Fri, 24 Apr 2026 12:52:18 +0200
implement getvaluefunc2 for menu item lists (GTK)
| ui/common/menu.c | file | annotate | diff | comparison | revisions | |
| ui/common/menu.h | file | annotate | diff | comparison | revisions | |
| ui/gtk/menu.c | file | annotate | diff | comparison | revisions | |
| ui/gtk/menu.h | file | annotate | diff | comparison | revisions | |
| ui/motif/menu.h | file | annotate | diff | comparison | revisions |
--- a/ui/common/menu.c Fri Apr 24 12:52:05 2026 +0200 +++ b/ui/common/menu.c Fri Apr 24 12:52:18 2026 +0200 @@ -44,6 +44,17 @@ static void *tmp_eventdata; static int tmp_eventdata_type; + +static void* getvalue_wrapper(UiList *list, void *elm, int row, int col, void *userdata, UiBool *freeResult) { + ui_getvaluefunc getvalue = (ui_getvaluefunc)userdata; + return getvalue(elm, col); +} + +static void* str_getvalue(UiList *list, void *elm, int row, int col, void *userdata, UiBool *freeResult) { + return elm; +} + + void uic_set_tmp_eventdata(void *eventdata, int type) { tmp_eventdata = eventdata; tmp_eventdata_type = type; @@ -208,7 +219,15 @@ item->item.prev = NULL; item->item.next = NULL; item->item.type = UI_MENU_ITEM_LIST; - item->getvalue = args->getvalue; + if(args->getvalue2) { + item->getvalue = args->getvalue2; + item->getvaluedata = args->getvaluedata; + } else if(args->getvalue) { + item->getvalue = getvalue_wrapper; + item->getvaluedata = (void*)args->getvalue; + } else { + item->getvalue = str_getvalue; + } item->callback = args->onselect; item->userdata = args->onselectdata; item->varname = nl_strdup(args->varname); @@ -223,6 +242,15 @@ item->item.prev = NULL; item->item.next = NULL; item->item.type = UI_MENU_CHECKITEM_LIST; + if(args->getvalue2) { + item->getvalue = args->getvalue2; + item->getvaluedata = args->getvaluedata; + } else if(args->getvalue) { + item->getvalue = getvalue_wrapper; + item->getvaluedata = (void*)args->getvalue; + } else { + item->getvalue = str_getvalue; + } item->callback = args->onselect; item->userdata = args->onselectdata; item->varname = nl_strdup(args->varname); @@ -236,6 +264,15 @@ item->item.prev = NULL; item->item.next = NULL; item->item.type = UI_MENU_RADIOITEM_LIST; + if(args->getvalue2) { + item->getvalue = args->getvalue2; + item->getvaluedata = args->getvaluedata; + } else if(args->getvalue) { + item->getvalue = getvalue_wrapper; + item->getvaluedata = (void*)args->getvalue; + } else { + item->getvalue = str_getvalue; + } item->callback = args->onselect; item->userdata = args->onselectdata; item->varname = nl_strdup(args->varname);
--- a/ui/common/menu.h Fri Apr 24 12:52:05 2026 +0200 +++ b/ui/common/menu.h Fri Apr 24 12:52:18 2026 +0200 @@ -107,12 +107,13 @@ }; struct UiMenuItemList { - UiMenuItemI item; - ui_getvaluefunc getvalue; - ui_callback callback; - void *userdata; - char *varname; - UiBool addseparator; + UiMenuItemI item; + ui_getvaluefunc2 getvalue; + void *getvaluedata; + ui_callback callback; + void *userdata; + char *varname; + UiBool addseparator; };
--- a/ui/gtk/menu.c Fri Apr 24 12:52:05 2026 +0200 +++ b/ui/gtk/menu.c Fri Apr 24 12:52:18 2026 +0200 @@ -277,6 +277,7 @@ ls->index = index; ls->oldcount = 0; ls->getvalue = il->getvalue; + ls->getvaluedata = il->getvaluedata; UiVar* var = uic_create_var(ui_global_context(), il->varname, UI_VAR_LIST); //UiVar* var = uic_create_var(obj->ctx, il->varname, UI_VAR_LIST); @@ -340,10 +341,12 @@ gtk_widget_show(widget); } - ui_getvaluefunc getvalue = list->getvalue; + ui_getvaluefunc2 getvalue = list->getvalue; + void *getvaluedata = list->getvaluedata; int i = 1; while(elm) { - char *label = (char*) (getvalue ? getvalue(elm, 0) : elm); + UiBool freeResult = FALSE; + char *label = (char*) (getvalue ? getvalue(ls, elm, i, 0, getvaluedata, &freeResult) : elm); GtkWidget *widget = gtk_menu_item_new_with_label(label); gtk_menu_shell_insert(list->menu, widget, list->index + i); @@ -372,6 +375,10 @@ elm = ui_list_next(ls); i++; + + if(freeResult) { + free(label); + } } list->oldcount = i; @@ -825,6 +832,7 @@ ls->index = index; ls->oldcount = 0; ls->getvalue = il->getvalue; + ls->getvaluedata = il->getvalue; GSimpleAction *action = g_simple_action_new(item->id, g_variant_type_new("i")); g_action_map_add_action(obj->ctx->action_map, G_ACTION(action)); @@ -943,11 +951,13 @@ UiList *ls = list->var->value; // add list items - ui_getvaluefunc getvalue = list->getvalue; + ui_getvaluefunc2 getvalue = list->getvalue; + void *getvaluedata = list->getvaluedata; int i = 0; void* elm = ui_list_first(ls); while(elm) { - char *label = (char*) (getvalue ? getvalue(elm, 0) : elm); + UiBool freeResult = FALSE; + char *label = (char*) (getvalue ? getvalue(ls, elm, i, 0, getvaluedata, &freeResult) : elm); GMenuItem *item = g_menu_item_new(label, NULL); GVariant *v = g_variant_new("i", i); @@ -957,6 +967,10 @@ elm = ui_list_next(ls); i++; + + if(freeResult) { + free(label); + } } list->oldcount = i;
--- a/ui/gtk/menu.h Fri Apr 24 12:52:05 2026 +0200 +++ b/ui/gtk/menu.h Fri Apr 24 12:52:18 2026 +0200 @@ -56,7 +56,8 @@ int index; int oldcount; UiVar *var; - ui_getvaluefunc getvalue; + ui_getvaluefunc2 getvalue; + void *getvaluedata; ui_callback callback; void *userdata; }; @@ -95,7 +96,8 @@ int index; int oldcount; UiVar *var; - ui_getvaluefunc getvalue; + ui_getvaluefunc2 getvalue; + void *getvaluedata; ui_callback callback; void *userdata; };