From c506d938a83585d973cbc369e99503cf83db68e2 Mon Sep 17 00:00:00 2001
From: Richard Moe Gustavsen <richard.gustavsen@digia.com>
Date: Wed, 12 Nov 2014 12:28:16 +0100
Subject: [PATCH] iOS: close menu when keyboard hides
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

If the menu is closed from the keyboard gesture, and
the focus object doesn't change, the menu will still
be in a visible state, even if the keyboard is hidden.

This patch will ensure that this can not be the case
by listening for keyboardWillHideNotification. Since
we have no guarantee for when the destructor runs, we
apply a pessimistic approach and ensure we stop listen
when the menu gets closed.

Task-number: QTBUG-42523
Change-Id: If734ea32d1823b978c9c1c67ebcc5b6c3c5c338c
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
---
 src/plugins/platforms/ios/qiosmenu.mm | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/src/plugins/platforms/ios/qiosmenu.mm b/src/plugins/platforms/ios/qiosmenu.mm
index f64c1a2f418..0f351f785b8 100644
--- a/src/plugins/platforms/ios/qiosmenu.mm
+++ b/src/plugins/platforms/ios/qiosmenu.mm
@@ -153,13 +153,29 @@ static NSString *const kSelectorPrefix = @"_qtMenuItem_";
         [self setDelegate:self];
         [self setDataSource:self];
         [self selectRow:m_selectedRow inComponent:0 animated:false];
+        [self listenForKeyboardWillHideNotification:YES];
     }
 
     return self;
 }
 
+-(void)listenForKeyboardWillHideNotification:(BOOL)listen
+{
+    if (listen) {
+        [[NSNotificationCenter defaultCenter]
+            addObserver:self
+            selector:@selector(cancelMenu)
+            name:@"UIKeyboardWillHideNotification" object:nil];
+    } else {
+        [[NSNotificationCenter defaultCenter]
+            removeObserver:self
+            name:@"UIKeyboardWillHideNotification" object:nil];
+    }
+}
+
 -(void)dealloc
 {
+    [self listenForKeyboardWillHideNotification:NO];
     self.toolbar = 0;
     [super dealloc];
 }
@@ -193,6 +209,7 @@ static NSString *const kSelectorPrefix = @"_qtMenuItem_";
 
 - (void)closeMenu
 {
+    [self listenForKeyboardWillHideNotification:NO];
     if (!m_visibleMenuItems.isEmpty())
         QIOSMenu::currentMenu()->handleItemSelected(m_visibleMenuItems.at(m_selectedRow));
     else
@@ -201,6 +218,7 @@ static NSString *const kSelectorPrefix = @"_qtMenuItem_";
 
 - (void)cancelMenu
 {
+    [self listenForKeyboardWillHideNotification:NO];
     QIOSMenu::currentMenu()->dismiss();
 }
 
-- 
GitLab