From 49e63efd2a45e1872468d8d6de1308c96ee92fcb Mon Sep 17 00:00:00 2001 From: Andy Shaw 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 Reviewed-by: Morten Johan Sørvig --- 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(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