Tue, 01 Apr 2014 13:47:29 +0200
added menu item lists (Motif)
0 | 1 | /* |
2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. | |
3 | * | |
4 | * Copyright 2014 Olaf Wintermann. All rights reserved. | |
5 | * | |
6 | * Redistribution and use in source and binary forms, with or without | |
7 | * modification, are permitted provided that the following conditions are met: | |
8 | * | |
9 | * 1. Redistributions of source code must retain the above copyright | |
10 | * notice, this list of conditions and the following disclaimer. | |
11 | * | |
12 | * 2. Redistributions in binary form must reproduce the above copyright | |
13 | * notice, this list of conditions and the following disclaimer in the | |
14 | * documentation and/or other materials provided with the distribution. | |
15 | * | |
16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
17 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
18 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
19 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | |
20 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |
21 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |
22 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |
23 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | |
24 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |
25 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |
26 | * POSSIBILITY OF SUCH DAMAGE. | |
27 | */ | |
28 | ||
29 | #include <stdio.h> | |
30 | #include <stdlib.h> | |
31 | ||
32 | #include "menu.h" | |
33 | #include "button.h" | |
34 | #include "toolkit.h" | |
35 | #include "../common/context.h" | |
36 | #include "../ui/window.h" | |
37 | ||
38 | UcxList *menus; | |
39 | UcxList *current; | |
40 | ||
41 | void ui_menu(char *label) { | |
42 | // free current menu hierarchy | |
43 | ucx_list_free(current); | |
44 | ||
45 | // create menu | |
46 | UiMenu *menu = malloc(sizeof(UiMenu)); | |
47 | menu->item.add_to = (ui_menu_add_f)add_menu_widget; | |
48 | ||
49 | menu->label = label; | |
50 | menu->items = NULL; | |
51 | menu->parent = NULL; | |
52 | ||
53 | current = ucx_list_prepend(NULL, menu); | |
54 | menus = ucx_list_append(menus, menu); | |
55 | ||
56 | } | |
57 | ||
58 | void ui_submenu(char *label) { | |
59 | UiMenu *menu = malloc(sizeof(UiMenu)); | |
60 | menu->item.add_to = (ui_menu_add_f)add_menu_widget; | |
61 | ||
62 | menu->label = label; | |
63 | menu->items = NULL; | |
64 | menu->parent = NULL; | |
65 | ||
66 | // add submenu to current menu | |
67 | UiMenu *cm = current->data; | |
68 | cm->items = ucx_list_append(cm->items, menu); | |
69 | ||
70 | // set the submenu to current menu | |
71 | current = ucx_list_prepend(current, menu); | |
72 | } | |
73 | ||
74 | void ui_submenu_end() { | |
75 | if(ucx_list_size(current) < 2) { | |
76 | return; | |
77 | } | |
78 | current = ucx_list_remove(current, current); | |
79 | } | |
80 | ||
81 | void ui_menuitem(char *label, ui_callback f, void *userdata) { | |
82 | if(!current) { | |
83 | return; | |
84 | } | |
85 | ||
86 | UiMenuItem *item = malloc(sizeof(UiMenuItem)); | |
87 | item->item.add_to = (ui_menu_add_f)add_menuitem_widget; | |
88 | ||
89 | item->label = label; | |
90 | item->userdata = userdata; | |
91 | item->callback = f; | |
92 | ||
93 | UiMenu *cm = current->data; | |
94 | cm->items = ucx_list_append(cm->items, item); | |
95 | } | |
96 | ||
97 | void ui_menuseparator() { | |
98 | if(!current) { | |
99 | return; | |
100 | } | |
101 | ||
102 | UiMenuItemI *item = malloc(sizeof(UiMenuItemI)); | |
103 | item->add_to = (ui_menu_add_f)add_menuseparator_widget; | |
104 | ||
105 | UiMenu *cm = current->data; | |
106 | cm->items = ucx_list_append(cm->items, item); | |
107 | } | |
108 | ||
109 | ||
110 | void ui_checkitem(char *label, ui_callback f, void *userdata) { | |
111 | if(!current) { | |
112 | return; | |
113 | } | |
114 | ||
115 | UiCheckItem *item = malloc(sizeof(UiCheckItem)); | |
116 | item->item.add_to = (ui_menu_add_f)add_checkitem_widget; | |
117 | item->label = label; | |
118 | item->callback = f; | |
119 | item->userdata = userdata; | |
120 | ||
121 | UiMenu *cm = current->data; | |
122 | cm->items = ucx_list_append(cm->items, item); | |
123 | } | |
124 | ||
125 | void ui_checkitem_nv(char *label, char *vname) { | |
126 | if(!current) { | |
127 | return; | |
128 | } | |
129 | ||
130 | UiCheckItemNV *item = malloc(sizeof(UiCheckItemNV)); | |
131 | item->item.add_to = (ui_menu_add_f)add_checkitemnv_widget; | |
132 | item->varname = vname; | |
133 | item->label = label; | |
134 | ||
135 | UiMenu *cm = current->data; | |
136 | cm->items = ucx_list_append(cm->items, item); | |
137 | } | |
138 | ||
17
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
139 | void ui_menuitem_list(UiList *items, ui_callback f, void *userdata) { |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
140 | if(!current) { |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
141 | return; |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
142 | } |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
143 | |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
144 | UiMenuItemList *item = malloc(sizeof(UiMenuItemList)); |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
145 | item->item.add_to = (ui_menu_add_f)add_menuitem_list_widget; |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
146 | item->callback = f; |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
147 | item->userdata = userdata; |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
148 | item->list = items; |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
149 | |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
150 | UiMenu *cm = current->data; |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
151 | cm->items = ucx_list_append(cm->items, item); |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
152 | } |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
153 | |
0 | 154 | |
155 | // private menu functions | |
156 | void ui_create_menubar(UiObject *obj) { | |
157 | if(!menus) { | |
158 | return; | |
159 | } | |
160 | ||
161 | Widget menubar = XmCreateMenuBar(obj->widget, "main_list", NULL, 0); | |
162 | XtManageChild(menubar); | |
163 | ||
164 | UcxList *ls = menus; | |
165 | int menu_index = 0; | |
166 | while(ls) { | |
167 | UiMenu *menu = ls->data; | |
168 | menu_index += menu->item.add_to(menubar, menu_index, &menu->item, obj); | |
169 | ||
170 | ls = ls->next; | |
171 | } | |
172 | } | |
173 | ||
174 | int add_menu_widget(Widget parent, int i, UiMenuItemI *item, UiObject *obj) { | |
175 | UiMenu *menu = (UiMenu*)item; | |
176 | ||
177 | Widget menuItem = XtVaCreateManagedWidget( | |
178 | menu->label, | |
179 | xmCascadeButtonWidgetClass, | |
180 | parent, | |
181 | NULL); | |
182 | Widget m = XmVaCreateSimplePulldownMenu(parent, menu->label, i, NULL, NULL); | |
183 | ||
184 | UcxList *ls = menu->items; | |
185 | int menu_index = 0; | |
186 | while(ls) { | |
187 | UiMenuItemI *mi = ls->data; | |
188 | menu_index += mi->add_to(m, menu_index, mi, obj); | |
189 | ls = ls->next; | |
190 | } | |
191 | ||
192 | return 1; | |
193 | } | |
194 | ||
195 | int add_menuitem_widget( | |
196 | Widget parent, | |
197 | int i, | |
198 | UiMenuItemI *item, | |
199 | UiObject *obj) | |
200 | { | |
201 | UiMenuItem *mi = (UiMenuItem*)item; | |
202 | ||
203 | Arg args[1]; | |
204 | XmString label = XmStringCreateLocalized(mi->label); | |
205 | XtSetArg(args[0], XmNlabelString, label); | |
206 | ||
207 | Widget mitem = XtCreateManagedWidget( | |
208 | "menubutton", | |
209 | xmPushButtonWidgetClass, | |
210 | parent, | |
211 | args, | |
212 | 1); | |
213 | XmStringFree(label); | |
214 | ||
215 | if(mi->callback != NULL) { | |
216 | UiEventData *event = ucx_mempool_malloc( | |
217 | obj->ctx->mempool, | |
218 | sizeof(UiEventData)); | |
219 | event->obj = obj; | |
220 | event->user_data = mi->userdata; | |
221 | event->callback = mi->callback; | |
17
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
222 | event->value = 0; |
3 | 223 | XtAddCallback( |
224 | mitem, | |
225 | XmNactivateCallback, | |
226 | (XtCallbackProc)ui_push_button_callback, | |
227 | event); | |
0 | 228 | } |
229 | ||
230 | return 1; | |
231 | } | |
232 | ||
233 | int add_menuseparator_widget( | |
234 | Widget parent, | |
235 | int i, | |
236 | UiMenuItemI *item, | |
237 | UiObject *obj) | |
238 | { | |
239 | Widget s = XmCreateSeparatorGadget (parent, "menu_separator", NULL, 0); | |
240 | XtManageChild(s); | |
241 | return 1; | |
242 | } | |
243 | ||
244 | int add_checkitem_widget( | |
245 | Widget parent, | |
246 | int i, | |
247 | UiMenuItemI *item, | |
248 | UiObject *obj) | |
249 | { | |
250 | UiCheckItem *ci = (UiCheckItem*)item; | |
251 | ||
252 | Arg args[3]; | |
253 | XmString label = XmStringCreateLocalized(ci->label); | |
254 | XtSetArg(args[0], XmNlabelString, label); | |
255 | XtSetArg(args[1], XmNvisibleWhenOff, 1); | |
256 | Widget checkbox = XtCreateManagedWidget( | |
257 | "menutogglebutton", | |
258 | xmToggleButtonWidgetClass, | |
259 | parent, | |
260 | args, | |
261 | 2); | |
262 | XmStringFree(label); | |
263 | ||
264 | if(ci->callback) { | |
265 | UiEventData *event = ucx_mempool_malloc( | |
266 | obj->ctx->mempool, | |
267 | sizeof(UiEventData)); | |
268 | event->obj = obj; | |
269 | event->user_data = ci->userdata; | |
270 | event->callback = ci->callback; | |
271 | XtAddCallback( | |
272 | checkbox, | |
273 | XmNvalueChangedCallback, | |
274 | (XtCallbackProc)ui_toggle_button_callback, | |
275 | event); | |
276 | } | |
277 | ||
278 | return 1; | |
279 | } | |
280 | ||
281 | int add_checkitemnv_widget( | |
282 | Widget parent, | |
283 | int i, | |
284 | UiMenuItemI *item, | |
285 | UiObject *obj) | |
286 | { | |
287 | UiCheckItemNV *ci = (UiCheckItemNV*)item; | |
288 | ||
289 | Arg args[3]; | |
290 | XmString label = XmStringCreateLocalized(ci->label); | |
291 | XtSetArg(args[0], XmNlabelString, label); | |
292 | XtSetArg(args[1], XmNvisibleWhenOff, 1); | |
293 | Widget checkbox = XtCreateManagedWidget( | |
294 | "menutogglebutton", | |
295 | xmToggleButtonWidgetClass, | |
296 | parent, | |
297 | args, | |
298 | 2); | |
299 | XmStringFree(label); | |
300 | ||
2
eeb50c534497
added support for replaceable documents
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
301 | UiVar *var = uic_connect_var(obj->ctx, ci->varname, UI_VAR_INTEGER); |
eeb50c534497
added support for replaceable documents
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
302 | if(var) { |
0 | 303 | UiInteger *value = var->value; |
304 | value->obj = checkbox; | |
305 | value->get = ui_toggle_button_get; | |
306 | value->set = ui_toggle_button_set; | |
307 | value = 0; | |
308 | } else { | |
2
eeb50c534497
added support for replaceable documents
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
309 | // TODO: error |
0 | 310 | } |
17
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
311 | |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
312 | return 1; |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
313 | } |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
314 | |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
315 | int add_menuitem_list_widget( |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
316 | Widget parent, |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
317 | int i, |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
318 | UiMenuItemI *item, |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
319 | UiObject *obj) |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
320 | { |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
321 | UiMenuItemList *il = (UiMenuItemList*)item; |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
322 | UcxMempool *mp = obj->ctx->mempool; |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
323 | |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
324 | UiActiveMenuItemList *ls = ucx_mempool_malloc( |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
325 | mp, |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
326 | sizeof(UiActiveMenuItemList)); |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
327 | |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
328 | ls->object = obj; |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
329 | ls->menu = parent; |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
330 | ls->index = i; |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
331 | ls->oldcount = 0; |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
332 | ls->list = il->list; |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
333 | ls->callback = il->callback; |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
334 | ls->userdata = il->userdata; |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
335 | |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
336 | ls->list->observers = ui_add_observer( |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
337 | ls->list->observers, |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
338 | (ui_callback)ui_update_menuitem_list, |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
339 | ls); |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
340 | |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
341 | ui_update_menuitem_list(NULL, ls); |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
342 | |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
343 | return 0; |
0 | 344 | } |
345 | ||
17
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
346 | void ui_update_menuitem_list(UiEvent *event, UiActiveMenuItemList *list) { |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
347 | Arg args[4]; |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
348 | |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
349 | // remove old items |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
350 | if(list->oldcount > 0) { |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
351 | Widget *children; |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
352 | int nc; |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
353 | |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
354 | XtVaGetValues( |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
355 | list->menu, |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
356 | XmNchildren, |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
357 | &children, |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
358 | XmNnumChildren, |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
359 | &nc, |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
360 | NULL); |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
361 | |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
362 | for(int i=0;i<list->oldcount;i++) { |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
363 | XtDestroyWidget(children[list->index + i]); |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
364 | } |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
365 | } |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
366 | |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
367 | char *str = ui_list_first(list->list); |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
368 | if(str) { |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
369 | // add separator |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
370 | XtSetArg(args[0], XmNpositionIndex, list->index); |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
371 | Widget s = XmCreateSeparatorGadget (list->menu, "menu_separator", args, 1); |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
372 | XtManageChild(s); |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
373 | } |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
374 | int i = 1; |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
375 | while(str) { |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
376 | XmString label = XmStringCreateLocalized(str); |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
377 | XtSetArg(args[0], XmNlabelString, label); |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
378 | XtSetArg(args[1], XmNpositionIndex, list->index + i); |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
379 | |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
380 | Widget mitem = XtCreateManagedWidget( |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
381 | "menubutton", |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
382 | xmPushButtonWidgetClass, |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
383 | list->menu, |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
384 | args, |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
385 | 2); |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
386 | XmStringFree(label); |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
387 | |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
388 | if(list->callback) { |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
389 | // TODO: use mempool |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
390 | UiEventData *event = malloc(sizeof(UiEventData)); |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
391 | event->obj = list->object; |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
392 | event->user_data = list->userdata; |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
393 | event->callback = list->callback; |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
394 | event->value = i - 1; |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
395 | |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
396 | XtAddCallback( |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
397 | mitem, |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
398 | XmNactivateCallback, |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
399 | (XtCallbackProc)ui_push_button_callback, |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
400 | event); |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
401 | } |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
402 | |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
403 | str = ui_list_next(list->list); |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
404 | i++; |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
405 | } |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
406 | |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
407 | list->oldcount = i; |
db95c0104937
added menu item lists (Motif)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
3
diff
changeset
|
408 | } |
0 | 409 | |
410 | void ui_menu_event_wrapper(Widget widget, XtPointer udata, XtPointer cdata) { | |
411 | UiEventData *event = udata; | |
412 | UiEvent e; | |
413 | e.obj = event->obj; | |
414 | e.window = event->obj->window; | |
2
eeb50c534497
added support for replaceable documents
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
415 | e.document = event->obj->document; |
0 | 416 | e.intval = 0; |
417 | event->callback(&e, event->user_data); | |
418 | } |