// This file is part of Desktop App Toolkit, // a set of libraries for developing nice desktop applications. // // For license and copyright information please follow this link: // https://github.com/desktop-app/legal/blob/master/LEGAL // #pragma once #include "ui/platform/ui_platform_window.h" #include "ui/platform/win/ui_window_shadow_win.h" namespace Ui { namespace Platform { class TitleWidget; struct HitTestRequest; enum class HitTestResult; class DirectManipulation; struct DirectManipulationEvent; class WindowHelper final : public BasicWindowHelper { public: explicit WindowHelper(not_null window); ~WindowHelper(); void initInWindow(not_null window) override; not_null body() override; QMargins frameMargins() override; int additionalContentPadding() const override; rpl::producer additionalContentPaddingValue() const override; void setTitle(const QString &title) override; void setTitleStyle(const style::WindowTitle &st) override; void setNativeFrame(bool enabled) override; void setMinimumSize(QSize size) override; void setFixedSize(QSize size) override; void setGeometry(QRect rect) override; void showFullScreen() override; void showNormal() override; [[nodiscard]] auto hitTestRequests() const -> rpl::producer> override; [[nodiscard]] auto systemButtonOver() const -> rpl::producer override; [[nodiscard]] auto systemButtonDown() const -> rpl::producer override; void overrideSystemButtonOver(HitTestResult button) override; void overrideSystemButtonDown(HitTestResult button) override; private: class NativeFilter; friend class NativeFilter; void init(); void updateMargins(); void updateCloaking(); void updateWindowFrameColors(); void updateWindowFrameColors(bool active); void initialShadowUpdate(); void updateCornersRounding(); void fixMaximizedWindow(); void handleDirectManipulationEvent( const DirectManipulationEvent &event); [[nodiscard]] bool handleNativeEvent( UINT msg, WPARAM wParam, LPARAM lParam, LRESULT *result); [[nodiscard]] bool handleSystemButtonEvent( UINT msg, WPARAM wParam, LPARAM lParam, LRESULT *result); [[nodiscard]] bool fixedSize() const; [[nodiscard]] int systemButtonHitTest(HitTestResult result) const; [[nodiscard]] HitTestResult systemButtonHitTest(int result) const; [[nodiscard]] int titleHeight() const; static not_null GetNativeFilter(); const HWND _handle = nullptr; const not_null _title; const not_null _body; std::unique_ptr _directManipulation; rpl::event_stream> _hitTestRequests; rpl::event_stream _systemButtonOver; rpl::event_stream _systemButtonDown; std::optional _shadow; rpl::variable _dpi; QMargins _marginsDelta; bool _updatingMargins = false; bool _isFullScreen = false; bool _isMaximizedAndTranslucent = false; }; [[nodiscard]] HWND GetWindowHandle(not_null widget); [[nodiscard]] HWND GetWindowHandle(not_null window); void SendWMPaintForce(not_null widget); void SendWMPaintForce(not_null window); } // namespace Platform } // namespace Ui