From 245ddfa1f01b4c9fa10337246b8045755e5bcce5 Mon Sep 17 00:00:00 2001 From: Sine Striker <trueful@163.com> Date: 周二, 19 12月 2023 21:03:58 +0800 Subject: [PATCH] Change back to qScopeGuard --- src/core/contexts/win32windowcontext_p.h | 66 +++++++++++++++++++++++++++++--- 1 files changed, 59 insertions(+), 7 deletions(-) diff --git a/src/core/contexts/win32windowcontext_p.h b/src/core/contexts/win32windowcontext_p.h index 85ecf59..8e25be7 100644 --- a/src/core/contexts/win32windowcontext_p.h +++ b/src/core/contexts/win32windowcontext_p.h @@ -1,24 +1,76 @@ #ifndef WIN32WINDOWCONTEXT_P_H #define WIN32WINDOWCONTEXT_P_H +// +// W A R N I N G !!! +// ----------------- +// +// This file is not part of the QWindowKit API. It is used purely as an +// implementation detail. This header file may change from version to +// version without notice, or may even be removed. +// + #include <QWKCore/qwindowkit_windows.h> #include <QWKCore/private/abstractwindowcontext_p.h> namespace QWK { - class QWK_CORE_EXPORT Win32WindowContext : public AbstractWindowContext { + class Win32WindowContext : public AbstractWindowContext { Q_OBJECT + Q_PROPERTY(bool needBorderPainter READ needBorderPainter FINAL) + Q_PROPERTY(int borderThickness READ borderThickness FINAL) public: - Win32WindowContext(QWindow *window, WindowItemDelegate *delegate); - ~Win32WindowContext(); + Win32WindowContext(); + ~Win32WindowContext() override; - public: - bool setup() override; + enum WindowPart { + Outside, + ClientArea, + ChromeButton, + ResizeBorder, + FixedBorder, + TitleBar, + }; - bool windowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, LRESULT *result); + QString key() const override; + void virtual_hook(int id, void *data) override; + + bool needBorderPainter() const; + int borderThickness() const; protected: - WId windowId; + void winIdChanged(QWindow *oldWindow) override; + + public: + bool windowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, LRESULT *result); + + bool systemMenuHandler(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, + LRESULT *result); + + // In order to perfectly apply Windows 11 Snap Layout into the Qt window, we need to + // intercept and simulate most of the mouse events, so that the processing logic + // is quite complex. Simultaneously, in order to make the handling code of other + // Windows messages clearer, we have separated them into this function. + bool snapLayoutHandler(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, + LRESULT *result); + + bool customWindowHandler(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, + LRESULT *result); + + bool nonClientCalcSizeHandler(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, + LRESULT *result); + + protected: + WId windowId = 0; + + // The last hit test result, helpful to handle WM_MOUSEMOVE and WM_NCMOUSELEAVE. + WindowPart lastHitTestResult = WindowPart::Outside; + + // Whether the last mouse leave message is blocked, mainly for handling the unexpected + // WM_MOUSELEAVE. + bool mouseLeaveBlocked = false; + + bool centered = false; }; } -- Gitblit v1.9.1