1 /* 2 * pwm/menu.h 3 * 4 * Copyright (c) Tuomo Valkonen 1999-2001. 5 * 6 * You may distribute and modify this program under the terms of either 7 * the Clarified Artistic License or the GNU GPL, version 2 or later. 8 */ 9 10 #ifndef INCLUDED_MENU_H 11 #define INCLUDED_MENU_H 12 13 #include "common.h" 14 #include "thing.h" 15 #include "winobj.h" 16 #include "function.h" 17 18 19 #define WMENU_KEEP 0x0001 20 #define WMENU_CONTEXTUAL 0x0002 21 #define WMENU_NOTITLE 0x0004 22 23 /* 24 #define WMENUENT_CHECKABLE 0x0001 25 #define WMENUENT_CHECKED 0x0002 26 #define WMENUENT_DISABLED 0x0004 27 */ 28 #define WMENUENT_SUBMENU 0x0008 29 30 #define WMENUDATA_CONTEXTUAL 0x0001 31 #define WMENUDATA_USER 0x0002 32 33 34 enum{ 35 MENU_CMD_NEXT, 36 MENU_CMD_PREV, 37 MENU_CMD_ENTERSUB, 38 MENU_CMD_LEAVESUB, 39 MENU_CMD_CLOSE, 40 MENU_CMD_RAISEKEEP, 41 MENU_CMD_KEEP, 42 MENU_CMD_EXECUTE 43 }; 44 45 typedef struct _WMenuEnt{ 46 char *name; 47 int flags; 48 union _U{ 49 struct _F{ 50 WFunction *function; 51 WFuncArg arg; 52 int arg_type; 53 } f; 54 struct _Winlist{ 55 WClientWin *clientwin; 56 int sort; 57 } winlist; 58 struct _WMenuData *submenu; 59 int num; 60 void *other; 61 } u; 62 } WMenuEnt; 63 64 65 typedef struct _WMenuData{ 66 char *title; 67 char *name; 68 int flags; 69 bool (*init_func)(struct _WMenuData *data, WThing *context); 70 void (*exec_func)(struct _WMenuEnt *entry, WThing *context); 71 void (*deinit_func)(struct _WMenuData *data); 72 int nentries; 73 WMenuEnt *entries; 74 int nref; 75 struct _WMenu *inst1; 76 struct _WMenuData *menudata_next, *menudata_prev; 77 } WMenuData; 78 79 80 typedef struct _WMenu{ 81 INHERIT_WWINOBJ; 82 83 Window menu_win; 84 85 WMenuData *data; 86 int selected; 87 88 int title_height; 89 int entry_height; 90 91 WThing *context; 92 } WMenu; 93 94 #define MENU_SUBMENU(MENU) ((WMenu*)(MENU)->stack_above_list) 95 #define MENU_PARENT(MENU) ((WMenu*)(MENU)->stack_above) 96 #define SUBMENU_DATA(ENT) ((ENT)->u.submenu) 97 98 extern void init_menus(); 99 100 extern void show_menu(WMenuData *mdata, WThing *context, int x, int y, 101 bool button_down); 102 103 extern void menu_command(WMenu *menu, int cmd); 104 105 extern void activate_menu(WMenu *menu); 106 extern void deactivate_menu(WMenu *menu); 107 108 extern void destroy_menu_tree(WMenu *menu); 109 extern void destroy_contextual_menus(); 110 111 extern void set_menu_pos(WMenu *menu, int x, int y); 112 113 extern void update_menus(WMenuData *mdata); 114 115 extern bool register_menudata(WMenuData *mdata); 116 extern void unregister_menudata(WMenuData *mdata); 117 extern void free_user_menudata(WMenuData *mdata); 118 extern WMenuData *lookup_menudata(const char *name); 119 extern void free_menu_entries(WMenuEnt *ents, int n); 120 121 #endif /* INCLUDED_MENU_H */ 122