From 49e63efd2a45e1872468d8d6de1308c96ee92fcb Mon Sep 17 00:00:00 2001
From: Andy Shaw <andy.shaw@digia.com>
Date: Mon, 2 Apr 2012 14:16:45 +0200
Subject: Ensure that the IME composition is handled correctly on Mac
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

When the language menu was shown while IME composition was underway, it
would cause the composition text to be in an invalid state.

Task-number: QTBUG-25107
Change-Id: Iaf06f330fb055e30c25ccc9874f15132ea000bc2
Reviewed-by: Tasuku Suzuki <tasuku.suzuki@nokia.com>
Reviewed-by: Morten Johan Sørvig <morten.sorvig@nokia.com>
---
 src/gui/inputmethod/qmacinputcontext_mac.cpp |  4 +++-
 src/gui/inputmethod/qmacinputcontext_p.h     |  3 ++-
 src/gui/kernel/qcocoaview_mac.mm             | 11 ++++++++---
 3 files changed, 13 insertions(+), 5 deletions(-)

diff --git a/src/gui/inputmethod/qmacinputcontext_mac.cpp b/src/gui/inputmethod/qmacinputcontext_mac.cpp
index 5fa5e63..282013a 100644
--- a/src/gui/inputmethod/qmacinputcontext_mac.cpp
+++ b/src/gui/inputmethod/qmacinputcontext_mac.cpp
@@ -58,7 +58,7 @@ extern bool qt_sendSpontaneousEvent(QObject*, QEvent*);
 
 QMacInputContext::QMacInputContext(QObject *parent)
     : QInputContext(parent), composing(false), recursionGuard(false), textDocument(0),
-      keydownEvent(0)
+      keydownEvent(0), lastFocusWid(0)
 {
 //    createTextDocument();
 }
@@ -141,6 +141,8 @@ bool QMacInputContext::isComposing() const
 
 void QMacInputContext::setFocusWidget(QWidget *w)
 {
+    if (!w)
+        lastFocusWid = focusWidget();
     createTextDocument();
 #ifndef QT_MAC_USE_COCOA
     if(w)
diff --git a/src/gui/inputmethod/qmacinputcontext_p.h b/src/gui/inputmethod/qmacinputcontext_p.h
index 1387246..39d19ab 100644
--- a/src/gui/inputmethod/qmacinputcontext_p.h
+++ b/src/gui/inputmethod/qmacinputcontext_p.h
@@ -81,7 +81,7 @@ public:
 
     EventRef lastKeydownEvent() { return keydownEvent; }
     void setLastKeydownEvent(EventRef);
-
+    QWidget *lastFocusWidget() const { return lastFocusWid; }
 protected:
     void mouseHandler(int pos, QMouseEvent *);
 private:
@@ -90,6 +90,7 @@ private:
     TSMDocumentID textDocument;
     QString currentText;
     EventRef keydownEvent;
+    QWidget *lastFocusWid;
 };
 
 QT_END_NAMESPACE
diff --git a/src/gui/kernel/qcocoaview_mac.mm b/src/gui/kernel/qcocoaview_mac.mm
index 84cb03a..63bbd29 100644
--- a/src/gui/kernel/qcocoaview_mac.mm
+++ b/src/gui/kernel/qcocoaview_mac.mm
@@ -1022,12 +1022,17 @@ static int qCocoaViewCount = 0;
     // 256 to the key events handling process.
     if (([aString length] && (composing || commitText.at(0).unicode() > 0xff)) || !fromKeyDownEvent) {
         // Send the commit string to the widget.
-        composing = false;
-        sendKeyEvents = false;
         QInputMethodEvent e;
         e.setCommitString(commitText);
-        if (QWidget *widgetToGetKey = qt_mac_getTargetForKeyEvent(qwidget))
+        QWidget *widgetToGetKey = 0;
+        if (!composing || qApp->focusWidget())
+            widgetToGetKey = qt_mac_getTargetForKeyEvent(qwidget);
+        else if (QMacInputContext *mic = qobject_cast<QMacInputContext *>(qApp->inputContext()))
+            widgetToGetKey = mic->lastFocusWidget();
+        if (widgetToGetKey)
             qt_sendSpontaneousEvent(widgetToGetKey, &e);
+        composing = false;
+        sendKeyEvents = false;
     } else {
         // The key sequence "`q" on a French Keyboard will generate two calls to insertText before
         // it returns from interpretKeyEvents. The first call will turn off 'composing' and accept
-- 
cgit v0.12