From 27d446bddaa6a259ad7a1166481551f3d0f9e741 Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 17 Feb 2023 13:21:19 +0400 Subject: [PATCH] Improve Ctrl+W / Ctrl+M handling by media viewer. --- Telegram/SourceFiles/core/application.cpp | 15 ++++++++------- .../media/view/media_view_overlay_widget.cpp | 14 ++++++++++++++ .../media/view/media_view_overlay_widget.h | 2 ++ .../SourceFiles/platform/mac/overlay_widget_mac.h | 7 ++++--- .../platform/mac/overlay_widget_mac.mm | 11 +++++++++-- .../platform/platform_overlay_widget.cpp | 5 +++++ .../platform/platform_overlay_widget.h | 5 +++-- Telegram/SourceFiles/window/main_window.h | 2 +- 8 files changed, 46 insertions(+), 15 deletions(-) diff --git a/Telegram/SourceFiles/core/application.cpp b/Telegram/SourceFiles/core/application.cpp index 83cbe5045..1245070db 100644 --- a/Telegram/SourceFiles/core/application.cpp +++ b/Telegram/SourceFiles/core/application.cpp @@ -1499,13 +1499,12 @@ void Application::windowActivated(not_null window) { } bool Application::closeActiveWindow() { - if (hideMediaView()) { + if (_mediaView && _mediaView->isActive()) { + _mediaView->close(); return true; - } - if (!calls().closeCurrentActiveCall()) { + } else if (!calls().closeCurrentActiveCall()) { if (const auto window = activeWindow()) { - if (window->widget()->isVisible() - && window->widget()->isActive()) { + if (window->widget()->isActive()) { window->close(); return true; } @@ -1515,8 +1514,10 @@ bool Application::closeActiveWindow() { } bool Application::minimizeActiveWindow() { - hideMediaView(); - if (!calls().minimizeCurrentActiveCall()) { + if (_mediaView && _mediaView->isActive()) { + _mediaView->minimize(); + return true; + } else if (!calls().minimizeCurrentActiveCall()) { if (const auto window = activeWindow()) { window->minimize(); return true; diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp index b86bcfc7c..5f8d4c39f 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp @@ -1533,6 +1533,9 @@ void OverlayWidget::clearSession() { OverlayWidget::~OverlayWidget() { clearSession(); + + // Otherwise dropdownHidden() may be called from the destructor. + _dropdown.destroy(); } void OverlayWidget::assignMediaPointer(DocumentData *document) { @@ -1592,6 +1595,13 @@ void OverlayWidget::close() { } } +void OverlayWidget::minimize() { + if (isHidden()) { + return; + } + _helper->minimize(_window); +} + void OverlayWidget::toggleFullScreen(bool fullscreen) { if constexpr (Platform::IsMac()) { _fullscreen = fullscreen; @@ -2548,6 +2558,10 @@ void OverlayWidget::update(const QRegion ®ion) { _widget->update(region); } +bool OverlayWidget::isActive() const { + return !isHidden() && !isMinimized() && Ui::InFocusChain(_window); +} + bool OverlayWidget::isHidden() const { return _window->isHidden(); } diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.h b/Telegram/SourceFiles/media/view/media_view_overlay_widget.h index 1ef65da59..ea5981e01 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.h +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.h @@ -80,6 +80,7 @@ public: None, }; + [[nodiscard]] bool isActive() const; [[nodiscard]] bool isHidden() const; [[nodiscard]] bool isMinimized() const; [[nodiscard]] bool isFullScreen() const; @@ -102,6 +103,7 @@ public: void activateControls(); void close(); + void minimize(); void toggleFullScreen(bool fullscreen); void notifyFileDialogShown(bool shown); diff --git a/Telegram/SourceFiles/platform/mac/overlay_widget_mac.h b/Telegram/SourceFiles/platform/mac/overlay_widget_mac.h index 077fc5412..ef9c6690a 100644 --- a/Telegram/SourceFiles/platform/mac/overlay_widget_mac.h +++ b/Telegram/SourceFiles/platform/mac/overlay_widget_mac.h @@ -17,10 +17,11 @@ public: not_null window, Fn maximize); ~MacOverlayWidgetHelper(); - + void beforeShow(bool fullscreen) override; void afterShow(bool fullscreen) override; void notifyFileDialogShown(bool shown) override; + void minimize(not_null window) override; private: struct Data; @@ -29,9 +30,9 @@ private: void resolveNative(); void updateStyles(bool fullscreen); void refreshButtons(bool fullscreen); - + std::unique_ptr _data; - + }; } // namespace Platform diff --git a/Telegram/SourceFiles/platform/mac/overlay_widget_mac.mm b/Telegram/SourceFiles/platform/mac/overlay_widget_mac.mm index 8c49ddf7d..39f5a1f33 100644 --- a/Telegram/SourceFiles/platform/mac/overlay_widget_mac.mm +++ b/Telegram/SourceFiles/platform/mac/overlay_widget_mac.mm @@ -67,7 +67,7 @@ namespace { const auto full = [window frame]; const auto inner = [window contentRectForFrameRect:full].size.height; const auto height = std::max(full.size.height - inner, 0.); - + result[int(NSWindowToolbarButton)] = { CGPoint(), CGSize{ full.size.width, height }}; return result; } @@ -154,7 +154,7 @@ void MacOverlayWidgetHelper::updateStyles(bool fullscreen) { void MacOverlayWidgetHelper::refreshButtons(bool fullscreen) { Expects(_data->native != nullptr); - + const auto window = _data->native; auto next = CGPoint(); const auto added = [&](NSRect frame) { @@ -250,6 +250,13 @@ void MacOverlayWidgetHelper::notifyFileDialogShown(bool shown) { } } +void MacOverlayWidgetHelper::minimize(not_null window) { + resolveNative(); + if (_data->native) { + [_data->native miniaturize:_data->handler]; + } +} + std::unique_ptr CreateOverlayWidgetHelper( not_null window, Fn maximize) { diff --git a/Telegram/SourceFiles/platform/platform_overlay_widget.cpp b/Telegram/SourceFiles/platform/platform_overlay_widget.cpp index ae7f5c56c..b9805c13d 100644 --- a/Telegram/SourceFiles/platform/platform_overlay_widget.cpp +++ b/Telegram/SourceFiles/platform/platform_overlay_widget.cpp @@ -8,10 +8,15 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "platform/platform_overlay_widget.h" #include "ui/platform/ui_platform_window_title.h" +#include "ui/widgets/rp_window.h" #include "styles/style_calls.h" namespace Platform { +void OverlayWidgetHelper::minimize(not_null window) { + window->setWindowState(window->windowState() | Qt::WindowMinimized); +} + DefaultOverlayWidgetHelper::DefaultOverlayWidgetHelper( not_null window, Fn maximize) diff --git a/Telegram/SourceFiles/platform/platform_overlay_widget.h b/Telegram/SourceFiles/platform/platform_overlay_widget.h index d87bf031f..06e969653 100644 --- a/Telegram/SourceFiles/platform/platform_overlay_widget.h +++ b/Telegram/SourceFiles/platform/platform_overlay_widget.h @@ -32,6 +32,7 @@ public: } virtual void notifyFileDialogShown(bool shown) { } + virtual void minimize(not_null window); }; [[nodiscard]] std::unique_ptr CreateOverlayWidgetHelper( @@ -44,10 +45,10 @@ public: not_null window, Fn maximize); ~DefaultOverlayWidgetHelper(); - + void orderWidgets() override; bool skipTitleHitTest(QPoint position) override; - + private: const std::unique_ptr _controls; diff --git a/Telegram/SourceFiles/window/main_window.h b/Telegram/SourceFiles/window/main_window.h index 0fcd9cf80..8393498a6 100644 --- a/Telegram/SourceFiles/window/main_window.h +++ b/Telegram/SourceFiles/window/main_window.h @@ -83,7 +83,7 @@ public: void updateIsActive(); [[nodiscard]] bool isActive() const { - return _isActive; + return !isHidden() && _isActive; } [[nodiscard]] virtual bool isActiveForTrayMenu() { updateIsActive();