diff options
-rw-r--r-- | src/plugins/platforms/cocoa/qcocoainputcontext.h | 3 | ||||
-rw-r--r-- | src/plugins/platforms/cocoa/qcocoainputcontext.mm | 10 | ||||
-rw-r--r-- | src/plugins/platforms/cocoa/qnsview.mm | 64 |
3 files changed, 60 insertions, 17 deletions
diff --git a/src/plugins/platforms/cocoa/qcocoainputcontext.h b/src/plugins/platforms/cocoa/qcocoainputcontext.h index 172c87e2dc..1fda29209d 100644 --- a/src/plugins/platforms/cocoa/qcocoainputcontext.h +++ b/src/plugins/platforms/cocoa/qcocoainputcontext.h @@ -59,7 +59,8 @@ public: virtual void reset(); private Q_SLOTS: - void inputItemChanged(); + void connectSignals(); + void focusObjectChanged(QObject *focusObject); private: QPointer<QWindow> mWindow; diff --git a/src/plugins/platforms/cocoa/qcocoainputcontext.mm b/src/plugins/platforms/cocoa/qcocoainputcontext.mm index db3488a0f5..5ac7f72acf 100644 --- a/src/plugins/platforms/cocoa/qcocoainputcontext.mm +++ b/src/plugins/platforms/cocoa/qcocoainputcontext.mm @@ -83,7 +83,7 @@ QCocoaInputContext::QCocoaInputContext() : QPlatformInputContext() , mWindow(QGuiApplication::focusWindow()) { - connect(qApp->inputMethod(), SIGNAL(inputItemChanged()), this, SLOT(inputItemChanged())); + QMetaObject::invokeMethod(this, "connectSignals", Qt::QueuedConnection); } QCocoaInputContext::~QCocoaInputContext() @@ -114,7 +114,13 @@ void QCocoaInputContext::reset() } } -void QCocoaInputContext::inputItemChanged() +void QCocoaInputContext::connectSignals() +{ + connect(qApp, SIGNAL(focusObjectChanged(QObject*)), this, SLOT(focusObjectChanged(QObject*))); + focusObjectChanged(qApp->focusObject()); +} + +void QCocoaInputContext::focusObjectChanged(QObject *focusObject) { mWindow = QGuiApplication::focusWindow(); } diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm index d7f6310f6e..d249158db3 100644 --- a/src/plugins/platforms/cocoa/qnsview.mm +++ b/src/plugins/platforms/cocoa/qnsview.mm @@ -614,10 +614,11 @@ static QTouchDevice *touchDevice = 0; QObject *fo = QGuiApplication::focusObject(); if (!m_keyEventsAccepted && fo) { - QInputMethodQueryEvent queryEvent(Qt::ImHints); + QInputMethodQueryEvent queryEvent(Qt::ImEnabled | Qt::ImHints); if (QCoreApplication::sendEvent(fo, &queryEvent)) { + bool imEnabled = queryEvent.value(Qt::ImEnabled).toBool(); Qt::InputMethodHints hints = static_cast<Qt::InputMethodHints>(queryEvent.value(Qt::ImHints).toUInt()); - if (!(hints & Qt::ImhDigitsOnly || hints & Qt::ImhFormattedNumbersOnly || hints & Qt::ImhHiddenText)) + if (imEnabled && !(hints & Qt::ImhDigitsOnly || hints & Qt::ImhFormattedNumbersOnly || hints & Qt::ImhHiddenText)) [self interpretKeyEvents:[NSArray arrayWithObject:nsevent]]; } } @@ -654,10 +655,15 @@ static QTouchDevice *touchDevice = 0; } QObject *fo = QGuiApplication::focusObject(); if (fo) { - QInputMethodEvent e; - e.setCommitString(commitString); - QCoreApplication::sendEvent(fo, &e); - m_keyEventsAccepted = true; + QInputMethodQueryEvent queryEvent(Qt::ImEnabled); + if (QCoreApplication::sendEvent(fo, &queryEvent)) { + if (queryEvent.value(Qt::ImEnabled).toBool()) { + QInputMethodEvent e; + e.setCommitString(commitString); + QCoreApplication::sendEvent(fo, &e); + m_keyEventsAccepted = true; + } + } } m_composingText.clear(); @@ -715,9 +721,14 @@ static QTouchDevice *touchDevice = 0; QObject *fo = QGuiApplication::focusObject(); if (fo) { - QInputMethodEvent e(preeditString, attrs); - QCoreApplication::sendEvent(fo, &e); - m_keyEventsAccepted = true; + QInputMethodQueryEvent queryEvent(Qt::ImEnabled); + if (QCoreApplication::sendEvent(fo, &queryEvent)) { + if (queryEvent.value(Qt::ImEnabled).toBool()) { + QInputMethodEvent e(preeditString, attrs); + QCoreApplication::sendEvent(fo, &e); + m_keyEventsAccepted = true; + } + } } } @@ -726,9 +737,14 @@ static QTouchDevice *touchDevice = 0; if (!m_composingText.isEmpty()) { QObject *fo = QGuiApplication::focusObject(); if (fo) { - QInputMethodEvent e; - e.setCommitString(m_composingText); - QCoreApplication::sendEvent(fo, &e); + QInputMethodQueryEvent queryEvent(Qt::ImEnabled); + if (QCoreApplication::sendEvent(fo, &queryEvent)) { + if (queryEvent.value(Qt::ImEnabled).toBool()) { + QInputMethodEvent e; + e.setCommitString(m_composingText); + QCoreApplication::sendEvent(fo, &e); + } + } } } m_composingText.clear(); @@ -749,9 +765,11 @@ static QTouchDevice *touchDevice = 0; QObject *fo = QGuiApplication::focusObject(); if (!fo) return nil; - QInputMethodQueryEvent queryEvent(Qt::ImCurrentSelection); + QInputMethodQueryEvent queryEvent(Qt::ImEnabled | Qt::ImCurrentSelection); if (!QCoreApplication::sendEvent(fo, &queryEvent)) return nil; + if (!queryEvent.value(Qt::ImEnabled).toBool()) + return nil; QString selectedText = queryEvent.value(Qt::ImCurrentSelection).toString(); if (selectedText.isEmpty()) @@ -785,9 +803,12 @@ static QTouchDevice *touchDevice = 0; QObject *fo = QGuiApplication::focusObject(); if (!fo) return selRange; - QInputMethodQueryEvent queryEvent(Qt::ImCurrentSelection); + QInputMethodQueryEvent queryEvent(Qt::ImEnabled | Qt::ImCurrentSelection); if (!QCoreApplication::sendEvent(fo, &queryEvent)) return selRange; + if (!queryEvent.value(Qt::ImEnabled).toBool()) + return selRange; + QString selectedText = queryEvent.value(Qt::ImCurrentSelection).toString(); if (!selectedText.isEmpty()) { @@ -804,6 +825,12 @@ static QTouchDevice *touchDevice = 0; if (!fo) return NSZeroRect; + QInputMethodQueryEvent queryEvent(Qt::ImEnabled); + if (!QCoreApplication::sendEvent(fo, &queryEvent)) + return NSZeroRect; + if (!queryEvent.value(Qt::ImEnabled).toBool()) + return NSZeroRect; + if (!m_window) return NSZeroRect; @@ -828,10 +855,19 @@ static QTouchDevice *touchDevice = 0; - (NSArray*) validAttributesForMarkedText { + if (m_window != QGuiApplication::focusWindow()) + return nil; + QObject *fo = QGuiApplication::focusObject(); if (!fo) return nil; + QInputMethodQueryEvent queryEvent(Qt::ImEnabled); + if (!QCoreApplication::sendEvent(fo, &queryEvent)) + return nil; + if (!queryEvent.value(Qt::ImEnabled).toBool()) + return nil; + // Support only underline color/style. return [NSArray arrayWithObjects:NSUnderlineColorAttributeName, NSUnderlineStyleAttributeName, nil]; |