diff -r 450a813dc2a5 -r 3f2b3d15668b ui/gtk/menu.c --- a/ui/gtk/menu.c Sun Sep 29 11:29:37 2024 +0200 +++ b/ui/gtk/menu.c Sun Sep 29 13:33:34 2024 +0200 @@ -597,13 +597,14 @@ ls->getvalue = il->getvalue; UiVar* var = uic_create_var(ui_global_context(), il->varname, UI_VAR_LIST); - ls->list = var->value; + ls->var = var; + UiList *list = var->value; ls->callback = il->callback; ls->userdata = il->userdata; - ls->list->observers = ui_add_observer( - ls->list->observers, + list->observers = ui_add_observer( + list->observers, (ui_callback)ui_update_gmenu_item_list, ls); @@ -616,13 +617,13 @@ event->obj = obj; event->userdata = il->userdata; event->callback = il->callback; - event->customdata = NULL; + event->customdata = var; event->value = 0; g_signal_connect( action, "activate", - G_CALLBACK(ui_activate_event_wrapper), + G_CALLBACK(ui_menu_list_item_activate_event_wrapper), event); g_signal_connect( obj->widget, @@ -648,16 +649,32 @@ event->callback(&evt, event->userdata); } +void ui_menu_list_item_activate_event_wrapper(GSimpleAction* self, GVariant* parameter, UiEventData *event) { + int index = g_variant_get_int32(parameter); + UiVar *var = event->customdata; + UiList *list = var->value; + + UiEvent evt; + evt.obj = event->obj; + evt.window = event->obj->window; + evt.document = event->obj->ctx->document; + evt.eventdata = ui_list_get(list, index); + evt.intval = index; + event->callback(&evt, event->userdata); + +} + void ui_update_gmenu_item_list(UiEvent *event, UiActiveGMenuItemList *list) { // remove old items for(int i=0;ioldcount;i++) { g_menu_remove(list->menu, list->index); } + UiList *ls = list->var->value; // add list items ui_getvaluefunc getvalue = list->getvalue; int i = 0; - void* elm = ui_list_first(list->list); + void* elm = ui_list_first(ls); while(elm) { char *label = (char*) (getvalue ? getvalue(elm, 0) : elm); @@ -666,7 +683,7 @@ g_menu_item_set_action_and_target_value(item, list->action, v); g_menu_insert_item(list->menu, list->index+i, item); - elm = ui_list_next(list->list); + elm = ui_list_next(ls); i++; }