implement ui_call_mainthread (Cocoa)

Sun, 24 Aug 2025 13:38:16 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sun, 24 Aug 2025 13:38:16 +0200
changeset 721
e9f655afc7ed
parent 720
6fa3c629000f
child 722
6466b4f16e5e

implement ui_call_mainthread (Cocoa)

make/xcode/toolkit/toolkit.xcodeproj/project.pbxproj file | annotate | diff | comparison | revisions
ui/cocoa/UiThread.m file | annotate | diff | comparison | revisions
ui/cocoa/toolkit.h file | annotate | diff | comparison | revisions
ui/cocoa/toolkit.m file | annotate | diff | comparison | revisions
--- a/make/xcode/toolkit/toolkit.xcodeproj/project.pbxproj	Sun Aug 24 13:30:56 2025 +0200
+++ b/make/xcode/toolkit/toolkit.xcodeproj/project.pbxproj	Sun Aug 24 13:38:16 2025 +0200
@@ -37,7 +37,6 @@
 		ED6581312CFF1A8800F5402F /* toolkit.m in Sources */ = {isa = PBXBuildFile; fileRef = ED6581302CFF1A8800F5402F /* toolkit.m */; };
 		ED6581342CFF1F1900F5402F /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = ED6581332CFF1F1900F5402F /* AppDelegate.m */; };
 		ED6581392CFF287300F5402F /* EventData.m in Sources */ = {isa = PBXBuildFile; fileRef = ED6581362CFF287300F5402F /* EventData.m */; };
-		ED65813A2CFF287300F5402F /* UiJob.m in Sources */ = {isa = PBXBuildFile; fileRef = ED6581382CFF287300F5402F /* UiJob.m */; };
 		ED6581432CFF3BCE00F5402F /* window.m in Sources */ = {isa = PBXBuildFile; fileRef = ED6581422CFF3BCE00F5402F /* window.m */; };
 		ED6581442CFF3BCE00F5402F /* button.m in Sources */ = {isa = PBXBuildFile; fileRef = ED65813C2CFF3BCE00F5402F /* button.m */; };
 		ED6581452CFF3BCE00F5402F /* Container.m in Sources */ = {isa = PBXBuildFile; fileRef = ED65813E2CFF3BCE00F5402F /* Container.m */; };
@@ -45,6 +44,7 @@
 		ED65815C2CFF3EE900F5402F /* MainWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = ED65815B2CFF3EE900F5402F /* MainWindow.m */; };
 		ED65815F2CFF4BF200F5402F /* WindowManager.m in Sources */ = {isa = PBXBuildFile; fileRef = ED65815E2CFF4BF200F5402F /* WindowManager.m */; };
 		ED679B0A2E5B266C001D4F71 /* label.m in Sources */ = {isa = PBXBuildFile; fileRef = ED679B092E5B266C001D4F71 /* label.m */; };
+		ED679B0D2E5B2FB0001D4F71 /* UiThread.m in Sources */ = {isa = PBXBuildFile; fileRef = ED679B0C2E5B2FB0001D4F71 /* UiThread.m */; };
 		ED8687E52D999CF3002F3EC2 /* menu.m in Sources */ = {isa = PBXBuildFile; fileRef = ED8687E42D999CF3002F3EC2 /* menu.m */; };
 		EDB452C32E302C65006FB12D /* image.m in Sources */ = {isa = PBXBuildFile; fileRef = EDB452C22E302C65006FB12D /* image.m */; };
 		EDCD22272E59EEF5000612AF /* list.m in Sources */ = {isa = PBXBuildFile; fileRef = EDCD22262E59EEF5000612AF /* list.m */; };
