summaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorTasuku Suzuki <tasuku.suzuki@nokia.com>2012-03-19 11:04:26 +0900
committerQt by Nokia <qt-info@nokia.com>2012-03-23 09:48:04 +0100
commit68f44a7f98de4d60c39c9374ecd470eab74b22dd (patch)
tree651468b10207b5f251f11a27c4823e85ef3ca716 /src/plugins
parentfd379ae7d3952cf423f87afbaed943d10e790432 (diff)
Check if Qt::ImEnabled is true before handling im events on Mac
Key events were not sent to items on graphics view after the change 412dbdf410c765e75c60d1f48143dd6c02a69493. This is because the change only checks if QGuiApplication::focusObject() exists. Qt::ImEnabled needs to be checked too. Change-Id: I2a78af717a7a1a5d84fbc8b521253bdc25b43286 Reviewed-by: Morten Johan Sørvig <morten.sorvig@nokia.com>
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/platforms/cocoa/qcocoainputcontext.h3
-rw-r--r--src/plugins/platforms/cocoa/qcocoainputcontext.mm10
-rw-r--r--src/plugins/platforms/cocoa/qnsview.mm64
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];