From 00b91a374872280a4a5addc22f08c7954a6637aa Mon Sep 17 00:00:00 2001 From: Sine Striker <trueful@163.com> Date: 周三, 15 5月 2024 10:10:51 +0800 Subject: [PATCH] minor tweaks --- src/core/contexts/win32windowcontext.cpp | 120 +++++++++++++++++++++++++++++++++++------------------------- 1 files changed, 70 insertions(+), 50 deletions(-) diff --git a/src/core/contexts/win32windowcontext.cpp b/src/core/contexts/win32windowcontext.cpp index a448ed6..43d5cb6 100644 --- a/src/core/contexts/win32windowcontext.cpp +++ b/src/core/contexts/win32windowcontext.cpp @@ -124,6 +124,36 @@ SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER); } + static inline bool isFullScreen(HWND hwnd) { + RECT windowRect{}; + ::GetWindowRect(hwnd, &windowRect); + // Compare to the full area of the screen, not the work area. + return (windowRect == getMonitorForWindow(hwnd).rcMonitor); + } + + static inline bool isMaximized(HWND hwnd) { + return ::IsZoomed(hwnd); + } + + static inline bool isMinimized(HWND hwnd) { + return ::IsIconic(hwnd); + } + + static inline bool isWindowNoState(HWND hwnd) { +#if 0 + WINDOWPLACEMENT wp{}; + wp.length = sizeof(wp); + ::GetWindowPlacement(hwnd, &wp); + return ((wp.showCmd == SW_NORMAL) || (wp.showCmd == SW_RESTORE)); +#else + if (isFullScreen(hwnd)) { + return false; + } + const auto style = static_cast<DWORD>(::GetWindowLongPtrW(hwnd, GWL_STYLE)); + return (!(style & (WS_MINIMIZE | WS_MAXIMIZE))); +#endif + } + static inline void bringWindowToFront(HWND hwnd) { HWND oldForegroundWindow = ::GetForegroundWindow(); if (!oldForegroundWindow) { @@ -135,7 +165,7 @@ if (!::IsWindowVisible(hwnd)) { ::ShowWindow(hwnd, SW_SHOW); } - if (IsMinimized(hwnd)) { + if (isMinimized(hwnd)) { // Restore the window if it is minimized. ::ShowWindow(hwnd, SW_RESTORE); // Once we've been restored, throw us on the active monitor. @@ -170,28 +200,6 @@ ::SetActiveWindow(hwnd); // Throw us on the active monitor. moveWindowToMonitor(hwnd, activeMonitor); - } - - static inline bool isFullScreen(HWND hwnd) { - RECT windowRect{}; - ::GetWindowRect(hwnd, &windowRect); - // Compare to the full area of the screen, not the work area. - return (windowRect == getMonitorForWindow(hwnd).rcMonitor); - } - - static inline bool isWindowNoState(HWND hwnd) { -#if 0 - WINDOWPLACEMENT wp{}; - wp.length = sizeof(wp); - ::GetWindowPlacement(hwnd, &wp); - return ((wp.showCmd == SW_NORMAL) || (wp.showCmd == SW_RESTORE)); -#else - if (isFullScreen(hwnd)) { - return false; - } - const auto style = static_cast<DWORD>(::GetWindowLongPtrW(hwnd, GWL_STYLE)); - return (!(style & (WS_MINIMIZE | WS_MAXIMIZE))); -#endif } static void syncPaintEventWithDwm() { @@ -250,7 +258,7 @@ return true; } - const bool maxOrFull = IsMaximized(hWnd) || isFullScreen(hWnd); + const bool maxOrFull = isMaximized(hWnd) || isFullScreen(hWnd); ::EnableMenuItem(hMenu, SC_CLOSE, (MF_BYCOMMAND | MFS_ENABLED)); ::EnableMenuItem(hMenu, SC_MAXIMIZE, (MF_BYCOMMAND | ((maxOrFull || fixedSize) ? MFS_DISABLED : MFS_ENABLED))); @@ -625,6 +633,7 @@ // Try hooked procedure and save result LRESULT result; if (ctx->windowProc(hWnd, message, wParam, lParam, &result)) { + // https://github.com/stdware/qwindowkit/issues/45 // Forward the event to user-defined native event filters, there may be some messages // that need to be processed by the user. std::ignore = @@ -699,12 +708,12 @@ auto hWnd = reinterpret_cast<HWND>(m_windowId); #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) const QPoint nativeGlobalPos = - QHighDpi::toNativeGlobalPosition(pos, m_windowHandle); + QHighDpi::toNativeGlobalPosition(pos, m_windowHandle.data()); #else - const QPoint nativeGlobalPos = QHighDpi::toNativePixels(pos, m_windowHandle); + const QPoint nativeGlobalPos = QHighDpi::toNativePixels(pos, m_windowHandle.data()); #endif std::ignore = showSystemMenu_sys(hWnd, qpoint2point(nativeGlobalPos), false, - m_delegate->isHostSizeFixed(m_host)); + isHostSizeFixed()); return; } @@ -1263,7 +1272,7 @@ POINT screenPoint{GET_X_LPARAM(dwScreenPos), GET_Y_LPARAM(dwScreenPos)}; ::ScreenToClient(hWnd, &screenPoint); QPoint qtScenePos = QHighDpi::fromNativeLocalPosition(point2qpoint(screenPoint), - m_windowHandle); + m_windowHandle.data()); auto dummy = WindowAgentBase::Unknown; if (isInSystemButtons(qtScenePos, &dummy)) { // We must record whether the last WM_MOUSELEAVE was filtered, because if @@ -1388,8 +1397,8 @@ // menu while Windows will create and execute a new event loop // until the menu returns iconButtonClickTime = ::GetTickCount64(); - *result = - ::DefWindowProcW(hWnd, WM_NCLBUTTONDOWN, wParam, lParam); + *result = ::DefWindowProcW(hWnd, message, wParam, lParam); + iconButtonClickTime = 0; if (iconButtonClickLevel & IconButtonTriggersClose) { ::PostMessageW(hWnd, WM_SYSCOMMAND, SC_CLOSE, 0); } @@ -1563,10 +1572,10 @@ auto clientWidth = RECT_WIDTH(clientRect); auto clientHeight = RECT_HEIGHT(clientRect); - QPoint qtScenePos = - QHighDpi::fromNativeLocalPosition(point2qpoint(nativeLocalPos), m_windowHandle); + QPoint qtScenePos = QHighDpi::fromNativeLocalPosition(point2qpoint(nativeLocalPos), + m_windowHandle.data()); - bool isFixedSize = m_delegate->isHostSizeFixed(m_host); + bool isFixedSize = isHostSizeFixed(); bool isTitleBar = isInTitleBarDraggableArea(qtScenePos); bool dontOverrideCursor = false; // ### TODO @@ -1645,7 +1654,7 @@ // OK, we are not inside any chrome buttons, try to find out which part of the // window are we hitting. - bool max = IsMaximized(hWnd); + bool max = isMaximized(hWnd); bool full = isFullScreen(hWnd); int frameSize = getResizeBorderThickness(hWnd); bool isTop = (nativeLocalPos.y < frameSize); @@ -1957,7 +1966,7 @@ clientRect->top = originalTop; } - const bool max = IsMaximized(hWnd); + const bool max = isMaximized(hWnd); const bool full = isFullScreen(hWnd); // We don't need this correction when we're fullscreen. We will // have the WS_POPUP size, so we don't have to worry about @@ -2072,7 +2081,7 @@ return {GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)}; }; const auto getNativeGlobalPosFromKeyboard = [hWnd]() -> POINT { - const bool maxOrFull = IsMaximized(hWnd) || isFullScreen(hWnd); + const bool maxOrFull = isMaximized(hWnd) || isFullScreen(hWnd); const quint32 frameSize = getResizeBorderThickness(hWnd); const quint32 horizontalOffset = ((maxOrFull || !isSystemBorderEnabled()) ? 0 : frameSize); @@ -2104,9 +2113,12 @@ switch (message) { case WM_RBUTTONUP: { const POINT nativeLocalPos = getNativePosFromMouse(); - const QPoint qtScenePos = - QHighDpi::fromNativeLocalPosition(point2qpoint(nativeLocalPos), m_windowHandle); - if (isInTitleBarDraggableArea(qtScenePos)) { + const QPoint qtScenePos = QHighDpi::fromNativeLocalPosition( + point2qpoint(nativeLocalPos), m_windowHandle.data()); + WindowAgentBase::SystemButton sysButtonType = WindowAgentBase::Unknown; + if (isInTitleBarDraggableArea(qtScenePos) || + (isInSystemButtons(qtScenePos, &sysButtonType) && + sysButtonType == WindowAgentBase::WindowIcon)) { shouldShowSystemMenu = true; nativeGlobalPos = nativeLocalPos; ::ClientToScreen(hWnd, &nativeGlobalPos); @@ -2176,14 +2188,23 @@ WH_MOUSE, [](int nCode, WPARAM wParam, LPARAM lParam) { if (nCode >= 0) { - if (wParam == WM_LBUTTONDOWN || wParam == WM_LBUTTONDBLCLK) { - if (wParam == WM_LBUTTONDBLCLK) { + switch (wParam) { + case WM_LBUTTONDBLCLK: mouseDoubleClicked = true; + Q_FALLTHROUGH(); + + // case WM_POINTERDOWN: + + case WM_LBUTTONDOWN: { + auto pMouseStruct = + reinterpret_cast<MOUSEHOOKSTRUCT *>(lParam); + if (pMouseStruct) { + mouseClickPos = pMouseStruct->pt; + } + break; } - auto pMouseStruct = reinterpret_cast<MOUSEHOOKSTRUCT *>(lParam); - if (pMouseStruct) { - mouseClickPos = pMouseStruct->pt; - } + default: + break; } } return ::CallNextHookEx(nullptr, nCode, wParam, lParam); @@ -2193,25 +2214,24 @@ } } - bool res = showSystemMenu_sys(hWnd, nativeGlobalPos, broughtByKeyboard, - m_delegate->isHostSizeFixed(m_host)); + bool res = + showSystemMenu_sys(hWnd, nativeGlobalPos, broughtByKeyboard, isHostSizeFixed()); // Uninstall mouse hook and check if it's a double-click if (mouseHookedLocal) { ::UnhookWindowsHookEx(mouseHook); // Emulate the Windows icon button's behavior - static uint32_t doubleClickTime = ::GetDoubleClickTime(); if (!res && mouseClickPos.has_value()) { POINT nativeLocalPos = mouseClickPos.value(); ::ScreenToClient(hWnd, &nativeLocalPos); QPoint qtScenePos = QHighDpi::fromNativeLocalPosition( - point2qpoint(nativeLocalPos), m_windowHandle); + point2qpoint(nativeLocalPos), m_windowHandle.data()); WindowAgentBase::SystemButton sysButtonType = WindowAgentBase::Unknown; if (isInSystemButtons(qtScenePos, &sysButtonType) && sysButtonType == WindowAgentBase::WindowIcon) { iconButtonClickLevel |= IconButtonClicked; - if (::GetTickCount64() - iconButtonClickTime <= doubleClickTime) { + if (::GetTickCount64() - iconButtonClickTime <= ::GetDoubleClickTime()) { iconButtonClickLevel |= IconButtonTriggersClose; } } -- Gitblit v1.9.1