From 1e6d4d6b410294cbf0d58c9314c19ceadbca888b Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 19 May 2017 17:02:55 +0300 Subject: [PATCH] Activate mediaview instead of main window. If the mediaview is currently shown and we receive an activation event for the main window we should activate and focus mediaview. --- Telegram/SourceFiles/mainwindow.cpp | 51 ++++++------------- Telegram/SourceFiles/mainwindow.h | 6 --- .../platform/linux/main_window_linux.cpp | 3 -- .../platform/linux/main_window_linux.h | 1 - .../platform/mac/main_window_mac.h | 1 - .../platform/mac/main_window_mac.mm | 3 -- .../platform/win/main_window_win.cpp | 8 ++- .../platform/win/main_window_win.h | 4 +- .../platform/win/windows_event_filter.cpp | 2 +- Telegram/SourceFiles/window/main_window.cpp | 23 +++++++++ Telegram/SourceFiles/window/main_window.h | 2 + 11 files changed, 51 insertions(+), 53 deletions(-) diff --git a/Telegram/SourceFiles/mainwindow.cpp b/Telegram/SourceFiles/mainwindow.cpp index 0536632f7..ee035fab4 100644 --- a/Telegram/SourceFiles/mainwindow.cpp +++ b/Telegram/SourceFiles/mainwindow.cpp @@ -148,33 +148,11 @@ void MainWindow::onInactiveTimer() { inactivePress(false); } -void MainWindow::onStateChanged(Qt::WindowState state) { - stateChangedHook(state); - - psUserActionDone(); - - updateIsActive((state == Qt::WindowMinimized) ? Global::OfflineBlurTimeout() : Global::OnlineFocusTimeout()); - - psUpdateSysMenu(state); - if (state == Qt::WindowMinimized && Global::WorkMode().value() == dbiwmTrayOnly) { - App::wnd()->minimizeToTray(); - } - savePosition(state); -} - void MainWindow::initHook() { Platform::MainWindow::initHook(); QCoreApplication::instance()->installEventFilter(this); - connect(windowHandle(), SIGNAL(windowStateChanged(Qt::WindowState)), this, SLOT(onStateChanged(Qt::WindowState))); - connect(windowHandle(), SIGNAL(activeChanged()), this, SLOT(onWindowActiveChanged()), Qt::QueuedConnection); -} - -void MainWindow::onWindowActiveChanged() { - checkHistoryActivation(); - QTimer::singleShot(1, base::lambda_slot_once(this, [this] { - updateTrayMenu(); - }), SLOT(action())); + connect(windowHandle(), &QWindow::activeChanged, this, [this] { checkHistoryActivation(); }, Qt::QueuedConnection); } void MainWindow::firstShow() { @@ -333,7 +311,6 @@ void MainWindow::setupMain(const MTPUser *self) { t_assert(AuthSession::Exists()); - _main.create(bodyWidget(), controller()); _main->show(); updateControlsGeometry(); @@ -589,7 +566,7 @@ void MainWindow::setInnerFocus() { } } -bool MainWindow::eventFilter(QObject *obj, QEvent *e) { +bool MainWindow::eventFilter(QObject *object, QEvent *e) { switch (e->type()) { case QEvent::MouseButtonPress: case QEvent::KeyPress: @@ -620,14 +597,16 @@ bool MainWindow::eventFilter(QObject *obj, QEvent *e) { break; case QEvent::ApplicationActivate: - if (obj == QCoreApplication::instance()) { + if (object == QCoreApplication::instance()) { psUserActionDone(); - QTimer::singleShot(1, this, SLOT(onWindowActiveChanged())); + App::CallDelayed(1, this, [this] { + handleActiveChanged(); + }); } break; case QEvent::FileOpen: - if (obj == QCoreApplication::instance()) { + if (object == QCoreApplication::instance()) { QString url = static_cast(e)->url().toEncoded().trimmed(); if (url.startsWith(qstr("tg://"), Qt::CaseInsensitive)) { cSetStartUrl(url.mid(0, 8192)); @@ -640,21 +619,23 @@ bool MainWindow::eventFilter(QObject *obj, QEvent *e) { break; case QEvent::WindowStateChange: - if (obj == this) { - Qt::WindowState state = (windowState() & Qt::WindowMinimized) ? Qt::WindowMinimized : ((windowState() & Qt::WindowMaximized) ? Qt::WindowMaximized : ((windowState() & Qt::WindowFullScreen) ? Qt::WindowFullScreen : Qt::WindowNoState)); - onStateChanged(state); + if (object == this) { + auto state = (windowState() & Qt::WindowMinimized) ? Qt::WindowMinimized : + ((windowState() & Qt::WindowMaximized) ? Qt::WindowMaximized : + ((windowState() & Qt::WindowFullScreen) ? Qt::WindowFullScreen : Qt::WindowNoState)); + handleStateChanged(state); } break; case QEvent::Move: case QEvent::Resize: - if (obj == this) { + if (object == this) { positionUpdated(); } break; } - return Platform::MainWindow::eventFilter(obj, e); + return Platform::MainWindow::eventFilter(object, e); } void MainWindow::updateTrayMenu(bool force) { @@ -774,10 +755,10 @@ void MainWindow::fixOrder() { void MainWindow::showFromTray(QSystemTrayIcon::ActivationReason reason) { if (reason != QSystemTrayIcon::Context) { - QTimer::singleShot(1, base::lambda_slot_once(this, [this] { + App::CallDelayed(1, this, [this] { updateTrayMenu(); updateGlobalMenu(); - }), SLOT(action())); + }); activate(); Notify::unreadCounterUpdated(); } diff --git a/Telegram/SourceFiles/mainwindow.h b/Telegram/SourceFiles/mainwindow.h index 0cded7d69..8247d66b9 100644 --- a/Telegram/SourceFiles/mainwindow.h +++ b/Telegram/SourceFiles/mainwindow.h @@ -24,7 +24,6 @@ Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org #include "platform/platform_main_window.h" #include "core/single_timer.h" -class MediaView; class PasscodeWidget; class MainWidget; class LayerStackWidget; @@ -188,11 +187,6 @@ signals: void tempDirClearFailed(int task); void checkNewAuthorization(); -private slots: - void onStateChanged(Qt::WindowState state); - - void onWindowActiveChanged(); - private: void checkAuthSession(); void showConnecting(const QString &text, const QString &reconnect = QString()); diff --git a/Telegram/SourceFiles/platform/linux/main_window_linux.cpp b/Telegram/SourceFiles/platform/linux/main_window_linux.cpp index 4555358b0..a71aeced9 100644 --- a/Telegram/SourceFiles/platform/linux/main_window_linux.cpp +++ b/Telegram/SourceFiles/platform/linux/main_window_linux.cpp @@ -567,9 +567,6 @@ void MainWindow::psFirstShow() { void MainWindow::psInitSysMenu() { } -void MainWindow::psUpdateSysMenu(Qt::WindowState state) { -} - void MainWindow::psUpdateMargins() { } diff --git a/Telegram/SourceFiles/platform/linux/main_window_linux.h b/Telegram/SourceFiles/platform/linux/main_window_linux.h index 10859223e..56cc4977e 100644 --- a/Telegram/SourceFiles/platform/linux/main_window_linux.h +++ b/Telegram/SourceFiles/platform/linux/main_window_linux.h @@ -32,7 +32,6 @@ public: void psFirstShow(); void psInitSysMenu(); - void psUpdateSysMenu(Qt::WindowState state); void psUpdateMargins(); void psRefreshTaskbarIcon() { diff --git a/Telegram/SourceFiles/platform/mac/main_window_mac.h b/Telegram/SourceFiles/platform/mac/main_window_mac.h index 6470efeef..cf5d99e1c 100644 --- a/Telegram/SourceFiles/platform/mac/main_window_mac.h +++ b/Telegram/SourceFiles/platform/mac/main_window_mac.h @@ -34,7 +34,6 @@ public: void psFirstShow(); void psInitSysMenu(); - void psUpdateSysMenu(Qt::WindowState state); void psUpdateMargins(); void psRefreshTaskbarIcon() { diff --git a/Telegram/SourceFiles/platform/mac/main_window_mac.mm b/Telegram/SourceFiles/platform/mac/main_window_mac.mm index 748222a99..2b113c761 100644 --- a/Telegram/SourceFiles/platform/mac/main_window_mac.mm +++ b/Telegram/SourceFiles/platform/mac/main_window_mac.mm @@ -496,9 +496,6 @@ void MainWindow::psMacSelectAll() { void MainWindow::psInitSysMenu() { } -void MainWindow::psUpdateSysMenu(Qt::WindowState state) { -} - void MainWindow::psUpdateMargins() { } diff --git a/Telegram/SourceFiles/platform/win/main_window_win.cpp b/Telegram/SourceFiles/platform/win/main_window_win.cpp index 6d1bec78b..8ee3fbb3d 100644 --- a/Telegram/SourceFiles/platform/win/main_window_win.cpp +++ b/Telegram/SourceFiles/platform/win/main_window_win.cpp @@ -829,13 +829,17 @@ void MainWindow::psFirstShow() { } } +void MainWindow::stateChangedHook(Qt::WindowState state) { + updateSystemMenu(state); +} + void MainWindow::psInitSysMenu() { Qt::WindowStates states = windowState(); ps_menu = GetSystemMenu(ps_hWnd, FALSE); - psUpdateSysMenu(windowHandle()->windowState()); + updateSystemMenu(windowHandle()->windowState()); } -void MainWindow::psUpdateSysMenu(Qt::WindowState state) { +void MainWindow::updateSystemMenu(Qt::WindowState state) { if (!ps_menu) return; int menuToDisable = SC_RESTORE; diff --git a/Telegram/SourceFiles/platform/win/main_window_win.h b/Telegram/SourceFiles/platform/win/main_window_win.h index e72c20f3c..97b8c54be 100644 --- a/Telegram/SourceFiles/platform/win/main_window_win.h +++ b/Telegram/SourceFiles/platform/win/main_window_win.h @@ -40,7 +40,7 @@ public: void psFirstShow(); void psInitSysMenu(); - void psUpdateSysMenu(Qt::WindowState state); + void updateSystemMenu(Qt::WindowState state); void psUpdateMargins(); void psRefreshTaskbarIcon(); @@ -86,6 +86,8 @@ protected: int32 screenNameChecksum(const QString &name) const override; void unreadCounterChangedHook() override; + void stateChangedHook(Qt::WindowState state) override; + bool hasTrayIcon() const override { return trayIcon; } diff --git a/Telegram/SourceFiles/platform/win/windows_event_filter.cpp b/Telegram/SourceFiles/platform/win/windows_event_filter.cpp index 39b9fad5a..400f67e18 100644 --- a/Telegram/SourceFiles/platform/win/windows_event_filter.cpp +++ b/Telegram/SourceFiles/platform/win/windows_event_filter.cpp @@ -208,7 +208,7 @@ bool EventFilter::mainWindowEvent(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lPa case WM_SYSCOMMAND: { if (wParam == SC_MOUSEMENU) { POINTS p = MAKEPOINTS(lParam); - App::wnd()->psUpdateSysMenu(App::wnd()->windowHandle()->windowState()); + App::wnd()->updateSystemMenu(App::wnd()->windowHandle()->windowState()); TrackPopupMenu(App::wnd()->psMenu(), TPM_LEFTALIGN | TPM_TOPALIGN | TPM_LEFTBUTTON, p.x, p.y, 0, hWnd, 0); } } return false; diff --git a/Telegram/SourceFiles/window/main_window.cpp b/Telegram/SourceFiles/window/main_window.cpp index 154a71fc1..598794812 100644 --- a/Telegram/SourceFiles/window/main_window.cpp +++ b/Telegram/SourceFiles/window/main_window.cpp @@ -190,6 +190,9 @@ void MainWindow::init() { initHook(); updateWindowIcon(); + connect(windowHandle(), &QWindow::activeChanged, this, [this] { handleActiveChanged(); }, Qt::QueuedConnection); + connect(windowHandle(), &QWindow::windowStateChanged, this, [this](Qt::WindowState state) { handleStateChanged(state); }); + _positionUpdatedTimer->setSingleShot(true); connect(_positionUpdatedTimer, SIGNAL(timeout()), this, SLOT(savePositionByTimer())); @@ -203,6 +206,26 @@ void MainWindow::init() { updateUnreadCounter(); } +void MainWindow::handleStateChanged(Qt::WindowState state) { + stateChangedHook(state); + updateIsActive((state == Qt::WindowMinimized) ? Global::OfflineBlurTimeout() : Global::OnlineFocusTimeout()); + psUserActionDone(); + if (state == Qt::WindowMinimized && Global::WorkMode().value() == dbiwmTrayOnly) { + minimizeToTray(); + } + savePosition(state); +} + +void MainWindow::handleActiveChanged() { + if (isActiveWindow() && _mediaView && !_mediaView->isHidden()) { + _mediaView->activateWindow(); + _mediaView->setFocus(); + } + App::CallDelayed(1, this, [this] { + updateTrayMenu(); + }); +} + void MainWindow::updatePalette() { auto p = palette(); p.setColor(QPalette::Window, st::windowBg->c); diff --git a/Telegram/SourceFiles/window/main_window.h b/Telegram/SourceFiles/window/main_window.h index 607cf5bb8..5f539d57f 100644 --- a/Telegram/SourceFiles/window/main_window.h +++ b/Telegram/SourceFiles/window/main_window.h @@ -100,6 +100,8 @@ protected: void resizeEvent(QResizeEvent *e) override; void savePosition(Qt::WindowState state = Qt::WindowActive); + void handleStateChanged(Qt::WindowState state); + void handleActiveChanged(); virtual void initHook() { }