fix ui_action_set_state (GTK)

Thu, 16 Oct 2025 15:57:05 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Thu, 16 Oct 2025 15:57:05 +0200
changeset 852
a04cb4398034
parent 851
367b2bbbc07e
child 853
380ec881faa2

fix ui_action_set_state (GTK)

ui/gtk/menu.c file | annotate | diff | comparison | revisions
--- 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;
     

mercurial