diff options
author | Friedemann Kleint <Friedemann.Kleint@nokia.com> | 2012-07-24 09:40:20 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-07-31 20:25:36 +0200 |
commit | 5b49793d8048b51e3f671eb7c390a08999323876 (patch) | |
tree | e42faf1e986e5023ec368fa355b1e3c717d18748 /src/gui/kernel | |
parent | 0e904279bd14c6d3d32165ff93d22d96e7ff6fd7 (diff) |
Implement synchronous WS events by flushing.
Previously synchronous window system events were
implemented by bypassing the queue and processing
the event immediately. This is not ideal since the
event order is not preserved - there might be "happened
before" events waiting in the queue.
Add QWindowSystemInterface::flushWindowSystemEvents
and change all handleSynchronous* to 1) queue the
event 2) call flushWindowSystemEvents.
flushWindowSystemEvents is almost identical to the
already existing sendWindowSystemEvents with the
exception that it does not call QApp::sendPostedEvents.
Move the common implementation to a new private function.
Task-number: QTBUG-20778
Change-Id: Ie98a83875bc0a14e335e36bed0dd9e0ed4a1dea0
Reviewed-by: Samuel Rødal <samuel.rodal@nokia.com>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Diffstat (limited to 'src/gui/kernel')
-rw-r--r-- | src/gui/kernel/qwindowsysteminterface.cpp | 27 | ||||
-rw-r--r-- | src/gui/kernel/qwindowsysteminterface.h | 4 |
2 files changed, 21 insertions, 10 deletions
diff --git a/src/gui/kernel/qwindowsysteminterface.cpp b/src/gui/kernel/qwindowsysteminterface.cpp index a18f6d8f17..87aa0c60b9 100644 --- a/src/gui/kernel/qwindowsysteminterface.cpp +++ b/src/gui/kernel/qwindowsysteminterface.cpp @@ -110,8 +110,8 @@ void QWindowSystemInterface::handleGeometryChange(QWindow *tlw, const QRect &new void QWindowSystemInterface::handleSynchronousGeometryChange(QWindow *tlw, const QRect &newRect) { - QWindowSystemInterfacePrivate::GeometryChangeEvent e(tlw,newRect); - QGuiApplicationPrivate::processWindowSystemEvent(&e); // send event immediately. + handleGeometryChange(tlw, newRect); + QWindowSystemInterface::flushWindowSystemEvents(); } void QWindowSystemInterface::handleCloseEvent(QWindow *tlw) @@ -126,8 +126,8 @@ void QWindowSystemInterface::handleCloseEvent(QWindow *tlw) void QWindowSystemInterface::handleSynchronousCloseEvent(QWindow *tlw) { if (tlw) { - QWindowSystemInterfacePrivate::CloseEvent e(tlw); - QGuiApplicationPrivate::processWindowSystemEvent(&e); + handleCloseEvent(tlw); + QWindowSystemInterface::flushWindowSystemEvents(); } } @@ -495,16 +495,24 @@ void QWindowSystemInterface::handleExposeEvent(QWindow *tlw, const QRegion ®i void QWindowSystemInterface::handleSynchronousExposeEvent(QWindow *tlw, const QRegion ®ion) { - QWindowSystemInterfacePrivate::ExposeEvent e(tlw, region); - QGuiApplicationPrivate::processWindowSystemEvent(&e); // send event immediately. + QWindowSystemInterface::handleExposeEvent(tlw, region); + QWindowSystemInterface::flushWindowSystemEvents(); +} + +void QWindowSystemInterface::flushWindowSystemEvents() +{ + sendWindowSystemEventsImplementation(QEventLoop::AllEvents); } bool QWindowSystemInterface::sendWindowSystemEvents(QEventLoop::ProcessEventsFlags flags) { - int nevents = 0; + QCoreApplication::sendPostedEvents(); // handle gui and posted events + return sendWindowSystemEventsImplementation(flags); +} - // handle gui and posted events - QCoreApplication::sendPostedEvents(); +bool QWindowSystemInterface::sendWindowSystemEventsImplementation(QEventLoop::ProcessEventsFlags flags) +{ + int nevents = 0; while (true) { QWindowSystemInterfacePrivate::WindowSystemEvent *event; @@ -609,5 +617,4 @@ void QWindowSystemInterface::handleTabletLeaveProximityEvent(int device, int poi handleTabletLeaveProximityEvent(time, device, pointerType, uid); } - QT_END_NAMESPACE diff --git a/src/gui/kernel/qwindowsysteminterface.h b/src/gui/kernel/qwindowsysteminterface.h index fb1717b628..3be863bf78 100644 --- a/src/gui/kernel/qwindowsysteminterface.h +++ b/src/gui/kernel/qwindowsysteminterface.h @@ -179,7 +179,11 @@ public: // For event dispatcher implementations static bool sendWindowSystemEvents(QEventLoop::ProcessEventsFlags flags); + static void flushWindowSystemEvents(); static int windowSystemEventsQueued(); + +private: + static bool sendWindowSystemEventsImplementation(QEventLoop::ProcessEventsFlags flags); }; QT_END_NAMESPACE |