diff options
Diffstat (limited to 'src/plugins/platforms/ios/quiview.mm')
-rw-r--r-- | src/plugins/platforms/ios/quiview.mm | 66 |
1 files changed, 50 insertions, 16 deletions
diff --git a/src/plugins/platforms/ios/quiview.mm b/src/plugins/platforms/ios/quiview.mm index c46ed4c0b1..c4b92618b1 100644 --- a/src/plugins/platforms/ios/quiview.mm +++ b/src/plugins/platforms/ios/quiview.mm @@ -44,6 +44,7 @@ #include "qiosglobal.h" #include "qiosintegration.h" #include "qiosviewcontroller.h" +#include "qiostextresponder.h" #include "qioswindow.h" #include "qiosmenu.h" @@ -191,33 +192,66 @@ - (BOOL)becomeFirstResponder { - if ([super becomeFirstResponder]) { + 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; + } + + qImDebug() << m_qioswindow->window() << "became first responder"; + + if (qGuiApp->focusWindow() != m_qioswindow->window()) { QWindowSystemInterface::handleWindowActivated(m_qioswindow->window()); QWindowSystemInterface::flushWindowSystemEvents(); + } else { + qImDebug() << m_qioswindow->window() + << "already active, not sending window activation"; + } + + return YES; +} - return YES; +- (BOOL)responderShouldTriggerWindowDeactivation:(UIResponder *)responder +{ + // We don't want to send window deactivation in case the resign + // was a result of another Qt window becoming first responder. + if ([responder isKindOfClass:[QUIView class]]) + return NO; + + // Nor do we want to deactivate the Qt window if the new responder + // is temporarily handling text input on behalf of a Qt window. + if ([responder isKindOfClass:[QIOSTextInputResponder class]]) { + while ((responder = [responder nextResponder])) { + if ([responder isKindOfClass:[QUIView class]]) + return NO; + } } - return NO; + return YES; } - (BOOL)resignFirstResponder { - if ([super resignFirstResponder]) { - // We don't want to send window deactivation in case we're in the process - // of activating another window. The handleWindowActivated of the activation - // will take care of both. - dispatch_async(dispatch_get_main_queue (), ^{ - if (![[UIResponder currentFirstResponder] isKindOfClass:[QUIView class]]) { - QWindowSystemInterface::handleWindowActivated(0); - QWindowSystemInterface::flushWindowSystemEvents(); - } - }); - - return YES; + qImDebug() << "win:" << m_qioswindow->window() << "self:" << self + << "first:" << [UIResponder currentFirstResponder]; + + if (![super resignFirstResponder]) + return NO; + + qImDebug() << m_qioswindow->window() << "resigned first responder"; + + UIResponder *newResponder = FirstResponderCandidate::currentCandidate(); + if ([self responderShouldTriggerWindowDeactivation:newResponder]) { + QWindowSystemInterface::handleWindowActivated(0); + QWindowSystemInterface::flushWindowSystemEvents(); } - return NO; + return YES; } // ------------------------------------------------------------------------- |