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