summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJohn Stanley <jpsinthemix@verizon.net>2012-02-07 03:59:40 -0500
committerQt by Nokia <qt-info@nokia.com>2012-02-10 03:02:07 +0100
commit7038151326feef8331d3a258ea03c870012a8f36 (patch)
tree17a6a6da208a7972df4e3bb9585a4f7344827c00 /src
parent6e3c4de94f394bfdb07035fe7e71237779c45971 (diff)
Add support for xlib backend X Event filters
Change-Id: Id1e7995f98395de748ce47a27365e4bdd564ea49 Reviewed-by: Simon Hausmann <simon.hausmann@nokia.com>
Diffstat (limited to 'src')
-rw-r--r--src/plugins/platforms/xlib/qxlibintegration.cpp2
-rw-r--r--src/plugins/platforms/xlib/qxlibintegration.h3
-rw-r--r--src/plugins/platforms/xlib/qxlibnativeinterface.cpp11
-rw-r--r--src/plugins/platforms/xlib/qxlibnativeinterface.h4
-rw-r--r--src/plugins/platforms/xlib/qxlibscreen.cpp11
-rw-r--r--src/plugins/platforms/xlib/qxlibscreen.h3
6 files changed, 29 insertions, 5 deletions
diff --git a/src/plugins/platforms/xlib/qxlibintegration.cpp b/src/plugins/platforms/xlib/qxlibintegration.cpp
index 965f6ffcc5..65d4d231c8 100644
--- a/src/plugins/platforms/xlib/qxlibintegration.cpp
+++ b/src/plugins/platforms/xlib/qxlibintegration.cpp
@@ -68,7 +68,7 @@ QXlibIntegration::QXlibIntegration()
XInitThreads();
- mPrimaryScreen = new QXlibScreen();
+ mPrimaryScreen = new QXlibScreen(mNativeInterface);
mScreens.append(mPrimaryScreen);
screenAdded(mPrimaryScreen);
}
diff --git a/src/plugins/platforms/xlib/qxlibintegration.h b/src/plugins/platforms/xlib/qxlibintegration.h
index b76c6e85d8..76c3f13ff6 100644
--- a/src/plugins/platforms/xlib/qxlibintegration.h
+++ b/src/plugins/platforms/xlib/qxlibintegration.h
@@ -54,6 +54,7 @@
QT_BEGIN_NAMESPACE
class QXlibScreen;
+class QXlibNativeInterface;
class QXlibIntegration : public QPlatformIntegration
{
@@ -82,7 +83,7 @@ private:
QList<QPlatformScreen *> mScreens;
QPlatformFontDatabase *mFontDb;
QPlatformClipboard *mClipboard;
- QPlatformNativeInterface *mNativeInterface;
+ QXlibNativeInterface *mNativeInterface;
QAbstractEventDispatcher *mEventDispatcher;
};
diff --git a/src/plugins/platforms/xlib/qxlibnativeinterface.cpp b/src/plugins/platforms/xlib/qxlibnativeinterface.cpp
index 06f11773bb..0519a365cf 100644
--- a/src/plugins/platforms/xlib/qxlibnativeinterface.cpp
+++ b/src/plugins/platforms/xlib/qxlibnativeinterface.cpp
@@ -92,6 +92,17 @@ void * QXlibNativeInterface::nativeResourceForWindow(const QByteArray &resourceS
}
return result;
}
+QPlatformNativeInterface::EventFilter QXlibNativeInterface::setEventFilter(const QByteArray &eventType, QPlatformNativeInterface::EventFilter filter)
+{
+ EventFilter oldFilter = m_eventFilters.value(eventType);
+ m_eventFilters.insert(eventType, filter);
+ return oldFilter;
+}
+
+QPlatformNativeInterface::EventFilter QXlibNativeInterface::eventFilterForEventType(const QByteArray& eventType) const
+{
+ return m_eventFilters.value(eventType);
+}
void * QXlibNativeInterface::displayForWindow(QWindow *window)
{
diff --git a/src/plugins/platforms/xlib/qxlibnativeinterface.h b/src/plugins/platforms/xlib/qxlibnativeinterface.h
index 8f68e61caf..9ec4ab51c8 100644
--- a/src/plugins/platforms/xlib/qxlibnativeinterface.h
+++ b/src/plugins/platforms/xlib/qxlibnativeinterface.h
@@ -60,6 +60,9 @@ public:
void *nativeResourceForWindow(const QByteArray &resourceString, QWindow *window);
+ EventFilter setEventFilter(const QByteArray &eventType, EventFilter filter);
+ EventFilter eventFilterForEventType(const QByteArray& eventType) const;
+
void *displayForWindow(QWindow *window);
void *eglDisplayForWindow(QWindow *window);
void *connectionForWindow(QWindow *window);
@@ -68,6 +71,7 @@ public:
void *eglContextForWindow(QWindow *window);
private:
+ QHash<QByteArray, EventFilter> m_eventFilters;
static QXlibScreen *qPlatformScreenForWindow(QWindow *window);
};
diff --git a/src/plugins/platforms/xlib/qxlibscreen.cpp b/src/plugins/platforms/xlib/qxlibscreen.cpp
index ed6f77d830..fc903708b3 100644
--- a/src/plugins/platforms/xlib/qxlibscreen.cpp
+++ b/src/plugins/platforms/xlib/qxlibscreen.cpp
@@ -50,6 +50,7 @@
#include "qxlibstatic.h"
#include "qxlibclipboard.h"
#include "qxlibdisplay.h"
+#include "qxlibnativeinterface.h"
#include <QtCore/QDebug>
#include <QtCore/QSocketNotifier>
@@ -190,8 +191,9 @@ qDebug() << "qt_x_errhandler" << err->error_code;
return 0;
}
-QXlibScreen::QXlibScreen()
- : mFormat(QImage::Format_RGB32)
+QXlibScreen::QXlibScreen(QXlibNativeInterface *nativeInterface)
+ : mNativeInterface(nativeInterface)
+ , mFormat(QImage::Format_RGB32)
#if !defined(QT_NO_OPENGL) && defined(QT_OPENGL_ES_2)
, mEGLDisplay(0)
#endif
@@ -263,6 +265,11 @@ unsigned long QXlibScreen::whitePixel()
bool QXlibScreen::handleEvent(XEvent *xe)
{
+ if (QPlatformNativeInterface::EventFilter filter = mNativeInterface->eventFilterForEventType(QByteArrayLiteral("XEvent"))) {
+ if (filter(xe, 0))
+ return true;
+ }
+
int quit = false;
QXlibWindow *platformWindow = QXlibWindow::platformWindowForXWindow(xe->xany.window);
if (!platformWindow)
diff --git a/src/plugins/platforms/xlib/qxlibscreen.h b/src/plugins/platforms/xlib/qxlibscreen.h
index 3404243c2c..c6672c3540 100644
--- a/src/plugins/platforms/xlib/qxlibscreen.h
+++ b/src/plugins/platforms/xlib/qxlibscreen.h
@@ -55,7 +55,7 @@ class QXlibScreen : public QObject, public QPlatformScreen
{
Q_OBJECT
public:
- QXlibScreen();
+ QXlibScreen(QXlibNativeInterface *nativeInterface);
~QXlibScreen();
@@ -93,6 +93,7 @@ public slots:
private:
void handleSelectionRequest(XEvent *event);
+ QXlibNativeInterface *mNativeInterface;
QRect mGeometry;
QSizeF mPhysicalSize;
int mDepth;