diff -r 64ded9f6a6c6 -r 6606616eca9f ui/motif/window.c --- a/ui/motif/window.c Tue Feb 25 21:11:00 2025 +0100 +++ b/ui/motif/window.c Sat Apr 05 16:46:11 2025 +0200 @@ -45,16 +45,27 @@ static int window_default_width = 600; static int window_default_height = 500; -static void window_close_handler(Widget window, void *udata, void *cdata) { - UiObject *obj = udata; +void ui_window_widget_destroy(UiObject *obj) { + XtDestroyWidget(obj->widget); uic_object_destroy(obj); - nwindows--; if(nwindows == 0) { ui_exit_mainloop(); } } +static void window_close_handler(Widget window, void *udata, void *cdata) { + UiObject *obj = udata; + + uic_context_prepare_close(obj->ctx); + obj->ref--; + if(obj->ref > 0) { + XtUnmapWidget(obj->widget); + } else { + ui_window_widget_destroy(obj); + } +} + static UiObject* create_window(const char *title, void *window_data, Boolean simple) { CxMempool *mp = cxMempoolCreateSimple(256); @@ -62,6 +73,7 @@ UiObject *obj = cxCalloc(a, 1, sizeof(UiObject)); obj->ctx = uic_context(obj, mp); obj->window = window_data; + obj->destroy = ui_window_widget_destroy; Arg args[16]; int n = 0;