summaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@nokia.com>2012-06-27 16:20:18 +0200
committerQt by Nokia <qt-info@nokia.com>2012-06-29 16:22:19 +0200
commitf58e046a611118a6349ee617a98dbb24280ef183 (patch)
tree50fb5a6348723553da5cb8d261282f7ec3adf16b /src/plugins
parent2b368469c8e58e0df26e48706b5864d5e4f7da5e (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')
-rw-r--r--src/plugins/platforms/windows/qwindowscontext.cpp5
-rw-r--r--src/plugins/platforms/windows/qwindowsmousehandler.cpp37
-rw-r--r--src/plugins/platforms/windows/qwindowsmousehandler.h1
-rw-r--r--src/plugins/platforms/windows/qwindowswindow.cpp9
-rw-r--r--src/plugins/platforms/windows/qwindowswindow.h6
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;