diff --git a/Telegram/SourceFiles/calls/calls_group_panel.cpp b/Telegram/SourceFiles/calls/calls_group_panel.cpp index 0c7c78540..9508d592b 100644 --- a/Telegram/SourceFiles/calls/calls_group_panel.cpp +++ b/Telegram/SourceFiles/calls/calls_group_panel.cpp @@ -241,6 +241,12 @@ GroupPanel::GroupPanel(not_null call) GroupPanel::~GroupPanel() = default; +bool GroupPanel::isActive() const { + return _window->isActiveWindow() + && _window->isVisible() + && !(_window->windowState() & Qt::WindowMinimized); +} + void GroupPanel::showAndActivate() { if (_window->isHidden()) { _window->show(); diff --git a/Telegram/SourceFiles/calls/calls_group_panel.h b/Telegram/SourceFiles/calls/calls_group_panel.h index 6fd1f2190..2d6a0a3ef 100644 --- a/Telegram/SourceFiles/calls/calls_group_panel.h +++ b/Telegram/SourceFiles/calls/calls_group_panel.h @@ -67,6 +67,7 @@ public: GroupPanel(not_null call); ~GroupPanel(); + [[nodiscard]] bool isActive() const; void showAndActivate(); void closeBeforeDestroy(); diff --git a/Telegram/SourceFiles/calls/calls_instance.cpp b/Telegram/SourceFiles/calls/calls_instance.cpp index e05bbfc16..80622d9d7 100644 --- a/Telegram/SourceFiles/calls/calls_instance.cpp +++ b/Telegram/SourceFiles/calls/calls_instance.cpp @@ -455,6 +455,17 @@ void Instance::destroyCurrentCall() { } } +bool Instance::hasActivePanel(not_null session) const { + if (inCall()) { + return (&_currentCall->user()->session() == session) + && _currentCallPanel->isActive(); + } else if (inGroupCall()) { + return (&_currentGroupCall->channel()->session() == session) + && _currentGroupCallPanel->isActive(); + } + return false; +} + bool Instance::activateCurrentCall() { if (inCall()) { _currentCallPanel->showAndActivate(); diff --git a/Telegram/SourceFiles/calls/calls_instance.h b/Telegram/SourceFiles/calls/calls_instance.h index 0c9458cdc..4fde646e1 100644 --- a/Telegram/SourceFiles/calls/calls_instance.h +++ b/Telegram/SourceFiles/calls/calls_instance.h @@ -52,6 +52,8 @@ public: [[nodiscard]] rpl::producer currentGroupCallValue() const; [[nodiscard]] bool inCall() const; [[nodiscard]] bool inGroupCall() const; + [[nodiscard]] bool hasActivePanel( + not_null session) const; bool activateCurrentCall(); std::shared_ptr getVideoCapture() override; diff --git a/Telegram/SourceFiles/calls/calls_panel.cpp b/Telegram/SourceFiles/calls/calls_panel.cpp index 0d87b44c4..1c862f859 100644 --- a/Telegram/SourceFiles/calls/calls_panel.cpp +++ b/Telegram/SourceFiles/calls/calls_panel.cpp @@ -202,6 +202,12 @@ Panel::Panel(not_null call) Panel::~Panel() = default; +bool Panel::isActive() const { + return _window->isActiveWindow() + && _window->isVisible() + && !(_window->windowState() & Qt::WindowMinimized); +} + void Panel::showAndActivate() { _window->raise(); _window->setWindowState(_window->windowState() | Qt::WindowActive); diff --git a/Telegram/SourceFiles/calls/calls_panel.h b/Telegram/SourceFiles/calls/calls_panel.h index 3bd6a59c0..8b6580503 100644 --- a/Telegram/SourceFiles/calls/calls_panel.h +++ b/Telegram/SourceFiles/calls/calls_panel.h @@ -51,6 +51,7 @@ public: Panel(not_null call); ~Panel(); + [[nodiscard]] bool isActive() const; void showAndActivate(); void replaceCall(not_null call); void closeBeforeDestroy(); diff --git a/Telegram/SourceFiles/core/application.cpp b/Telegram/SourceFiles/core/application.cpp index 2d2b59b9e..17d48f779 100644 --- a/Telegram/SourceFiles/core/application.cpp +++ b/Telegram/SourceFiles/core/application.cpp @@ -880,9 +880,12 @@ void Application::localPasscodeChanged() { bool Application::hasActiveWindow(not_null session) const { if (App::quitting() || !_window) { return false; + } else if (_calls->hasActivePanel(session)) { + return true; } else if (const auto controller = _window->sessionController()) { - if (&controller->session() == session) { - return _window->widget()->isActive(); + if (&controller->session() == session + && _window->widget()->isActive()) { + return true; } } return false;