Windows: Implement native event filters.
Change-Id: Ibdf556428e4dbb9156c87504b923ec9600bcf871 Reviewed-by: Simon Hausmann <simon.hausmann@nokia.com>
This commit is contained in:
parent
e309e7a3e8
commit
0b1586f86c
@ -52,6 +52,7 @@
|
|||||||
|
|
||||||
#include <QtGui/QWindow>
|
#include <QtGui/QWindow>
|
||||||
#include <QtGui/QWindowSystemInterface>
|
#include <QtGui/QWindowSystemInterface>
|
||||||
|
#include <QtGui/QPlatformNativeInterface>
|
||||||
|
|
||||||
#include <QtCore/QSet>
|
#include <QtCore/QSet>
|
||||||
#include <QtCore/QHash>
|
#include <QtCore/QHash>
|
||||||
@ -219,6 +220,14 @@ QWindowsContext *QWindowsContext::m_instance = 0;
|
|||||||
typedef QHash<HWND, QWindowsWindow *> HandleBaseWindowHash;
|
typedef QHash<HWND, QWindowsWindow *> HandleBaseWindowHash;
|
||||||
|
|
||||||
struct QWindowsContextPrivate {
|
struct QWindowsContextPrivate {
|
||||||
|
typedef QPlatformNativeInterface::EventFilter EventFilter;
|
||||||
|
|
||||||
|
enum EventFilterType
|
||||||
|
{
|
||||||
|
GenericWindowsEventFilter,
|
||||||
|
EventFilterTypeCount
|
||||||
|
};
|
||||||
|
|
||||||
QWindowsContextPrivate();
|
QWindowsContextPrivate();
|
||||||
|
|
||||||
unsigned m_systemInfo;
|
unsigned m_systemInfo;
|
||||||
@ -232,6 +241,7 @@ struct QWindowsContextPrivate {
|
|||||||
QWindowsScreenManager m_screenManager;
|
QWindowsScreenManager m_screenManager;
|
||||||
QSharedPointer<QWindowCreationContext> m_creationContext;
|
QSharedPointer<QWindowCreationContext> m_creationContext;
|
||||||
const HRESULT m_oleInitializeResult;
|
const HRESULT m_oleInitializeResult;
|
||||||
|
EventFilter m_eventFilters[EventFilterTypeCount];
|
||||||
};
|
};
|
||||||
|
|
||||||
QWindowsContextPrivate::QWindowsContextPrivate() :
|
QWindowsContextPrivate::QWindowsContextPrivate() :
|
||||||
@ -252,6 +262,7 @@ QWindowsContextPrivate::QWindowsContextPrivate() :
|
|||||||
m_systemInfo |= QWindowsContext::SI_RTL_Extensions;
|
m_systemInfo |= QWindowsContext::SI_RTL_Extensions;
|
||||||
m_keyMapper.setUseRTLExtensions(true);
|
m_keyMapper.setUseRTLExtensions(true);
|
||||||
}
|
}
|
||||||
|
qFill(m_eventFilters, m_eventFilters + EventFilterTypeCount, EventFilter(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
QWindowsContext::QWindowsContext() :
|
QWindowsContext::QWindowsContext() :
|
||||||
@ -612,6 +623,27 @@ QByteArray QWindowsContext::comErrorString(HRESULT hr)
|
|||||||
return "Unknown error 0x" + QByteArray::number(quint64(hr), 16);
|
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.
|
\brief Main windows procedure registered for windows.
|
||||||
|
|
||||||
@ -623,6 +655,22 @@ bool QWindowsContext::windowsProc(HWND hwnd, UINT message,
|
|||||||
WPARAM wParam, LPARAM lParam, LRESULT *result)
|
WPARAM wParam, LPARAM lParam, LRESULT *result)
|
||||||
{
|
{
|
||||||
*result = 0;
|
*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.
|
// Events without an associated QWindow or events we are not interested in.
|
||||||
switch (et) {
|
switch (et) {
|
||||||
case QtWindows::DeactivateApplicationEvent:
|
case QtWindows::DeactivateApplicationEvent:
|
||||||
@ -685,14 +733,6 @@ bool QWindowsContext::windowsProc(HWND hwnd, UINT message,
|
|||||||
return false;
|
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) {
|
switch (et) {
|
||||||
case QtWindows::KeyDownEvent:
|
case QtWindows::KeyDownEvent:
|
||||||
case QtWindows::KeyEvent:
|
case QtWindows::KeyEvent:
|
||||||
|
@ -103,6 +103,8 @@ class QWindowsContext
|
|||||||
{
|
{
|
||||||
Q_DISABLE_COPY(QWindowsContext)
|
Q_DISABLE_COPY(QWindowsContext)
|
||||||
public:
|
public:
|
||||||
|
typedef bool (*EventFilter)(void *message, long *result);
|
||||||
|
|
||||||
enum SystemInfoFlags
|
enum SystemInfoFlags
|
||||||
{
|
{
|
||||||
SI_RTL_Extensions = 0x1,
|
SI_RTL_Extensions = 0x1,
|
||||||
@ -136,6 +138,8 @@ public:
|
|||||||
HDC displayContext() const;
|
HDC displayContext() const;
|
||||||
int screenDepth() const;
|
int screenDepth() const;
|
||||||
|
|
||||||
|
EventFilter setEventFilter(const QByteArray &eventType, EventFilter filter);
|
||||||
|
|
||||||
static QWindowsContext *instance();
|
static QWindowsContext *instance();
|
||||||
|
|
||||||
static QString windowsErrorMessage(unsigned long errorCode);
|
static QString windowsErrorMessage(unsigned long errorCode);
|
||||||
|
@ -87,6 +87,8 @@ public:
|
|||||||
virtual void *nativeResourceForContext(const QByteArray &resource, QOpenGLContext *context);
|
virtual void *nativeResourceForContext(const QByteArray &resource, QOpenGLContext *context);
|
||||||
virtual void *nativeResourceForWindow(const QByteArray &resource, QWindow *window);
|
virtual void *nativeResourceForWindow(const QByteArray &resource, QWindow *window);
|
||||||
virtual void *nativeResourceForBackingStore(const QByteArray &resource, QBackingStore *bs);
|
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)
|
void *QWindowsNativeInterface::nativeResourceForWindow(const QByteArray &resource, QWindow *window)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user