improve exit behavior (GTK)

Sun, 20 Jul 2025 12:27:33 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sun, 20 Jul 2025 12:27:33 +0200
changeset 673
90a32d739b8e
parent 672
1b08ba076b65
child 674
51670b0bc625

improve exit behavior (GTK)

application/main.c file | annotate | diff | comparison | revisions
ui/gtk/toolkit.c file | annotate | diff | comparison | revisions
ui/ui/toolkit.h file | annotate | diff | comparison | revisions
--- a/application/main.c	Fri Jul 18 21:54:33 2025 +0200
+++ b/application/main.c	Sun Jul 20 12:27:33 2025 +0200
@@ -521,7 +521,7 @@
     ui_attach_document(obj->ctx, doc);
     
     ui_sidebar(obj, .margin = 0, .spacing = 0) {
-        ui_sourcelist(obj, .fill = UI_ON,
+        ui_sourcelist(obj, .fill = TRUE,
                 .getvalue = sourcelist_getvalue,
                 .sublists = UI_SUBLISTS(UI_SUBLIST(.varname = "srclist1", .header = "Header 1", .userdata = "Sublist1"), UI_SUBLIST(.varname = "srclist2", .header = "Header 2", .userdata = "Sublist2")),
                 .onactivate = action_sourcelist_activate);
@@ -529,12 +529,12 @@
     
     ui_tabview(obj, .spacing=10, .margin=10, .tabview = UI_TABVIEW_NAVIGATION_SIDE, .varname="tabview") {
         ui_tab(obj, "Tab 0") {
-            ui_vbox(obj, .fill = UI_OFF, .margin = 15, .spacing = 15) {
+            ui_vbox(obj, .fill = FALSE, .margin = 15, .spacing = 15) {
                 ui_button(obj, .label = "Test Button", .icon = "application-x-generic", .onclick = action_button);
                 ui_togglebutton(obj, .label = "Toggle");
                 ui_checkbox(obj, .label = "My Checkbox");
             }
-            ui_grid(obj, .fill = UI_OFF, .columnspacing = 15, .rowspacing = 15, .margin = 15) {
+            ui_grid(obj, .fill = FALSE, .columnspacing = 15, .rowspacing = 15, .margin = 15) {
                 ui_button(obj, .label = "Activate Group 1", .hexpand = TRUE, .onclick = action_group1);
                 ui_button(obj, .label = "Disable Group 1", .onclick = action_group1, .onclickdata = "disable");
                 ui_newline(obj);
@@ -590,10 +590,10 @@
             UiModel *model = ui_model(obj->ctx, UI_STRING, "col1", UI_INTEGER, "col2", UI_ICON, "col3", UI_ICON_TEXT, "col4", UI_INTEGER, "col5", -1);
             model->columnsize[0] = -1;
             model->getvalue = table_getvalue;
-            ui_table(obj, .model = model, .list = doc->list2, .colspan = 2, .fill = UI_ON, .contextmenu = menubuilder, .multiselection = TRUE,
+            ui_table(obj, .model = model, .list = doc->list2, .colspan = 2, .fill = TRUE, .contextmenu = menubuilder, .multiselection = TRUE, .fill = TRUE,
                     .onactivate = action_table_activate, .onactivatedata = "activate",
                     .onselection = action_table_activate, .onselectiondata = "selection");
-            ui_hbox(obj, .fill = UI_OFF) {
+            ui_hbox(obj, .fill = FALSE) {
                 ui_textfield(obj, .value = doc->list_input);
                 ui_button(obj, .label = "Update List Item 1", .onclick = action_update_list);
             }
@@ -607,7 +607,7 @@
             ui_button(obj, .label = "Button 6", .onclick=action_tab2_button);
         }
         ui_tab(obj, "Tab 3") {
-            UiTabViewArgs args = {0};
+            UiTabViewArgs args = {.fill = TRUE};
             UI_CTN(obj, tabview=ui_tabview_create(obj, &args)) {
                 UiObject *tab1 = ui_tabview_add(tabview, "Sub 1", -1);
                 ui_button(tab1, .label = "Button 1");
@@ -618,15 +618,15 @@
             }
         }
         ui_tab(obj, "Tab 4") {
-            ui_textarea(obj, .varname = "text");
+            ui_textarea(obj, .varname = "text", .fill = TRUE);
         }
         ui_tab(obj, "Tab 5") {
             ui_button(obj, .label = "Test Button", .icon = "application-x-generic", .onclick = action_button);
-            ui_imageviewer(obj, .varname = "image", .style_class = "imageviewer", .contextmenu = menubuilder, .scrollarea = TRUE, .useradjustable = TRUE, .autoscale = TRUE);
+            ui_imageviewer(obj, .varname = "image", .style_class = "imageviewer", .contextmenu = menubuilder, .scrollarea = TRUE, .useradjustable = TRUE, .autoscale = TRUE, .fill = TRUE);
         }
         
         ui_tab(obj, "Tab 6") {
-            ui_scrolledwindow(obj, .fill = UI_ON) {
+            ui_scrolledwindow(obj, .fill = TRUE) {
                 ui_expander(obj, .label = "Expander", .margin = 10, .spacing = 10) {
                     ui_label(obj, .label = "Test");
                     ui_button(obj, .label = "Button");
@@ -648,18 +648,18 @@
         }
         
         ui_tab(obj, "Tab 7") {
-            ui_itemlist(obj, .create_ui = create_item, .varname = "items", .subcontainer = UI_CONTAINER_HBOX, .sub_spacing = 10, .margin = 10, .spacing = 4, .userdata = doc);
+            ui_itemlist(obj, .create_ui = create_item, .varname = "items", .subcontainer = UI_CONTAINER_HBOX, .sub_spacing = 10, .margin = 10, .spacing = 4, .userdata = doc, .fill = TRUE);
         }
         
         ui_tab(obj, "Tab 8") {
-            ui_hsplitpane(obj, .initial_position = 100) {
+            ui_hsplitpane(obj, .initial_position = 100, .fill = TRUE) {
                 ui_button(obj, .label = "Button 1");
                 ui_button(obj, .label = "Button 2");
             }
         }
         ui_tab(obj, "Tab 9") {
 #ifdef UI_WEBVIEW
-          ui_webview(obj, .fill = UI_ON, .value = doc->web);
+          ui_webview(obj, .fill = TRUE, .value = doc->web);
           cxstring html = CX_STR("<html><body><h1>Hello Toolkit</h1><p>Toolkit WebView</p></body></html>");
           ui_webview_load_content(doc->web, "mypage", html.ptr, html.length, NULL, NULL);
 #else
--- a/ui/gtk/toolkit.c	Fri Jul 18 21:54:33 2025 +0200
+++ b/ui/gtk/toolkit.c	Sun Jul 20 12:27:33 2025 +0200
@@ -66,6 +66,8 @@
 
 static int scale_factor = 1;
 
+static UiBool        exit_on_shutdown;
+
 UIEXPORT void ui_init(const char *appname, int argc, char **argv) {
     application_name = appname;
     uic_init_global_context();
@@ -110,8 +112,15 @@
     exit_data = userdata;
 }
 
+void ui_app_onexit(void) {
+    uic_store_app_properties();
+}
 
-#ifndef UI_GTK2
+void ui_app_exit_on_shutdown(UiBool exitapp) {
+    exit_on_shutdown = exitapp;
+}
+
+#ifdef UI_APPLICATION
 static void app_startup(GtkApplication* app, gpointer userdata) {
     if(startup_func) {
         startup_func(NULL, startup_data);
@@ -119,8 +128,16 @@
 }
 
 static void app_activate(GtkApplication* app, gpointer userdata) {
-    printf("activate\n");
+    //printf("activate\n");
 }
+
+static void app_shutdown(GtkApplication *app, gpointer userdata) {
+    if(exit_func) {
+        exit_func(NULL, exit_data);
+    }
+    ui_app_onexit();
+}
+
 #endif
 
 void ui_main() {
@@ -130,6 +147,7 @@
             application_name ? application_name : "application1");
     app = UI_APPLICATION_NEW(appid.ptr);
     g_signal_connect (app, "startup", G_CALLBACK (app_startup), NULL);
+    g_signal_connect (app, "shutdown", G_CALLBACK (app_shutdown), NULL);
     g_signal_connect (app, "activate", G_CALLBACK (app_activate), NULL);
     g_application_run(G_APPLICATION (app), 0, NULL);
     g_object_unref (app);
@@ -140,11 +158,14 @@
         startup_func(NULL, startup_data);
     }
     gtk_main();
-#endif
     if(exit_func) {
         exit_func(NULL, exit_data);
     }
-    uic_store_app_properties();
+    ui_app_onexit();
+#endif
+    if(exit_on_shutdown) {
+        exit(0);
+    }
 }
 
 #ifndef UI_GTK2
--- a/ui/ui/toolkit.h	Fri Jul 18 21:54:33 2025 +0200
+++ b/ui/ui/toolkit.h	Sun Jul 20 12:27:33 2025 +0200
@@ -514,6 +514,9 @@
 UIEXPORT void ui_onopen(ui_callback f, void *userdata);
 UIEXPORT void ui_onexit(ui_callback f, void *userdata);
 
+UIEXPORT void ui_app_onexit(void);
+UIEXPORT void ui_app_exit_on_shutdown(UiBool exitapp);
+
 UIEXPORT void ui_main(void);
 UIEXPORT void ui_show(UiObject *obj);
 UIEXPORT void ui_close(UiObject *obj);

mercurial