From ecd08c3cd520b8269396809996d2bf496a3c8901 Mon Sep 17 00:00:00 2001 From: Sine Striker <trueful@163.com> Date: ćšć, 29 2æ 2024 03:26:45 +0800 Subject: [PATCH] minor tweaks --- src/core/contexts/win32windowcontext.cpp | 86 ++++++++++++++++++++++++++++--------------- 1 files changed, 56 insertions(+), 30 deletions(-) diff --git a/src/core/contexts/win32windowcontext.cpp b/src/core/contexts/win32windowcontext.cpp index 841273a..811fd44 100644 --- a/src/core/contexts/win32windowcontext.cpp +++ b/src/core/contexts/win32windowcontext.cpp @@ -6,13 +6,16 @@ #include <optional> +#include <QtCore/QAbstractEventDispatcher> +#include <QtCore/QDateTime> #include <QtCore/QHash> #include <QtCore/QScopeGuard> #include <QtCore/QTimer> -#include <QtCore/QDateTime> #include <QtGui/QGuiApplication> #include <QtGui/QPainter> #include <QtGui/QPalette> + +#include <QtGui/qpa/qwindowsysteminterface.h> #include <QtGui/private/qhighdpiscaling_p.h> #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) @@ -153,7 +156,7 @@ [[maybe_unused]] const auto &cleaner = qScopeGuard([windowThreadProcessId, currentThreadId]() { ::AttachThreadInput(windowThreadProcessId, currentThreadId, FALSE); // - }); + }); // TODO: Remove it ::BringWindowToTop(hwnd); // Activate the window too. This will force us to the virtual desktop this @@ -441,9 +444,12 @@ return false; } - static inline bool forwardFilteredEvents(QWindow *window, HWND hWnd, UINT message, - WPARAM wParam, LPARAM lParam, LRESULT *result) { + static inline bool forwardFilteredEvent(QWindow *window, HWND hWnd, UINT message, WPARAM wParam, + LPARAM lParam, LRESULT *result) { MSG msg = createMessageBlock(hWnd, message, wParam, lParam); + + // https://github.com/qt/qtbase/blob/e26a87f1ecc40bc8c6aa5b889fce67410a57a702/src/plugins/platforms/windows/qwindowscontext.cpp#L1025 + // Do exact the same as what Qt Windows plugin does. // Run the native event filters. QTBUG-67095: Exclude input messages which are sent // by QEventDispatcherWin32::processEvents() @@ -476,17 +482,38 @@ return false; } - // https://github.com/qt/qtbase/blob/e26a87f1ecc40bc8c6aa5b889fce67410a57a702/src/plugins/platforms/windows/qwindowscontext.cpp#L1546 - // Qt needs to refer to the WM_NCCALCSIZE message data that hasn't been processed, so we - // have to process it after Qt acquires the initial data. auto msg = static_cast<const MSG *>(message); - if (msg->message == WM_NCCALCSIZE && lastMessageContext) { - LRESULT res; - if (lastMessageContext->nonClientCalcSizeHandler(msg->hwnd, msg->message, - msg->wParam, msg->lParam, &res)) { - *result = decltype(*result)(res); - return true; + switch (msg->message) { + case WM_NCCALCSIZE: { + // https://github.com/qt/qtbase/blob/e26a87f1ecc40bc8c6aa5b889fce67410a57a702/src/plugins/platforms/windows/qwindowscontext.cpp#L1546 + // Qt needs to refer to the WM_NCCALCSIZE message data that hasn't been + // processed, so we have to process it after Qt acquires the initial data. + if (lastMessageContext) { + LRESULT res; + if (lastMessageContext->nonClientCalcSizeHandler( + msg->hwnd, msg->message, msg->wParam, msg->lParam, &res)) { + *result = decltype(*result)(res); + return true; + } + } + break; } + + // case WM_NCHITTEST: { + // // The child window must return HTTRANSPARENT when processing + // WM_NCHITTEST for + // // the parent window to receive WM_NCHITTEST. + // if (!lastMessageContext) { + // auto rootHWnd = ::GetAncestor(msg->hwnd, GA_ROOT); + // if (rootHWnd != msg->hwnd) { + // if (auto ctx = g_wndProcHash->value(rootHWnd)) { + // *result = HTTRANSPARENT; + // return true; + // } + // } + // } + // break; + // } } return false; } @@ -575,13 +602,15 @@ return ::DefWindowProcW(hWnd, message, wParam, lParam); } + WindowsNativeEventFilter::lastMessageContext = ctx; + const auto &contextCleaner = qScopeGuard([]() { + WindowsNativeEventFilter::lastMessageContext = nullptr; // + }); + // Since Qt does the necessary processing of the WM_NCCALCSIZE message, we need to // forward it right away and process it in our native event filter. if (message == WM_NCCALCSIZE) { - WindowsNativeEventFilter::lastMessageContext = ctx; - LRESULT result = ::CallWindowProcW(g_qtWindowProc, hWnd, message, wParam, lParam); - WindowsNativeEventFilter::lastMessageContext = nullptr; - return result; + return ::CallWindowProcW(g_qtWindowProc, hWnd, message, wParam, lParam); } // Try hooked procedure and save result @@ -590,7 +619,7 @@ // Forward the event to user-defined native event filters, there may be some messages // that need to be processed by the user. std::ignore = - forwardFilteredEvents(ctx->window(), hWnd, message, wParam, lParam, &result); + forwardFilteredEvent(ctx->window(), hWnd, message, wParam, lParam, &result); return result; } @@ -599,18 +628,10 @@ } static inline void addManagedWindow(QWindow *window, HWND hWnd, Win32WindowContext *ctx) { - const auto margins = [hWnd]() -> QMargins { - const auto titleBarHeight = int(getTitleBarHeight(hWnd)); - if (isSystemBorderEnabled()) { - return {0, -titleBarHeight, 0, 0}; - } else { - const auto frameSize = int(getResizeBorderThickness(hWnd)); - return {-frameSize, -titleBarHeight, -frameSize, -frameSize}; - } - }(); - - // Inform Qt we want and have set custom margins - setInternalWindowFrameMargins(window, margins); + if (isSystemBorderEnabled()) { + // Inform Qt we want and have set custom margins + setInternalWindowFrameMargins(window, QMargins(0, -int(getTitleBarHeight(hWnd)), 0, 0)); + } // Store original window proc if (!g_qtWindowProc) { @@ -801,6 +822,11 @@ mouseLeaveBlocked = false; lastHitTestResult = WindowPart::Outside; + if (!isSystemBorderEnabled()) { + m_delegate->setWindowFlags(m_host, m_delegate->getWindowFlags(m_host) | + Qt::FramelessWindowHint); + } + // If the original window id is valid, remove all resources related if (oldWinId) { removeManagedWindow(reinterpret_cast<HWND>(oldWinId)); -- Gitblit v1.9.1