From dd961a654f29fe6a59a093f8b4b0fff726efbd4a Mon Sep 17 00:00:00 2001 From: Sine Striker <trueful@163.com> Date: 周三, 08 5月 2024 11:55:57 +0800 Subject: [PATCH] Fix a mistake --- src/core/contexts/win32windowcontext.cpp | 41 ++++++++++++++++++++++++++++++++++------- 1 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src/core/contexts/win32windowcontext.cpp b/src/core/contexts/win32windowcontext.cpp index 661e0e8..a448ed6 100644 --- a/src/core/contexts/win32windowcontext.cpp +++ b/src/core/contexts/win32windowcontext.cpp @@ -35,6 +35,12 @@ namespace QWK { + enum IconButtonClickLevelFlag { + IconButtonClicked = 1, + IconButtonDoubleClicked = 2, + IconButtonTriggersClose = 4, + }; + // The thickness of an auto-hide taskbar in pixels. static constexpr const quint8 kAutoHideTaskBarThickness = 2; @@ -1376,7 +1382,7 @@ if (lastHitTestResultRaw == HTSYSMENU) { switch (message) { case WM_NCLBUTTONDOWN: - if (iconButtonClickTime == 0) { + if (iconButtonClickLevel == 0) { // A message of WM_SYSCOMMAND with SC_MOUSEMENU will be sent by // Windows, and the current control flow will be blocked by the // menu while Windows will create and execute a new event loop @@ -1384,10 +1390,17 @@ iconButtonClickTime = ::GetTickCount64(); *result = ::DefWindowProcW(hWnd, WM_NCLBUTTONDOWN, wParam, lParam); - iconButtonClickTime = 0; + if (iconButtonClickLevel & IconButtonTriggersClose) { + ::PostMessageW(hWnd, WM_SYSCOMMAND, SC_CLOSE, 0); + } + if (iconButtonClickLevel & IconButtonDoubleClicked) { + iconButtonClickLevel = 0; + } + // Otherwise, no need to reset `iconButtonClickLevel` if not to + // close, if it has value, there must be another incoming + // WM_NCLBUTTONDOWN } else { - *result = FALSE; - emulateClientAreaMessage(hWnd, message, wParam, lParam); + iconButtonClickLevel = 0; } break; case WM_NCLBUTTONDBLCLK: @@ -2143,7 +2156,10 @@ if (shouldShowSystemMenu) { static HHOOK mouseHook = nullptr; static std::optional<POINT> mouseClickPos; + static bool mouseDoubleClicked = false; bool mouseHookedLocal = false; + + // The menu is triggered by a click on icon button if (iconButtonClickTime > 0) { POINT menuPos{0, static_cast<LONG>(getTitleBarHeight(hWnd))}; if (const auto tb = titleBar()) { @@ -2161,6 +2177,9 @@ [](int nCode, WPARAM wParam, LPARAM lParam) { if (nCode >= 0) { if (wParam == WM_LBUTTONDOWN || wParam == WM_LBUTTONDBLCLK) { + if (wParam == WM_LBUTTONDBLCLK) { + mouseDoubleClicked = true; + } auto pMouseStruct = reinterpret_cast<MOUSEHOOKSTRUCT *>(lParam); if (pMouseStruct) { mouseClickPos = pMouseStruct->pt; @@ -2173,6 +2192,7 @@ mouseHookedLocal = true; } } + bool res = showSystemMenu_sys(hWnd, nativeGlobalPos, broughtByKeyboard, m_delegate->isHostSizeFixed(m_host)); @@ -2182,8 +2202,7 @@ // Emulate the Windows icon button's behavior static uint32_t doubleClickTime = ::GetDoubleClickTime(); - if (!res && mouseClickPos.has_value() && - ::GetTickCount64() - iconButtonClickTime <= doubleClickTime) { + if (!res && mouseClickPos.has_value()) { POINT nativeLocalPos = mouseClickPos.value(); ::ScreenToClient(hWnd, &nativeLocalPos); QPoint qtScenePos = QHighDpi::fromNativeLocalPosition( @@ -2191,12 +2210,20 @@ WindowAgentBase::SystemButton sysButtonType = WindowAgentBase::Unknown; if (isInSystemButtons(qtScenePos, &sysButtonType) && sysButtonType == WindowAgentBase::WindowIcon) { - ::PostMessageW(hWnd, WM_SYSCOMMAND, SC_CLOSE, 0); + iconButtonClickLevel |= IconButtonClicked; + if (::GetTickCount64() - iconButtonClickTime <= doubleClickTime) { + iconButtonClickLevel |= IconButtonTriggersClose; + } } + } + + if (mouseDoubleClicked) { + iconButtonClickLevel |= IconButtonDoubleClicked; } mouseHook = nullptr; mouseClickPos.reset(); + mouseDoubleClicked = false; } // QPA's internal code will handle system menu events separately, and its -- Gitblit v1.9.1