sourcelist contextmenu item events also get sublist eventdata (GTK)

Tue, 04 Nov 2025 20:38:19 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Tue, 04 Nov 2025 20:38:19 +0100
changeset 890
8d30cbd1c465
parent 889
5be43605226f
child 891
0804fc9298f6
child 893
32b334db5f8b

sourcelist contextmenu item events also get sublist eventdata (GTK)

ui/common/menu.c file | annotate | diff | comparison | revisions
ui/common/menu.h file | annotate | diff | comparison | revisions
ui/gtk/list.c file | annotate | diff | comparison | revisions
ui/gtk/list.h file | annotate | diff | comparison | revisions
ui/gtk/menu.c file | annotate | diff | comparison | revisions
--- a/ui/common/menu.c	Mon Nov 03 21:10:39 2025 +0100
+++ b/ui/common/menu.c	Tue Nov 04 20:38:19 2025 +0100
@@ -41,6 +41,22 @@
 
 static int menu_item_counter = 0;
 
+static void *tmp_eventdata;
+static int tmp_eventdata_type;
+
+void uic_set_tmp_eventdata(void *eventdata, int type) {
+    tmp_eventdata = eventdata;
+    tmp_eventdata_type = type;
+}
+
+void* uic_get_tmp_eventdata(void) {
+    return tmp_eventdata;
+}
+
+int uic_get_tmp_eventdata_type(void) {
+    return tmp_eventdata_type;
+}
+
 void uic_menu_init(void) {
     global_builder.current = cxLinkedListCreate(cxDefaultAllocator, NULL, CX_STORE_POINTERS);
     current_builder = &global_builder;
--- a/ui/common/menu.h	Mon Nov 03 21:10:39 2025 +0100
+++ b/ui/common/menu.h	Tue Nov 04 20:38:19 2025 +0100
@@ -131,6 +131,10 @@
 
 int* uic_copy_groups(const int* groups, size_t *ngroups);
 
+void uic_set_tmp_eventdata(void *eventdata, int type);
+void* uic_get_tmp_eventdata(void);
+int uic_get_tmp_eventdata_type(void);
+
 #ifdef __cplusplus
 }
 #endif
--- a/ui/gtk/list.c	Mon Nov 03 21:10:39 2025 +0100
+++ b/ui/gtk/list.c	Tue Nov 04 20:38:19 2025 +0100
@@ -2318,19 +2318,19 @@
 static void listbox_button_clicked(GtkWidget *button, UiEventDataExt *data) {
     UiListBoxSubList *sublist = data->customdata0;
     
-    UiSubListEventData eventdata;
-    eventdata.list = sublist->var->value;
-    eventdata.sublist_index = sublist->index;
-    eventdata.row_index = data->value0;
-    eventdata.sublist_userdata = sublist->userdata;
-    eventdata.row_data = eventdata.list->get(eventdata.list, eventdata.row_index);
-    eventdata.event_data = data->customdata2;
+    UiSubListEventData *eventdata = &sublist->listbox->current_eventdata;
+    eventdata->list = sublist->var->value;
+    eventdata->sublist_index = sublist->index;
+    eventdata->row_index = data->value0;
+    eventdata->sublist_userdata = sublist->userdata;
+    eventdata->row_data = eventdata->list->get(eventdata->list, eventdata->row_index);
+    eventdata->event_data = data->customdata2;
     
     UiEvent event;
     event.obj = data->obj;
     event.window = event.obj->window;
     event.document = event.obj->ctx->document;
-    event.eventdata = &eventdata;
+    event.eventdata = eventdata;
     event.eventdatatype = UI_EVENT_DATA_SUBLIST;
     event.intval = data->value0;
     event.set = ui_get_setop();
@@ -2340,6 +2340,8 @@
     }
     
     if(data->customdata3) {
+        uic_set_tmp_eventdata(eventdata, UI_EVENT_DATA_SUBLIST);
+        
         UIMENU menu = data->customdata3;
         g_object_set_data(G_OBJECT(button), "ui-button-popup", menu);
         gtk_popover_popup(GTK_POPOVER(menu));
--- a/ui/gtk/list.h	Mon Nov 03 21:10:39 2025 +0100
+++ b/ui/gtk/list.h	Tue Nov 04 20:38:19 2025 +0100
@@ -127,6 +127,7 @@
     void                     *onbuttonclickdata;
     GtkListBoxRow            *first_row;
     UiBool                   header_is_item;
+    UiSubListEventData       current_eventdata;
 };
 
 
--- a/ui/gtk/menu.c	Mon Nov 03 21:10:39 2025 +0100
+++ b/ui/gtk/menu.c	Tue Nov 04 20:38:19 2025 +0100
@@ -284,6 +284,7 @@
             event->callback = list->callback;
             event->value = i - 1;
             event->customdata = elm;
+            event->customint = UI_EVENT_DATA_LIST_ELM;
 
             g_signal_connect(
                 widget,
@@ -309,9 +310,17 @@
     evt.obj = event->obj;
     evt.window = event->obj->window;
     evt.document = event->obj->ctx->document;
+    if(event->customdata) {
+        evt.eventdata = event->customdata;
+        evt.eventdatatype = event->customint;
+    } else {
+        evt.eventdata = uic_get_tmp_eventdata();
+        evt.eventdatatype = uic_get_tmp_eventdata_type();
+    }
     evt.eventdata = event->customdata;
     evt.intval = event->value;
-    event->callback(&evt, event->userdata);    
+    event->callback(&evt, event->userdata);   
+    uic_set_tmp_eventdata(NULL, 0);
 }
 
 void ui_menu_event_toggled(GtkCheckMenuItem *ci, UiEventData *event) {
@@ -747,10 +756,16 @@
     evt.obj = event->obj;
     evt.window = event->obj->window;
     evt.document = event->obj->ctx->document;
-    evt.eventdata = event->customdata;
-    evt.eventdatatype = event->customint;
+    if(event->customdata) {
+        evt.eventdata = event->customdata;
+        evt.eventdatatype = event->customint;
+    } else {
+        evt.eventdata = uic_get_tmp_eventdata();
+        evt.eventdatatype = uic_get_tmp_eventdata_type();
+    }
     evt.intval = intval;
-    event->callback(&evt, event->userdata);    
+    event->callback(&evt, event->userdata);
+    uic_set_tmp_eventdata(NULL, 0);
 }
 
 void ui_menu_list_item_activate_event_wrapper(GSimpleAction* self, GVariant* parameter, UiEventData *event) {

mercurial