From 0b1586f86c08e0fe4936199eb655a83510fe7e54 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Fri, 20 Jan 2012 16:49:44 +0100 Subject: Windows: Implement native event filters. Change-Id: Ibdf556428e4dbb9156c87504b923ec9600bcf871 Reviewed-by: Simon Hausmann --- src/plugins/platforms/windows/qwindowscontext.cpp | 56 ++++++++++++++++++---- src/plugins/platforms/windows/qwindowscontext.h | 4 ++ .../platforms/windows/qwindowsintegration.cpp | 2 + 3 files changed, 54 insertions(+), 8 deletions(-) (limited to 'src/plugins') diff --git a/src/plugins/platforms/windows/qwindowscontext.cpp b/src/plugins/platforms/windows/qwindowscontext.cpp index 717c945946..cd11d82d2d 100644 --- a/src/plugins/platforms/windows/qwindowscontext.cpp +++ b/src/plugins/platforms/windows/qwindowscontext.cpp @@ -52,6 +52,7 @@ #include #include +#include #include #include @@ -219,6 +220,14 @@ QWindowsContext *QWindowsContext::m_instance = 0; typedef QHash HandleBaseWindowHash; struct QWindowsContextPrivate { + typedef QPlatformNativeInterface::EventFilter EventFilter; + + enum EventFilterType + { + GenericWindowsEventFilter, + EventFilterTypeCount + }; + QWindowsContextPrivate(); unsigned m_systemInfo; @@ -232,6 +241,7 @@ struct QWindowsContextPrivate { QWindowsScreenManager m_screenManager; QSharedPointer m_creationContext; const HRESULT m_oleInitializeResult; + EventFilter m_eventFilters[EventFilterTypeCount]; }; QWindowsContextPrivate::QWindowsContextPrivate() : @@ -252,6 +262,7 @@ QWindowsContextPrivate::QWindowsContextPrivate() : m_systemInfo |= QWindowsContext::SI_RTL_Extensions; m_keyMapper.setUseRTLExtensions(true); } + qFill(m_eventFilters, m_eventFilters + EventFilterTypeCount, EventFilter(0)); } QWindowsContext::QWindowsContext() : @@ -612,6 +623,27 @@ QByteArray QWindowsContext::comErrorString(HRESULT hr) return "Unknown error 0x" + QByteArray::number(quint64(hr), 16); } +/*! + \brief Set event filter. + + \sa QWindowsNativeInterface +*/ + +QWindowsContext::EventFilter QWindowsContext::setEventFilter(const QByteArray &eventType, EventFilter filter) +{ + int eventFilterType = -1; + if (eventType == QByteArrayLiteral("windows_generic_MSG")) + eventFilterType = QWindowsContextPrivate::GenericWindowsEventFilter; + if (eventFilterType < 0) { + qWarning("%s: Attempt to set unsupported event filter '%s'.", + __FUNCTION__, eventType.constData()); + return 0; + } + const EventFilter previous = d->m_eventFilters[eventFilterType]; + d->m_eventFilters[eventFilterType] = filter; + return previous; +} + /*! \brief Main windows procedure registered for windows. @@ -623,6 +655,22 @@ bool QWindowsContext::windowsProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam, LRESULT *result) { *result = 0; + + MSG msg; + msg.hwnd = hwnd; // re-create MSG structure + msg.message = message; // time and pt fields ignored + msg.wParam = wParam; + msg.lParam = lParam; + msg.pt.x = GET_X_LPARAM(lParam); + msg.pt.y = GET_Y_LPARAM(lParam); + + if (d->m_eventFilters[QWindowsContextPrivate::GenericWindowsEventFilter]) { + long filterResult = 0; + if (d->m_eventFilters[QWindowsContextPrivate::GenericWindowsEventFilter](&msg, &filterResult)) { + *result = LRESULT(filterResult); + return true; + } + } // Events without an associated QWindow or events we are not interested in. switch (et) { case QtWindows::DeactivateApplicationEvent: @@ -685,14 +733,6 @@ bool QWindowsContext::windowsProc(HWND hwnd, UINT message, return false; } - MSG msg; - msg.hwnd = hwnd; // re-create MSG structure - msg.message = message; // time and pt fields ignored - msg.wParam = wParam; - msg.lParam = lParam; - msg.pt.x = GET_X_LPARAM(lParam); - msg.pt.y = GET_Y_LPARAM(lParam); - switch (et) { case QtWindows::KeyDownEvent: case QtWindows::KeyEvent: diff --git a/src/plugins/platforms/windows/qwindowscontext.h b/src/plugins/platforms/windows/qwindowscontext.h index a733d16c3a..4f3a77bf05 100644 --- a/src/plugins/platforms/windows/qwindowscontext.h +++ b/src/plugins/platforms/windows/qwindowscontext.h @@ -103,6 +103,8 @@ class QWindowsContext { Q_DISABLE_COPY(QWindowsContext) public: + typedef bool (*EventFilter)(void *message, long *result); + enum SystemInfoFlags { SI_RTL_Extensions = 0x1, @@ -136,6 +138,8 @@ public: HDC displayContext() const; int screenDepth() const; + EventFilter setEventFilter(const QByteArray &eventType, EventFilter filter); + static QWindowsContext *instance(); static QString windowsErrorMessage(unsigned long errorCode); diff --git a/src/plugins/platforms/windows/qwindowsintegration.cpp b/src/plugins/platforms/windows/qwindowsintegration.cpp index 1c2a4b73c6..0c9d83f926 100644 --- a/src/plugins/platforms/windows/qwindowsintegration.cpp +++ b/src/plugins/platforms/windows/qwindowsintegration.cpp @@ -87,6 +87,8 @@ public: virtual void *nativeResourceForContext(const QByteArray &resource, QOpenGLContext *context); virtual void *nativeResourceForWindow(const QByteArray &resource, QWindow *window); virtual void *nativeResourceForBackingStore(const QByteArray &resource, QBackingStore *bs); + virtual EventFilter setEventFilter(const QByteArray &eventType, EventFilter filter) + { return QWindowsContext::instance()->setEventFilter(eventType, filter); } }; void *QWindowsNativeInterface::nativeResourceForWindow(const QByteArray &resource, QWindow *window) -- cgit v1.2.3