diff options
author | Thomas McGuire <thomas.mcguire.qnx@kdab.com> | 2012-10-15 12:21:21 (GMT) |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2012-10-18 00:32:11 (GMT) |
commit | 7c99fed1373829835d926081c43a5426bc4d2cb6 (patch) | |
tree | 58cdf525d1b9027be341386bea053d3791b6a417 /src/corelib | |
parent | 097af16558e75a961f322b60824506c11491ef63 (diff) | |
download | Qt-7c99fed1373829835d926081c43a5426bc4d2cb6.zip Qt-7c99fed1373829835d926081c43a5426bc4d2cb6.tar.gz Qt-7c99fed1373829835d926081c43a5426bc4d2cb6.tar.bz2 |
Blackberry: Emit aboutToBlock() and awake() correctly in the dispatcher
On Blackberry, select() can actually temporarily wake up to process
mative BPS events. Make sure to emit the aboutToBlock() and awake()
signals in this situation accordingly.
This is a backport of
qtbase commit a1082dbc3f61f1747bd756f8fce2a54f558793ed
Change-Id: If1bd1c300b037cb5dac1c96c68abbfb22188dd34
Reviewed-by: Kevin Krammer <kevin.krammer@kdab.com>
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Reviewed-by: Rafael Roquetto <rafael.roquetto@kdab.com>
Diffstat (limited to 'src/corelib')
-rw-r--r-- | src/corelib/kernel/qeventdispatcher_blackberry.cpp | 38 |
1 files changed, 31 insertions, 7 deletions
diff --git a/src/corelib/kernel/qeventdispatcher_blackberry.cpp b/src/corelib/kernel/qeventdispatcher_blackberry.cpp index 5711903..3c00e91 100644 --- a/src/corelib/kernel/qeventdispatcher_blackberry.cpp +++ b/src/corelib/kernel/qeventdispatcher_blackberry.cpp @@ -296,14 +296,35 @@ int QEventDispatcherBlackberry::select(int nfds, fd_set *readfds, fd_set *writef if (timeout) timeout_bps = (timeout->tv_sec * 1000) + (timeout->tv_usec / 1000); + bool hasProcessedEventsOnce = false; + bps_event_t *event = 0; + // This loop exists such that we can drain the bps event queue of all native events // more efficiently than if we were to return control to Qt after each event. This // is important for handling touch events which can come in rapidly. forever { + Q_ASSERT(!hasProcessedEventsOnce || event); + + // Only emit the awake() and aboutToBlock() signals in the second iteration. For the first + // iteration, the UNIX event dispatcher will have taken care of that already. + if (hasProcessedEventsOnce) + emit awake(); + + // Filtering the native event should happen between the awake() and aboutToBlock() signal + // emissions. The calls awake() - filterNativeEvent() - aboutToBlock() - bps_get_event() + // need not to be interrupted by a break or return statement. + // + // Because of this, the native event is actually processed one loop iteration + // after it was retrieved with bps_get_event(). + if (event) + filterEvent((void*)event); + + if (hasProcessedEventsOnce) + emit aboutToBlock(); + // Wait for event or file to be ready - bps_event_t *event = NULL; + event = 0; const int result = bps_get_event(&event, timeout_bps); - if (result != BPS_SUCCESS) qWarning("QEventDispatcherBlackberry::select: bps_get_event() failed"); @@ -315,16 +336,19 @@ int QEventDispatcherBlackberry::select(int nfds, fd_set *readfds, fd_set *writef if (!event || bps_event_get_domain(event) == bpsIOReadyDomain) break; - // Any other events must be bps native events so we pass all such received - // events through the native event filter chain - filterEvent((void*)event); - // Update the timeout. If this fails we have exceeded our alloted time or the system // clock has changed time and we cannot calculate a new timeout so we bail out. - if (!updateTimeout(&timeout_bps, startTime)) + if (!updateTimeout(&timeout_bps, startTime)) { + + // No more loop iteration, so we need to filter the event here. + filterEvent((void*)event); break; + } + + hasProcessedEventsOnce = true; } + // the number of bits set in the file sets return d->ioData->count; } |