diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2018-05-03 11:03:16 +0200 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2018-05-16 13:38:32 +0000 |
commit | 7c3ecf85a770cd7fef01ece935f88d8894de09b2 (patch) | |
tree | 05501cd497e9562429c0600af8d0a3c8a67ae8f1 /src/plugins/platforms | |
parent | 811db6262f2df72e726708a9814a549ddd8e4f86 (diff) |
Windows QPA: Fix left button reported pressed after moving windows
When moving a window by dragging the title bar, no WM_NCLBUTTONUP is
received after WM_NCLBUTTONDOWN, WM_NCMOUSEMOVE (due to internal mouse
capture), which can leave the left mouse button 'pressed' in
QGuiApplication's state. Intercept WM_EXITSIZEMOVE to sync the buttons.
Complements 45894408913f62f6f25a302d8ed07af57ac7db5d.
Change-Id: I94d18d1d4a4796dcecb1a9731809d05c7f9ddd65
Reviewed-by: Andre de la Rocha <andre.rocha@qt.io>
Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
Diffstat (limited to 'src/plugins/platforms')
-rw-r--r-- | src/plugins/platforms/windows/qwindowscontext.cpp | 1 | ||||
-rw-r--r-- | src/plugins/platforms/windows/qwindowsmousehandler.cpp | 24 | ||||
-rw-r--r-- | src/plugins/platforms/windows/qwindowsmousehandler.h | 2 |
3 files changed, 27 insertions, 0 deletions
diff --git a/src/plugins/platforms/windows/qwindowscontext.cpp b/src/plugins/platforms/windows/qwindowscontext.cpp index 98a4b261fd..2def926409 100644 --- a/src/plugins/platforms/windows/qwindowscontext.cpp +++ b/src/plugins/platforms/windows/qwindowscontext.cpp @@ -1093,6 +1093,7 @@ bool QWindowsContext::windowsProc(HWND hwnd, UINT message, case QtWindows::ExitSizeMoveEvent: platformWindow->clearFlag(QWindowsWindow::ResizeMoveActive); platformWindow->checkForScreenChanged(); + QWindowsMouseHandler::handleExitSizeMove(platformWindow->window()); return true; case QtWindows::ScrollEvent: return sessionManagerInteractionBlocked() || d->m_mouseHandler.translateScrollEvent(platformWindow->window(), hwnd, msg, result); diff --git a/src/plugins/platforms/windows/qwindowsmousehandler.cpp b/src/plugins/platforms/windows/qwindowsmousehandler.cpp index 0dd1f40b71..bb6d803fb2 100644 --- a/src/plugins/platforms/windows/qwindowsmousehandler.cpp +++ b/src/plugins/platforms/windows/qwindowsmousehandler.cpp @@ -178,6 +178,30 @@ Qt::MouseButtons QWindowsMouseHandler::queryMouseButtons() return result; } +void QWindowsMouseHandler::handleExitSizeMove(QWindow *window) +{ + // When moving a window by dragging the title bar, no WM_NCLBUTTONUP is + // received after WM_NCLBUTTONDOWN, WM_NCMOUSEMOVE (due to internal + // mouse capture), which can leave the left mouse button 'pressed' + // in QGuiApplication's state. Intercept WM_EXITSIZEMOVE to sync the buttons. + const Qt::MouseButtons currentButtons = QWindowsMouseHandler::queryMouseButtons(); + const Qt::MouseButtons appButtons = QGuiApplication::mouseButtons(); + if (currentButtons == appButtons) + return; + const Qt::KeyboardModifiers keyboardModifiers = QWindowsKeyMapper::queryKeyboardModifiers(); + const QPoint globalPos = QWindowsCursor::mousePosition(); + const QPoint localPos = window->handle()->mapFromGlobal(globalPos); + for (Qt::MouseButton button : {Qt::LeftButton, Qt::RightButton, Qt::MiddleButton}) { + if (appButtons.testFlag(button) && !currentButtons.testFlag(button)) { + QWindowSystemInterface::handleMouseEvent(window, localPos, globalPos, + currentButtons, button, + QEvent::NonClientAreaMouseButtonRelease, + keyboardModifiers, + Qt::MouseEventNotSynthesized); + } + } +} + static QPoint lastMouseMovePos; namespace { diff --git a/src/plugins/platforms/windows/qwindowsmousehandler.h b/src/plugins/platforms/windows/qwindowsmousehandler.h index 86f18a0482..c8744c161e 100644 --- a/src/plugins/platforms/windows/qwindowsmousehandler.h +++ b/src/plugins/platforms/windows/qwindowsmousehandler.h @@ -80,6 +80,8 @@ public: QWindow *windowUnderMouse() const { return m_windowUnderMouse.data(); } void clearWindowUnderMouse() { m_windowUnderMouse = 0; } + static void handleExitSizeMove(QWindow *window); + private: inline bool translateMouseWheelEvent(QWindow *window, HWND hwnd, MSG msg, LRESULT *result); |