From 6a4bf73c07b034a0f9d07cb617d23e92ca778dd1 Mon Sep 17 00:00:00 2001 From: Pekka Vuorela Date: Thu, 23 Feb 2012 15:57:14 +0200 Subject: Added some convenience API for platform input contexts QPlatformInputContext now gets notified on changed focus and has inputMethodAccepted() telling whether current focus object accepts input method events. Also adapted IBus plugin to use this. Key event filtering for focused objects without input method support got fixed by the change. Change-Id: I6910aa6af2459d752a5763f0ae88fa8c34e5b165 Reviewed-by: Joona Petrell --- .../ibus/qibusplatforminputcontext.cpp | 19 ++++++++++--------- .../ibus/qibusplatforminputcontext.h | 2 +- 2 files changed, 11 insertions(+), 10 deletions(-) (limited to 'src/plugins/platforminputcontexts') diff --git a/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp b/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp index 5579b4cd26..38fe0cce51 100644 --- a/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp +++ b/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp @@ -89,7 +89,6 @@ QIBusPlatformInputContext::QIBusPlatformInputContext () connect(d->context, SIGNAL(UpdatePreeditText(QDBusVariant,uint,bool)), this, SLOT(updatePreeditText(QDBusVariant,uint,bool))); } QInputMethod *p = qApp->inputMethod(); - connect(p, SIGNAL(inputItemChanged()), this, SLOT(inputItemChanged())); connect(p, SIGNAL(cursorRectangleChanged()), this, SLOT(cursorRectChanged())); } @@ -130,7 +129,7 @@ void QIBusPlatformInputContext::commit() if (!d->valid) return; - QObject *input = qApp->inputMethod()->inputItem(); + QObject *input = qApp->focusObject(); if (!input) { d->predit = QString(); return; @@ -159,7 +158,7 @@ void QIBusPlatformInputContext::cursorRectChanged() if(!r.isValid()) return; - QWindow *inputWindow = qApp->inputMethod()->inputWindow(); + QWindow *inputWindow = qApp->focusWindow(); if (!inputWindow) return; r.moveTopLeft(inputWindow->mapToGlobal(r.topLeft())); @@ -168,15 +167,14 @@ void QIBusPlatformInputContext::cursorRectChanged() d->context->SetCursorLocation(r.x(), r.y(), r.width(), r.height()); } -void QIBusPlatformInputContext::inputItemChanged() +void QIBusPlatformInputContext::setFocusObject(QObject *object) { if (!d->valid) return; - QObject *input = qApp->inputMethod()->inputItem(); if (debug) - qDebug() << "setFocusObject" << input; - if (input) + qDebug() << "setFocusObject" << object; + if (object) d->context->FocusIn(); else d->context->FocusOut(); @@ -184,7 +182,7 @@ void QIBusPlatformInputContext::inputItemChanged() void QIBusPlatformInputContext::commitText(const QDBusVariant &text) { - QObject *input = qApp->inputMethod()->inputItem(); + QObject *input = qApp->focusObject(); if (!input) return; @@ -206,7 +204,7 @@ void QIBusPlatformInputContext::commitText(const QDBusVariant &text) void QIBusPlatformInputContext::updatePreeditText(const QDBusVariant &text, uint cursorPos, bool visible) { - QObject *input = qApp->inputMethod()->inputItem(); + QObject *input = qApp->focusObject(); if (!input) return; @@ -254,6 +252,9 @@ QIBusPlatformInputContext::x11FilterEvent(uint keyval, uint keycode, uint state, if (!d->valid) return false; + if (!inputMethodAccepted()) + return false; + if (!press) return false; diff --git a/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.h b/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.h index ca8f492c5d..1ed4262ef6 100644 --- a/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.h +++ b/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.h @@ -56,6 +56,7 @@ public: ~QIBusPlatformInputContext(); bool isValid() const; + void setFocusObject(QObject *object); void invokeAction(QInputMethod::Action a, int x); void reset(); @@ -67,7 +68,6 @@ public: public Q_SLOTS: void commitText(const QDBusVariant &text); void updatePreeditText(const QDBusVariant &text, uint cursor_pos, bool visible); - void inputItemChanged(); void cursorRectChanged(); private: -- cgit v1.2.3