XCB: Implement native events for for windows.
authorFriedemann Kleint <Friedemann.Kleint@nokia.com>
Fri, 9 Mar 2012 13:35:11 +0000 (14:35 +0100)
committerQt by Nokia <qt-info@nokia.com>
Sat, 10 Mar 2012 21:16:05 +0000 (22:16 +0100)
Change-Id: Iacea1231b49ebe57da96f4012d3f314e1b037105
Reviewed-by: Samuel Rødal <samuel.rodal@nokia.com>
src/plugins/platforms/xcb/qxcbconnection.cpp
src/plugins/platforms/xcb/qxcbnativeinterface.cpp
src/plugins/platforms/xcb/qxcbnativeinterface.h

index 367b24d..76979bf 100644 (file)
@@ -235,16 +235,24 @@ QXcbWindow *QXcbConnection::platformWindowFromId(xcb_window_t id)
 #define HANDLE_PLATFORM_WINDOW_EVENT(event_t, windowMember, handler) \
 { \
     event_t *e = (event_t *)event; \
-    if (QXcbWindow *platformWindow = platformWindowFromId(e->windowMember)) \
-        platformWindow->handler(e); \
+    if (QXcbWindow *platformWindow = platformWindowFromId(e->windowMember))  { \
+        long result = 0; \
+        handled = QWindowSystemInterface::handleNativeEvent(platformWindow->window(), m_nativeInterface->genericEventFilterType(), event, &result); \
+        if (!handled) \
+            platformWindow->handler(e); \
+    } \
 } \
 break;
 
 #define HANDLE_KEYBOARD_EVENT(event_t, handler) \
 { \
     event_t *e = (event_t *)event; \
-    if (QXcbWindow *platformWindow = platformWindowFromId(e->event)) \
-        m_keyboard->handler(platformWindow, e); \
+    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); \
+    } \
 } \
 break;
 
index f56072f..fc320ee 100644 (file)
@@ -76,7 +76,9 @@ public:
 
 Q_GLOBAL_STATIC(QXcbResourceMap, qXcbResourceMap)
 
-QXcbNativeInterface::QXcbNativeInterface()
+QXcbNativeInterface::QXcbNativeInterface() :
+    m_genericEventFilterType(QByteArrayLiteral("xcb_generic_event_t"))
+
 {
     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)
 {
     int type = -1;
-    if (eventType == QByteArrayLiteral("xcb_generic_event_t"))
+    if (eventType == m_genericEventFilterType)
         type = GenericEventFilter;
     if (type == -1) {
         qWarning("QXcbNativeInterface: %s: Attempt to set invalid event filter type '%s'.",
index 6f6130d..c6835ff 100644 (file)
@@ -71,6 +71,7 @@ public:
     void *nativeResourceForContext(const QByteArray &resourceString, QOpenGLContext *context);
     void *nativeResourceForWindow(const QByteArray &resourceString, QWindow *window);
 
+    inline const QByteArray &genericEventFilterType() const { return m_genericEventFilterType; }
     EventFilter setEventFilter(const QByteArray &eventType, EventFilter filter);
     EventFilter eventFilter(EventFilterType type) const { return m_eventFilters[type]; }
 
@@ -83,6 +84,7 @@ public:
     void *eglContextForContext(QOpenGLContext *context);
 
 private:
+    const QByteArray m_genericEventFilterType;
     EventFilter m_eventFilters[EventFilterCount];
 
     static QXcbScreen *qPlatformScreenForWindow(QWindow *window);