implement actions for toggle buttons (GTK) default tip

Sat, 25 Apr 2026 21:29:37 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sat, 25 Apr 2026 21:29:37 +0200
changeset 1112
9250601f9d9a
parent 1111
3910be3b2ac6

implement actions for toggle buttons (GTK)

ui/gtk/button.c file | annotate | diff | comparison | revisions
ui/gtk/button.h file | annotate | diff | comparison | revisions
ui/gtk/headerbar.c file | annotate | diff | comparison | revisions
--- a/ui/gtk/button.c	Fri Apr 24 18:17:20 2026 +0200
+++ b/ui/gtk/button.c	Sat Apr 25 21:29:37 2026 +0200
@@ -188,7 +188,14 @@
     e.eventdatatype = 0;
     e.intval = gtk_toggle_button_get_active(widget);
     e.set = ui_get_setop();
-    event->callback(&e, event->userdata);    
+    
+    if(event->callback) {
+        event->callback(&e, event->userdata);    
+    }
+    
+    if(event->action) {
+        uic_action_callback(&e, event->action);
+    }
 }
 
 static void ui_togglebutton_enable_state_callback(GtkToggleButton *widget, UiEventData *event) {
@@ -209,6 +216,7 @@
         UiInteger *value,
         ui_callback onchange,
         void *onchangedata,
+        const char *action,
         int enable_state)
 {
     if(label) {
@@ -219,6 +227,14 @@
         gtk_widget_set_tooltip_text(togglebutton, tooltip);
     }
     
+   if(action) {
+        uic_bind_action(obj->ctx, action, togglebutton, (ui_enablefunc)ui_set_enabled);
+        UiAction *ui_action = uic_resolve_action(obj->ctx, action);
+        if(!ui_action) {
+            ui_set_enabled(togglebutton, FALSE);
+        }
+    }
+    
     ui_bind_togglebutton(
             obj,
             togglebutton,
@@ -229,6 +245,7 @@
             (ui_toggled_func)ui_toggled_callback,
             onchange,
             onchangedata,
+            action,
             (ui_toggled_func)ui_togglebutton_enable_state_callback,
             enable_state
             );
@@ -244,6 +261,7 @@
         void (*toggled_callback)(void*, void*),
         ui_callback onchange,
         void *onchangedata,
+        const char *action,
         void (*enable_state_func)(void*, void*),
         int enable_state)
 {
@@ -280,6 +298,7 @@
         event->obj = obj;
         event->userdata = onchangedata;
         event->callback = onchange;
+        event->action = action ? strdup(action) : NULL,
         event->value = 0;
         event->customdata = NULL;
         event->customint = 0;
@@ -292,10 +311,10 @@
         g_signal_connect(
                 widget,
                 "destroy",
-                G_CALLBACK(ui_destroy_userdata),
+                G_CALLBACK(ui_destroy_eventdata),
                 event);
     }
-    
+     
     if(enable_state > 0) {
         UiEventData *event = malloc(sizeof(UiEventData));
         event->obj = obj;
@@ -329,6 +348,7 @@
             args->value,
             args->onchange,
             args->onchangedata,
+            args->action,
             args->enable_state);
     ui_set_name_and_style(widget, args->name, args->style_class);
     ui_set_widget_states(obj->ctx, widget, args->states);
@@ -391,6 +411,7 @@
             (ui_toggled_func)ui_checkbox_callback,
             args->onchange,
             args->onchangedata,
+            args->action,
             (ui_toggled_func)ui_checkbox_enable_state,
             args->enable_state);
     
--- a/ui/gtk/button.h	Fri Apr 24 18:17:20 2026 +0200
+++ b/ui/gtk/button.h	Sat Apr 25 21:29:37 2026 +0200
@@ -72,6 +72,7 @@
         UiInteger *value,
         ui_callback onchange,
         void *onchangedata,
+        const char *action,
         int enable_state);
 
 void ui_bind_togglebutton(
@@ -84,6 +85,7 @@
         void (*toggled_callback)(void*, void*),
         ui_callback onchange,
         void *onchangedata,
+        const char *action,
         void (*enable_state_func)(void*, void*),
         int enable_state);
     
--- a/ui/gtk/headerbar.c	Fri Apr 24 18:17:20 2026 +0200
+++ b/ui/gtk/headerbar.c	Sat Apr 25 21:29:37 2026 +0200
@@ -181,7 +181,7 @@
     ui_set_widget_states(obj->ctx, button, item->args.states);
     ui_set_widget_visibility_states(obj->ctx, button, item->args.visibility_states);
     WIDGET_ADD_CSS_CLASS(button, "flat");
-    ui_setup_togglebutton(obj, button, item->args.label, item->args.icon, item->args.tooltip, item->args.varname, NULL, item->args.onchange, item->args.onchangedata, 0);
+    ui_setup_togglebutton(obj, button, item->args.label, item->args.icon, item->args.tooltip, item->args.varname, NULL, item->args.onchange, item->args.onchangedata, item->args.action, 0);
     headerbar_add(headerbar, box, button, pos);
 }
 

mercurial