From 38700ac4e6864e94a5435b19b803282bac2f6f5b Mon Sep 17 00:00:00 2001 From: Sine Striker <trueful@163.com> Date: 周日, 17 12月 2023 22:35:17 +0800 Subject: [PATCH] Add TODO encounting a new bug --- src/core/contexts/win32windowcontext.cpp | 37 ++++++++++++++++--------------------- 1 files changed, 16 insertions(+), 21 deletions(-) diff --git a/src/core/contexts/win32windowcontext.cpp b/src/core/contexts/win32windowcontext.cpp index 0f5b7c7..95f6e1a 100644 --- a/src/core/contexts/win32windowcontext.cpp +++ b/src/core/contexts/win32windowcontext.cpp @@ -79,16 +79,6 @@ // Original Qt window proc function static WNDPROC g_qtWindowProc = nullptr; - // ### FIXME FIXME FIXME - // ### FIXME: Tell the user to call in the documentation, instead of automatically - // calling it directly. - // ### FIXME FIXME FIXME - static const struct QWK_Hook { - QWK_Hook() { - qApp->setAttribute(Qt::AA_DontCreateNativeWidgetSiblings); - } - } g_hook{}; - struct DynamicApis { static const DynamicApis &instance() { static const DynamicApis inst{}; @@ -430,8 +420,10 @@ const auto monitorInfo = getMonitorForWindow(hwnd); RECT windowRect{}; ::GetWindowRect(hwnd, &windowRect); - const auto newX = monitorInfo.rcMonitor.left + (RECT_WIDTH(monitorInfo.rcMonitor) - RECT_WIDTH(windowRect)) / 2; - const auto newY = monitorInfo.rcMonitor.top + (RECT_HEIGHT(monitorInfo.rcMonitor) - RECT_HEIGHT(windowRect)) / 2; + const auto newX = monitorInfo.rcMonitor.left + + (RECT_WIDTH(monitorInfo.rcMonitor) - RECT_WIDTH(windowRect)) / 2; + const auto newY = monitorInfo.rcMonitor.top + + (RECT_HEIGHT(monitorInfo.rcMonitor) - RECT_HEIGHT(windowRect)) / 2; ::SetWindowPos(hwnd, nullptr, newX, newY, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER); } @@ -794,16 +786,17 @@ void Win32WindowContext::virtual_hook(int id, void *data) { switch (id) { case CentralizeHook: { - const auto hwnd = reinterpret_cast<HWND>(m_windowHandle->winId()); + const auto hwnd = reinterpret_cast<HWND>(windowId); moveToDesktopCenter(hwnd); return; } case ShowSystemMenuHook: { const auto &pos = *static_cast<const QPoint *>(data); - auto hWnd = reinterpret_cast<HWND>(m_windowHandle->winId()); + auto hWnd = reinterpret_cast<HWND>(windowId); #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) - const QPoint nativeGlobalPos = QHighDpi::toNativeGlobalPosition(pos, m_windowHandle); + const QPoint nativeGlobalPos = + QHighDpi::toNativeGlobalPosition(pos, m_windowHandle); #else const QPoint nativeGlobalPos = QHighDpi::toNativePixels(pos, m_windowHandle); #endif @@ -827,7 +820,7 @@ auto &painter = *static_cast<QPainter *>(args[0]); const auto &rect = *static_cast<const QRect *>(args[1]); const auto ®ion = *static_cast<const QRegion *>(args[2]); - const auto hwnd = reinterpret_cast<HWND>(m_windowHandle->winId()); + const auto hwnd = reinterpret_cast<HWND>(windowId); QPen pen; pen.setWidth(getWindowFrameBorderThickness(hwnd) * 2); @@ -884,7 +877,8 @@ auto hWnd = reinterpret_cast<HWND>(winId); #if QT_VERSION < QT_VERSION_CHECK(6, 5, 0) - for (const auto attr : { _DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1, _DWMWA_USE_IMMERSIVE_DARK_MODE }) { + for (const auto attr : + {_DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1, _DWMWA_USE_IMMERSIVE_DARK_MODE}) { const BOOL enable = TRUE; DynamicApis::instance().pDwmSetWindowAttribute(hWnd, attr, &enable, sizeof(enable)); } @@ -1171,7 +1165,7 @@ const WindowPart currentWindowPart = lastHitTestResult; if (message == WM_NCMOUSEMOVE) { if (currentWindowPart != WindowPart::ChromeButton) { - m_delegate->resetQtGrabbedControl(); + m_delegate->resetQtGrabbedControl(m_host); if (mouseLeaveBlocked) { emulateClientAreaMessage(hWnd, message, wParam, lParam, WM_NCMOUSELEAVE); @@ -1233,7 +1227,7 @@ // window from client area, which means we will get previous window part as // HTCLIENT if the mouse leaves window from client area and enters window // from non-client area, but it has no bad effect. - m_delegate->resetQtGrabbedControl(); + m_delegate->resetQtGrabbedControl(m_host); } } break; @@ -1558,9 +1552,10 @@ // the client area as a whole will shift to the left, which looks very abnormal if // we don't repaint it. This exception disappears if we add SWP_NOCOPYBITS flag. // But I don't know what caused the problem, or why this would solve it. + static constexpr const auto kBadWindowPosFlag = + SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED; const auto windowPos = reinterpret_cast<LPWINDOWPOS>(lParam); - if (windowPos->flags == - (SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED)) { + if (windowPos->flags == kBadWindowPosFlag) { windowPos->flags |= SWP_NOCOPYBITS; } break; -- Gitblit v1.9.1