| | |
| | | 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) { |
| | |
| | | // 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; |
| | |
| | | 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; |
| | |
| | | // 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); |
| | | } |
| | | |
| | |
| | | ::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; |
| | |
| | | |
| | | if (!isValidWindow(hWnd, false, true)) { |
| | | return false; |
| | | } |
| | | |
| | | if (systemMenuHandler(hWnd, message, wParam, lParam, result)) { |
| | | return true; |
| | | } |
| | | |
| | | // Test snap layout |
| | |
| | | return true; |
| | | } |
| | | |
| | | bool Win32WindowContext::systemMenuHandler(HWND hWnd, UINT message, WPARAM wParam, |
| | | LPARAM lParam, LRESULT *result) { |
| | | return false; |
| | | } |
| | | |
| | | } |