From 6ca167679d130299271d8cd9418b40ce79093b00 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Fri, 10 Jun 2022 13:59:19 +0300 Subject: [PATCH] Added ability to invoke callback for non-primary window controllers. --- Telegram/SourceFiles/intro/intro_widget.cpp | 3 ++- .../media/view/media_view_overlay_widget.cpp | 21 ++++++++++--------- .../SourceFiles/window/window_controller.cpp | 10 +++++++++ .../SourceFiles/window/window_controller.h | 1 + .../window/window_session_controller.cpp | 3 ++- 5 files changed, 26 insertions(+), 12 deletions(-) diff --git a/Telegram/SourceFiles/intro/intro_widget.cpp b/Telegram/SourceFiles/intro/intro_widget.cpp index 3746e829a1..7542be9752 100644 --- a/Telegram/SourceFiles/intro/intro_widget.cpp +++ b/Telegram/SourceFiles/intro/intro_widget.cpp @@ -194,7 +194,8 @@ bool Widget::floatPlayerIsVisible(not_null item) { void Widget::floatPlayerDoubleClickEvent(not_null item) { getData()->controller->invokeForSessionController( &item->history()->peer->session().account(), - [=](not_null controller) { + item->history()->peer, + [&](not_null controller) { controller->showPeerHistoryAtItem(item); }); } diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp index 3785edacb9..e3920a701e 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp @@ -4735,16 +4735,17 @@ Window::SessionController *OverlayWidget::findWindow(bool switchTo) const { } } - const auto &active = _session->windows(); - if (!active.empty()) { - return active.front(); - } else if (window && switchTo) { - Window::SessionController *controllerPtr = nullptr; - window->invokeForSessionController( - &_session->account(), - [&](not_null newController) { - controllerPtr = newController; - }); + if (switchTo) { + auto controllerPtr = (Window::SessionController*)nullptr; + const auto anyWindow = window ? window : Core::App().primaryWindow(); + if (anyWindow) { + anyWindow->invokeForSessionController( + &_session->account(), + _history ? _history->peer : nullptr, + [&](not_null newController) { + controllerPtr = newController; + }); + } return controllerPtr; } diff --git a/Telegram/SourceFiles/window/window_controller.cpp b/Telegram/SourceFiles/window/window_controller.cpp index cad568bb2c..610a742d11 100644 --- a/Telegram/SourceFiles/window/window_controller.cpp +++ b/Telegram/SourceFiles/window/window_controller.cpp @@ -383,7 +383,17 @@ void Controller::preventOrInvoke(Fn &&callback) { void Controller::invokeForSessionController( not_null account, + PeerData *singlePeer, Fn)> &&callback) { + const auto separateWindow = singlePeer + ? Core::App().separateWindowForPeer(singlePeer) + : nullptr; + const auto separateSession = separateWindow + ? separateWindow->sessionController() + : nullptr; + if (separateSession) { + return callback(separateSession); + } _account->domain().activate(std::move(account)); if (_sessionController) { callback(_sessionController.get()); diff --git a/Telegram/SourceFiles/window/window_controller.h b/Telegram/SourceFiles/window/window_controller.h index 01cb58fa88..6792826f10 100644 --- a/Telegram/SourceFiles/window/window_controller.h +++ b/Telegram/SourceFiles/window/window_controller.h @@ -98,6 +98,7 @@ public: void invokeForSessionController( not_null account, + PeerData *singlePeer, Fn)> &&callback); void openInMediaView(Media::View::OpenRequest &&request); diff --git a/Telegram/SourceFiles/window/window_session_controller.cpp b/Telegram/SourceFiles/window/window_session_controller.cpp index a86ac76609..b084c998ac 100644 --- a/Telegram/SourceFiles/window/window_session_controller.cpp +++ b/Telegram/SourceFiles/window/window_session_controller.cpp @@ -1466,7 +1466,8 @@ void SessionController::showPeerHistoryAtItem( not_null item) { _window->invokeForSessionController( &item->history()->peer->session().account(), - [=](not_null controller) { + item->history()->peer, + [&](not_null controller) { if (item->isScheduled()) { controller->showSection( std::make_shared(