]> uap-core.de Git - note.git/commitdiff
toolkit update: fix note title updates
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Sat, 6 Jun 2026 16:46:48 +0000 (18:46 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Sat, 6 Jun 2026 16:46:48 +0000 (18:46 +0200)
14 files changed:
ui/cocoa/EventData.h
ui/cocoa/MainWindow.h
ui/cocoa/MainWindow.m
ui/cocoa/Toolbar.h
ui/cocoa/WindowManager.h
ui/cocoa/WindowManager.m
ui/cocoa/appdelegate.m
ui/cocoa/button.m
ui/cocoa/text.m
ui/cocoa/toolkit.h
ui/cocoa/toolkit.m
ui/cocoa/webview.m
ui/cocoa/window.m
ui/common/types.c

index f82f1d4cfc9eaeadca6ed3353d1bf3e94e579335..f0c8eacfc62c4597e4065fed6757f1a52c914a6f 100644 (file)
@@ -29,7 +29,7 @@
 #import "../ui/toolkit.h"
 #import "../common/context.h"
 
-typedef void(*get_eventdata_func)(id sender, UiVar *var, void **eventdata, int *eventdatatype, int *value);
+typedef void(*get_eventdata_func)(id sender, UiVar *var, void **eventdata, UiEventType *eventdatatype, int *value);
 
 @interface EventData : NSObject
 @property UiObject           *obj;
index 7c8cbf63d9688d0925b2c2a55105330f5f1758ac..52ad47fa9dc0151d86d46a9749eb30e732999027 100644 (file)
@@ -29,7 +29,7 @@
 #import "toolkit.h"
 #import "../ui/window.h"
 
-@interface MainWindow : NSWindow<UiToplevelObject>
+@interface MainWindow : NSWindow<UiToplevelObject, NSWindowDelegate>
 
 @property UiObject *obj;
 @property (strong) NSSplitView *splitview;
@@ -38,7 +38,8 @@
 @property (strong) NSView *rightPanel;
 @property int topOffset;
 
-- (MainWindow*)init:(UiObject*)obj withSidebar:(BOOL)hasSidebar withSplitview:(BOOL)hasSplitview;
+- (MainWindow*)init:(UiObject*)obj withSidebar:(BOOL)hasSidebar withSplitview:(BOOL)hasSplitview width:(int)width height:(int)height;
+- (void) saveWindowSize;
 
 @end
 
index d46025f710527f91082b5b0b0f2f7a84a9fa00bd..944c9aa3206a736f5302a42828a59a4c38727b71 100644 (file)
@@ -27,6 +27,7 @@
  */
 
 #import "MainWindow.h"
+#import "WindowManager.h"
 #import "container.h"
 #import "GridLayout.h"
 #import "BoxContainer.h"
 #import "menu.h"
 #import "Toolbar.h"
 
+
+
 @implementation MainWindow
 
-- (MainWindow*)init:(UiObject*)obj withSidebar:(BOOL)hasSidebar withSplitview:(BOOL)hasSplitview{
-    NSRect frame = NSMakeRect(300, 200, 600, 500);
+- (MainWindow*)init:(UiObject*)obj withSidebar:(BOOL)hasSidebar withSplitview:(BOOL)hasSplitview width:(int)width height:(int)height {
+    NSRect frame = NSMakeRect(300, 200, width, height);
     
     self = [self initWithContentRect:frame
                            styleMask:NSWindowStyleMaskTitled |
@@ -51,7 +54,7 @@
                              backing:NSBackingStoreBuffered
                                defer:false];
     _obj = obj;
-    
+    self.delegate = self;
     
     int top = 4;
     NSView *content = self.contentView;
         [self setToolbar:toolbar];
     }
     
-    
     return self;
 }
 
+- (void) saveWindowSize {
+    CGSize size = self.frame.size;
+    if(size.width > 0 && size.height > 0) {
+        char width_str[32];
+        char height_str[32];
+        snprintf(width_str, 32, "%d", (int)size.width);
+        snprintf(height_str, 32, "%d", (int)size.height);
+        ui_set_property("ui.window.width", width_str);
+        ui_set_property("ui.window.height", height_str);
+    }
+}
+
 - (BOOL) getIsVisible {
     return [self isVisible];
 }
     }
 }
 
