Yuhang Zhao
2023-12-07 dec34d131a925ede768fd6c6f167522cfda9645f
src/core/contexts/win32windowcontext.cpp
@@ -432,9 +432,6 @@
                               QT_NATIVE_EVENT_RESULT_TYPE *result) override {
            Q_UNUSED(eventType)
            auto orgLastMessageContext = lastMessageContext;
            lastMessageContext = nullptr;
            // It has been observed that the pointer that Qt gives us is sometimes null on some
            // machines. We need to guard against it in such scenarios.
            if (!result) {
@@ -445,9 +442,9 @@
            // Qt needs to refer to the WM_NCCALCSIZE message data that hasn't been processed, so we
            // have to process it after Qt acquired the initial data.
            auto msg = static_cast<const MSG *>(message);
            if (msg->message == WM_NCCALCSIZE && orgLastMessageContext) {
            if (msg->message == WM_NCCALCSIZE && lastMessageContext) {
                LRESULT res;
                if (Win32WindowContext::nonClientCalcSizeHandler(msg->hwnd, msg->message,
                if (lastMessageContext->nonClientCalcSizeHandler(msg->hwnd, msg->message,
                                                                 msg->wParam, msg->lParam, &res)) {
                    *result = decltype(*result)(res);
                    return true;
@@ -460,11 +457,17 @@
        static Win32WindowContext *lastMessageContext;
        static inline void install() {
            if (instance) {
                return;
            }
            instance = new WindowsNativeEventFilter();
            installNativeEventFilter(instance);
        }
        static inline void uninstall() {
            if (!instance) {
                return;
            }
            removeNativeEventFilter(instance);
            delete instance;
            instance = nullptr;
@@ -543,22 +546,18 @@
        // forward it right away and process it in our native event filter.
        if (message == WM_NCCALCSIZE) {
            WindowsNativeEventFilter::lastMessageContext = ctx;
            return ::CallWindowProcW(g_qtWindowProc, hWnd, message, wParam, lParam);
            LRESULT result = ::CallWindowProcW(g_qtWindowProc, hWnd, message, wParam, lParam);
            WindowsNativeEventFilter::lastMessageContext = nullptr;
            return result;
        }
        // Try hooked procedure and save result
        LRESULT result;
        bool handled = ctx->windowProc(hWnd, message, wParam, lParam, &result);
        // TODO: Determine whether to show system menu
        // ...
        if (handled) {
        if (ctx->windowProc(hWnd, message, wParam, lParam, &result)) {
            return result;
        }
        // Continue dispatching.
        WindowsNativeEventFilter::lastMessageContext = ctx;
        return ::CallWindowProcW(g_qtWindowProc, hWnd, message, wParam, lParam);
    }
@@ -594,9 +593,7 @@
        ::SetWindowLongPtrW(hWnd, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(QWKHookedWndProc));
        // Install global native event filter
        if (!WindowsNativeEventFilter::instance) {
            WindowsNativeEventFilter::install();
        }
        WindowsNativeEventFilter::install();
        // Cache window ID
        windowId = winId;
@@ -627,6 +624,10 @@
        if (!isValidWindow(hWnd, false, true)) {
            return false;
        }
        if (systemMenuHandler(hWnd, message, wParam, lParam, result)) {
            return true;
        }
        // Test snap layout
@@ -1507,4 +1508,9 @@
        return true;
    }
    bool Win32WindowContext::systemMenuHandler(HWND hWnd, UINT message, WPARAM wParam,
                                               LPARAM lParam, LRESULT *result) {
        return false;
    }
}