From 9a3055934392b64858e6153635f08a31d7ffe11f Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Sat, 14 Mar 2026 19:38:41 -0700 Subject: [PATCH] handle click dock icon to reopen app for Mac --- ui/app_delegate_darwin.go | 27 ++++++++++++++++++++++++++ ui/app_delegate_darwin.m | 41 +++++++++++++++++++++++++++++++++++++++ ui/app_delegate_other.go | 8 ++++++++ ui/mainwindow.go | 3 ++- 4 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 ui/app_delegate_darwin.go create mode 100644 ui/app_delegate_darwin.m create mode 100644 ui/app_delegate_other.go diff --git a/ui/app_delegate_darwin.go b/ui/app_delegate_darwin.go new file mode 100644 index 0000000..0138fc4 --- /dev/null +++ b/ui/app_delegate_darwin.go @@ -0,0 +1,27 @@ +//go:build darwin + +package ui + +/* +void installReopenDelegate(); +*/ +import "C" + +import "fyne.io/fyne/v2" + +var darwinAppDelegateReopenWindow fyne.Window + +func installReopenHandler(w fyne.Window) { + darwinAppDelegateReopenWindow = w + C.installReopenDelegate() +} + +//export appReopened +func appReopened() { + if darwinAppDelegateReopenWindow == nil { + return + } + go func() { + fyne.Do(darwinAppDelegateReopenWindow.Show) + }() +} diff --git a/ui/app_delegate_darwin.m b/ui/app_delegate_darwin.m new file mode 100644 index 0000000..063cdaf --- /dev/null +++ b/ui/app_delegate_darwin.m @@ -0,0 +1,41 @@ +//go:build darwin + +#import + +extern void appReopened(void); + +@interface ReopenDelegate : NSObject +@property (nonatomic, strong) id wrapped; +@end + + +@implementation ReopenDelegate + +- (BOOL)applicationShouldHandleReopen:(NSApplication *)app + hasVisibleWindows:(BOOL)hasVisible { + if (!hasVisible) { + appReopened(); + } + if ([self.wrapped respondsToSelector:_cmd]) { + return [self.wrapped applicationShouldHandleReopen:app + hasVisibleWindows:hasVisible]; + } + return YES; +} + +- (BOOL)respondsToSelector:(SEL)sel { + return [super respondsToSelector:sel] || + [self.wrapped respondsToSelector:sel]; +} + +- (id)forwardingTargetForSelector:(SEL)sel { + return [self.wrapped respondsToSelector:sel] ? self.wrapped : nil; +} + +@end + +void installReopenDelegate(void) { + ReopenDelegate *d = [ReopenDelegate new]; + d.wrapped = [NSApp delegate]; + [NSApp setDelegate:d]; +} diff --git a/ui/app_delegate_other.go b/ui/app_delegate_other.go new file mode 100644 index 0000000..fa39367 --- /dev/null +++ b/ui/app_delegate_other.go @@ -0,0 +1,8 @@ +//go:build !darwin + +package ui + +import "fyne.io/fyne/v2" + +func installReopenHandler(w fyne.Window) { +} diff --git a/ui/mainwindow.go b/ui/mainwindow.go index ba7e2e3..6393eb2 100644 --- a/ui/mainwindow.go +++ b/ui/mainwindow.go @@ -61,6 +61,7 @@ func NewMainWindow(fyneApp fyne.App, appName, displayAppName, appVersion string, Window: fyneApp.NewWindow(displayAppName), theme: myTheme.NewMyTheme(&app.Config.Theme, app.ThemesDir()), } + installReopenHandler(m.Window) fynetooltip.SetToolTipTextSizeName(myTheme.SizeNameSubText) m.theme.NormalFont = app.Config.Application.FontNormalTTF @@ -184,7 +185,7 @@ func NewMainWindow(fyneApp fyne.App, appName, displayAppName, appVersion string, m.Window.SetCloseIntercept(func() { m.SaveWindowSettings() - if app.Config.Application.CloseToSystemTray && m.HaveSystemTray() { + if runtime.GOOS == "darwin" || (app.Config.Application.CloseToSystemTray && m.HaveSystemTray()) { m.Window.Hide() } else { m.Window.Close()