+- (void) windowWillClose:(NSNotification *) notification {
+    UiObject *obj = _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(obj->ref > 0) {
+        obj->ref--;
+    } else {
+        // warn about invalid reference counting
+        NSLog(@"Error: UiObject %p ref == 0\n", obj);
+    }
+    
+    if(obj->ref == 0) {
+        [self saveWindowSize];
+        // this cleans up any widget references from the context
+        uic_context_prepare_close(obj->ctx);
+        [[WindowManager sharedWindowManager] closeWindow:self];
+    }
+}
 
+- (void) dealloc {
+    uic_object_destroy(_obj);
+    NSLog(@"MainWindow dealloc");
+}
 @end
 
 
index 7ec7bbd5d4d11fcc6287a0f6bda5e36f26140c44..042fa240462d2fe723f8924581d510044b6b9446 100644 (file)
@@ -50,7 +50,7 @@
     NSMutableArray<NSString*> *defaultItems;
 }
 
-@property MainWindow *window;
+@property (weak) MainWindow *window;
 @property UiObject *obj;
 
 - (UiToolbar*) initWithWindow:(MainWindow*)window;
index 7f1b225af6c36332b4f5e3b6865475eadb70513b..76e3c655c83004c58a3871a1790468d21575cba0 100644 (file)
 
 #import "toolkit.h"
 
-@interface WindowManager : NSObject<NSWindowDelegate>
+@interface WindowManager : NSObject
 
-@property NSMutableArray<NSWindow*> *windows;
+@property NSMutableArray<NSWindowController*> *windows;
 
 + (WindowManager*) sharedWindowManager;
 
 - (WindowManager*)init;
 
-- (void)addWindow:(NSWindow*)win;
+- (void)addWindow:(NSWindowController*)win;
+
+- (void)closeWindow:(NSWindow*)win;
+
+- (void)shutdown;
 
 @end
index ca0318211603b3faee8aa7a65622257161ab194a..9b5d04a26561b11354c7e90984d4cfc87424bbe9 100644 (file)
@@ -27,6 +27,7 @@
  */
 
 #import "WindowManager.h"
+#import "MainWindow.h"
 
 @implementation WindowManager
 
@@ -44,14 +45,21 @@ static WindowManager *instance = nil;
     return self;
 }
 
