diff --git a/Telegram/SourceFiles/calls/calls_group_panel.cpp b/Telegram/SourceFiles/calls/calls_group_panel.cpp index 0665318b14..a6e260bb2a 100644 --- a/Telegram/SourceFiles/calls/calls_group_panel.cpp +++ b/Telegram/SourceFiles/calls/calls_group_panel.cpp @@ -316,6 +316,7 @@ GroupPanel::GroupPanel(not_null call) , _hangup(widget(), st::groupCallHangup) { _layerBg->setStyleOverrides(&st::groupCallBox, &st::groupCallLayerBox); _settings->setColorOverrides(_mute->colorOverrides()); + _layerBg->setHideByBackgroundClick(true); SubscribeToMigration( _peer, @@ -337,6 +338,14 @@ bool GroupPanel::isActive() const { && !(_window->windowState() & Qt::WindowMinimized); } +void GroupPanel::minimize() { + _window->setWindowState(_window->windowState() | Qt::WindowMinimized); +} + +void GroupPanel::close() { + _window->close(); +} + 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 c377785249..32cd06caab 100644 --- a/Telegram/SourceFiles/calls/calls_group_panel.h +++ b/Telegram/SourceFiles/calls/calls_group_panel.h @@ -68,6 +68,8 @@ public: ~GroupPanel(); [[nodiscard]] bool isActive() const; + void minimize(); + void close(); void showAndActivate(); void closeBeforeDestroy(); diff --git a/Telegram/SourceFiles/calls/calls_instance.cpp b/Telegram/SourceFiles/calls/calls_instance.cpp index 7ce5ede236..79ad8a91bd 100644 --- a/Telegram/SourceFiles/calls/calls_instance.cpp +++ b/Telegram/SourceFiles/calls/calls_instance.cpp @@ -486,6 +486,25 @@ bool Instance::activateCurrentCall() { return false; } +bool Instance::minimizeCurrentActiveCall() { + if (inCall() && _currentCallPanel->isActive()) { + _currentCallPanel->minimize(); + return true; + } else if (inGroupCall() && _currentGroupCallPanel->isActive()) { + _currentGroupCallPanel->minimize(); + return true; + } + return false; +} + +bool Instance::closeCurrentActiveCall() { + if (inGroupCall() && _currentGroupCallPanel->isActive()) { + _currentGroupCallPanel->close(); + return true; + } + return false; +} + Call *Instance::currentCall() const { return _currentCall.get(); } diff --git a/Telegram/SourceFiles/calls/calls_instance.h b/Telegram/SourceFiles/calls/calls_instance.h index 73844d24f8..3aa192feba 100644 --- a/Telegram/SourceFiles/calls/calls_instance.h +++ b/Telegram/SourceFiles/calls/calls_instance.h @@ -55,6 +55,8 @@ public: [[nodiscard]] bool hasActivePanel( not_null session) const; bool activateCurrentCall(); + bool minimizeCurrentActiveCall(); + bool closeCurrentActiveCall(); auto getVideoCapture() -> std::shared_ptr override; void requestPermissionsOrFail(Fn onSuccess, bool video = true); diff --git a/Telegram/SourceFiles/calls/calls_panel.cpp b/Telegram/SourceFiles/calls/calls_panel.cpp index cca21afcbc..add124453e 100644 --- a/Telegram/SourceFiles/calls/calls_panel.cpp +++ b/Telegram/SourceFiles/calls/calls_panel.cpp @@ -221,6 +221,10 @@ void Panel::showAndActivate() { _window->setFocus(); } +void Panel::minimize() { + _window->setWindowState(_window->windowState() | Qt::WindowMinimized); +} + 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 8b65805033..ec8d7e4ea4 100644 --- a/Telegram/SourceFiles/calls/calls_panel.h +++ b/Telegram/SourceFiles/calls/calls_panel.h @@ -53,6 +53,7 @@ public: [[nodiscard]] bool isActive() const; void showAndActivate(); + void minimize(); void replaceCall(not_null call); void closeBeforeDestroy(); diff --git a/Telegram/SourceFiles/core/application.cpp b/Telegram/SourceFiles/core/application.cpp index 6b527cc10e..045146b0c5 100644 --- a/Telegram/SourceFiles/core/application.cpp +++ b/Telegram/SourceFiles/core/application.cpp @@ -915,18 +915,25 @@ bool Application::closeActiveWindow() { if (hideMediaView()) { return true; } - if (const auto window = activeWindow()) { - window->close(); - return true; + if (!calls().closeCurrentActiveCall()) { + if (const auto window = activeWindow()) { + if (window->widget()->isVisible() + && window->widget()->isActive()) { + window->close(); + return true; + } + } } return false; } bool Application::minimizeActiveWindow() { hideMediaView(); - if (const auto window = activeWindow()) { - window->minimize(); - return true; + if (!calls().minimizeCurrentActiveCall()) { + if (const auto window = activeWindow()) { + window->minimize(); + return true; + } } return false; }