diff options
author | Friedemann Kleint <Friedemann.Kleint@nokia.com> | 2012-06-27 16:20:18 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-06-29 16:22:19 +0200 |
commit | f58e046a611118a6349ee617a98dbb24280ef183 (patch) | |
tree | 50fb5a6348723553da5cb8d261282f7ec3adf16b /src/plugins/platforms | |
parent | 2b368469c8e58e0df26e48706b5864d5e4f7da5e (diff) |
Add framestrut mouse events.
- Add infrastructure to QWindowSystemInterface.
- Add a setter for enabling framestrut events
to QPlatformWindow.
- Add Windows implementation, pass keyboard modifiers.
QDockWidget relies on it for docking.
Task-number: QTBUG-26296
Change-Id: I9d84b356e9a5eb341f57b6f51f34b6b494ff7f87
Reviewed-by: Jørgen Lind <jorgen.lind@nokia.com>
Diffstat (limited to 'src/plugins/platforms')
5 files changed, 50 insertions, 8 deletions
diff --git a/src/plugins/platforms/windows/qwindowscontext.cpp b/src/plugins/platforms/windows/qwindowscontext.cpp index 891753215d..ba32369c03 100644 --- a/src/plugins/platforms/windows/qwindowscontext.cpp +++ b/src/plugins/platforms/windows/qwindowscontext.cpp @@ -817,9 +817,12 @@ bool QWindowsContext::windowsProc(HWND hwnd, UINT message, #endif case QtWindows::ExposeEvent: return platformWindow->handleWmPaint(hwnd, message, wParam, lParam); + case QtWindows::NonClientMouseEvent: + if (platformWindow->frameStrutEventsEnabled()) + return d->m_mouseHandler.translateMouseEvent(platformWindow->window(), hwnd, et, msg, result); + break; case QtWindows::MouseWheelEvent: case QtWindows::MouseEvent: - case QtWindows::NonClientMouseEvent: case QtWindows::LeaveEvent: return d->m_mouseHandler.translateMouseEvent(platformWindow->window(), hwnd, et, msg, result); case QtWindows::TouchEvent: diff --git a/src/plugins/platforms/windows/qwindowsmousehandler.cpp b/src/plugins/platforms/windows/qwindowsmousehandler.cpp index eb7d2912bb..e9a2b5c19d 100644 --- a/src/plugins/platforms/windows/qwindowsmousehandler.cpp +++ b/src/plugins/platforms/windows/qwindowsmousehandler.cpp @@ -40,6 +40,7 @@ ****************************************************************************/ #include "qwindowsmousehandler.h" +#include "qwindowskeymapper.h" #include "qwindowscontext.h" #include "qwindowswindow.h" #include "qwindowsintegration.h" @@ -130,14 +131,37 @@ QWindowsMouseHandler::QWindowsMouseHandler() : { } +Qt::MouseButtons QWindowsMouseHandler::queryMouseButtons() +{ + Qt::MouseButtons result = 0; + const bool mouseSwapped = GetSystemMetrics(SM_SWAPBUTTON); + if (GetAsyncKeyState(VK_LBUTTON) < 0) + result |= mouseSwapped ? Qt::RightButton: Qt::LeftButton; + if (GetAsyncKeyState(VK_RBUTTON) < 0) + result |= mouseSwapped ? Qt::LeftButton : Qt::RightButton; + if (GetAsyncKeyState(VK_MBUTTON) < 0) + result |= Qt::MidButton; + return result; +} + bool QWindowsMouseHandler::translateMouseEvent(QWindow *window, HWND hwnd, QtWindows::WindowsEventType et, MSG msg, LRESULT *result) { - if (et & QtWindows::NonClientEventFlag) - return false; if (et == QtWindows::MouseWheelEvent) return translateMouseWheelEvent(window, hwnd, msg, result); + + const QPoint winEventPosition(GET_X_LPARAM(msg.lParam), GET_Y_LPARAM(msg.lParam)); + if (et & QtWindows::NonClientEventFlag) { + const QPoint globalPosition = winEventPosition; + const QPoint clientPosition = QWindowsGeometryHint::mapFromGlobal(hwnd, globalPosition); + const Qt::MouseButtons buttons = QWindowsMouseHandler::queryMouseButtons(); + QWindowSystemInterface::handleFrameStrutMouseEvent(window, clientPosition, + globalPosition, buttons, + QWindowsKeyMapper::queryKeyboardModifiers()); + return false; // Allow further event processing (dragging of windows). + } + *result = 0; if (msg.message == WM_MOUSELEAVE) { // When moving out of a child, MouseMove within parent is received first @@ -161,7 +185,6 @@ bool QWindowsMouseHandler::translateMouseEvent(QWindow *window, HWND hwnd, return true; } } - const QPoint client(GET_X_LPARAM(msg.lParam), GET_Y_LPARAM(msg.lParam)); // Enter new window: track to generate leave event. if (m_windowUnderMouse != window) { // The tracking on m_windowUnderMouse might still be active and @@ -186,9 +209,11 @@ bool QWindowsMouseHandler::translateMouseEvent(QWindow *window, HWND hwnd, qWarning("TrackMouseEvent failed."); #endif // !Q_OS_WINCE } - QWindowSystemInterface::handleMouseEvent(window, client, - QWindowsGeometryHint::mapToGlobal(hwnd, client), - keyStateToMouseButtons((int)msg.wParam)); + const QPoint clientPosition = winEventPosition; + QWindowSystemInterface::handleMouseEvent(window, clientPosition, + QWindowsGeometryHint::mapToGlobal(hwnd, clientPosition), + keyStateToMouseButtons((int)msg.wParam), + QWindowsKeyMapper::queryKeyboardModifiers()); return true; } diff --git a/src/plugins/platforms/windows/qwindowsmousehandler.h b/src/plugins/platforms/windows/qwindowsmousehandler.h index a978840d67..e3d329e872 100644 --- a/src/plugins/platforms/windows/qwindowsmousehandler.h +++ b/src/plugins/platforms/windows/qwindowsmousehandler.h @@ -70,6 +70,7 @@ public: static inline Qt::KeyboardModifiers keyStateToModifiers(int); static inline int mouseButtonsToKeyState(Qt::MouseButtons); + static Qt::MouseButtons queryMouseButtons(); QWindow *windowUnderMouse() const { return m_windowUnderMouse.data(); } private: diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp index 7fa43e03e6..b553c15864 100644 --- a/src/plugins/platforms/windows/qwindowswindow.cpp +++ b/src/plugins/platforms/windows/qwindowswindow.cpp @@ -1489,6 +1489,15 @@ bool QWindowsWindow::startSystemResize(const QPoint &, Qt::Corner corner) return true; } +void QWindowsWindow::setFrameStrutEventsEnabled(bool enabled) +{ + if (enabled) { + setFlag(FrameStrutEventsEnabled); + } else { + clearFlag(FrameStrutEventsEnabled); + } +} + #ifndef Q_OS_WINCE // maybe available on some SDKs revisit WM_GETMINMAXINFO void QWindowsWindow::getSizeHints(MINMAXINFO *mmi) const { diff --git a/src/plugins/platforms/windows/qwindowswindow.h b/src/plugins/platforms/windows/qwindowswindow.h index 182bef78e4..475982aba4 100644 --- a/src/plugins/platforms/windows/qwindowswindow.h +++ b/src/plugins/platforms/windows/qwindowswindow.h @@ -123,7 +123,8 @@ public: OpenGLDoubleBuffered = 0x20, OpenGlPixelFormatInitialized = 0x40, BlockedByModal = 0x80, - SizeGripOperation = 0x100 + SizeGripOperation = 0x100, + FrameStrutEventsEnabled = 0x200 }; struct WindowData @@ -178,6 +179,9 @@ public: virtual bool startSystemResize(const QPoint &pos, Qt::Corner corner); + void setFrameStrutEventsEnabled(bool enabled); + bool frameStrutEventsEnabled() const { return testFlag(FrameStrutEventsEnabled); } + Qt::WindowState windowState_sys() const; Qt::WindowStates windowStates_sys() const; |