From a8b959826c669f88d57b05d36fac8a94e4aeb68c Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 1 Nov 2023 22:23:41 +0400 Subject: [PATCH] Don't activate main window in case of visible call window. Fixes #27017. --- Telegram/SourceFiles/calls/calls_instance.cpp | 21 ++++++++++++++----- Telegram/SourceFiles/calls/calls_instance.h | 4 +++- Telegram/SourceFiles/calls/calls_panel.cpp | 9 +++++--- Telegram/SourceFiles/calls/calls_panel.h | 1 + .../calls/group/calls_group_panel.cpp | 9 +++++--- .../calls/group/calls_group_panel.h | 1 + .../platform/mac/specific_mac_p.mm | 7 ++++++- 7 files changed, 39 insertions(+), 13 deletions(-) diff --git a/Telegram/SourceFiles/calls/calls_instance.cpp b/Telegram/SourceFiles/calls/calls_instance.cpp index d205ab4b0d..d261409166 100644 --- a/Telegram/SourceFiles/calls/calls_instance.cpp +++ b/Telegram/SourceFiles/calls/calls_instance.cpp @@ -712,13 +712,24 @@ void Instance::destroyCurrentCall() { } } -bool Instance::hasActivePanel(not_null session) const { +bool Instance::hasVisiblePanel(Main::Session *session) const { if (inCall()) { - return (&_currentCall->user()->session() == session) - && _currentCallPanel->isActive(); + return _currentCallPanel->isVisible() + && (!session || (&_currentCall->user()->session() == session)); } else if (inGroupCall()) { - return (&_currentGroupCall->peer()->session() == session) - && _currentGroupCallPanel->isActive(); + return _currentGroupCallPanel->isVisible() + && (!session || (&_currentGroupCall->peer()->session() == session)); + } + return false; +} + +bool Instance::hasActivePanel(Main::Session *session) const { + if (inCall()) { + return _currentCallPanel->isActive() + && (!session || (&_currentCall->user()->session() == session)); + } else if (inGroupCall()) { + return _currentGroupCallPanel->isActive() + && (!session || (&_currentGroupCall->peer()->session() == session)); } return false; } diff --git a/Telegram/SourceFiles/calls/calls_instance.h b/Telegram/SourceFiles/calls/calls_instance.h index 4113a600e8..e15d800be7 100644 --- a/Telegram/SourceFiles/calls/calls_instance.h +++ b/Telegram/SourceFiles/calls/calls_instance.h @@ -89,8 +89,10 @@ public: [[nodiscard]] rpl::producer currentGroupCallValue() const; [[nodiscard]] bool inCall() const; [[nodiscard]] bool inGroupCall() const; + [[nodiscard]] bool hasVisiblePanel( + Main::Session *session = nullptr) const; [[nodiscard]] bool hasActivePanel( - not_null session) const; + Main::Session *session = nullptr) const; bool activateCurrentCall(const QString &joinHash = QString()); bool minimizeCurrentActiveCall(); bool toggleFullScreenCurrentActiveCall(); diff --git a/Telegram/SourceFiles/calls/calls_panel.cpp b/Telegram/SourceFiles/calls/calls_panel.cpp index 46481cad6b..8575964755 100644 --- a/Telegram/SourceFiles/calls/calls_panel.cpp +++ b/Telegram/SourceFiles/calls/calls_panel.cpp @@ -106,12 +106,15 @@ Panel::Panel(not_null call) Panel::~Panel() = default; -bool Panel::isActive() const { - return window()->isActiveWindow() - && window()->isVisible() +bool Panel::isVisible() const { + return window()->isVisible() && !(window()->windowState() & Qt::WindowMinimized); } +bool Panel::isActive() const { + return window()->isActiveWindow() && isVisible(); +} + void Panel::showAndActivate() { if (window()->isHidden()) { window()->show(); diff --git a/Telegram/SourceFiles/calls/calls_panel.h b/Telegram/SourceFiles/calls/calls_panel.h index 16836db622..dc715584ae 100644 --- a/Telegram/SourceFiles/calls/calls_panel.h +++ b/Telegram/SourceFiles/calls/calls_panel.h @@ -61,6 +61,7 @@ public: Panel(not_null call); ~Panel(); + [[nodiscard]] bool isVisible() const; [[nodiscard]] bool isActive() const; void showAndActivate(); void minimize(); diff --git a/Telegram/SourceFiles/calls/group/calls_group_panel.cpp b/Telegram/SourceFiles/calls/group/calls_group_panel.cpp index 6002963a9e..d3bac6aeba 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_panel.cpp +++ b/Telegram/SourceFiles/calls/group/calls_group_panel.cpp @@ -258,12 +258,15 @@ not_null Panel::call() const { return _call; } -bool Panel::isActive() const { - return window()->isActiveWindow() - && window()->isVisible() +bool Panel::isVisible() const { + return window()->isVisible() && !(window()->windowState() & Qt::WindowMinimized); } +bool Panel::isActive() const { + return window()->isActiveWindow() && isVisible(); +} + base::weak_ptr Panel::showToast( const QString &text, crl::time duration) { diff --git a/Telegram/SourceFiles/calls/group/calls_group_panel.h b/Telegram/SourceFiles/calls/group/calls_group_panel.h index cf93526973..851cc91d8f 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_panel.h +++ b/Telegram/SourceFiles/calls/group/calls_group_panel.h @@ -91,6 +91,7 @@ public: [[nodiscard]] not_null widget() const; [[nodiscard]] not_null call() const; + [[nodiscard]] bool isVisible() const; [[nodiscard]] bool isActive() const; base::weak_ptr showToast( diff --git a/Telegram/SourceFiles/platform/mac/specific_mac_p.mm b/Telegram/SourceFiles/platform/mac/specific_mac_p.mm index e02930c1a7..9846438711 100644 --- a/Telegram/SourceFiles/platform/mac/specific_mac_p.mm +++ b/Telegram/SourceFiles/platform/mac/specific_mac_p.mm @@ -9,6 +9,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "mainwindow.h" #include "mainwidget.h" +#include "calls/calls_instance.h" #include "core/sandbox.h" #include "core/application.h" #include "core/core_settings.h" @@ -175,7 +176,11 @@ ApplicationDelegate *_sharedDelegate = nil; Core::App().handleAppActivated(); if (const auto window = Core::App().activeWindow()) { if (window->widget()->isHidden()) { - window->widget()->showFromTray(); + if (Core::App().calls().hasVisiblePanel()) { + Core::App().calls().activateCurrentCall(); + } else { + window->widget()->showFromTray(); + } } } }