From fecf4102666f327abfa7a0afc3b9b1844a3a913c Mon Sep 17 00:00:00 2001 From: zoajimen Date: Wed, 1 Apr 2026 16:47:59 +0200 Subject: [PATCH] Enhance macOS dock handling in SerenaDashboardViewer and add high-resolution app icon --- resources/serena-mac-dock-icon.cdr | Bin 0 -> 26002 bytes src/serena/dashboard.py | 119 ++++++++---------- .../dashboard/serena-icon-1024-mac.png | Bin 0 -> 38227 bytes 3 files changed, 54 insertions(+), 65 deletions(-) create mode 100644 resources/serena-mac-dock-icon.cdr create mode 100644 src/serena/resources/dashboard/serena-icon-1024-mac.png diff --git a/resources/serena-mac-dock-icon.cdr b/resources/serena-mac-dock-icon.cdr new file mode 100644 index 0000000000000000000000000000000000000000..3f3f164cd7fe096eb86d2af4223f1b2e661b55e9 GIT binary patch literal 26002 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 literal 0 HcmV?d00001 diff --git a/src/serena/dashboard.py b/src/serena/dashboard.py index 0e2f7129..538fd250 100644 --- a/src/serena/dashboard.py +++ b/src/serena/dashboard.py @@ -704,10 +704,8 @@ class SerenaDashboardViewer: self.window: webview.Window self._tray_icon: Any - self._app_delegate: Any = None self._quitting = False - self._window_hidden_to_tray = start_minimized - self._suppress_next_activate_reopen = start_minimized + self._app_icon_path: str | None = None @staticmethod def is_current_platform_supported() -> bool: @@ -727,8 +725,9 @@ class SerenaDashboardViewer: dashboard_path = Path(SERENA_DASHBOARD_DIR) # .ico is Windows-only; macOS expects a PNG for the window/dock icon. - icon_filename = "serena.ico" if sys.platform == "win32" else "serena-icon-64.png" + icon_filename = "serena.ico" if sys.platform == "win32" else "serena-icon-1024-mac.png" icon_path = str(dashboard_path / icon_filename) + self._app_icon_path = icon_path # Create hidden to avoid flash; show/restore/minimize in start callback. window = webview.create_window( @@ -746,83 +745,73 @@ class SerenaDashboardViewer: self._start_tray() def _start_callback() -> None: - # pywebview installs its own NSApplication delegate during startup, - # so on macOS we need to wrap that final delegate here instead of - # earlier in run(), or the dock reopen handler gets overwritten. - if sys.platform == "darwin" and self.tray: - from PyObjCTools.AppHelper import callAfter - - callAfter(self._setup_macos_dock_handler) if self.start_minimized: - self.window.minimize() + self._hide_window() else: self._show_window() webview.start(_start_callback, icon=icon_path) def _show_window(self) -> None: - if self.window: + if not self.window: + return + + if sys.platform == "darwin": + from PyObjCTools.AppHelper import callAfter + + callAfter(self._show_window_on_macos) + else: self.window.show() self.window.restore() - self._window_hidden_to_tray = False - self._suppress_next_activate_reopen = False def _hide_window(self) -> None: - if self.window: + if not self.window: + return + + if sys.platform == "darwin": + from PyObjCTools.AppHelper import callAfter + + callAfter(self._hide_window_on_macos) + else: self.window.hide() - self._window_hidden_to_tray = True - def _setup_macos_dock_handler(self) -> None: - """Set up handler for dock icon clicks on macOS.""" - from AppKit import NSApplication, NSObject - from objc import python_method # type: ignore[import-untyped] - - viewer = self - - class SerenaDockDelegate(NSObject): - """Wraps pywebview's delegate to handle dock icon clicks.""" - - @python_method - def initWithOriginalDelegate_(self, original: Any) -> Any: - obj = self.init() - if obj is not None: - obj._original = original - return obj - - @python_method - def _forward(self, method: str, *args: Any) -> Any: - """Forward method call to original delegate if it has the method.""" - orig = getattr(self, "_original", None) - if orig and hasattr(orig, method): - return getattr(orig, method)(*args) - return None - - def applicationShouldHandleReopen_hasVisibleWindows_(self, sender: Any, has_visible_windows: bool) -> bool: - """Called when dock icon is clicked.""" - if not has_visible_windows: - viewer._show_window() - result = self._forward("applicationShouldHandleReopen_hasVisibleWindows_", sender, has_visible_windows) - return result if result is not None else True - - def applicationDidBecomeActive_(self, notification: Any) -> None: - """Fallback for dock activation paths that do not invoke reopen.""" - if viewer._suppress_next_activate_reopen: - viewer._suppress_next_activate_reopen = False - elif viewer._window_hidden_to_tray: - viewer._show_window() - self._forward("applicationDidBecomeActive_", notification) - - def forwardingTargetForSelector_(self, selector: Any) -> Any: - """Forward unknown selectors to original delegate.""" - orig = getattr(self, "_original", None) - return orig if orig and orig.respondsToSelector_(selector) else None + def _show_window_on_macos(self) -> None: + from AppKit import ( + NSApplication, + NSApplicationActivationPolicyRegular, + ) + from PyObjCTools.AppHelper import callLater ns_app = NSApplication.sharedApplication() - original_delegate = ns_app.delegate() - if original_delegate is self._app_delegate: + ns_app.setActivationPolicy_(NSApplicationActivationPolicyRegular) + self._set_macos_app_icon(ns_app) + ns_app.unhide_(None) + ns_app.activateIgnoringOtherApps_(True) + # Give the status item menu a beat to close before restoring the window. + callLater(0.1, self._restore_window_on_macos) + + def _restore_window_on_macos(self) -> None: + self.window.show() + self.window.restore() + + def _hide_window_on_macos(self) -> None: + from AppKit import ( + NSApplication, + NSApplicationActivationPolicyAccessory, + ) + + self.window.hide() + NSApplication.sharedApplication().setActivationPolicy_(NSApplicationActivationPolicyAccessory) + + def _set_macos_app_icon(self, ns_app: Any) -> None: + if not self._app_icon_path: return - self._app_delegate = SerenaDockDelegate.alloc().initWithOriginalDelegate_(original_delegate) - ns_app.setDelegate_(self._app_delegate) + + from AppKit import NSImage + + ns_image = NSImage.alloc().initByReferencingFile_(self._app_icon_path) + if ns_image is not None: + ns_app.setApplicationIconImage_(ns_image) def _on_closing(self) -> bool: """Intercept window close: hide window instead of quitting (macOS standard behavior).""" diff --git a/src/serena/resources/dashboard/serena-icon-1024-mac.png b/src/serena/resources/dashboard/serena-icon-1024-mac.png new file mode 100644 index 0000000000000000000000000000000000000000..2ad41dae7efa8844187336b802b9f006e3311795 GIT binary patch literal 38227 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 literal 0 HcmV?d00001