diff options
author | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2017-01-03 17:50:28 +0100 |
---|---|---|
committer | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2017-01-06 13:31:26 +0000 |
commit | bc80cef1d4bb07605cba81de082625f07fc4136b (patch) | |
tree | 0d776ce4b59709ffa7cd1f7900782516e2836055 /src/plugins/platforms/ios/quiview.mm | |
parent | 8ad200dcb437ae6138dce39c260860db9c7aaa02 (diff) |
iOS: Limit duration of FirstResponderCandidate to becomeFirstResponder
We only need the FirstResponderCandidate for the duration of the call to
[super becomeFirstResponder]. Keeping it around longer means that when
emitting window activation events, which may result in changing the
first responder again, we may wrongly conclude that we're not allowed
to change the responder due to the FirstResponderCandidate still being
alive.
Change-Id: I8203e795cdde4128776283fe63a1907eb6ebc151
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
Diffstat (limited to 'src/plugins/platforms/ios/quiview.mm')
-rw-r--r-- | src/plugins/platforms/ios/quiview.mm | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/src/plugins/platforms/ios/quiview.mm b/src/plugins/platforms/ios/quiview.mm index 259070216e..9966bd50a3 100644 --- a/src/plugins/platforms/ios/quiview.mm +++ b/src/plugins/platforms/ios/quiview.mm @@ -209,19 +209,24 @@ - (BOOL)becomeFirstResponder { - FirstResponderCandidate firstResponderCandidate(self); - - qImDebug() << "win:" << m_qioswindow->window() << "self:" << self - << "first:" << [UIResponder currentFirstResponder]; + { + // Scope for the duration of becoming first responder only, as the window + // activation event may trigger new responders, which we don't want to be + // blocked by this guard. + FirstResponderCandidate firstResponderCandidate(self); + + qImDebug() << "win:" << m_qioswindow->window() << "self:" << self + << "first:" << [UIResponder currentFirstResponder]; + + if (![super becomeFirstResponder]) { + qImDebug() << m_qioswindow->window() + << "was not allowed to become first responder"; + return NO; + } - if (![super becomeFirstResponder]) { - qImDebug() << m_qioswindow->window() - << "was not allowed to become first responder"; - return NO; + qImDebug() << m_qioswindow->window() << "became first responder"; } - qImDebug() << m_qioswindow->window() << "became first responder"; - if (qGuiApp->focusWindow() != m_qioswindow->window()) QWindowSystemInterface::handleWindowActivated<QWindowSystemInterface::SynchronousDelivery>(m_qioswindow->window()); else |