Fix native hiding of macOS windows (#2583)

This commit is contained in:
Sami Vänttinen 2019-01-16 18:03:54 +02:00 committed by Jonathan White
parent d6ce6b85d5
commit f8c6c9f72c
7 changed files with 52 additions and 3 deletions

View File

@ -55,6 +55,7 @@ BrowserService::BrowserService(DatabaseTabWidget* parent)
, m_dialogActive(false) , m_dialogActive(false)
, m_bringToFrontRequested(false) , m_bringToFrontRequested(false)
, m_wasMinimized(false) , m_wasMinimized(false)
, m_wasHidden(false)
, m_keepassBrowserUUID(QUuid::fromRfc4122(QByteArray::fromHex("de887cc3036343b8974b5911b8816224"))) , m_keepassBrowserUUID(QUuid::fromRfc4122(QByteArray::fromHex("de887cc3036343b8974b5911b8816224")))
{ {
// Don't connect the signals when used from DatabaseSettingsWidgetBrowser (parent is nullptr) // Don't connect the signals when used from DatabaseSettingsWidgetBrowser (parent is nullptr)
@ -96,7 +97,6 @@ bool BrowserService::openDatabase(bool triggerUnlock)
if (triggerUnlock) { if (triggerUnlock) {
m_bringToFrontRequested = true; m_bringToFrontRequested = true;
m_wasMinimized = getMainWindow()->isMinimized();
raiseWindow(true); raiseWindow(true);
} }
@ -933,7 +933,11 @@ void BrowserService::hideWindow() const
getMainWindow()->showMinimized(); getMainWindow()->showMinimized();
} else { } else {
#ifdef Q_OS_MACOS #ifdef Q_OS_MACOS
if (m_wasHidden) {
macUtils()->hideOwnWindow();
} else {
macUtils()->raiseLastActiveWindow(); macUtils()->raiseLastActiveWindow();
}
#else #else
getMainWindow()->lower(); getMainWindow()->lower();
#endif #endif
@ -944,6 +948,7 @@ void BrowserService::raiseWindow(const bool force)
{ {
m_wasMinimized = getMainWindow()->isMinimized(); m_wasMinimized = getMainWindow()->isMinimized();
#ifdef Q_OS_MACOS #ifdef Q_OS_MACOS
m_wasHidden = macUtils()->isHidden();
macUtils()->raiseOwnWindow(); macUtils()->raiseOwnWindow();
Tools::wait(500); Tools::wait(500);
#else #else

View File

@ -125,6 +125,7 @@ private:
bool m_dialogActive; bool m_dialogActive;
bool m_bringToFrontRequested; bool m_bringToFrontRequested;
bool m_wasMinimized; bool m_wasMinimized;
bool m_wasHidden;
QUuid m_keepassBrowserUUID; QUuid m_keepassBrowserUUID;
}; };

View File

@ -33,6 +33,8 @@ public:
pid_t activeProcessId(); pid_t activeProcessId();
pid_t ownProcessId(); pid_t ownProcessId();
bool activateProcess(pid_t pid); bool activateProcess(pid_t pid);
bool hideProcess(pid_t pid);
bool isHidden(pid_t pid);
private: private:
void *self; void *self;

View File

@ -28,5 +28,7 @@
- (pid_t) activeProcessId; - (pid_t) activeProcessId;
- (pid_t) ownProcessId; - (pid_t) ownProcessId;
- (bool) activateProcess:(pid_t) pid; - (bool) activateProcess:(pid_t) pid;
- (bool) hideProcess:(pid_t) pid;
- (bool) isHidden:(pid_t) pid;
@end @end

View File

@ -72,10 +72,27 @@ AppKit::~AppKit()
- (bool) activateProcess:(pid_t) pid - (bool) activateProcess:(pid_t) pid
{ {
NSRunningApplication *app = [NSRunningApplication runningApplicationWithProcessIdentifier:pid]; NSRunningApplication *app = [NSRunningApplication runningApplicationWithProcessIdentifier:pid];
return [app activateWithOptions:NSApplicationActivateIgnoringOtherApps]; 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 ------------------------- // ------------------------- C++ Trampolines -------------------------
// //
@ -100,4 +117,14 @@ bool AppKit::activateProcess(pid_t pid)
return [static_cast<id>(self) activateProcess:pid]; return [static_cast<id>(self) activateProcess:pid];
} }
bool AppKit::hideProcess(pid_t pid)
{
return [static_cast<id>(self) hideProcess:pid];
}
bool AppKit::isHidden(pid_t pid)
{
return [static_cast<id>(self) isHidden:pid];
}
@end @end

View File

@ -60,3 +60,13 @@ bool MacUtils::raiseLastActiveWindow()
{ {
return m_appkit->activateProcess(m_appkit->lastActiveProcessId()); 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());
}

View File

@ -35,6 +35,8 @@ public:
bool raiseWindow(WId pid); bool raiseWindow(WId pid);
bool raiseLastActiveWindow(); bool raiseLastActiveWindow();
bool raiseOwnWindow(); bool raiseOwnWindow();
bool hideOwnWindow();
bool isHidden();
private: private:
explicit MacUtils(QObject* parent = nullptr); explicit MacUtils(QObject* parent = nullptr);