diff --git a/ui/platform/ui_platform_window.cpp b/ui/platform/ui_platform_window.cpp index 6042e0b5..09a900ef 100644 --- a/ui/platform/ui_platform_window.cpp +++ b/ui/platform/ui_platform_window.cpp @@ -33,6 +33,9 @@ BasicWindowHelper::BasicWindowHelper(not_null window) _window->setWindowFlag(Qt::Window); } +void BasicWindowHelper::initInWindow(not_null window) { +} + not_null BasicWindowHelper::body() { return _window; } @@ -49,6 +52,19 @@ rpl::producer BasicWindowHelper::additionalContentPaddingValue() const { return rpl::single(0); } +auto BasicWindowHelper::hitTestRequests() const +-> rpl::producer> { + return rpl::never>(); +} + +rpl::producer BasicWindowHelper::systemButtonOver() const { + return rpl::never(); +} + +rpl::producer BasicWindowHelper::systemButtonDown() const { + return rpl::never(); +} + void BasicWindowHelper::setTitle(const QString &title) { _window->setWindowTitle(title); } diff --git a/ui/platform/ui_platform_window.h b/ui/platform/ui_platform_window.h index 4eadb211..014ef6c4 100644 --- a/ui/platform/ui_platform_window.h +++ b/ui/platform/ui_platform_window.h @@ -15,11 +15,14 @@ struct WindowTitle; namespace Ui { class RpWidget; +class RpWindow; enum class WindowTitleHitTestFlag; using WindowTitleHitTestFlags = base::flags; namespace Platform { +struct HitTestRequest; +enum class HitTestResult; class DefaultTitleWidget; class BasicWindowHelper { @@ -27,11 +30,22 @@ class BasicWindowHelper { explicit BasicWindowHelper(not_null window); virtual ~BasicWindowHelper() = default; + [[nodiscard]] not_null window() const { + return _window; + } + + [[nodiscard]] virtual void initInWindow(not_null window); [[nodiscard]] virtual not_null body(); [[nodiscard]] virtual QMargins frameMargins(); [[nodiscard]] virtual int additionalContentPadding() const; [[nodiscard]] virtual auto additionalContentPaddingValue() const -> rpl::producer; + [[nodiscard]] virtual auto hitTestRequests() const + -> rpl::producer>; + [[nodiscard]] virtual auto systemButtonOver() const + -> rpl::producer; + [[nodiscard]] virtual auto systemButtonDown() const + -> rpl::producer; virtual void setTitle(const QString &title); virtual void setTitleStyle(const style::WindowTitle &st); virtual void setNativeFrame(bool enabled); @@ -46,9 +60,6 @@ class BasicWindowHelper { void setBodyTitleArea(Fn testMethod); protected: - [[nodiscard]] not_null window() const { - return _window; - } [[nodiscard]] WindowTitleHitTestFlags bodyTitleAreaHit( QPoint point) const { return _bodyTitleAreaTestMethod @@ -111,7 +122,7 @@ class DefaultWindowHelper final : public QObject, public BasicWindowHelper { return std::make_unique(window); } -bool NativeWindowFrameSupported(); +[[nodiscard]] bool NativeWindowFrameSupported(); } // namespace Platform } // namespace Ui diff --git a/ui/platform/ui_platform_window_title.cpp b/ui/platform/ui_platform_window_title.cpp index d46398c7..33a9bf35 100644 --- a/ui/platform/ui_platform_window_title.cpp +++ b/ui/platform/ui_platform_window_title.cpp @@ -15,6 +15,7 @@ #include "styles/palette.h" #include "base/algorithm.h" #include "base/event_filter.h" +#include "base/platform/base_platform_info.h" #include #include @@ -36,6 +37,34 @@ void RemoveDuplicates(std::vector &v) { } // namespace +bool SemiNativeSystemButtonProcessing() { + return ::Platform::IsWindows11OrGreater(); +} + +void SetupSemiNativeSystemButtons( + not_null controls, + not_null window, + rpl::lifetime &lifetime, + Fn filter) { + if (!SemiNativeSystemButtonProcessing()) { + return; + } + + window->systemButtonOver( + ) | rpl::filter([=](HitTestResult button) { + return !filter || filter() || (button == HitTestResult::None); + }) | rpl::start_with_next([=](HitTestResult button) { + controls->buttonOver(button); + }, lifetime); + + window->systemButtonDown( + ) | rpl::filter([=](HitTestResult button) { + return !filter || filter() || (button == HitTestResult::None); + }) | rpl::start_with_next([=](HitTestResult button) { + controls->buttonDown(button); + }, lifetime); +} + class TitleControls::Button final : public IconButton { public: using IconButton::IconButton; @@ -216,12 +245,12 @@ void TitleControls::buttonOver(HitTestResult testResult) { update(_close, HitTestResult::Close); } -void TitleControls::buttonDown(HitTestResult testResult, bool down) { +void TitleControls::buttonDown(HitTestResult testResult) { const auto update = [&]( const object_ptr