diff options
Diffstat (limited to 'src/plugins/platforms/windows/qwindowswindow.cpp')
-rw-r--r-- | src/plugins/platforms/windows/qwindowswindow.cpp | 39 |
1 files changed, 20 insertions, 19 deletions
diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp index b43032dc1a..d58d10b4d5 100644 --- a/src/plugins/platforms/windows/qwindowswindow.cpp +++ b/src/plugins/platforms/windows/qwindowswindow.cpp @@ -696,7 +696,6 @@ QWindowsWindow::QWindowsWindow(QWindow *aWindow, const WindowData &data) : m_hdc(0), m_windowState(Qt::WindowNoState), m_opacity(1.0), - m_mouseGrab(false), m_cursor(QWindowsScreen::screenOf(aWindow)->windowsCursor()->standardWindowCursor()), m_dropTarget(0), m_savedStyle(0), @@ -738,6 +737,8 @@ void QWindowsWindow::destroyWindow() if (QWindowsContext::verboseIntegration || QWindowsContext::verboseWindows) qDebug() << __FUNCTION__ << this << window() << m_data.hwnd; if (m_data.hwnd) { // Stop event dispatching before Window is destroyed. + if (hasMouseCapture()) + setMouseGrabEnabled(false); unregisterDropSite(); QWindowsContext::instance()->removeWindow(m_data.hwnd); #ifdef QT_OPENGL_ES_2 @@ -811,6 +812,8 @@ void QWindowsWindow::setVisible(bool visible) QWindowSystemInterface::handleExposeEvent(window(), QRect(QPoint(), geometry().size())); } else { + if (hasMouseCapture()) + setMouseGrabEnabled(false); hide_sys(); QWindowSystemInterface::handleExposeEvent(window(), QRegion()); } @@ -1495,29 +1498,27 @@ bool QWindowsWindow::setKeyboardGrabEnabled(bool grab) bool QWindowsWindow::setMouseGrabEnabled(bool grab) { - bool result = false; + if (QWindowsContext::verboseWindows) + qDebug() << __FUNCTION__ << window() << grab; if (!m_data.hwnd) { qWarning("%s: No handle", __FUNCTION__); - return result; + return false; } - if (QWindowsContext::verboseWindows) - qDebug() << __FUNCTION__ << window() << grab; - - if (m_mouseGrab != grab) { - m_mouseGrab = grab; - if (isVisible()) - setMouseGrabEnabled_sys(grab); + if (!isVisible() && grab) { + qWarning("%s: Not setting mouse grab for invisible window %s", + __FUNCTION__, qPrintable(window()->objectName())); + return false; } - return grab; -} - -void QWindowsWindow::setMouseGrabEnabled_sys(bool grab) -{ - if (grab) { - SetCapture(m_data.hwnd); - } else { - ReleaseCapture(); + // release grab or an explicit grab overriding autocapture: Clear flag. + clearFlag(QWindowsWindow::AutoMouseCapture); + if (hasMouseCapture() != grab) { + if (grab) { + SetCapture(m_data.hwnd); + } else { + ReleaseCapture(); + } } + return grab; } static inline DWORD cornerToWinOrientation(Qt::Corner corner) |