From f8c6c9f72ca4f280713befe6fdfe139b3b5a2b9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sami=20V=C3=A4nttinen?= Date: Wed, 16 Jan 2019 18:03:54 +0200 Subject: [PATCH] Fix native hiding of macOS windows (#2583) --- src/browser/BrowserService.cpp | 9 +++++++-- src/browser/BrowserService.h | 1 + src/gui/macutils/AppKit.h | 2 ++ src/gui/macutils/AppKitImpl.h | 2 ++ src/gui/macutils/AppKitImpl.mm | 29 ++++++++++++++++++++++++++++- src/gui/macutils/MacUtils.cpp | 10 ++++++++++ src/gui/macutils/MacUtils.h | 2 ++ 7 files changed, 52 insertions(+), 3 deletions(-) diff --git a/src/browser/BrowserService.cpp b/src/browser/BrowserService.cpp index 0ccd31062..834d76aca 100644 --- a/src/browser/BrowserService.cpp +++ b/src/browser/BrowserService.cpp @@ -55,6 +55,7 @@ BrowserService::BrowserService(DatabaseTabWidget* parent) , m_dialogActive(false) , m_bringToFrontRequested(false) , m_wasMinimized(false) + , m_wasHidden(false) , m_keepassBrowserUUID(QUuid::fromRfc4122(QByteArray::fromHex("de887cc3036343b8974b5911b8816224"))) { // Don't connect the signals when used from DatabaseSettingsWidgetBrowser (parent is nullptr) @@ -96,7 +97,6 @@ bool BrowserService::openDatabase(bool triggerUnlock) if (triggerUnlock) { m_bringToFrontRequested = true; - m_wasMinimized = getMainWindow()->isMinimized(); raiseWindow(true); } @@ -933,7 +933,11 @@ void BrowserService::hideWindow() const getMainWindow()->showMinimized(); } else { #ifdef Q_OS_MACOS - macUtils()->raiseLastActiveWindow(); + if (m_wasHidden) { + macUtils()->hideOwnWindow(); + } else { + macUtils()->raiseLastActiveWindow(); + } #else getMainWindow()->lower(); #endif @@ -944,6 +948,7 @@ void BrowserService::raiseWindow(const bool force) { m_wasMinimized = getMainWindow()->isMinimized(); #ifdef Q_OS_MACOS + m_wasHidden = macUtils()->isHidden(); macUtils()->raiseOwnWindow(); Tools::wait(500); #else diff --git a/src/browser/BrowserService.h b/src/browser/BrowserService.h index 74febe4f0..8e1c45f4a 100644 --- a/src/browser/BrowserService.h +++ b/src/browser/BrowserService.h @@ -125,6 +125,7 @@ private: bool m_dialogActive; bool m_bringToFrontRequested; bool m_wasMinimized; + bool m_wasHidden; QUuid m_keepassBrowserUUID; }; diff --git a/src/gui/macutils/AppKit.h b/src/gui/macutils/AppKit.h index f1eced5bb..ecd11c421 100644 --- a/src/gui/macutils/AppKit.h +++ b/src/gui/macutils/AppKit.h @@ -33,6 +33,8 @@ public: pid_t activeProcessId(); pid_t ownProcessId(); bool activateProcess(pid_t pid); + bool hideProcess(pid_t pid); + bool isHidden(pid_t pid); private: void *self; diff --git a/src/gui/macutils/AppKitImpl.h b/src/gui/macutils/AppKitImpl.h index f370096fc..97673b071 100644 --- a/src/gui/macutils/AppKitImpl.h +++ b/src/gui/macutils/AppKitImpl.h @@ -28,5 +28,7 @@ - (pid_t) activeProcessId; - (pid_t) ownProcessId; - (bool) activateProcess:(pid_t) pid; +- (bool) hideProcess:(pid_t) pid; +- (bool) isHidden:(pid_t) pid; @end diff --git a/src/gui/macutils/AppKitImpl.mm b/src/gui/macutils/AppKitImpl.mm index 457044389..ca4e9f10e 100644 --- a/src/gui/macutils/AppKitImpl.mm +++ b/src/gui/macutils/AppKitImpl.mm @@ -72,10 +72,27 @@ AppKit::~AppKit() - (bool) activateProcess:(pid_t) pid { NSRunningApplication *app = [NSRunningApplication runningApplicationWithProcessIdentifier:pid]; - return [app activateWithOptions:NSApplicationActivateIgnoringOtherApps]; } +// +// Hide application by process id +// +- (bool) hideProcess:(pid_t) pid +{ + NSRunningApplication *app = [NSRunningApplication runningApplicationWithProcessIdentifier:pid]; + return [app hide]; +} + +// +// Get application hidden state by process id +// +- (bool) isHidden:(pid_t) pid +{ + NSRunningApplication *app = [NSRunningApplication runningApplicationWithProcessIdentifier:pid]; + return [app isHidden]; +} + // // ------------------------- C++ Trampolines ------------------------- // @@ -100,4 +117,14 @@ bool AppKit::activateProcess(pid_t pid) return [static_cast(self) activateProcess:pid]; } +bool AppKit::hideProcess(pid_t pid) +{ + return [static_cast(self) hideProcess:pid]; +} + +bool AppKit::isHidden(pid_t pid) +{ + return [static_cast(self) isHidden:pid]; +} + @end diff --git a/src/gui/macutils/MacUtils.cpp b/src/gui/macutils/MacUtils.cpp index a76c561be..602c1958f 100644 --- a/src/gui/macutils/MacUtils.cpp +++ b/src/gui/macutils/MacUtils.cpp @@ -60,3 +60,13 @@ bool MacUtils::raiseLastActiveWindow() { return m_appkit->activateProcess(m_appkit->lastActiveProcessId()); } + +bool MacUtils::hideOwnWindow() +{ + return m_appkit->hideProcess(m_appkit->ownProcessId()); +} + +bool MacUtils::isHidden() +{ + return m_appkit->isHidden(m_appkit->ownProcessId()); +} diff --git a/src/gui/macutils/MacUtils.h b/src/gui/macutils/MacUtils.h index 6d8bb3fe2..67c53dd22 100644 --- a/src/gui/macutils/MacUtils.h +++ b/src/gui/macutils/MacUtils.h @@ -35,6 +35,8 @@ public: bool raiseWindow(WId pid); bool raiseLastActiveWindow(); bool raiseOwnWindow(); + bool hideOwnWindow(); + bool isHidden(); private: explicit MacUtils(QObject* parent = nullptr);