diff options
Diffstat (limited to 'src/platformsupport/eventdispatchers')
7 files changed, 86 insertions, 12 deletions
diff --git a/src/platformsupport/eventdispatchers/qeventdispatcher_glib.cpp b/src/platformsupport/eventdispatchers/qeventdispatcher_glib.cpp index 06f0aa6747..0ccbf01e80 100644 --- a/src/platformsupport/eventdispatchers/qeventdispatcher_glib.cpp +++ b/src/platformsupport/eventdispatchers/qeventdispatcher_glib.cpp @@ -48,26 +48,76 @@ QT_BEGIN_NAMESPACE +struct GUserEventSource +{ + GSource source; + QPAEventDispatcherGlib *q; + QPAEventDispatcherGlibPrivate *d; +}; + +static gboolean userEventSourcePrepare(GSource *source, gint *timeout) +{ + Q_UNUSED(timeout) + GUserEventSource *userEventSource = reinterpret_cast<GUserEventSource *>(source); + return userEventSource->d->wakeUpCalled; +} + +static gboolean userEventSourceCheck(GSource *source) +{ + return userEventSourcePrepare(source, 0); +} + +static gboolean userEventSourceDispatch(GSource *source, GSourceFunc, gpointer) +{ + GUserEventSource *userEventSource = reinterpret_cast<GUserEventSource *>(source); + QPAEventDispatcherGlib *dispatcher = userEventSource->q; + QWindowSystemInterface::sendWindowSystemEvents(dispatcher->m_flags); + return true; +} + +static GSourceFuncs userEventSourceFuncs = { + userEventSourcePrepare, + userEventSourceCheck, + userEventSourceDispatch, + NULL, + NULL, + NULL +}; + QPAEventDispatcherGlibPrivate::QPAEventDispatcherGlibPrivate(GMainContext *context) : QEventDispatcherGlibPrivate(context) { + Q_Q(QPAEventDispatcherGlib); + userEventSource = reinterpret_cast<GUserEventSource *>(g_source_new(&userEventSourceFuncs, + sizeof(GUserEventSource))); + userEventSource->q = q; + userEventSource->d = this; + g_source_set_can_recurse(&userEventSource->source, true); + g_source_attach(&userEventSource->source, mainContext); } + QPAEventDispatcherGlib::QPAEventDispatcherGlib(QObject *parent) : QEventDispatcherGlib(*new QPAEventDispatcherGlibPrivate, parent) , m_flags(QEventLoop::AllEvents) { + Q_D(QPAEventDispatcherGlib); + d->userEventSource->q = this; } QPAEventDispatcherGlib::~QPAEventDispatcherGlib() { + Q_D(QPAEventDispatcherGlib); + + g_source_destroy(&d->userEventSource->source); + g_source_unref(&d->userEventSource->source); + d->userEventSource = 0; } bool QPAEventDispatcherGlib::processEvents(QEventLoop::ProcessEventsFlags flags) { m_flags = flags; - const bool didSendEvents = QEventDispatcherGlib::processEvents(m_flags); - return QWindowSystemInterface::sendWindowSystemEvents(m_flags) || didSendEvents; + return QEventDispatcherGlib::processEvents(m_flags); } QT_END_NAMESPACE diff --git a/src/platformsupport/eventdispatchers/qeventdispatcher_glib_p.h b/src/platformsupport/eventdispatchers/qeventdispatcher_glib_p.h index 5930dc68e7..085a1c52f3 100644 --- a/src/platformsupport/eventdispatchers/qeventdispatcher_glib_p.h +++ b/src/platformsupport/eventdispatchers/qeventdispatcher_glib_p.h @@ -71,11 +71,14 @@ public: QEventLoop::ProcessEventsFlags m_flags; }; +struct GUserEventSource; + class QPAEventDispatcherGlibPrivate : public QEventDispatcherGlibPrivate { Q_DECLARE_PUBLIC(QPAEventDispatcherGlib) public: QPAEventDispatcherGlibPrivate(GMainContext *context = 0); + GUserEventSource *userEventSource; }; diff --git a/src/platformsupport/eventdispatchers/qgenericunixeventdispatcher.cpp b/src/platformsupport/eventdispatchers/qgenericunixeventdispatcher.cpp index 11d9c259d5..2e1d81a181 100644 --- a/src/platformsupport/eventdispatchers/qgenericunixeventdispatcher.cpp +++ b/src/platformsupport/eventdispatchers/qgenericunixeventdispatcher.cpp @@ -43,7 +43,7 @@ QT_BEGIN_NAMESPACE -class QAbstractEventDispatcher *createUnixEventDispatcher() +class QAbstractEventDispatcher *QtGenericUnixDispatcher::createUnixEventDispatcher() { #if !defined(QT_NO_GLIB) && !defined(Q_OS_WIN) if (qEnvironmentVariableIsEmpty("QT_NO_GLIB") && QEventDispatcherGlib::versionSupported()) diff --git a/src/platformsupport/eventdispatchers/qgenericunixeventdispatcher_p.h b/src/platformsupport/eventdispatchers/qgenericunixeventdispatcher_p.h index adf70adc05..61b4d0515c 100644 --- a/src/platformsupport/eventdispatchers/qgenericunixeventdispatcher_p.h +++ b/src/platformsupport/eventdispatchers/qgenericunixeventdispatcher_p.h @@ -56,7 +56,10 @@ QT_BEGIN_NAMESPACE class QAbstractEventDispatcher; +namespace QtGenericUnixDispatcher { QAbstractEventDispatcher* createUnixEventDispatcher(); +} +using QtGenericUnixDispatcher::createUnixEventDispatcher; QT_END_NAMESPACE diff --git a/src/platformsupport/eventdispatchers/qunixeventdispatcher.cpp b/src/platformsupport/eventdispatchers/qunixeventdispatcher.cpp index 7438ab65c1..44258538ec 100644 --- a/src/platformsupport/eventdispatchers/qunixeventdispatcher.cpp +++ b/src/platformsupport/eventdispatchers/qunixeventdispatcher.cpp @@ -43,14 +43,9 @@ #include "private/qguiapplication_p.h" #include <qpa/qwindowsysteminterface.h> -#include <QtCore/QElapsedTimer> -#include <QtCore/QAtomicInt> -#include <QtCore/QSemaphore> #include <QtCore/QDebug> -#include <errno.h> - QT_BEGIN_NAMESPACE QT_USE_NAMESPACE diff --git a/src/platformsupport/eventdispatchers/qunixeventdispatcher_qpa_p.h b/src/platformsupport/eventdispatchers/qunixeventdispatcher_qpa_p.h index 23be081ba3..7f775b73ee 100644 --- a/src/platformsupport/eventdispatchers/qunixeventdispatcher_qpa_p.h +++ b/src/platformsupport/eventdispatchers/qunixeventdispatcher_qpa_p.h @@ -56,12 +56,9 @@ QT_BEGIN_NAMESPACE -class QUnixEventDispatcherQPAPrivate; - class QUnixEventDispatcherQPA : public QEventDispatcherUNIX { Q_OBJECT - Q_DECLARE_PRIVATE(QUnixEventDispatcherQPA) public: explicit QUnixEventDispatcherQPA(QObject *parent = 0); diff --git a/src/platformsupport/eventdispatchers/qwindowsguieventdispatcher.cpp b/src/platformsupport/eventdispatchers/qwindowsguieventdispatcher.cpp index aa7bb102c6..a37547f513 100644 --- a/src/platformsupport/eventdispatchers/qwindowsguieventdispatcher.cpp +++ b/src/platformsupport/eventdispatchers/qwindowsguieventdispatcher.cpp @@ -184,7 +184,33 @@ messageDebugEntries[] = { {WM_DRAWCLIPBOARD, "WM_DRAWCLIPBOARD", true}, {WM_THEMECHANGED, "WM_THEMECHANGED", true}, {0x90, "WM_UAHDESTROYWINDOW", true}, - {0x272, "WM_UNREGISTER_WINDOW_SERVICES", true} + {0x272, "WM_UNREGISTER_WINDOW_SERVICES", true}, +#ifdef WM_POINTERUPDATE + {WM_POINTERDEVICECHANGE, "WM_POINTERDEVICECHANGE", true}, + {WM_POINTERDEVICEINRANGE, "WM_POINTERDEVICEINRANGE", true}, + {WM_POINTERDEVICEOUTOFRANGE, "WM_POINTERDEVICEOUTOFRANGE", true}, + {WM_NCPOINTERUPDATE, "WM_NCPOINTERUPDATE", true}, + {WM_NCPOINTERDOWN, "WM_NCPOINTERDOWN", true}, + {WM_NCPOINTERUP, "WM_NCPOINTERUP", true}, + {WM_POINTERUPDATE, "WM_POINTERUPDATE", true}, + {WM_POINTERDOWN, "WM_POINTERDOWN", true}, + {WM_POINTERUP, "WM_POINTERUP", true}, + {WM_POINTERENTER, "WM_POINTERENTER", true}, + {WM_POINTERLEAVE, "WM_POINTERLEAVE", true}, + {WM_POINTERACTIVATE, "WM_POINTERACTIVATE", true}, + {WM_POINTERCAPTURECHANGED, "WM_POINTERCAPTURECHANGED", true}, + {WM_TOUCHHITTESTING, "WM_TOUCHHITTESTING", true}, + {WM_POINTERWHEEL, "WM_POINTERWHEEL", true}, + {WM_POINTERHWHEEL, "WM_POINTERHWHEEL", true}, +#endif // WM_POINTERUPDATE +#ifdef DM_POINTERHITTEST + {DM_POINTERHITTEST, "DM_POINTERHITTEST", true}, +#endif // DM_POINTERHITTEST +#ifdef WM_POINTERROUTEDTO + {WM_POINTERROUTEDTO, "WM_POINTERROUTEDTO", true}, + {WM_POINTERROUTEDAWAY, "WM_POINTERROUTEDAWAY", true}, + {WM_POINTERROUTEDRELEASED, "WM_POINTERROUTEDRELEASED", true}, +#endif // WM_POINTERROUTEDTO }; static inline const MessageDebugEntry *messageDebugEntry(UINT msg) |