ui/motif/menu.c

changeset 17
db95c0104937
parent 3
c1a75454b444
child 18
06be29a56f8b
equal deleted inserted replaced
16:a499c8a72c15 17:db95c0104937
134 134
135 UiMenu *cm = current->data; 135 UiMenu *cm = current->data;
136 cm->items = ucx_list_append(cm->items, item); 136 cm->items = ucx_list_append(cm->items, item);
137 } 137 }
138 138
139 void ui_menuitem_list(UiList *items, ui_callback f, void *userdata) {
140 if(!current) {
141 return;
142 }
143
144 UiMenuItemList *item = malloc(sizeof(UiMenuItemList));
145 item->item.add_to = (ui_menu_add_f)add_menuitem_list_widget;
146 item->callback = f;
147 item->userdata = userdata;
148 item->list = items;
149
150 UiMenu *cm = current->data;
151 cm->items = ucx_list_append(cm->items, item);
152 }
153
139 154
140 // private menu functions 155 // private menu functions
141 void ui_create_menubar(UiObject *obj) { 156 void ui_create_menubar(UiObject *obj) {
142 if(!menus) { 157 if(!menus) {
143 return; 158 return;
202 obj->ctx->mempool, 217 obj->ctx->mempool,
203 sizeof(UiEventData)); 218 sizeof(UiEventData));
204 event->obj = obj; 219 event->obj = obj;
205 event->user_data = mi->userdata; 220 event->user_data = mi->userdata;
206 event->callback = mi->callback; 221 event->callback = mi->callback;
222 event->value = 0;
207 XtAddCallback( 223 XtAddCallback(
208 mitem, 224 mitem,
209 XmNactivateCallback, 225 XmNactivateCallback,
210 (XtCallbackProc)ui_push_button_callback, 226 (XtCallbackProc)ui_push_button_callback,
211 event); 227 event);
290 value->set = ui_toggle_button_set; 306 value->set = ui_toggle_button_set;
291 value = 0; 307 value = 0;
292 } else { 308 } else {
293 // TODO: error 309 // TODO: error
294 } 310 }
295 } 311
296 312 return 1;
313 }
314
315 int add_menuitem_list_widget(
316 Widget parent,
317 int i,
318 UiMenuItemI *item,
319 UiObject *obj)
320 {
321 UiMenuItemList *il = (UiMenuItemList*)item;
322 UcxMempool *mp = obj->ctx->mempool;
323
324 UiActiveMenuItemList *ls = ucx_mempool_malloc(
325 mp,
326 sizeof(UiActiveMenuItemList));
327
328 ls->object = obj;
329 ls->menu = parent;
330 ls->index = i;
331 ls->oldcount = 0;
332 ls->list = il->list;
333 ls->callback = il->callback;
334 ls->userdata = il->userdata;
335
336 ls->list->observers = ui_add_observer(
337 ls->list->observers,
338 (ui_callback)ui_update_menuitem_list,
339 ls);
340
341 ui_update_menuitem_list(NULL, ls);
342
343 return 0;
344 }
345
346 void ui_update_menuitem_list(UiEvent *event, UiActiveMenuItemList *list) {
347 Arg args[4];
348
349 // remove old items
350 if(list->oldcount > 0) {
351 Widget *children;
352 int nc;
353
354 XtVaGetValues(
355 list->menu,
356 XmNchildren,
357 &children,
358 XmNnumChildren,
359 &nc,
360 NULL);
361
362 for(int i=0;i<list->oldcount;i++) {
363 XtDestroyWidget(children[list->index + i]);
364 }
365 }
366
367 char *str = ui_list_first(list->list);
368 if(str) {
369 // add separator
370 XtSetArg(args[0], XmNpositionIndex, list->index);
371 Widget s = XmCreateSeparatorGadget (list->menu, "menu_separator", args, 1);
372 XtManageChild(s);
373 }
374 int i = 1;
375 while(str) {
376 XmString label = XmStringCreateLocalized(str);
377 XtSetArg(args[0], XmNlabelString, label);
378 XtSetArg(args[1], XmNpositionIndex, list->index + i);
379
380 Widget mitem = XtCreateManagedWidget(
381 "menubutton",
382 xmPushButtonWidgetClass,
383 list->menu,
384 args,
385 2);
386 XmStringFree(label);
387
388 if(list->callback) {
389 // TODO: use mempool
390 UiEventData *event = malloc(sizeof(UiEventData));
391 event->obj = list->object;
392 event->user_data = list->userdata;
393 event->callback = list->callback;
394 event->value = i - 1;
395
396 XtAddCallback(
397 mitem,
398 XmNactivateCallback,
399 (XtCallbackProc)ui_push_button_callback,
400 event);
401 }
402
403 str = ui_list_next(list->list);
404 i++;
405 }
406
407 list->oldcount = i;
408 }
297 409
298 void ui_menu_event_wrapper(Widget widget, XtPointer udata, XtPointer cdata) { 410 void ui_menu_event_wrapper(Widget widget, XtPointer udata, XtPointer cdata) {
299 UiEventData *event = udata; 411 UiEventData *event = udata;
300 UiEvent e; 412 UiEvent e;
301 e.obj = event->obj; 413 e.obj = event->obj;

mercurial