From f240f2100cfe2857ca409b6791aff2dae3757a52 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Sat, 24 Dec 2022 15:35:04 +1100 Subject: [PATCH] Refactor mainthread dispatch --- exp/pkg/application/application.go | 10 ++++++++++ exp/pkg/application/dialogs_darwin.go | 2 +- exp/pkg/application/mainthread.go | 9 --------- exp/pkg/application/mainthread_darwin.go | 14 +++++++------- exp/pkg/application/systemtray_darwin.go | 6 +++--- exp/pkg/application/window_darwin.go | 12 ++++++------ 6 files changed, 27 insertions(+), 26 deletions(-) diff --git a/exp/pkg/application/application.go b/exp/pkg/application/application.go index bc58fda06..698306418 100644 --- a/exp/pkg/application/application.go +++ b/exp/pkg/application/application.go @@ -49,6 +49,7 @@ type platformApp interface { showAboutDialog(name string, description string, icon []byte) setIcon(icon []byte) on(id uint) + dispatchOnMainThread(id uint) } // Messages sent from javascript get routed here @@ -367,3 +368,12 @@ func (a *App) Clipboard() *Clipboard { } return a.clipboard } + +func (a *App) dispatchOnMainThread(fn func()) { + mainThreadFunctionStoreLock.Lock() + id := generateFunctionStoreID() + mainThreadFunctionStore[id] = fn + mainThreadFunctionStoreLock.Unlock() + // Call platform specific dispatch function + a.impl.dispatchOnMainThread(id) +} diff --git a/exp/pkg/application/dialogs_darwin.go b/exp/pkg/application/dialogs_darwin.go index 5cfa621a9..d59deab9f 100644 --- a/exp/pkg/application/dialogs_darwin.go +++ b/exp/pkg/application/dialogs_darwin.go @@ -314,7 +314,7 @@ type macosDialog struct { } func (m *macosDialog) show() { - DispatchOnMainThread(func() { + globalApplication.dispatchOnMainThread(func() { // Mac can only have 4 buttons on a dialog if len(m.dialog.buttons) > 4 { diff --git a/exp/pkg/application/mainthread.go b/exp/pkg/application/mainthread.go index 8c62a8672..f0ae2803b 100644 --- a/exp/pkg/application/mainthread.go +++ b/exp/pkg/application/mainthread.go @@ -19,12 +19,3 @@ func generateFunctionStoreID() uint { } } } - -func DispatchOnMainThread(fn func()) { - mainThreadFunctionStoreLock.Lock() - id := generateFunctionStoreID() - mainThreadFunctionStore[id] = fn - mainThreadFunctionStoreLock.Unlock() - // Call platform specific dispatch function - platformDispatch(id) -} diff --git a/exp/pkg/application/mainthread_darwin.go b/exp/pkg/application/mainthread_darwin.go index 5a026d1ca..5603ea0d0 100644 --- a/exp/pkg/application/mainthread_darwin.go +++ b/exp/pkg/application/mainthread_darwin.go @@ -8,23 +8,23 @@ package application #include "Cocoa/Cocoa.h" -extern void dispatchCallback(unsigned int); +extern void dispatchOnMainThreadCallback(unsigned int); -static void dispatch(unsigned int id) { +static void dispatchOnMainThread(unsigned int id) { dispatch_async(dispatch_get_main_queue(), ^{ - dispatchCallback(id); + dispatchOnMainThreadCallback(id); }); } */ import "C" -func platformDispatch(id uint) { - C.dispatch(C.uint(id)) +func (m *macosApp) dispatchOnMainThread(id uint) { + C.dispatchOnMainThread(C.uint(id)) } -//export dispatchCallback -func dispatchCallback(callbackID C.uint) { +//export dispatchOnMainThreadCallback +func dispatchOnMainThreadCallback(callbackID C.uint) { mainThreadFunctionStoreLock.RLock() id := uint(callbackID) fn := mainThreadFunctionStore[id] diff --git a/exp/pkg/application/systemtray_darwin.go b/exp/pkg/application/systemtray_darwin.go index d26690f9d..2baade1b2 100644 --- a/exp/pkg/application/systemtray_darwin.go +++ b/exp/pkg/application/systemtray_darwin.go @@ -100,7 +100,7 @@ func (s *macosSystemTray) setMenu(menu *Menu) { } func (s *macosSystemTray) run() { - DispatchOnMainThread(func() { + globalApplication.dispatchOnMainThread(func() { if s.nsStatusItem != nil { Fatal("System tray '%d' already running", s.id) } @@ -124,7 +124,7 @@ func (s *macosSystemTray) run() { func (s *macosSystemTray) setIcon(icon []byte) { s.icon = icon - DispatchOnMainThread(func() { + globalApplication.dispatchOnMainThread(func() { s.nsImage = unsafe.Pointer(C.imageFromBytes((*C.uchar)(&icon[0]), C.int(len(icon)))) C.systemTraySetIcon(s.nsStatusItem, s.nsImage, C.int(s.iconPosition), C.bool(s.isTemplateIcon)) }) @@ -133,7 +133,7 @@ func (s *macosSystemTray) setIcon(icon []byte) { func (s *macosSystemTray) setTemplateIcon(icon []byte) { s.icon = icon s.isTemplateIcon = true - DispatchOnMainThread(func() { + globalApplication.dispatchOnMainThread(func() { s.nsImage = unsafe.Pointer(C.imageFromBytes((*C.uchar)(&icon[0]), C.int(len(icon)))) C.systemTraySetIcon(s.nsStatusItem, s.nsImage, C.int(s.iconPosition), C.bool(s.isTemplateIcon)) }) diff --git a/exp/pkg/application/window_darwin.go b/exp/pkg/application/window_darwin.go index f638159e7..011846d0a 100644 --- a/exp/pkg/application/window_darwin.go +++ b/exp/pkg/application/window_darwin.go @@ -736,7 +736,7 @@ func (w *macosWindow) syncMainThreadReturningBool(fn func() bool) bool { var wg sync.WaitGroup wg.Add(1) var result bool - DispatchOnMainThread(func() { + globalApplication.dispatchOnMainThread(func() { result = fn() wg.Done() }) @@ -812,7 +812,7 @@ func (w *macosWindow) size() (int, int) { var width, height C.int var wg sync.WaitGroup wg.Add(1) - DispatchOnMainThread(func() { + globalApplication.dispatchOnMainThread(func() { C.windowGetSize(w.nsWindow, &width, &height) wg.Done() }) @@ -828,7 +828,7 @@ func (w *macosWindow) width() int { var width C.int var wg sync.WaitGroup wg.Add(1) - DispatchOnMainThread(func() { + globalApplication.dispatchOnMainThread(func() { width = C.windowGetWidth(w.nsWindow) wg.Done() }) @@ -839,7 +839,7 @@ func (w *macosWindow) height() int { var height C.int var wg sync.WaitGroup wg.Add(1) - DispatchOnMainThread(func() { + globalApplication.dispatchOnMainThread(func() { height = C.windowGetHeight(w.nsWindow) wg.Done() }) @@ -851,7 +851,7 @@ func (w *macosWindow) run() { for eventId := range w.parent.eventListeners { w.on(eventId) } - DispatchOnMainThread(func() { + globalApplication.dispatchOnMainThread(func() { w.nsWindow = C.windowNew(C.uint(w.parent.id), C.int(w.parent.options.Width), C.int(w.parent.options.Height)) w.setTitle(w.parent.options.Title) w.setAlwaysOnTop(w.parent.options.AlwaysOnTop) @@ -938,7 +938,7 @@ func (w *macosWindow) position() (int, int) { var x, y C.int var wg sync.WaitGroup wg.Add(1) - go DispatchOnMainThread(func() { + go globalApplication.dispatchOnMainThread(func() { C.windowGetPosition(w.nsWindow, &x, &y) wg.Done() })