From 65d79f295fe60cdad99429fcbfdea9e967dff10f Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Sun, 17 May 2020 11:58:42 +0200 Subject: [PATCH] app/internal/app: introduce runOnMain for main thread callbacks Signed-off-by: Elias Naur --- app/internal/window/os_darwin.go | 30 ++++++++++++++++++++++++++++++ app/internal/window/os_darwin.h | 3 +++ app/internal/window/os_darwin.m | 12 ++++++++++++ 3 files changed, 45 insertions(+) create mode 100644 app/internal/window/os_darwin.go create mode 100644 app/internal/window/os_darwin.h create mode 100644 app/internal/window/os_darwin.m diff --git a/app/internal/window/os_darwin.go b/app/internal/window/os_darwin.go new file mode 100644 index 00000000..5d84b47c --- /dev/null +++ b/app/internal/window/os_darwin.go @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: Unlicense OR MIT + +package window + +/* +#include "os_darwin.h" +*/ +import "C" + +var mainFuncs = make(chan func(), 1) + +// runOnMain runs the function on the main thread. +func runOnMain(f func()) { + go func() { + mainFuncs <- f + C.gio_wakeupMainThread() + }() +} + +//export gio_dispatchMainFuncs +func gio_dispatchMainFuncs() { + for { + select { + case f := <-mainFuncs: + f() + default: + return + } + } +} diff --git a/app/internal/window/os_darwin.h b/app/internal/window/os_darwin.h new file mode 100644 index 00000000..cb56b440 --- /dev/null +++ b/app/internal/window/os_darwin.h @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: Unlicense OR MIT + +__attribute__ ((visibility ("hidden"))) void gio_wakeupMainThread(void); diff --git a/app/internal/window/os_darwin.m b/app/internal/window/os_darwin.m new file mode 100644 index 00000000..8c7b6eb3 --- /dev/null +++ b/app/internal/window/os_darwin.m @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: Unlicense OR MIT + +@import Dispatch; + +#include "os_darwin.h" +#include "_cgo_export.h" + +void gio_wakeupMainThread(void) { + dispatch_async(dispatch_get_main_queue(), ^{ + gio_dispatchMainFuncs(); + }); +}