ui/motif/menu.c

changeset 21
012418e7dc90
parent 18
06be29a56f8b
child 52
25e5390cce41
equal deleted inserted replaced
20:2dda1ad6dc7a 21:012418e7dc90
26 * POSSIBILITY OF SUCH DAMAGE. 26 * POSSIBILITY OF SUCH DAMAGE.
27 */ 27 */
28 28
29 #include <stdio.h> 29 #include <stdio.h>
30 #include <stdlib.h> 30 #include <stdlib.h>
31 #include <stdarg.h>
31 32
32 #include "menu.h" 33 #include "menu.h"
33 #include "button.h" 34 #include "button.h"
34 #include "toolkit.h" 35 #include "toolkit.h"
35 #include "stock.h" 36 #include "stock.h"
78 } 79 }
79 current = ucx_list_remove(current, current); 80 current = ucx_list_remove(current, current);
80 } 81 }
81 82
82 void ui_menuitem(char *label, ui_callback f, void *userdata) { 83 void ui_menuitem(char *label, ui_callback f, void *userdata) {
84 ui_menuitem_gr(label, f, userdata, -1);
85 }
86
87 void ui_menuitem_st(char *stockid, ui_callback f, void *userdata) {
88 ui_menuitem_stgr(stockid, f, userdata, -1);
89 }
90
91 void ui_menuitem_gr(char *label, ui_callback f, void *userdata, ...) {
83 if(!current) { 92 if(!current) {
84 return; 93 return;
85 } 94 }
86 95
87 UiMenuItem *item = malloc(sizeof(UiMenuItem)); 96 UiMenuItem *item = malloc(sizeof(UiMenuItem));
88 item->item.add_to = (ui_menu_add_f)add_menuitem_widget; 97 item->item.add_to = (ui_menu_add_f)add_menuitem_widget;
89 98
90 item->label = label; 99 item->label = label;
91 item->userdata = userdata; 100 item->userdata = userdata;
92 item->callback = f; 101 item->callback = f;
102 item->groups = NULL;
103
104 // add groups
105 va_list ap;
106 va_start(ap, userdata);
107 int group;
108 while((group = va_arg(ap, int)) != -1) {
109 item->groups = ucx_list_append(item->groups, (void*)(intptr_t)group);
110 }
111 va_end(ap);
93 112
94 UiMenu *cm = current->data; 113 UiMenu *cm = current->data;
95 cm->items = ucx_list_append(cm->items, item); 114 cm->items = ucx_list_append(cm->items, item);
96 } 115 }
97 116
98 void ui_menuitem_st(char *stockid, ui_callback f, void *userdata) { 117 void ui_menuitem_stgr(char *stockid, ui_callback f, void *userdata, ...) {
99 if(!current) { 118 if(!current) {
100 return; 119 return;
101 } 120 }
102 121
103 UiStMenuItem *item = malloc(sizeof(UiStMenuItem)); 122 UiStMenuItem *item = malloc(sizeof(UiStMenuItem));
104 item->item.add_to = (ui_menu_add_f)add_menuitem_st_widget; 123 item->item.add_to = (ui_menu_add_f)add_menuitem_st_widget;
105 124
106 item->stockid = stockid; 125 item->stockid = stockid;
107 item->userdata = userdata; 126 item->userdata = userdata;
108 item->callback = f; 127 item->callback = f;
128 item->groups = NULL;
129
130 // add groups
131 va_list ap;
132 va_start(ap, userdata);
133 int group;
134 while((group = va_arg(ap, int)) != -1) {
135 item->groups = ucx_list_append(item->groups, (void*)(intptr_t)group);
136 }
137 va_end(ap);
109 138
110 UiMenu *cm = current->data; 139 UiMenu *cm = current->data;
111 cm->items = ucx_list_append(cm->items, item); 140 cm->items = ucx_list_append(cm->items, item);
112 } 141 }
113 142
242 XmNactivateCallback, 271 XmNactivateCallback,
243 (XtCallbackProc)ui_push_button_callback, 272 (XtCallbackProc)ui_push_button_callback,
244 event); 273 event);
245 } 274 }
246 275
276 if(mi->groups) {
277 uic_add_group_widget(obj->ctx, mitem, mi->groups);
278 }
279
247 return 1; 280 return 1;
248 } 281 }
249 282
250 int add_menuitem_st_widget(Widget parent, int i, UiMenuItemI *item, UiObject *obj) { 283 int add_menuitem_st_widget(Widget parent, int i, UiMenuItemI *item, UiObject *obj) {
251 UiStMenuItem *mi = (UiStMenuItem*)item; 284 UiStMenuItem *mi = (UiStMenuItem*)item;
295 XtAddCallback( 328 XtAddCallback(
296 mitem, 329 mitem,
297 XmNactivateCallback, 330 XmNactivateCallback,
298 (XtCallbackProc)ui_push_button_callback, 331 (XtCallbackProc)ui_push_button_callback,
299 event); 332 event);
333 }
334
335 if(mi->groups) {
336 uic_add_group_widget(obj->ctx, mitem, mi->groups);
300 } 337 }
301 338
302 return 1; 339 return 1;
303 } 340 }
304 341

mercurial