From 029ba1202e167a1511b34f49fdba1e6f8024543f Mon Sep 17 00:00:00 2001 From: Sergio Martins Date: Thu, 18 Feb 2021 15:14:52 +0000 Subject: [PATCH] CustomFrame: Add a NativeFeatures enum Replaces the htCaptionRect. As we don't want to pass many arguments, instead just pass a struct which describes which native features to enable --- src/private/WidgetResizeHandler.cpp | 11 ++++++----- src/private/WidgetResizeHandler_p.h | 26 +++++++++++++++++++++++--- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/private/WidgetResizeHandler.cpp b/src/private/WidgetResizeHandler.cpp index a41dab3f..b90a7b19 100644 --- a/src/private/WidgetResizeHandler.cpp +++ b/src/private/WidgetResizeHandler.cpp @@ -318,7 +318,7 @@ bool WidgetResizeHandler::handleWindowsNativeEvent(FloatingWindow *fw, const QBy bool WidgetResizeHandler::handleWindowsNativeEvent(QWindow *w, MSG *msg, Qt5Qt6Compat::qintptr *result, - QRect htCaptionRect) + const NativeFeatures &features) { if (msg->message == WM_NCCALCSIZE) { *result = 0; @@ -354,9 +354,10 @@ bool WidgetResizeHandler::handleWindowsNativeEvent(QWindow *w, MSG *msg, *result = HTBOTTOM; } else if (!hasFixedWidth && xPos <= rect.right && xPos >= rect.right - borderWidth) { *result = HTRIGHT; - } else if (!htCaptionRect.isNull()) { + } else if (!features.htCaptionRect.isNull()) { const QPoint globalPosQt = QHighDpi::fromNativePixels(QPoint(xPos, yPos), w); // htCaptionRect is the rect on which we allow for Windows to do a native drag + const QRect htCaptionRect = features.htCaptionRect; if (globalPosQt.y() >= htCaptionRect.top() && globalPosQt.y() <= htCaptionRect.bottom() && globalPosQt.x() >= htCaptionRect.left() && globalPosQt.x() <= htCaptionRect.right()) { if (!KDDockWidgets::inDisallowDragWidget(globalPosQt)) { // Just makes sure the mouse isn't over the close button, we don't allow drag in that case. *result = HTCAPTION; @@ -605,8 +606,8 @@ bool CustomFrameHelper::nativeEventFilter(const QByteArray &eventType, void *mes if (!window) return false; - const WidgetResizeHandler::Features features = m_shouldUseCustomFrameFunc(window); - if (!features) { + const WidgetResizeHandler::NativeFeatures features = m_shouldUseCustomFrameFunc(window); + if (!features.hasFeatures()) { // No native support for is desired for this window return false; } @@ -619,7 +620,7 @@ bool CustomFrameHelper::nativeEventFilter(const QByteArray &eventType, void *mes window->setProperty(propertyName, true); } - return WidgetResizeHandler::handleWindowsNativeEvent(window, msg, result); + return WidgetResizeHandler::handleWindowsNativeEvent(window, msg, result, features); #else Q_UNUSED(eventType); Q_UNUSED(message); diff --git a/src/private/WidgetResizeHandler_p.h b/src/private/WidgetResizeHandler_p.h index 93373a87..c23a7c53 100644 --- a/src/private/WidgetResizeHandler_p.h +++ b/src/private/WidgetResizeHandler_p.h @@ -42,10 +42,30 @@ public: Feature_NativeShadow = 1, Feature_NativeResize = 2, Feature_NativeDrag = 4, - Feature_NativeMaximize = 8 + Feature_NativeMaximize = 8, + Feature_All = Feature_NativeShadow | Feature_NativeResize | Feature_NativeDrag + | Feature_NativeMaximize }; Q_DECLARE_FLAGS(Features, Feature); + struct NativeFeatures { + NativeFeatures() = default; + + NativeFeatures(QRect r) + : htCaptionRect(r) { + } + + NativeFeatures(Features f) + : features(f) { + } + + QRect htCaptionRect; // in global coordinates + Features features = Feature_All; + bool hasFeatures() const { + return features != Feature_None; + } + }; + /** * @brief CTOR * @param isTopLevelResizer If true, then this resize handler is for top-level widgets (aka windows) @@ -83,7 +103,7 @@ public: static void setupWindow(QWindow *window); #ifdef Q_OS_WIN - static bool handleWindowsNativeEvent(QWindow *w, MSG *msg, Qt5Qt6Compat::qintptr *result, QRect htCaptionRect = {}); + static bool handleWindowsNativeEvent(QWindow *w, MSG *msg, Qt5Qt6Compat::qintptr *result, const NativeFeatures & = {}); static bool handleWindowsNativeEvent(FloatingWindow *w, const QByteArray &eventType, void *message, Qt5Qt6Compat::qintptr *result); #endif @@ -140,7 +160,7 @@ class DOCKS_EXPORT CustomFrameHelper { Q_OBJECT public: - typedef WidgetResizeHandler::Features (*ShouldUseCustomFrame)(QWindow *); + typedef WidgetResizeHandler::NativeFeatures (*ShouldUseCustomFrame)(QWindow *); explicit CustomFrameHelper(ShouldUseCustomFrame shouldUseCustomFrameFunc, QObject *parent = nullptr); ~CustomFrameHelper() override;