summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMorten Sorvig <morten.sorvig@nokia.com>2011-06-23 09:05:34 +0200
committerMorten Sorvig <morten.sorvig@nokia.com>2011-06-23 11:04:21 +0200
commit58d10c0bd7cff2009edf6183c660b2e149eb9a82 (patch)
tree85ef2a3b398932fdc1c5db5ebbb4b5312742a201
parentc359cf0017e83b9cbfdf88c1fef16f84865ca0a8 (diff)
Refactor window system event dispatching.
Add QWindowSystemInterface::sendWindowSystemEvents, which contains the canonical "empty and send queued window system events" implementation. Make the Cocoa, QPA, and GLIB dispatchers use the new implementation. Cocoa now no longer inherits from QPA.
-rw-r--r--src/gui/kernel/qwindowsysteminterface_qpa.cpp33
-rw-r--r--src/gui/kernel/qwindowsysteminterface_qpa.h5
-rw-r--r--src/platformsupport/eventdispatchers/qeventdispatcher_glib.cpp18
-rw-r--r--src/platformsupport/eventdispatchers/qeventdispatcher_qpa.cpp41
-rw-r--r--src/plugins/platforms/cocoa/qcocoaeventdispatcher.h6
-rw-r--r--src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm6
6 files changed, 50 insertions, 59 deletions
diff --git a/src/gui/kernel/qwindowsysteminterface_qpa.cpp b/src/gui/kernel/qwindowsysteminterface_qpa.cpp
index 9df8b1af54..6b2b2d5f19 100644
--- a/src/gui/kernel/qwindowsysteminterface_qpa.cpp
+++ b/src/gui/kernel/qwindowsysteminterface_qpa.cpp
@@ -270,4 +270,37 @@ void QWindowSystemInterface::handleExposeEvent(QWindow *tlw, const QRegion &regi
QWindowSystemInterfacePrivate::queueWindowSystemEvent(e);
}
+bool QWindowSystemInterface::sendWindowSystemEvents(QAbstractEventDispatcher *eventDispatcher, QEventLoop::ProcessEventsFlags flags)
+{
+ int nevents = 0;
+
+ // handle gui and posted events
+ QCoreApplication::sendPostedEvents();
+
+ while (true) {
+ QWindowSystemInterfacePrivate::WindowSystemEvent *event;
+ if (!(flags & QEventLoop::ExcludeUserInputEvents)
+ && QWindowSystemInterfacePrivate::windowSystemEventsQueued() > 0) {
+ // process a pending user input event
+ event = QWindowSystemInterfacePrivate::getWindowSystemEvent();
+ if (!event)
+ break;
+ } else {
+ break;
+ }
+
+ if (eventDispatcher->filterEvent(event)) {
+ delete event;
+ continue;
+ }
+
+ nevents++;
+
+ QGuiApplicationPrivate::processWindowSystemEvent(event);
+ delete event;
+ }
+
+ return (nevents > 0);
+}
+
QT_END_NAMESPACE
diff --git a/src/gui/kernel/qwindowsysteminterface_qpa.h b/src/gui/kernel/qwindowsysteminterface_qpa.h
index 1188ca3439..17d8f83a3f 100644
--- a/src/gui/kernel/qwindowsysteminterface_qpa.h
+++ b/src/gui/kernel/qwindowsysteminterface_qpa.h
@@ -44,10 +44,12 @@
#include <QtCore/QTime>
#include <QtGui/qwindowdefs.h>
#include <QtCore/QEvent>
+#include <QtCore/QAbstractEventDispatcher>
#include <QtGui/QWindow>
#include <QtCore/QWeakPointer>
#include <QtCore/QMutex>
#include <QtGui/QTouchEvent>
+#include <QtCore/QEventLoop>
QT_BEGIN_HEADER
@@ -105,6 +107,9 @@ public:
static void handleScreenGeometryChange(int screenIndex);
static void handleScreenAvailableGeometryChange(int screenIndex);
static void handleScreenCountChange(int count);
+
+ // For event dispatcher implementations
+ static bool sendWindowSystemEvents(QAbstractEventDispatcher *eventDispatcher, QEventLoop::ProcessEventsFlags flags);
};
QT_END_NAMESPACE
diff --git a/src/platformsupport/eventdispatchers/qeventdispatcher_glib.cpp b/src/platformsupport/eventdispatchers/qeventdispatcher_glib.cpp
index 39b14e32af..3d28ea29a1 100644
--- a/src/platformsupport/eventdispatchers/qeventdispatcher_glib.cpp
+++ b/src/platformsupport/eventdispatchers/qeventdispatcher_glib.cpp
@@ -74,26 +74,10 @@ static gboolean userEventSourceCheck(GSource *source)
static gboolean userEventSourceDispatch(GSource *s, GSourceFunc, gpointer)
{
GUserEventSource * source = reinterpret_cast<GUserEventSource *>(s);
-
- QWindowSystemInterfacePrivate::WindowSystemEvent * event;
- while (QWindowSystemInterfacePrivate::windowSystemEventsQueued()) {
- event = QWindowSystemInterfacePrivate::getWindowSystemEvent();
- if (!event)
- break;
-
- // send through event filter
- if (source->q->filterEvent(event)) {
- delete event;
- continue;
- }
- QGuiApplicationPrivate::processWindowSystemEvent(event);
- delete event;
- }
-
+ QWindowSystemInterface::sendWindowSystemEvents(source->q, flags);
return true;
}
-
static GSourceFuncs userEventSourceFuncs = {
userEventSourcePrepare,
userEventSourceCheck,
diff --git a/src/platformsupport/eventdispatchers/qeventdispatcher_qpa.cpp b/src/platformsupport/eventdispatchers/qeventdispatcher_qpa.cpp
index e6bd4c7f6b..db20797023 100644
--- a/src/platformsupport/eventdispatchers/qeventdispatcher_qpa.cpp
+++ b/src/platformsupport/eventdispatchers/qeventdispatcher_qpa.cpp
@@ -83,43 +83,14 @@ bool QEventDispatcherQPA::processEvents(QEventLoop::ProcessEventsFlags flags)
{
Q_D(QEventDispatcherQPA);
- int nevents = 0;
-
- // handle gui and posted events
- d->interrupt = false;
- QCoreApplication::sendPostedEvents();
-
- while (!d->interrupt) { // also flushes output buffer ###can be optimized
- QWindowSystemInterfacePrivate::WindowSystemEvent *event;
- if (!(flags & QEventLoop::ExcludeUserInputEvents)
- && QWindowSystemInterfacePrivate::windowSystemEventsQueued() > 0) {
- // process a pending user input event
- event = QWindowSystemInterfacePrivate::getWindowSystemEvent();
- if (!event)
- break;
- } else {
- break;
- }
-
- if (filterEvent(event)) {
- delete event;
- continue;
- }
- nevents++;
-
- QGuiApplicationPrivate::processWindowSystemEvent(event);
- delete event;
- }
+ bool didSendEvents = QWindowSystemInterface::sendWindowSystemEvents(this, flags);
-#ifdef Q_OS_MAC // (inverted inheritance on mac: QEventDispatcherMac calls QEventDispatcherQPA)
- if (!d->interrupt) {
- if (EVENTDISPATCHERBASE::processEvents(flags)) {
- EVENTDISPATCHERBASE::processEvents(flags);
- return true;
- }
+ if (EVENTDISPATCHERBASE::processEvents(flags)) {
+ EVENTDISPATCHERBASE::processEvents(flags);
+ return true;
}
-#endif
- return (nevents > 0);
+
+ return didSendEvents;
}
bool QEventDispatcherQPA::hasPendingEvents()
diff --git a/src/plugins/platforms/cocoa/qcocoaeventdispatcher.h b/src/plugins/platforms/cocoa/qcocoaeventdispatcher.h
index 2567700ce2..2085a437ac 100644
--- a/src/plugins/platforms/cocoa/qcocoaeventdispatcher.h
+++ b/src/plugins/platforms/cocoa/qcocoaeventdispatcher.h
@@ -90,7 +90,7 @@
#include <QtCore/qhash.h>
#include <QtCore/qstack.h>
#include <QtGui/qwindowdefs.h>
-#include <QtPlatformSupport/private/qeventdispatcher_qpa_p.h>
+#include <QtCore/private/qeventdispatcher_unix_p.h>
#include <CoreFoundation/CoreFoundation.h>
@@ -115,7 +115,7 @@ public:
};
class QCocoaEventDispatcherPrivate;
-class QCocoaEventDispatcher : public QEventDispatcherQPA
+class QCocoaEventDispatcher : public QEventDispatcherUNIX
{
Q_OBJECT
Q_DECLARE_PRIVATE(QCocoaEventDispatcher)
@@ -167,7 +167,7 @@ struct MacSocketInfo {
};
typedef QHash<int, MacSocketInfo *> MacSocketHash;
-class QCocoaEventDispatcherPrivate : public QEventDispatcherQPAPrivate
+class QCocoaEventDispatcherPrivate : public QEventDispatcherUNIXPrivate
{
Q_DECLARE_PUBLIC(QCocoaEventDispatcher)
diff --git a/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm b/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm
index b5cbc83029..cfb6995f57 100644
--- a/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm
+++ b/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm
@@ -910,7 +910,7 @@ QCocoaEventDispatcherPrivate::QCocoaEventDispatcherPrivate()
}
QCocoaEventDispatcher::QCocoaEventDispatcher(QObject *parent)
- : QEventDispatcherQPA(*new QCocoaEventDispatcherPrivate, parent)
+ : QEventDispatcherUNIX(*new QCocoaEventDispatcherPrivate, parent)
{
Q_D(QCocoaEventDispatcher);
CFRunLoopSourceContext context;
@@ -992,9 +992,7 @@ void processPostedEvents(QCocoaEventDispatcherPrivate *const d, const bool block
if (!d->threadData->canWait || (d->serialNumber != d->lastSerial)) {
d->lastSerial = d->serialNumber;
- // Call down to the base class event handler, which will send
- // the window system events.
- d->q_func()->QEventDispatcherQPA::processEvents(QEventLoop::AllEvents);
+ QWindowSystemInterface::sendWindowSystemEvents(d->q_func(), QEventLoop::AllEvents);
}
}