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
412dbdf410. 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>
This commit is contained in:
Tasuku Suzuki 2012-03-19 11:04:26 +09:00 committed by Qt by Nokia
parent fd379ae7d3
commit 68f44a7f98
3 changed files with 60 additions and 17 deletions

View File

@ -59,7 +59,8 @@ public:
virtual void reset();
private Q_SLOTS:
void inputItemChanged();
void connectSignals();
void focusObjectChanged(QObject *focusObject);
private:
QPointer<QWindow> mWindow;

View File

@ -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();
}

View File

@ -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];