iOS: delay callbacks to UITextInput to avoid recursion
authorRichard Moe Gustavsen <richard.gustavsen@digia.com>
Wed, 28 May 2014 12:14:23 +0000 (14:14 +0200)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Fri, 6 Jun 2014 09:21:17 +0000 (11:21 +0200)
commitbc9423316f373a5baa63aa47b9ab340d34c9d6ac
treec65a68b0d425cab938a1bb0635ebbdb62e430c8b
parentdbc7ed82149d8915a32489a0d3a930d2793c6e65
iOS: delay callbacks to UITextInput to avoid recursion

If the application calls "reset" or "commit" on the input
method (or forces active focus on some other item) from a text
changed or key pressed handler, iOS will sometimes throw
an exception. It does so because we try to change the state
of UITextInput (by calling textDidChange) while processing a
callback from the same place (insertText).

Optimally this should not happen since we would normally
post such events to Qt, not send them directly. But with
text input we cannot do this since UITextInput expects us
to update immediately upon receiving text input callbacks.
If not, word completion and spell checking will stop working.

This change will guard against recursive callbacks by delaying
callbacks to UITextInput when text/selection/first responder
changes.

Change-Id: I099f30adf1c5aba241fc833a45b423016f4ed8d0
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
src/plugins/platforms/ios/qiosinputcontext.mm
src/plugins/platforms/ios/quiview.h
src/plugins/platforms/ios/quiview_textinput.mm