-- (void)addWindow:(NSWindow*)win {
+- (void)addWindow:(NSWindowController*)win {
     [_windows addObject:win];
-    [win setDelegate:self];
 }
 
-- (void) windowWillClose:(NSNotification *) notification {
-    NSWindow *window = notification.object;
-    [_windows removeObject:window];
+- (void)closeWindow:(NSWindow*)win {
+    [_windows removeObject:win.windowController];
+}
+
+- (void)shutdown {
+    if(_windows.count > 0) {
+        NSWindowController *controller = _windows.firstObject;
+        MainWindow *win = (MainWindow*)controller.window;
+        [win saveWindowSize];
+    }
+    [_windows removeAllObjects];
 }
 
 @end
index 82d90206b11dbf501a54e33e8a928b914cf59bf5..690053f991a3f37c5fc044b118f5794212b88662 100644 (file)
  */
 
 #import "AppDelegate.h"
+#import "WindowManager.h"
 
 #import "toolkit.h"
 #import "menu.h"
 
+#import "../common/app.h"
+
 @implementation AppDelegate
 
 - (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
     ui_menu_init();
     NSLog(@"toolkit applicationDidFinishLaunching");
-    ui_cocoa_onstartup();
+    uic_application_startup(NULL);
 }
 
 - (void)applicationWillTerminate:(NSNotification *)aNotification {
     NSLog(@"toolkit applicationWillTerminate");
-    ui_cocoa_onexit();
+    uic_application_exit(NULL);
+    [[WindowManager sharedWindowManager] shutdown];
+    ui_app_save_settings();
 }
 
 
index 9a85451c572fd211695cfc511a2cffb47257c2fb..dd1c55945945c0756f0caa7cf0eeef9f09a5a63d 100644 (file)
@@ -64,7 +64,7 @@ UIWIDGET ui_button_create(UiObject* obj, UiButtonArgs *args) {
 }
 
 
-static void togglebutton_eventdata(id button, UiVar *var, void **eventdata, int *eventdatatype, int *value) {
+static void togglebutton_eventdata(id button, UiVar *var, void **eventdata, UiEventType *eventdatatype, int *value) {
     NSButton *btn = (NSButton*)button;
     NSControlStateValue state = btn.state;
     *value = (int)state;
@@ -137,7 +137,7 @@ UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs *args) {
     return togglebutton_create(obj, args, NSButtonTypeSwitch);
 }
 
-static void switch_eventdata(id button, UiVar *var, void **eventdata, int *eventdatatype, int *value) {
+static void switch_eventdata(id button, UiVar *var, void **eventdata, UiEventType *eventdatatype, int *value) {
     NSSwitch *btn = (NSSwitch*)button;
     NSControlStateValue state = btn.state;
     *value = (int)state;
@@ -207,7 +207,7 @@ void ui_switch_set(UiInteger *i, int64_t value) {
 
 @end
 
-static void radiobutton_eventdata(id button, UiVar *var, void **eventdata, int *eventdatatype, int *value) {
+static void radiobutton_eventdata(id button, UiVar *var, void **eventdata, UiEventType *eventdatatype, int *value) {
     if(var) {
         UiInteger *i = var->value;
         NSMutableArray *buttons = (__bridge NSMutableArray*)i->obj;
index b2709d673292dba7c7607d6cba39baad146a0a1c..acbffedd33a593bcc31b203fc38e6b584201f4b7 100644 (file)
@@ -73,7 +73,9 @@ UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs *args) {
     }
     
     if(args->onchange || args->ontextchanged || args->onchange_action || args->ontextchanged_action) {
-        
+        TextAreaDelegate * tad = [[TextAreaDelegate alloc] init:obj var:var args:args];
+        textview.delegate = tad;
+        objc_setAssociatedObject(textview, "delegate", tad, OBJC_ASSOCIATION_RETAIN);
     }
     
     return (__bridge void*)scrollview;
@@ -379,7 +381,7 @@ void ui_textarea_remove(UiText *text, int begin, int end) {
 
 /* -------------------------- TextField -------------------------- */
 
-static void textfield_geteventdata(id sender, UiVar *var, void **eventdata, int *eventdatatype, int *value) {
+static void textfield_geteventdata(id sender, UiVar *var, void **eventdata, UiEventType *eventdatatype, int *value) {
     
 }
 
index 9a377b35343359056fbe034648f9c8b35cc6d1f9..ab4c6da5f5f5909a9403dfad85f03aaa925b18f9 100644 (file)
@@ -51,7 +51,4 @@
 
 @end
 
-void ui_cocoa_onstartup(void);
-void ui_cocoa_onopen(const char *file);
-void ui_cocoa_onexit(void);
 
index 66e496851c684080417a2aeddf4d41c5ff02ad48..9a8e3095ced1e9cbaa2f021dde101e5d72db5fe7 100644 (file)
@@ -114,40 +114,10 @@ void ui_app_exit_on_shutdown(UiBool exitapp) {
     exit_on_shutdown = exitapp;
 }
 
-void ui_cocoa_onstartup(void) {
-    UiEvent e;
-    e.obj = NULL;
-    e.window = NULL;
-    e.document = NULL;
-    e.eventdata = NULL;
-    e.intval = 0;
-    uic_application_startup(&e);
-}
-
-void ui_cocoa_onopen(const char *file) {
-    UiEvent e;
-    e.obj = NULL;
-    e.window = NULL;
-    e.document = NULL;
-    e.eventdata = NULL;
-    e.intval = 0;
-    uic_application_open(&e);
-}
-
-void ui_cocoa_onexit(void) {
-    UiEvent e;
-    e.obj = NULL;
-    e.window = NULL;
-    e.document = NULL;
-    e.eventdata = NULL;
-    e.intval = 0;
-    uic_application_exit(&e);
-}
-
 void ui_main(void) {
     main_thr_check("ui_main");
     
-    NSApplicationMain(app_argc, app_argv);
+    NSApplicationMain(app_argc,app_argv);
     //[NSApp finishLaunching];
     //[NSApp activateIgnoringOtherApps:YES];
     //[NSApp run];
index 088ad5f67aa673f5a36d96bd92bbd16d9fc08ef6..a4b4dae6c5a47ef8e0e3dadcff54a3cee6afa9ce 100644 (file)
@@ -52,7 +52,7 @@ UIWIDGET ui_webview_create(UiObject *obj, UiWebviewArgs *args) {
             data->webview = (__bridge void*)webview;
             data->javascript = TRUE;
             data->zoom = 1;
-            value->value = value;
+            value->value = data;
         }
     }
     
index b0259d280382af4c4c0ddf9d86cce5d0fb0cdf85..459b64986fb352f43b174d185887bede60ff50ee 100644 (file)
@@ -41,6 +41,7 @@
 #include "../common/menu.h"
 #include "../common/toolbar.h"
 #include "../common/object.h"
+#include "../common/utils.h"
 
 #include <cx/mempool.h>
 
@@ -50,19 +51,30 @@ static int window_default_height = 550;
 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;
+    [window saveWindowSize];
+    [[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
+    int width = window_default_width;
+    int height = window_default_height;
+    if(!simple) {
+       ui_get_window_default_width(&width, &height);
+   }
+    
+    MainWindow *window = [[MainWindow alloc] init:obj withSidebar:sidebar withSplitview:splitview width:width height:height];
     
     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;
 }
@@ -310,13 +322,15 @@ UiObject *ui_dialog_window_create(UiObject *parent, UiDialogWindowArgs *args) {
                                                              NSWindowStyleMaskUtilityWindow)
                                                    backing:NSBackingStoreBuffered
                                                      defer:NO];
+    NSWindowController *controller = [[NSWindowController alloc] initWithWindow:panel];
+    panel.windowController = controller;
     panel.parent = (__bridge NSWindow*)parent->wobj;
     panel.obj = obj;
     panel.modal = args->modal;
     panel.onclick = args->onclick;
     panel.onclickdata = args->onclickdata;
     [panel center];
-    [[WindowManager sharedWindowManager] addWindow:panel];
+    [[WindowManager sharedWindowManager] addWindow:controller];
     obj->wobj = (__bridge void*)panel;
     
     NSView *content = panel.contentView;
index 72d5cd36da8d065c15ed239d3b04c70b632ac035..fb5f49dd380a39ed3b7fd2890aac0d13e5bc4c9c 100644 (file)
@@ -760,6 +760,9 @@ void uic_range_save(UiRange *r) {
 
 void uic_generic_save(UiGeneric *g) {
     if(!g->obj) return;
+    // TODO: this leaks memory
+    // we can't just use get on Generic and ignore the result
+    // probably a separate save method is required
     g->get(g);
 }
 
@@ -812,7 +815,7 @@ void uic_range_unbind(UiRange *r) {
     r->obj = NULL;
 }
 
-void uic_list_unbind(UiList *l) {      
+void uic_list_unbind(UiList *l) {
     l->update = NULL;
     l->getselection = NULL;
     l->setselection = NULL;