summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2018-05-03 11:03:16 +0200
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2018-05-16 13:38:32 +0000
commit7c3ecf85a770cd7fef01ece935f88d8894de09b2 (patch)
tree05501cd497e9562429c0600af8d0a3c8a67ae8f1 /src/plugins/platforms
parent811db6262f2df72e726708a9814a549ddd8e4f86 (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.cpp1
-rw-r--r--src/plugins/platforms/windows/qwindowsmousehandler.cpp24
-rw-r--r--src/plugins/platforms/windows/qwindowsmousehandler.h2
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);