From cd67cb1c62637dae2d00fdc87746c6b5f1365cd1 Mon Sep 17 00:00:00 2001 From: Ilya Fedin Date: Mon, 16 Nov 2020 20:47:32 +0400 Subject: [PATCH] Update media viewer geometry on showing and screen change --- .../media/view/media_view_overlay_widget.cpp | 45 +++++++++++++++---- .../media/view/media_view_overlay_widget.h | 6 ++- 2 files changed, 41 insertions(+), 10 deletions(-) diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp index 245388078e..e7d4fce548 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp @@ -359,6 +359,7 @@ OverlayWidget::OverlayWidget() } else { setWindowFlags(Qt::FramelessWindowHint); } + updateGeometry(QApplication::primaryScreen()->geometry()); moveToScreen(); setAttribute(Qt::WA_NoSystemBackground, true); setAttribute(Qt::WA_TranslucentBackground, true); @@ -374,6 +375,17 @@ OverlayWidget::OverlayWidget() setWindowState(Qt::WindowFullScreen); } + connect( + windowHandle(), + &QWindow::visibleChanged, + this, + [=](bool visible) { handleVisibleChanged(visible); }); + connect( + windowHandle(), + &QWindow::screenChanged, + this, + [=](QScreen *screen) { handleScreenChanged(screen); }); + #if defined Q_OS_MAC && !defined OS_OSX TouchBar::SetupMediaViewTouchBar( winId(), @@ -417,7 +429,7 @@ void OverlayWidget::refreshLang() { InvokeQueued(this, [this] { updateThemePreviewGeometry(); }); } -void OverlayWidget::moveToScreen(bool force) { +void OverlayWidget::moveToScreen() { const auto widgetScreen = [&](auto &&widget) -> QScreen* { if (auto handle = widget ? widget->windowHandle() : nullptr) { return handle->screen(); @@ -432,14 +444,10 @@ void OverlayWidget::moveToScreen(bool force) { if (activeWindowScreen && myScreen && myScreen != activeWindowScreen) { windowHandle()->setScreen(activeWindowScreen); } - const auto screen = activeWindowScreen - ? activeWindowScreen - : QApplication::primaryScreen(); - const auto available = screen->geometry(); - if (!force && geometry() == available) { - return; - } - setGeometry(available); +} + +void OverlayWidget::updateGeometry(const QRect &rect) { + setGeometry(rect); auto navSkip = 2 * st::mediaviewControlMargin + st::mediaviewControlSize; _closeNav = myrtlrect(width() - st::mediaviewControlMargin - st::mediaviewControlSize, st::mediaviewControlMargin, st::mediaviewControlSize, st::mediaviewControlSize); @@ -1294,6 +1302,12 @@ void OverlayWidget::onScreenResized(int screen) { const auto changed = (screen >= 0 && screen < screens.size()) ? screens[screen] : nullptr; + if (windowHandle() + && windowHandle()->screen() + && changed + && windowHandle()->screen() == changed) { + updateGeometry(changed->geometry()); + } if (!windowHandle() || !windowHandle()->screen() || !changed @@ -1302,6 +1316,19 @@ void OverlayWidget::onScreenResized(int screen) { } } +void OverlayWidget::handleVisibleChanged(bool visible) { + if (visible) { + const auto screen = windowHandle()->screen() + ? windowHandle()->screen() + : QApplication::primaryScreen(); + updateGeometry(screen->geometry()); + } +} + +void OverlayWidget::handleScreenChanged(QScreen *screen) { + updateGeometry(screen->geometry()); +} + void OverlayWidget::onToMessage() { if (!_session) { return; diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.h b/Telegram/SourceFiles/media/view/media_view_overlay_widget.h index 5987609285..194659f408 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.h +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.h @@ -208,10 +208,14 @@ private: void assignMediaPointer(not_null photo); void updateOver(QPoint mpos); - void moveToScreen(bool force = false); + void moveToScreen(); bool moveToNext(int delta); void preloadData(int delta); + void updateGeometry(const QRect &rect); + void handleVisibleChanged(bool visible); + void handleScreenChanged(QScreen *screen); + bool contentCanBeSaved() const; void checkForSaveLoaded();