diff options
Diffstat (limited to 'src/plugins/platforms/windows/qwindowsmousehandler.cpp')
-rw-r--r-- | src/plugins/platforms/windows/qwindowsmousehandler.cpp | 24 |
1 files changed, 24 insertions, 0 deletions
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 { |