diff --git a/Telegram/SourceFiles/calls/calls_instance.cpp b/Telegram/SourceFiles/calls/calls_instance.cpp index e48a41a93..4ea1264c4 100644 --- a/Telegram/SourceFiles/calls/calls_instance.cpp +++ b/Telegram/SourceFiles/calls/calls_instance.cpp @@ -734,6 +734,17 @@ bool Instance::minimizeCurrentActiveCall() { return false; } +bool Instance::toggleFullScreenCurrentActiveCall() { + if (inCall() && _currentCallPanel->isActive()) { + _currentCallPanel->toggleFullScreen(); + return true; + } else if (inGroupCall() && _currentGroupCallPanel->isActive()) { + _currentGroupCallPanel->toggleFullScreen(); + return true; + } + return false; +} + bool Instance::closeCurrentActiveCall() { if (inGroupCall() && _currentGroupCallPanel->isActive()) { _currentGroupCallPanel->close(); diff --git a/Telegram/SourceFiles/calls/calls_instance.h b/Telegram/SourceFiles/calls/calls_instance.h index fcfbc55cf..679419711 100644 --- a/Telegram/SourceFiles/calls/calls_instance.h +++ b/Telegram/SourceFiles/calls/calls_instance.h @@ -93,6 +93,7 @@ public: not_null session) const; bool activateCurrentCall(const QString &joinHash = QString()); bool minimizeCurrentActiveCall(); + bool toggleFullScreenCurrentActiveCall(); bool closeCurrentActiveCall(); [[nodiscard]] auto getVideoCapture( std::optional deviceId = std::nullopt, diff --git a/Telegram/SourceFiles/calls/calls_panel.cpp b/Telegram/SourceFiles/calls/calls_panel.cpp index 99177e487..fcb0a1c7b 100644 --- a/Telegram/SourceFiles/calls/calls_panel.cpp +++ b/Telegram/SourceFiles/calls/calls_panel.cpp @@ -128,6 +128,10 @@ void Panel::minimize() { window()->setWindowState(window()->windowState() | Qt::WindowMinimized); } +void Panel::toggleFullScreen() { + toggleFullScreen(!window()->isFullScreen()); +} + void Panel::replaceCall(not_null call) { reinitWithCall(call); updateControlsGeometry(); diff --git a/Telegram/SourceFiles/calls/calls_panel.h b/Telegram/SourceFiles/calls/calls_panel.h index 77c9768f2..16836db62 100644 --- a/Telegram/SourceFiles/calls/calls_panel.h +++ b/Telegram/SourceFiles/calls/calls_panel.h @@ -64,6 +64,7 @@ public: [[nodiscard]] bool isActive() const; void showAndActivate(); void minimize(); + void toggleFullScreen(); void replaceCall(not_null call); void closeBeforeDestroy(); diff --git a/Telegram/SourceFiles/calls/group/calls_group_panel.cpp b/Telegram/SourceFiles/calls/group/calls_group_panel.cpp index 0a6dd7790..7214a344c 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_panel.cpp +++ b/Telegram/SourceFiles/calls/group/calls_group_panel.cpp @@ -487,7 +487,7 @@ void Panel::initControls() { } void Panel::toggleFullScreen() { - if (_fullScreenOrMaximized.current()) { + if (_fullScreenOrMaximized.current() || window()->isFullScreen()) { window()->showNormal(); } else { window()->showFullScreen(); diff --git a/Telegram/SourceFiles/calls/group/calls_group_panel.h b/Telegram/SourceFiles/calls/group/calls_group_panel.h index c1d251a50..e607d0c95 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_panel.h +++ b/Telegram/SourceFiles/calls/group/calls_group_panel.h @@ -94,6 +94,7 @@ public: void hideLayer(anim::type animated = anim::type::normal); void minimize(); + void toggleFullScreen(); void close(); void showAndActivate(); void closeBeforeDestroy(); @@ -133,7 +134,6 @@ private: bool handleClose(); void startScheduledNow(); - void toggleFullScreen(); void trackControls(bool track, bool force = false); void raiseControls(); void enlargeVideo(); diff --git a/Telegram/SourceFiles/core/application.cpp b/Telegram/SourceFiles/core/application.cpp index d3699c01a..e251ca7de 100644 --- a/Telegram/SourceFiles/core/application.cpp +++ b/Telegram/SourceFiles/core/application.cpp @@ -30,6 +30,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "chat_helpers/emoji_keywords.h" #include "chat_helpers/stickers_emoji_image_loader.h" #include "base/qt/qt_common_adapters.h" +#include "base/platform/base_platform_global_shortcuts.h" #include "base/platform/base_platform_url_scheme.h" #include "base/platform/base_platform_last_input.h" #include "base/platform/base_platform_info.h" @@ -618,7 +619,14 @@ bool Application::hideMediaView() { bool Application::eventFilter(QObject *object, QEvent *e) { switch (e->type()) { - case QEvent::KeyPress: + case QEvent::KeyPress: { + updateNonIdle(); + const auto event = static_cast(e); + if (base::Platform::GlobalShortcuts::IsToggleFullScreenKey(event) + && toggleActiveWindowFullScreen()) { + return true; + } + } break; case QEvent::MouseButtonPress: case QEvent::TouchBegin: case QEvent::Wheel: { @@ -1513,7 +1521,9 @@ bool Application::minimizeActiveWindow() { if (_mediaView && _mediaView->isActive()) { _mediaView->minimize(); return true; - } else if (!calls().minimizeCurrentActiveCall()) { + } else if (calls().minimizeCurrentActiveCall()) { + return true; + } else { if (const auto window = activeWindow()) { window->minimize(); return true; @@ -1522,6 +1532,25 @@ bool Application::minimizeActiveWindow() { return false; } +bool Application::toggleActiveWindowFullScreen() { + if (_mediaView && _mediaView->isActive()) { + _mediaView->toggleFullScreen(); + return true; + } else if (calls().toggleFullScreenCurrentActiveCall()) { + return true; + } else if (const auto window = activeWindow()) { + if constexpr (Platform::IsMac()) { + if (window->widget()->isFullScreen()) { + window->widget()->showNormal(); + } else { + window->widget()->showFullScreen(); + } + return true; + } + } + return false; +} + QWidget *Application::getFileDialogParent() { if (const auto view = _mediaView.get(); view && !view->isHidden()) { return view->widget(); diff --git a/Telegram/SourceFiles/core/application.h b/Telegram/SourceFiles/core/application.h index ef7671150..0488dec3c 100644 --- a/Telegram/SourceFiles/core/application.h +++ b/Telegram/SourceFiles/core/application.h @@ -182,6 +182,7 @@ public: void windowActivated(not_null window); bool closeActiveWindow(); bool minimizeActiveWindow(); + bool toggleActiveWindowFullScreen(); [[nodiscard]] QWidget *getFileDialogParent(); void notifyFileDialogShown(bool shown); void checkSystemDarkMode(); diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp index 8877f6280..7cdfcf9ce 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp @@ -1826,6 +1826,10 @@ void OverlayWidget::minimize() { _helper->minimize(_window); } +void OverlayWidget::toggleFullScreen() { + toggleFullScreen(!_fullscreen); +} + void OverlayWidget::toggleFullScreen(bool fullscreen) { _helper->clearState(); _fullscreen = fullscreen; @@ -5170,10 +5174,12 @@ bool OverlayWidget::filterApplicationEvent( const auto ctrl = event->modifiers().testFlag(Qt::ControlModifier); if (key == Qt::Key_F && ctrl && _streamed) { playbackToggleFullScreen(); + return true; } else if (key == Qt::Key_0 && ctrl) { zoomReset(); + return true; } - return true; + return false; } else if (type == QEvent::MouseMove || type == QEvent::MouseButtonPress || type == QEvent::MouseButtonRelease) { diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.h b/Telegram/SourceFiles/media/view/media_view_overlay_widget.h index a70b64f79..d80c4500e 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.h +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.h @@ -105,6 +105,7 @@ public: void activateControls(); void close(); void minimize(); + void toggleFullScreen(); void toggleFullScreen(bool fullscreen); void notifyFileDialogShown(bool shown); diff --git a/Telegram/lib_base b/Telegram/lib_base index 7f1291715..285527e3d 160000 --- a/Telegram/lib_base +++ b/Telegram/lib_base @@ -1 +1 @@ -Subproject commit 7f129171548a3828693d7f79fbdb783464f31b97 +Subproject commit 285527e3df689d291cae8a1923479da1b4d361d5