From 843089733b02f6c11cec6422f8ead9c486a6f172 Mon Sep 17 00:00:00 2001 From: John Preston Date: Sat, 18 Feb 2017 16:32:38 +0300 Subject: [PATCH] Better handle window hide / activate in macOS. #1278 When we hide window by 'x' title button or by cmd+w key we try to deactivate the whole application (so some other app gets activated). When we activate the application in any way we check if the main window is hidden and if it is - we show it and activate it. --- Telegram/SourceFiles/application.cpp | 21 ++++++++++++++++--- Telegram/SourceFiles/application.h | 4 +++- .../platform/mac/main_window_mac.mm | 8 ++++--- Telegram/SourceFiles/pspecific_mac_p.mm | 8 +++++-- 4 files changed, 32 insertions(+), 9 deletions(-) diff --git a/Telegram/SourceFiles/application.cpp b/Telegram/SourceFiles/application.cpp index d898d1e83..37b005223 100644 --- a/Telegram/SourceFiles/application.cpp +++ b/Telegram/SourceFiles/application.cpp @@ -912,13 +912,28 @@ void AppClass::checkLocalTime() { } void AppClass::onAppStateChanged(Qt::ApplicationState state) { + if (state == Qt::ApplicationActive) { + handleAppActivated(); + } else { + handleAppDeactivated(); + } +} + +void AppClass::handleAppActivated() { checkLocalTime(); if (_window) { - _window->updateIsActive((state == Qt::ApplicationActive) ? Global::OnlineFocusTimeout() : Global::OfflineBlurTimeout()); + if (_window->isHidden()) { + _window->showFromTray(); + } + _window->updateIsActive(Global::OnlineFocusTimeout()); } - if (state != Qt::ApplicationActive) { - Ui::Tooltip::Hide(); +} + +void AppClass::handleAppDeactivated() { + if (_window) { + _window->updateIsActive(Global::OfflineBlurTimeout()); } + Ui::Tooltip::Hide(); } void AppClass::call_handleHistoryUpdate() { diff --git a/Telegram/SourceFiles/application.h b/Telegram/SourceFiles/application.h index d728e68e3..4d73fe573 100644 --- a/Telegram/SourceFiles/application.h +++ b/Telegram/SourceFiles/application.h @@ -147,7 +147,6 @@ class AppClass : public QObject, public RPCSender { Q_OBJECT public: - AppClass(); ~AppClass(); @@ -176,6 +175,9 @@ public: void checkLocalTime(); void checkMapVersion(); + void handleAppActivated(); + void handleAppDeactivated(); + signals: void peerPhotoDone(PeerId peer); diff --git a/Telegram/SourceFiles/platform/mac/main_window_mac.mm b/Telegram/SourceFiles/platform/mac/main_window_mac.mm index b591526c7..635825aaf 100644 --- a/Telegram/SourceFiles/platform/mac/main_window_mac.mm +++ b/Telegram/SourceFiles/platform/mac/main_window_mac.mm @@ -214,12 +214,13 @@ MainWindow::MainWindow() void MainWindow::closeWithoutDestroy() { NSWindow *nsWindow = [reinterpret_cast(winId()) window]; - bool isFullScreen = (([nsWindow styleMask] & NSFullScreenWindowMask) == NSFullScreenWindowMask); + + auto isFullScreen = (([nsWindow styleMask] & NSFullScreenWindowMask) == NSFullScreenWindowMask); if (isFullScreen) { _hideAfterFullScreenTimer.start(3000); [nsWindow toggleFullScreen:nsWindow]; } else { - hide(); + [[NSApplication sharedApplication] hide: nsWindow]; } } @@ -247,7 +248,8 @@ void MainWindow::titleVisibilityChangedHook() { } void MainWindow::onHideAfterFullScreen() { - hide(); + NSWindow *nsWindow = [reinterpret_cast(winId()) window]; + [[NSApplication sharedApplication] hide: nsWindow]; } QImage MainWindow::psTrayIcon(bool selected) const { diff --git a/Telegram/SourceFiles/pspecific_mac_p.mm b/Telegram/SourceFiles/pspecific_mac_p.mm index 44c55eb02..647e61160 100644 --- a/Telegram/SourceFiles/pspecific_mac_p.mm +++ b/Telegram/SourceFiles/pspecific_mac_p.mm @@ -121,11 +121,15 @@ ApplicationDelegate *_sharedDelegate = nil; } - (void)applicationDidBecomeActive:(NSNotification *)aNotification { - if (App::app()) App::app()->checkLocalTime(); + if (App::app()) { + App::app()->handleAppActivated(); + } } - (void)receiveWakeNote:(NSNotification*)aNotification { - if (App::app()) App::app()->checkLocalTime(); + if (App::app()) { + App::app()->checkLocalTime(); + } LOG(("Audio Info: -receiveWakeNote: received, scheduling detach from audio device")); Media::Player::DetachFromDeviceByTimer();