XCB: Implement native events for for windows.

Change-Id: Iacea1231b49ebe57da96f4012d3f314e1b037105
Reviewed-by: Samuel Rødal <samuel.rodal@nokia.com>
This commit is contained in:
Friedemann Kleint 2012-03-09 14:35:11 +01:00 committed by Qt by Nokia
parent d8e6350c16
commit 472cc7ac27
3 changed files with 18 additions and 6 deletions

View File

@ -235,17 +235,25 @@ QXcbWindow *QXcbConnection::platformWindowFromId(xcb_window_t id)
#define HANDLE_PLATFORM_WINDOW_EVENT(event_t, windowMember, handler) \ #define HANDLE_PLATFORM_WINDOW_EVENT(event_t, windowMember, handler) \
{ \ { \
event_t *e = (event_t *)event; \ event_t *e = (event_t *)event; \
if (QXcbWindow *platformWindow = platformWindowFromId(e->windowMember)) \ if (QXcbWindow *platformWindow = platformWindowFromId(e->windowMember)) { \
long result = 0; \
handled = QWindowSystemInterface::handleNativeEvent(platformWindow->window(), m_nativeInterface->genericEventFilterType(), event, &result); \
if (!handled) \
platformWindow->handler(e); \ platformWindow->handler(e); \
} \ } \
} \
break; break;
#define HANDLE_KEYBOARD_EVENT(event_t, handler) \ #define HANDLE_KEYBOARD_EVENT(event_t, handler) \
{ \ { \
event_t *e = (event_t *)event; \ event_t *e = (event_t *)event; \
if (QXcbWindow *platformWindow = platformWindowFromId(e->event)) \ if (QXcbWindow *platformWindow = platformWindowFromId(e->event)) { \
long result = 0; \
handled = QWindowSystemInterface::handleNativeEvent(platformWindow->window(), m_nativeInterface->genericEventFilterType(), event, &result); \
if (!handled) \
m_keyboard->handler(platformWindow, e); \ m_keyboard->handler(platformWindow, e); \
} \ } \
} \
break; break;
//#define XCB_EVENT_DEBUG //#define XCB_EVENT_DEBUG

View File

@ -76,7 +76,9 @@ public:
Q_GLOBAL_STATIC(QXcbResourceMap, qXcbResourceMap) Q_GLOBAL_STATIC(QXcbResourceMap, qXcbResourceMap)
QXcbNativeInterface::QXcbNativeInterface() QXcbNativeInterface::QXcbNativeInterface() :
m_genericEventFilterType(QByteArrayLiteral("xcb_generic_event_t"))
{ {
qFill(m_eventFilters, m_eventFilters + EventFilterCount, EventFilter(0)); qFill(m_eventFilters, m_eventFilters + EventFilterCount, EventFilter(0));
} }
@ -134,7 +136,7 @@ void *QXcbNativeInterface::nativeResourceForWindow(const QByteArray &resourceStr
QPlatformNativeInterface::EventFilter QXcbNativeInterface::setEventFilter(const QByteArray &eventType, QPlatformNativeInterface::EventFilter filter) QPlatformNativeInterface::EventFilter QXcbNativeInterface::setEventFilter(const QByteArray &eventType, QPlatformNativeInterface::EventFilter filter)
{ {
int type = -1; int type = -1;
if (eventType == QByteArrayLiteral("xcb_generic_event_t")) if (eventType == m_genericEventFilterType)
type = GenericEventFilter; type = GenericEventFilter;
if (type == -1) { if (type == -1) {
qWarning("QXcbNativeInterface: %s: Attempt to set invalid event filter type '%s'.", qWarning("QXcbNativeInterface: %s: Attempt to set invalid event filter type '%s'.",

View File

@ -71,6 +71,7 @@ public:
void *nativeResourceForContext(const QByteArray &resourceString, QOpenGLContext *context); void *nativeResourceForContext(const QByteArray &resourceString, QOpenGLContext *context);
void *nativeResourceForWindow(const QByteArray &resourceString, QWindow *window); void *nativeResourceForWindow(const QByteArray &resourceString, QWindow *window);
inline const QByteArray &genericEventFilterType() const { return m_genericEventFilterType; }
EventFilter setEventFilter(const QByteArray &eventType, EventFilter filter); EventFilter setEventFilter(const QByteArray &eventType, EventFilter filter);
EventFilter eventFilter(EventFilterType type) const { return m_eventFilters[type]; } EventFilter eventFilter(EventFilterType type) const { return m_eventFilters[type]; }
@ -83,6 +84,7 @@ public:
void *eglContextForContext(QOpenGLContext *context); void *eglContextForContext(QOpenGLContext *context);
private: private:
const QByteArray m_genericEventFilterType;
EventFilter m_eventFilters[EventFilterCount]; EventFilter m_eventFilters[EventFilterCount];
static QXcbScreen *qPlatformScreenForWindow(QWindow *window); static QXcbScreen *qPlatformScreenForWindow(QWindow *window);