--- a/ui/cocoa/window.m Sat Jun 06 16:53:39 2026 +0200 +++ b/ui/cocoa/window.m Sat Jun 06 18:04:54 2026 +0200 @@ -50,19 +50,23 @@ static int splitview_window_default_pos = -1; static UiBool splitview_window_use_prop = TRUE; +static void main_window_destroy(UiObject *obj) { + MainWindow *window = (__bridge MainWindow*)obj->wobj; + [[WindowManager sharedWindowManager] closeWindow:window]; +} + static UiObject* create_window(const char *title, BOOL simple, BOOL sidebar, BOOL splitview) { UiObject *obj = uic_object_new_toplevel(); MainWindow *window = [[MainWindow alloc] init:obj withSidebar:sidebar withSplitview:splitview]; - [[WindowManager sharedWindowManager] addWindow:window]; - window.releasedWhenClosed = false; // TODO: we still need a cleanup strategy obj->wobj = (__bridge void*)window; + obj->destroy = main_window_destroy; MainWindowController *controller = [[MainWindowController alloc] initWithWindow:obj window:window]; window.windowController = controller; [window setNextResponder:(NSResponder*)controller]; - objc_setAssociatedObject(window, "windowcontroller", controller, OBJC_ASSOCIATION_RETAIN); + [[WindowManager sharedWindowManager] addWindow:controller]; return obj; }