# HG changeset patch # User Olaf Wintermann # Date 1760623025 -7200 # Node ID a04cb4398034b18f383e8eb34e53d48b21ba9d5a # Parent 367b2bbbc07e549c02a44f4386af2eb3e15c982e fix ui_action_set_state (GTK) diff -r 367b2bbbc07e -r a04cb4398034 ui/gtk/menu.c --- a/ui/gtk/menu.c Thu Oct 16 10:48:16 2025 +0200 +++ b/ui/gtk/menu.c Thu Oct 16 15:57:05 2025 +0200 @@ -506,13 +506,43 @@ } } +static void stateful_action_notify_group(UiMenuRadioGroup *group, UiInteger *i) { + UiEvent event; + event.obj = group->obj; + event.window = event.obj->window; + event.document = event.obj->ctx->document; + event.eventdata = NULL; + event.eventdatatype = 0; + event.intval = (int)i->value; + event.set = ui_get_setop(); + + CxIterator iter = cxListIterator(group->callbacks); + cx_foreach(UiCallbackData *, cb, iter) { + if(cb->callback) { + cb->callback(&event, cb->userdata); + } + } + + UiObserver *obs = i->observers; + while(obs) { + if(obs->callback) { + obs->callback(&event, obs->data); + } + obs = obs->next; + } +} + static void ui_action_set_state(UiInteger *i, int64_t value) { - UiMenuRadioGroup *group = i->obj; i->value = value; - char buf[32]; - snprintf(buf, 32, "%d", (int)value); - GVariant *state = g_variant_new_string(buf); - g_action_change_state(G_ACTION(group->action), state); + CxList *bindings = i->obj; + CxIterator iter = cxListIterator(bindings); + cx_foreach(UiMenuRadioGroup *, group, iter) { + char buf[32]; + snprintf(buf, 32, "%d", (int)value); + GVariant *state = g_variant_new_string(buf); + g_action_change_state(G_ACTION(group->action), state); + stateful_action_notify_group(group, i); + } } static int64_t ui_action_get_state(UiInteger *i) { @@ -562,33 +592,14 @@ i->value = v; } - UiEvent event; - event.obj = group->obj; - event.window = event.obj->window; - event.document = event.obj->ctx->document; - event.eventdata = NULL; - event.eventdatatype = 0; - event.intval = v; - event.set = ui_get_setop(); - - CxIterator iter = cxListIterator(group->callbacks); - cx_foreach(UiCallbackData *, cb, iter) { - if(cb->callback) { - cb->callback(&event, cb->userdata); - } - } - - UiObserver *obs = i->observers; - while(obs) { - if(obs->callback) { - obs->callback(&event, obs->data); - } - obs = obs->next; + CxList *bindings = i->obj; + CxIterator iter = cxListIterator(bindings); + cx_foreach(UiMenuRadioGroup *, gr, iter) { + stateful_action_notify_group(gr, i); } } - void ui_gmenu_add_radioitem(GMenu *parent, int index, UiMenuItemI *item, UiObject *obj) { UiMenuRadioItem *i = (UiMenuRadioItem*)item;