diff --git a/Telegram/SourceFiles/data/data_document_resolver.cpp b/Telegram/SourceFiles/data/data_document_resolver.cpp index df6e4ea67..9588cea4b 100644 --- a/Telegram/SourceFiles/data/data_document_resolver.cpp +++ b/Telegram/SourceFiles/data/data_document_resolver.cpp @@ -209,7 +209,7 @@ base::binary_guard ReadImageAsync( } void ResolveDocument( - not_null controller, + Window::SessionController *controller, not_null document, HistoryItem *item) { if (!document->date) { @@ -222,7 +222,7 @@ void ResolveDocument( && document->isVideoFile() && !document->filepath().isEmpty()) { File::Launch(document->location(false).fname); - } else { + } else if (controller) { controller->openDocument(document, msgId, true); } }; diff --git a/Telegram/SourceFiles/data/data_document_resolver.h b/Telegram/SourceFiles/data/data_document_resolver.h index 03a689947..b1cf745a4 100644 --- a/Telegram/SourceFiles/data/data_document_resolver.h +++ b/Telegram/SourceFiles/data/data_document_resolver.h @@ -30,7 +30,7 @@ base::binary_guard ReadImageAsync( FnMut done); void ResolveDocument( - not_null controller, + Window::SessionController *controller, not_null document, HistoryItem *item); diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp index 3fde0a195..ab523514a 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp @@ -1427,12 +1427,15 @@ void OverlayWidget::subscribeToScreenGeometry() { } void OverlayWidget::toMessage() { - if (!_session || !_controller) { + if (!_session) { return; } + if (const auto item = _session->data().message(_msgid)) { close(); - _controller->showPeerHistoryAtItem(item); + if (const auto window = findWindow()) { + window->showPeerHistoryAtItem(item); + } } } @@ -1556,11 +1559,8 @@ void OverlayWidget::handleDocumentClick() { if (_document->loading()) { saveCancel(); } else { - if (!_controller) { - return; - } Data::ResolveDocument( - _controller, + findWindow(), _document, _document->owner().message(_msgid)); if (_document->loading() && !_radial.animating()) { @@ -2251,10 +2251,6 @@ void OverlayWidget::activate() { } void OverlayWidget::show(OpenRequest request) { - if (!request.controller()) { - return; - } - const auto document = request.document(); const auto photo = request.photo(); const auto contextItem = request.item(); @@ -2264,8 +2260,6 @@ void OverlayWidget::show(OpenRequest request) { return; } setSession(&photo->session()); - _controller = request.controller(); - Assert(_session == (&_controller->session())); if (contextPeer) { setContext(contextPeer); @@ -2284,8 +2278,6 @@ void OverlayWidget::show(OpenRequest request) { activateControls(); } else if (document) { setSession(&document->session()); - _controller = request.controller(); - Assert(_session == (&_controller->session())); if (contextItem) { setContext(contextItem); @@ -2308,6 +2300,9 @@ void OverlayWidget::show(OpenRequest request) { activateControls(); } } + if (const auto controller = request.controller()) { + _window = base::make_weak(&controller->window()); + } } void OverlayWidget::displayPhoto(not_null photo, HistoryItem *item) { @@ -3097,14 +3092,13 @@ float64 OverlayWidget::playbackControlsCurrentSpeed() { void OverlayWidget::switchToPip() { Expects(_streamed != nullptr); Expects(_document != nullptr); - Expects(_controller != nullptr); const auto document = _document; const auto msgId = _msgid; const auto closeAndContinue = [=] { _showAsPip = false; show(OpenRequest( - _controller, + findWindow(), document, document->owner().message(msgId), true)); @@ -4538,6 +4532,36 @@ void OverlayWidget::applyHideWindowWorkaround() { } } +Window::SessionController *OverlayWidget::findWindow() const { + if (!_session) { + return nullptr; + } + + const auto window = _window.get(); + if (window) { + if (const auto controller = window->sessionController()) { + if (&controller->session() == _session) { + return controller; + } + } + } + + const auto &active = _session->windows(); + if (!active.empty()) { + return active.front(); + } else if (window) { + Window::SessionController *controllerPtr = nullptr; + window->invokeForSessionController( + &_session->account(), + [&](not_null newController) { + controllerPtr = newController; + }); + return controllerPtr; + } + + return nullptr; +} + // #TODO unite and check void OverlayWidget::clearBeforeHide() { _sharedMedia = nullptr; diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.h b/Telegram/SourceFiles/media/view/media_view_overlay_widget.h index a2618d70f..3d567edf5 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.h +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.h @@ -411,11 +411,13 @@ private: void applyHideWindowWorkaround(); + Window::SessionController *findWindow() const; + bool _opengl = false; const std::unique_ptr _surface; const not_null _widget; - Window::SessionController *_controller = nullptr; + base::weak_ptr _window; Main::Session *_session = nullptr; rpl::lifetime _sessionLifetime; PhotoData *_photo = nullptr; diff --git a/Telegram/SourceFiles/window/window_controller.h b/Telegram/SourceFiles/window/window_controller.h index bdf8ade84..1b20e7e0a 100644 --- a/Telegram/SourceFiles/window/window_controller.h +++ b/Telegram/SourceFiles/window/window_controller.h @@ -21,7 +21,7 @@ struct OpenRequest; namespace Window { -class Controller final { +class Controller final : public base::has_weak_ptr { public: Controller(); ~Controller();