From 155e34c7a833fc25c2a94a113163704ceca6c59e Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Fri, 16 Jun 2023 20:48:57 +1000 Subject: [PATCH] [v3 mac] Better main thread calls --- v3/pkg/application/application.go | 7 +++++++ v3/pkg/application/mainthread_darwin.go | 8 ++++++++ v3/pkg/application/webview_window_darwin.go | 12 +++++++----- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/v3/pkg/application/application.go b/v3/pkg/application/application.go index 270fa4e07..4c8c3490d 100644 --- a/v3/pkg/application/application.go +++ b/v3/pkg/application/application.go @@ -147,6 +147,7 @@ type ( getPrimaryScreen() (*Screen, error) getScreens() ([]*Screen, error) GetFlags(options Options) map[string]any + isOnMainThread() bool } runnable interface { @@ -585,6 +586,12 @@ func (a *App) Clipboard() *Clipboard { } func (a *App) dispatchOnMainThread(fn func()) { + // If we are on the main thread, just call the function + if a.impl.isOnMainThread() { + fn() + return + } + mainThreadFunctionStoreLock.Lock() id := generateFunctionStoreID() mainThreadFunctionStore[id] = fn diff --git a/v3/pkg/application/mainthread_darwin.go b/v3/pkg/application/mainthread_darwin.go index 65ca398ad..70e4d70b1 100644 --- a/v3/pkg/application/mainthread_darwin.go +++ b/v3/pkg/application/mainthread_darwin.go @@ -16,9 +16,17 @@ static void dispatchOnMainThread(unsigned int id) { }); } +static bool onMainThread() { + return [NSThread isMainThread]; +} + */ import "C" +func (m *macosApp) isOnMainThread() bool { + return bool(C.onMainThread()) +} + func (m *macosApp) dispatchOnMainThread(id uint) { C.dispatchOnMainThread(C.uint(id)) } diff --git a/v3/pkg/application/webview_window_darwin.go b/v3/pkg/application/webview_window_darwin.go index a722da0f8..e2bb58d05 100644 --- a/v3/pkg/application/webview_window_darwin.go +++ b/v3/pkg/application/webview_window_darwin.go @@ -829,6 +829,11 @@ type macosWebviewWindow struct { parent *WebviewWindow } +func (w *macosWebviewWindow) startResize(border string) error { + // Not needed right now + return nil +} + func (w *macosWebviewWindow) focus() { w.show() } @@ -1212,13 +1217,10 @@ func (w *macosWebviewWindow) setBackgroundColour(colour RGBA) { func (w *macosWebviewWindow) position() (int, int) { var x, y C.int - var wg sync.WaitGroup - wg.Add(1) - go globalApplication.dispatchOnMainThread(func() { + invokeSync(func() { C.windowGetPosition(w.nsWindow, &x, &y) - wg.Done() }) - wg.Wait() + return int(x), int(y) }