--- a/ui/gtk/window.c Mon May 18 21:29:56 2026 +0200 +++ b/ui/gtk/window.c Tue May 19 18:10:13 2026 +0200 @@ -112,7 +112,12 @@ } } - obj->ref--; + if(obj->ref > 0) { + obj->ref--; + } else { + // warn about invalid reference counting + fprintf(stderr, "Error: UiObject %p ref == 0\n", obj); + } if(obj->ref > 0) { #if GTK_CHECK_VERSION(2, 18, 0) gtk_widget_set_visible(obj->widget, FALSE); @@ -138,12 +143,25 @@ } } +static void window_onclose_callback(UiObject *obj) { + if(obj->onclose) { + UiEvent event; + memset(&event, 0, sizeof(UiEvent)); + event.obj = obj; + event.window = obj->window; + event.document = obj->ctx->document; + obj->onclose(&event, obj->onclosedata); + } +} + #if GTK_MAJOR_VERSION >= 4 static gboolean close_request(GtkWindow* self, UiObject *obj) { + window_onclose_callback(obj); return ui_window_close_request(obj); } #else static gboolean close_request(GtkWidget* self, GdkEvent* event, UiObject *obj) { + window_onclose_callback(obj); return ui_window_close_request(obj); } #endif @@ -305,17 +323,23 @@ adw_header_bar_set_show_title(ADW_HEADER_BAR(headerbar_sidebar), FALSE); } else if(!strcmp(show_title, "sidebar")) { adw_header_bar_set_show_title(ADW_HEADER_BAR(headerbar_main), FALSE); - adw_header_bar_set_show_title(ADW_HEADER_BAR(headerbar_sidebar), TRUE); + if(headerbar_sidebar) { + adw_header_bar_set_show_title(ADW_HEADER_BAR(headerbar_sidebar), TRUE); + } } else if(!strcmp(show_title, "false")) { - adw_header_bar_set_show_title(ADW_HEADER_BAR(headerbar_sidebar), FALSE); + if(headerbar_sidebar) { + adw_header_bar_set_show_title(ADW_HEADER_BAR(headerbar_sidebar), FALSE); + } adw_header_bar_set_show_title(ADW_HEADER_BAR(headerbar_main), FALSE); } else { fprintf(stderr, "Unknown value '%s' for property ui.gtk.window.showtitle\n", show_title); - adw_header_bar_set_show_title(ADW_HEADER_BAR(headerbar_sidebar), FALSE); + if(headerbar_sidebar) { + adw_header_bar_set_show_title(ADW_HEADER_BAR(headerbar_sidebar), FALSE); + } } } else { adw_header_bar_set_show_title(ADW_HEADER_BAR(headerbar_main), FALSE); - if(sidebar) { + if(headerbar_sidebar) { adw_header_bar_set_show_title(ADW_HEADER_BAR(headerbar_sidebar), TRUE); } }