summaryrefslogtreecommitdiffstats
path: root/src/platformsupport/eventdispatchers/qeventdispatcher_cf.mm
Commit message (Collapse)AuthorAgeFilesLines
* iOS: Implement hasPendingEvents() in the event dispatcherTor Arne Vestbø2013-09-121-2/+11
| | | | | | | | | | | As we're using CFRunLoopIsWaiting() to check for the possible presence of system events hasPendingEvents() will never return false if called on the main thread. We assume clients will not use this function to determine whether or not to call processEvents(), but instead use the return value from processEvents. Change-Id: Ifd63892c6d35bb7da204072616bfe3ee69ca1d85 Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@digia.com>
* iOS: Teach event-dispatcher to handle changes to run-loop mode at runtimeTor Arne Vestbø2013-09-121-2/+69
| | | | | | | | | | | | | | | | | | | | | | | | UIKit changes the run-loop mode during scrolling to UITrackingMode, which presumably prioritizes touch events and other sources related to a smooth scrolling experience. It signals this change by interrupting the current run-loop pass, and the outer loop is responsible for re-entering the run-loop in the new mode. Failing to enter the run-loop with this new mode results in UIScrollViews losing their kinetic feel when flicking. This can be observed by e.g. bringing up the Emoji keyboard and scrolling it horizontally. We keep track of the current run-loop mode by listening for push and pop notifications on the UIApplication object. The current mode is then used in our Q_FOREVER-loop when re-entering CFRunLoopRunInMode. For now we don't add our posted event source or timer source to the new modes, under the assumption that the system prefers to limit the number of sources that will fire during scrolling. If this turns out to give a bad user-experience for Qt applications we should consider changing it. Change-Id: I3a612b3cfc77c74b658963057732dc4d61684df8 Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
* iOS: Rewrite CoreFoundation event-dispatcherTor Arne Vestbø2013-09-121-194/+397
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Instead of having separate code-paths for QEventLoop::EventLoopExec and the non-blocking processEvent() we now have a single Q_FOREVER loop where the logic can be shared. We make multiple loop-passes, each time calling CFRunLoopRunInMode with potentially different arguments, depending on the result of the previous run. For the EventLoopExec case we'll continue making loop-passes until the event-loop has been interrupted. For the non-EventLoopExec case, we respect interruption, but will continue making loop-passes only until we've processed all events in the queue, optionally waiting for the initial event if WaitForMoreEvents is set. Limitations in the CoreFoundation APIs unfortunately force us to keep some state on whether or not we've processed events and timers for a given processEvents() pass (with corresponding deferred scheduling of timers and event source signaling). The way we handle timers has also been rewritten to no longer defer the timer activation to a special timer source. The constraint of CoreFoundation timers is that they can not recurse (re-fire) in a callback, but that only applies per timer, so using multiple CF timers allows us to recurse. We still only use a single CF timer for all the Qt timers though, and only spawn a new CF timer if the user calls processEvents() inside a timer callback. This commit removes the logic related to dealing with UITrackingMode, as that logic was slighly problematic, but the feature will be added back in a follow-up commit, in line with the new approach. The result of this commit is that we're passing all event-loop, event-dispatcher, and timer auto-tests, both for the QtCore dispatcher and the GUI event-dispatcher. Change-Id: I3c56fbc7857a25110064681257abb47075b5bd2d Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@digia.com>
* iOS: Make the event dispatcher properly emit aboutToBlock() and awake()Tor Arne Vestbø2013-08-231-0/+25
| | | | | | | | This approach follows the same one used by the Cocoa event dispatcher. Change-Id: I2813b09beae07d90477c9ca506924058ace13f34 Reviewed-by: Ian Dean <ian@mediator-software.com> Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@digia.com>
* Share named time-interval constants in CoreFoundation event dispatcherTor Arne Vestbø2013-08-231-9/+12
| | | | | | Change-Id: Ie9ae40e3f7e2631c461ad01b6e5a4640c0b773c9 Reviewed-by: Ian Dean <ian@mediator-software.com> Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@digia.com>
* iOS: Wrap CFRunLoopSource in C++ class for easier code legibilityTor Arne Vestbø2013-08-231-56/+25
| | | | | | Change-Id: If34953b171676f0246c2fb5e60c59f59350863ec Reviewed-by: Ian Dean <ian@mediator-software.com> Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@digia.com>
* Rename QIOSEventDispatcher to QEventDispatcherCoreFoundationTor Arne Vestbø2013-08-231-0/+356
Now that it lives in QPlatformSupport, will be fleshed out more, and might be used on OSX at some point in time. Still iOS specific, as none of the iOS API usages have been ifdef'ed. Change-Id: Ib7fde6403ef2dfef175a6f306a85d58027569a30 Reviewed-by: Ian Dean <ian@mediator-software.com> Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@digia.com>