implement getvaluefunc2 for menu item lists (GTK)

Fri, 24 Apr 2026 12:52:18 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Fri, 24 Apr 2026 12:52:18 +0200
changeset 1107
22d58a28fea7
parent 1106
785c2c75b2a5
child 1108
2c8ab8c17da7

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;
 };
--- a/ui/motif/menu.h	Fri Apr 24 12:52:05 2026 +0200
+++ b/ui/motif/menu.h	Fri Apr 24 12:52:18 2026 +0200
@@ -44,7 +44,8 @@
     int              index;
     int              oldcount;
     UiVar            *var;
-    ui_getvaluefunc  getvalue;
+    ui_getvaluefunc2 getvalue;
+    void             *getvaluedata;
     ui_callback      callback;
     void             *userdata;
     bool             addseparator;

mercurial