intval in radio button events should be the button state (GTK)

Wed, 24 Dec 2025 08:47:12 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Wed, 24 Dec 2025 08:47:12 +0100
changeset 1022
4ab47c0f92ea
parent 1020
cae4af417424
child 1023
d9b6b85cc210

intval in radio button events should be the button state (GTK)

ui/gtk/button.c file | annotate | diff | comparison | revisions
--- a/ui/gtk/button.c	Tue Dec 23 18:24:04 2025 +0100
+++ b/ui/gtk/button.c	Wed Dec 24 08:47:12 2025 +0100
@@ -505,33 +505,41 @@
 #define RADIOBUTTON_GET_ACTIVE(button) gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))
 #endif
 
-static void radiobutton_toggled(void *widget, UiEventData *event) {
+static void radiobutton_toggled(void *widget, UiVarEventData *event) {
+    gboolean active = RADIOBUTTON_GET_ACTIVE(widget);
+    
     UiEvent e;
     e.obj = event->obj;
     e.window = event->obj->window;
     e.document = event->obj->ctx->document;
     e.eventdata = NULL;
     e.eventdatatype = 0;
-    e.intval = RADIOBUTTON_GET_ACTIVE(widget);
+    e.intval = active;
     e.set = ui_get_setop();
-    event->callback(&e, event->userdata);    
+    
+    if(event->callback) {
+        event->callback(&e, event->userdata);    
+    }
+    
+    if(active && event->var) {
+        UiInteger *i = event->var->value;
+        
+        e.intval = i->get(i);
+        ui_notify_evt(i->observers, &e);
+    }
 }
 
 typedef struct UiRadioButtonData {
-    UiInteger *value;
-    UiVarEventData *eventdata;
+    UiObject *obj;
+    UiVar *var;
     UiBool first;
 } UiRadioButtonData;
 
 static void destroy_radiobutton(GtkWidget *w, UiRadioButtonData *data) {
     if(data->first) {
-        ui_destroy_vardata(w, data->eventdata);
-        g_slist_free(data->value->obj);
-        data->value->obj = NULL;
-        data->value->get = NULL;
-        data->value->set = NULL;
-    } else {
-        free(data->eventdata);
+        UiInteger *value = data->var->value;
+        ui_destroy_boundvar(data->obj->ctx, data->var);
+        g_slist_free(value->obj);
     }
     free(data);
 }
@@ -554,6 +562,16 @@
     GtkWidget *rbutton = RADIOBUTTON_NEW(rg, args->label); 
     ui_set_name_and_style(rbutton, args->name, args->style_class);
     ui_set_widget_states(obj->ctx, rbutton, args->states);
+    
+    UiVarEventData *event = malloc(sizeof(UiVarEventData));
+    event->obj = obj;
+    event->var = var;
+    event->observers = NULL;
+    event->callback = args->onchange;
+    event->userdata = args->onchangedata;
+    event->customint1 = 0;
+    event->customint2 = 0;
+    
     if(rgroup) {
 #if GTK_MAJOR_VERSION >= 4
         if(rg) {
@@ -571,52 +589,28 @@
         
         ui_radiobutton_set(rgroup, rgroup->value);
         
-        UiVarEventData *event = malloc(sizeof(UiVarEventData));
-        event->obj = obj;
-        event->var = var;
-        event->observers = NULL;
-        event->callback = NULL;
-        event->userdata = NULL;
-        event->customint1 = 0;
-        event->customint2 = 0;
-        
         UiRadioButtonData *rbdata = malloc(sizeof(UiRadioButtonData));
-        rbdata->value = rgroup;
-        rbdata->eventdata = event;
+        rbdata->obj = obj;
+        rbdata->var = var;
         rbdata->first = first;
         
         g_signal_connect(
                 rbutton,
-                "toggled",
-                G_CALLBACK(ui_radio_obs),
-                event);
-        g_signal_connect(
-                rbutton,
                 "destroy",
                 G_CALLBACK(destroy_radiobutton),
                 rbdata);
     }
-    
-    if(args->onchange) {
-        UiEventData *event = malloc(sizeof(UiEventData));
-        event->obj = obj;
-        event->userdata = args->onchangedata;
-        event->callback = args->onchange;
-        event->value = 0;
-        event->customdata = NULL;
-        event->customint = 0;
         
-        g_signal_connect(
-                rbutton,
-                "toggled",
-                G_CALLBACK(radiobutton_toggled),
-                event);
-        g_signal_connect(
-                rbutton,
-                "destroy",
-                G_CALLBACK(ui_destroy_userdata),
-                event);
-    }
+    g_signal_connect(
+            rbutton,
+            "toggled",
+            G_CALLBACK(radiobutton_toggled),
+            event);
+    g_signal_connect(
+            rbutton,
+            "destroy",
+            G_CALLBACK(ui_destroy_userdata),
+            event);
     
     UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end;
     UiLayout layout = UI_ARGS2LAYOUT(args);
@@ -625,20 +619,6 @@
     return rbutton;
 }
 
-void ui_radio_obs(GtkToggleButton *widget, UiVarEventData *event) {
-    UiInteger *i = event->var->value;
-    
-    UiEvent e;
-    e.obj = event->obj;
-    e.window = event->obj->window;
-    e.document = event->obj->ctx->document;
-    e.eventdata = NULL;
-    e.eventdatatype = 0;
-    e.intval = i->get(i);
-    
-    ui_notify_evt(i->observers, &e);
-}
-
 #if GTK_MAJOR_VERSION >= 4
 int64_t ui_radiobutton_get(UiInteger *value) {
     int selection = 0;

mercurial