LibMB 1.9
|
00001 #ifndef _MBMENU_H_ 00002 #define _MBMENU_H_ 00003 00004 /* libmb 00005 * Copyright (C) 2002 Matthew Allum 00006 * 00007 * This library is free software; you can redistribute it and/or 00008 * modify it under the terms of the GNU Lesser General Public 00009 * License as published by the Free Software Foundation; either 00010 * version 2 of the License, or (at your option) any later version. 00011 * 00012 * This library is distributed in the hope that it will be useful, 00013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00015 * Lesser General Public License for more details. 00016 * 00017 * You should have received a copy of the GNU Lesser General Public 00018 * License along with this library; if not, write to the 00019 * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 00020 * Boston, MA 02111-1307, USA. 00021 */ 00022 00023 #include "libmb/mbconfig.h" 00024 00025 #include <stdio.h> 00026 #include <unistd.h> 00027 #include <stdlib.h> 00028 #include <string.h> 00029 #include <sys/types.h> 00030 #include <sys/stat.h> 00031 #include <dirent.h> 00032 #include <signal.h> 00033 #include <sys/wait.h> 00034 #include <X11/Xlib.h> 00035 #include <X11/Xutil.h> 00036 #include <X11/Xatom.h> 00037 00038 #include <X11/Xresource.h> 00039 #include <X11/extensions/shape.h> 00040 #include <X11/Xatom.h> 00041 #include <X11/keysymdef.h> 00042 #include <X11/keysym.h> 00043 #include <X11/Xmd.h> 00044 00045 #ifdef USE_XSETTINGS 00046 #include <xsettings-client.h> 00047 #endif 00048 00049 #include "mbpixbuf.h" 00050 #include "mbexp.h" 00051 00061 /* 00062 TODO? 00063 00064 - mb_menu menu calls to mb_menu_menu ? 00065 */ 00066 00067 #ifdef __cplusplus 00068 extern "C" { 00069 #endif 00070 00071 00077 typedef enum { 00078 MBMENU_SET_BG_COL, 00079 MBMENU_SET_FG_COL, 00080 MBMENU_SET_HL_COL, 00081 MBMENU_SET_BD_COL 00082 } MBMenuColorElement; 00083 00089 typedef enum { 00090 MBMENU_NO_SORT = (1<<1), 00091 MBMENU_PREPEND = (1<<2) 00092 } MBMenuItemAddFlags; 00093 00094 enum { 00095 MBMENU_ITEM_APP, 00096 MBMENU_ITEM_FOLDER, 00097 MBMENU_ITEM_SEPERATOR 00098 }; 00099 00100 /* for mb_menu_new */ 00101 #define MBMENU_FG_COL (1<<1) 00102 #define MBMENU_BG_COL (1<<2) 00103 #define MBMENU_HL_COL (1<<3) 00104 #define MBMENU_BD_COL (1<<4) 00105 #define MBMENU_FONT (1<<5) 00106 #define MBMENU_BD_SZ (1<<6) 00107 #define MBMENU_ICON_SZ (1<<7) 00108 #define MBMENU_ICON_FN (1<<8) 00109 #define MBMENU_ICON_FOLDER_FN (1<<9) 00110 #define MBMENU_TRANS (1<<10) 00111 #define MBMENU_BG_FN (1<<11) 00112 #define MBMENU_BEVEL (1<<12) 00113 00114 typedef struct _menu_options 00115 { 00116 char *fontname; 00117 char *foreground_col_spec; 00118 char *background_col_spec; 00119 char *highlight_col_spec; 00120 char *border_col_spec; 00121 int border_size; 00122 int icon_dimention; 00123 char *default_icon_filename; 00124 char *default_folder_icon_filename; 00125 char *bg_img_filename; 00126 int transparency_level; 00127 int bevel_size; 00128 00129 } MBMenuOptions; 00130 00136 typedef struct _menu 00137 { 00138 00139 /* 00140 #ifdef USE_XFT 00141 XftDraw *xftdraw; 00142 XftDraw *shadow_xftdraw; 00143 XftDraw *active_xftdraw; 00144 int expose_cnt; 00145 #endif 00146 */ 00147 00148 char *title; 00149 struct _menuitem *items; 00150 struct _menuitem *active_item; 00151 struct _menuitem *too_big_start_item; 00152 struct _menuitem *too_big_end_item; 00153 struct _menuitem *parent_item; 00154 00155 int x; 00156 int y; 00157 int width; 00158 int height; 00159 int depth; 00160 00161 Window win; 00162 00163 GC mask_gc; 00164 Bool too_big; 00165 00166 MBDrawable *active_item_drw; 00167 MBDrawable *backing; 00168 00169 00170 } MBMenuMenu; 00171 00172 00178 typedef struct _menuitem 00179 { 00180 int type; 00181 00182 char *title; 00183 void (* cb)( struct _menuitem *item ); 00184 void *cb_data; 00185 char *info; 00186 char *icon_fn; 00187 00188 MBPixbufImage *img; 00189 00190 MBMenuMenu *child; 00191 struct _menuitem *next_item; 00192 00193 int y; 00194 int h; 00195 00196 00197 } MBMenuItem; /* XXX MBMenuItem */ 00198 00204 typedef struct _mbmemu 00205 { 00206 Display *dpy; 00207 Window root; 00208 int screen; 00209 MBFont *font; 00210 00211 /* 00212 #ifdef USE_XFT 00213 XftFont *xftfont; 00214 XftColor fg_xftcol; 00215 XftColor bg_xftcol; 00216 XftColor hl_xftcol; 00217 XftColor bd_xftcol; 00218 XftColor shadow_xftcol; 00219 #else 00220 XFontStruct* font; 00221 #endif 00222 XColor fg_xcol; 00223 XColor bg_xcol; 00224 XColor hl_xcol; 00225 XColor bd_xcol; 00226 */ 00227 00228 MBColor *fg_col; 00229 MBColor *bg_col; 00230 MBColor *hl_col; 00231 MBColor *bd_col; 00232 00233 00234 GC gc; 00235 00236 Bool have_highlight_col; 00237 00238 int options; 00239 00240 int border_width; /* X window border */ 00241 int inner_border_width; /* Non X border */ 00242 XColor border_cols[3]; 00243 int trans; 00244 00245 int icon_dimention; /* 0 - no icons, else icon size after scale */ 00246 00247 MBPixbuf *pb; 00248 MBPixbufImage *img_default_folder; 00249 MBPixbufImage *img_default_app; 00250 MBPixbufImage *img_bg; 00251 00252 Pixmap arrow_icon, arrow_mask; /* XXX Togo */ 00253 Pixmap bg_pixmap, bg_pixmap_mask; 00254 00255 struct _menu *rootmenu; 00256 Bool xmenu_is_active; 00257 struct _menu *active[10]; 00258 int active_depth; 00259 00260 Atom atom_mbtheme; 00261 00262 struct _menu *keyboard_focus_menu; 00263 00264 #ifdef USE_XSETTINGS 00265 XSettingsClient *xsettings_client; 00266 #endif 00267 00268 } MBMenu; 00269 00275 typedef void (*MBMenuActivateCB)( MBMenuItem *item ) ; 00276 00284 MBMenu * 00285 mb_menu_new(Display *dpy, int screen); 00286 00294 Bool 00295 mb_menu_set_font (MBMenu *mbmenu, 00296 char *font_desc); 00297 00306 Bool 00307 mb_menu_set_default_icons(MBMenu *mbmenu, char *folder, char *app); 00308 00309 00317 void 00318 mb_menu_set_icon_size(MBMenu *mbmenu, int size); 00319 00327 void 00328 mb_menu_set_col(MBMenu *mbmenu, 00329 MBMenuColorElement element, 00330 char *col_spec); 00331 00339 void 00340 mb_menu_set_trans(MBMenu *mbmenu, int trans); 00341 00349 MBMenuMenu* mb_menu_get_root_menu(MBMenu *mbmenu); 00350 00351 00360 Bool 00361 mb_menu_get_root_menu_size(MBMenu *mbmenu, int *width, int *height); 00362 00363 00372 void 00373 mb_menu_add_seperator_to_menu(MBMenu *mbmenu, 00374 MBMenuMenu *menu, 00375 int flags); 00376 00387 MBMenuMenu 00388 *mb_menu_add_path(MBMenu *mbmenu, 00389 char *path, 00390 char *icon_path, 00391 int flags); 00392 00399 void mb_menu_remove_menu(MBMenu *mbmenu, 00400 MBMenuMenu *menu); 00401 00402 00408 void mb_menu_free(MBMenu *mbmenu); 00409 00416 Bool mb_menu_is_active(MBMenu *mbmenu); 00417 00426 void mb_menu_activate(MBMenu *mbmenu, 00427 int x, 00428 int y); 00429 00435 void mb_menu_deactivate(MBMenu *mbmenu); 00436 00437 00445 void mb_menu_handle_xevent(MBMenu *mbmenu, XEvent *xevent); 00446 00459 MBMenuItem * 00460 mb_menu_new_item (MBMenu *mbmenu, 00461 MBMenuMenu *menu, 00462 char *title, 00463 MBMenuActivateCB activate_callback , 00464 void *user_data, 00465 MBMenuItemAddFlags flags 00466 ); 00467 00468 00469 MBMenuItem * /* XXX TOGO */ 00470 mb_menu_add_item_to_menu(MBMenu *mbmenu, 00471 MBMenuMenu *menu, 00472 char *title, 00473 char *icon, 00474 char *info, 00475 void (* cmd)( MBMenuItem *item ), 00476 void *cb_data, 00477 int flags); 00478 00486 void 00487 mb_menu_item_icon_set(MBMenu *mbmenu, MBMenuItem *item, MBPixbufImage *img); 00488 00495 void* 00496 mb_menu_item_get_user_data(MBMenuItem *item); 00497 00505 void mb_menu_item_remove(MBMenu *mbmenu, MBMenuMenu *menu, MBMenuItem *item); 00506 00514 void mb_menu_dump(MBMenu *mbmenu, MBMenuMenu *menu); 00515 00516 #ifdef __cplusplus 00517 } 00518 #endif 00519 00520 00521 00525 #endif