@@ -117,8 +117,6 @@
 		ED6581332CFF1F1900F5402F /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = /Users/olaf/Projekte/toolkit/ui/cocoa/AppDelegate.m; sourceTree = "<absolute>"; };
 		ED6581352CFF287300F5402F /* EventData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = EventData.h; path = /Users/olaf/Projekte/toolkit/ui/cocoa/EventData.h; sourceTree = "<absolute>"; };
 		ED6581362CFF287300F5402F /* EventData.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = EventData.m; path = /Users/olaf/Projekte/toolkit/ui/cocoa/EventData.m; sourceTree = "<absolute>"; };
-		ED6581372CFF287300F5402F /* UiJob.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = UiJob.h; path = /Users/olaf/Projekte/toolkit/ui/cocoa/UiJob.h; sourceTree = "<absolute>"; };
-		ED6581382CFF287300F5402F /* UiJob.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = UiJob.m; path = /Users/olaf/Projekte/toolkit/ui/cocoa/UiJob.m; sourceTree = "<absolute>"; };
 		ED65813B2CFF3BCE00F5402F /* button.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = button.h; path = /Users/olaf/Projekte/toolkit/ui/cocoa/button.h; sourceTree = "<absolute>"; };
 		ED65813C2CFF3BCE00F5402F /* button.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = button.m; path = /Users/olaf/Projekte/toolkit/ui/cocoa/button.m; sourceTree = "<absolute>"; };
 		ED65813D2CFF3BCE00F5402F /* Container.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Container.h; path = /Users/olaf/Projekte/toolkit/ui/cocoa/Container.h; sourceTree = "<absolute>"; };
@@ -151,6 +149,8 @@
 		ED65815E2CFF4BF200F5402F /* WindowManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = WindowManager.m; path = /Users/olaf/Projekte/toolkit/ui/cocoa/WindowManager.m; sourceTree = "<absolute>"; };
 		ED679B082E5B266C001D4F71 /* label.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = label.h; path = /Users/olaf/Projekte/toolkit/ui/cocoa/label.h; sourceTree = "<absolute>"; };
 		ED679B092E5B266C001D4F71 /* label.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = label.m; path = /Users/olaf/Projekte/toolkit/ui/cocoa/label.m; sourceTree = "<absolute>"; };
+		ED679B0B2E5B2FB0001D4F71 /* UiThread.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = UiThread.h; path = /Users/olaf/Projekte/toolkit/ui/cocoa/UiThread.h; sourceTree = "<absolute>"; };
+		ED679B0C2E5B2FB0001D4F71 /* UiThread.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = UiThread.m; path = /Users/olaf/Projekte/toolkit/ui/cocoa/UiThread.m; sourceTree = "<absolute>"; };
 		ED8687E32D999CF3002F3EC2 /* menu.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = menu.h; path = ../../../ui/cocoa/menu.h; sourceTree = SOURCE_ROOT; };
 		ED8687E42D999CF3002F3EC2 /* menu.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = menu.m; path = ../../../ui/cocoa/menu.m; sourceTree = SOURCE_ROOT; };
 		EDB452C12E302C65006FB12D /* image.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = image.h; path = /Users/olaf/Projekte/toolkit/ui/cocoa/image.h; sourceTree = "<absolute>"; };
@@ -281,6 +281,8 @@
 		ED65812E2CFF1A7200F5402F /* cocoa */ = {
 			isa = PBXGroup;
 			children = (
+				ED679B0B2E5B2FB0001D4F71 /* UiThread.h */,
+				ED679B0C2E5B2FB0001D4F71 /* UiThread.m */,
 				ED679B082E5B266C001D4F71 /* label.h */,
 				ED679B092E5B266C001D4F71 /* label.m */,
 				EDCD22362E5A160A000612AF /* ListDelegate.h */,
@@ -311,8 +313,6 @@
 				ED6581422CFF3BCE00F5402F /* window.m */,
 				ED6581352CFF287300F5402F /* EventData.h */,
 				ED6581362CFF287300F5402F /* EventData.m */,
-				ED6581372CFF287300F5402F /* UiJob.h */,
-				ED6581382CFF287300F5402F /* UiJob.m */,
 				ED6581322CFF1F1900F5402F /* AppDelegate.h */,
 				ED6581332CFF1F1900F5402F /* AppDelegate.m */,
 				ED65812F2CFF1A8800F5402F /* toolkit.h */,
@@ -445,6 +445,7 @@
 				ED6581282CFF1A3000F5402F /* string.c in Sources */,
 				ED6581312CFF1A8800F5402F /* toolkit.m in Sources */,
 				ED6581342CFF1F1900F5402F /* AppDelegate.m in Sources */,
+				ED679B0D2E5B2FB0001D4F71 /* UiThread.m in Sources */,
 				ED6581292CFF1A3000F5402F /* allocator.c in Sources */,
 				ED52BFB02D86FC5D00FD8BE5 /* text.m in Sources */,
 				ED6581432CFF3BCE00F5402F /* window.m in Sources */,
@@ -452,7 +453,6 @@
 				ED6581452CFF3BCE00F5402F /* Container.m in Sources */,
 				ED6581462CFF3BCE00F5402F /* GridLayout.m in Sources */,
 				ED6581392CFF287300F5402F /* EventData.m in Sources */,
-				ED65813A2CFF287300F5402F /* UiJob.m in Sources */,
 				ED65812B2CFF1A3000F5402F /* buffer.c in Sources */,
 				ED65812C2CFF1A3000F5402F /* printf.c in Sources */,
 				ED6580F32CFF19F900F5402F /* object.c in Sources */,
--- a/ui/cocoa/UiThread.m	Sun Aug 24 13:30:56 2025 +0200
+++ b/ui/cocoa/UiThread.m	Sun Aug 24 13:38:16 2025 +0200
@@ -26,7 +26,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
-#import "UiJob.h"
+#import "UiThread.h"
 
 
 @implementation UiThread
--- a/ui/cocoa/toolkit.h	Sun Aug 24 13:30:56 2025 +0200
+++ b/ui/cocoa/toolkit.h	Sun Aug 24 13:38:16 2025 +0200
@@ -31,6 +31,19 @@
 #include "../common/context.h"
 #include "../common/object.h"
 
+@interface UiAppCallback : NSObject {
+    ui_threadfunc callback;
+    void          *userdata;
+}
+
+- (id) initWithCallback:(ui_threadfunc)func userdata:(void*)userdata;
+
+- (void) callMainThread;
+
+- (void) mainThread:(id)n;
+
+@end
+
 void ui_cocoa_onstartup(void);
 void ui_cocoa_onopen(const char *file);
 void ui_cocoa_onexit(void);
--- a/ui/cocoa/toolkit.m	Sun Aug 24 13:30:56 2025 +0200
+++ b/ui/cocoa/toolkit.m	Sun Aug 24 13:38:16 2025 +0200
@@ -37,7 +37,7 @@
 #import "image.h"
 #import "menu.h"
 #import "Toolbar.h"
-#import "UiJob.h"
+#import "UiThread.h"
 
 #import "AppDelegate.h"
 
@@ -167,6 +167,27 @@
     [thread start];
 }
 
-void ui_call_mainthread(ui_threadfunc tf, void* td) {
+@implementation UiAppCallback
+
+- (id) initWithCallback:(ui_threadfunc)func userdata:(void*)userdata {
+    self->callback = func;
+    self->userdata = userdata;
+    return self;
+}
 
+- (void) callMainThread {
+    [self performSelectorOnMainThread:@selector(mainThread:)
+                                   withObject:nil
+                                waitUntilDone:NO];
 }
+
+- (void) mainThread:(id)n {
+    callback(userdata);
+}
+
+@end
+
+void ui_call_mainthread(ui_threadfunc tf, void* td) {
+    UiAppCallback *cb = [[UiAppCallback alloc]initWithCallback:tf userdata:td];
+    [cb callMainThread];
+}

mercurial