Yuhang Zhao
2023-12-07 0209d06cc48e4e40c9c54d20d7fd6314d5492a34
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,7 +546,9 @@
        // 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
@@ -558,7 +563,6 @@
        }
        // Continue dispatching.
        WindowsNativeEventFilter::lastMessageContext = ctx;
        return ::CallWindowProcW(g_qtWindowProc, hWnd, message, wParam, lParam);
    }
@@ -594,9 +598,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;
@@ -1507,4 +1509,9 @@
        return true;
    }
    bool Win32WindowContext::systemMenuHandler(HWND hWnd, UINT message, WPARAM wParam,
                                               LPARAM lParam, LRESULT *result) {
        return false;
    }
}