summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/ios/quiview.mm
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/platforms/ios/quiview.mm')
-rw-r--r--src/plugins/platforms/ios/quiview.mm66
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;
}
// -------------------------------------------------------------------------