diff options
Diffstat (limited to 'src/plugins/platforminputcontexts/ibus')
5 files changed, 154 insertions, 35 deletions
diff --git a/src/plugins/platforminputcontexts/ibus/main.cpp b/src/plugins/platforminputcontexts/ibus/main.cpp index 2846f52c8c..0a7da3b14c 100644 --- a/src/plugins/platforminputcontexts/ibus/main.cpp +++ b/src/plugins/platforminputcontexts/ibus/main.cpp @@ -51,7 +51,7 @@ class QIbusPlatformInputContextPlugin : public QPlatformInputContextPlugin Q_PLUGIN_METADATA(IID QPlatformInputContextFactoryInterface_iid FILE "ibus.json") public: - QIBusPlatformInputContext *create(const QString&, const QStringList&) Q_DECL_OVERRIDE; + QIBusPlatformInputContext *create(const QString&, const QStringList&) override; }; QIBusPlatformInputContext *QIbusPlatformInputContextPlugin::create(const QString& system, const QStringList& paramList) diff --git a/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp b/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp index 9675d828e7..76f42d764d 100644 --- a/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp +++ b/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp @@ -60,6 +60,10 @@ #ifndef IBUS_RELEASE_MASK #define IBUS_RELEASE_MASK (1 << 30) +#define IBUS_SHIFT_MASK (1 << 0) +#define IBUS_CONTROL_MASK (1 << 2) +#define IBUS_MOD1_MASK (1 << 3) +#define IBUS_META_MASK (1 << 28) #endif QT_BEGIN_NAMESPACE @@ -90,6 +94,7 @@ public: bool valid; bool busConnected; QString predit; + QList<QInputMethodEvent::Attribute> attributes; bool needsSurroundingText; QLocale locale; }; @@ -165,6 +170,7 @@ void QIBusPlatformInputContext::reset() d->context->Reset(); d->predit = QString(); + d->attributes.clear(); } void QIBusPlatformInputContext::commit() @@ -177,6 +183,7 @@ void QIBusPlatformInputContext::commit() QObject *input = qApp->focusObject(); if (!input) { d->predit = QString(); + d->attributes.clear(); return; } @@ -188,6 +195,7 @@ void QIBusPlatformInputContext::commit() d->context->Reset(); d->predit = QString(); + d->attributes.clear(); } @@ -274,6 +282,7 @@ void QIBusPlatformInputContext::commitText(const QDBusVariant &text) QCoreApplication::sendEvent(input, &event); d->predit = QString(); + d->attributes.clear(); } void QIBusPlatformInputContext::updatePreeditText(const QDBusVariant &text, uint cursorPos, bool visible) @@ -292,16 +301,48 @@ void QIBusPlatformInputContext::updatePreeditText(const QDBusVariant &text, uint if (debug) qDebug() << "preedit text:" << t.text; - QList<QInputMethodEvent::Attribute> attributes = t.attributes.imAttributes(); + d->attributes = t.attributes.imAttributes(); if (!t.text.isEmpty()) - attributes += QInputMethodEvent::Attribute(QInputMethodEvent::Cursor, cursorPos, visible ? 1 : 0); + d->attributes += QInputMethodEvent::Attribute(QInputMethodEvent::Cursor, cursorPos, visible ? 1 : 0, QVariant()); - QInputMethodEvent event(t.text, attributes); + QInputMethodEvent event(t.text, d->attributes); QCoreApplication::sendEvent(input, &event); d->predit = t.text; } +void QIBusPlatformInputContext::forwardKeyEvent(uint keyval, uint keycode, uint state) +{ + if (!qApp) + return; + + QObject *input = qApp->focusObject(); + if (!input) + return; + + if (debug) + qDebug() << "forwardKeyEvent" << keyval << keycode << state; + + QEvent::Type type = QEvent::KeyPress; + if (state & IBUS_RELEASE_MASK) + type = QEvent::KeyRelease; + + state &= ~IBUS_RELEASE_MASK; + + Qt::KeyboardModifiers modifiers = Qt::NoModifier; + if (state & IBUS_SHIFT_MASK) + modifiers |= Qt::ShiftModifier; + if (state & IBUS_CONTROL_MASK) + modifiers |= Qt::ControlModifier; + if (state & IBUS_MOD1_MASK) + modifiers |= Qt::AltModifier; + if (state & IBUS_META_MASK) + modifiers |= Qt::MetaModifier; + + QKeyEvent event(type, keyval, modifiers, QString(keyval)); + QCoreApplication::sendEvent(input, &event); +} + void QIBusPlatformInputContext::surroundingTextRequired() { if (debug) @@ -324,6 +365,27 @@ void QIBusPlatformInputContext::deleteSurroundingText(int offset, uint n_chars) QCoreApplication::sendEvent(input, &event); } +void QIBusPlatformInputContext::hidePreeditText() +{ + QObject *input = QGuiApplication::focusObject(); + if (!input) + return; + + QList<QInputMethodEvent::Attribute> attributes; + QInputMethodEvent event(QString(), attributes); + QCoreApplication::sendEvent(input, &event); +} + +void QIBusPlatformInputContext::showPreeditText() +{ + QObject *input = QGuiApplication::focusObject(); + if (!input) + return; + + QInputMethodEvent event(d->predit, d->attributes); + QCoreApplication::sendEvent(input, &event); +} + bool QIBusPlatformInputContext::filterEvent(const QEvent *event) { if (!d->busConnected) @@ -496,8 +558,11 @@ void QIBusPlatformInputContext::connectToContextSignals() if (d->context) { connect(d->context, SIGNAL(CommitText(QDBusVariant)), SLOT(commitText(QDBusVariant))); connect(d->context, SIGNAL(UpdatePreeditText(QDBusVariant,uint,bool)), this, SLOT(updatePreeditText(QDBusVariant,uint,bool))); + connect(d->context, SIGNAL(ForwardKeyEvent(uint, uint, uint)), this, SLOT(forwardKeyEvent(uint, uint, uint))); connect(d->context, SIGNAL(DeleteSurroundingText(int,uint)), this, SLOT(deleteSurroundingText(int,uint))); connect(d->context, SIGNAL(RequireSurroundingText()), this, SLOT(surroundingTextRequired())); + connect(d->context, SIGNAL(HidePreeditText()), this, SLOT(hidePreeditText())); + connect(d->context, SIGNAL(ShowPreeditText()), this, SLOT(showPreeditText())); } } diff --git a/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.h b/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.h index 7baa9ad1da..9b92b2e1f9 100644 --- a/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.h +++ b/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.h @@ -86,23 +86,26 @@ public: QIBusPlatformInputContext(); ~QIBusPlatformInputContext(); - bool isValid() const Q_DECL_OVERRIDE; - void setFocusObject(QObject *object) Q_DECL_OVERRIDE; + bool isValid() const override; + void setFocusObject(QObject *object) override; - void invokeAction(QInputMethod::Action a, int x) Q_DECL_OVERRIDE; - void reset() Q_DECL_OVERRIDE; - void commit() Q_DECL_OVERRIDE; - void update(Qt::InputMethodQueries) Q_DECL_OVERRIDE; - bool filterEvent(const QEvent *event) Q_DECL_OVERRIDE; - QLocale locale() const Q_DECL_OVERRIDE; - bool hasCapability(Capability capability) const Q_DECL_OVERRIDE; + void invokeAction(QInputMethod::Action a, int x) override; + void reset() override; + void commit() override; + void update(Qt::InputMethodQueries) override; + bool filterEvent(const QEvent *event) override; + QLocale locale() const override; + bool hasCapability(Capability capability) const override; public Q_SLOTS: void commitText(const QDBusVariant &text); void updatePreeditText(const QDBusVariant &text, uint cursor_pos, bool visible); + void forwardKeyEvent(uint keyval, uint keycode, uint state); void cursorRectChanged(); void deleteSurroundingText(int offset, uint n_chars); void surroundingTextRequired(); + void hidePreeditText(); + void showPreeditText(); void filterEventFinished(QDBusPendingCallWatcher *call); void socketChanged(const QString &str); void connectToBus(); diff --git a/src/plugins/platforminputcontexts/ibus/qibusproxy.cpp b/src/plugins/platforminputcontexts/ibus/qibusproxy.cpp index 9efa6f7eb0..156e9b7c90 100644 --- a/src/plugins/platforminputcontexts/ibus/qibusproxy.cpp +++ b/src/plugins/platforminputcontexts/ibus/qibusproxy.cpp @@ -33,10 +33,53 @@ QIBusProxy::~QIBusProxy() { } +#ifdef QIBUS_GET_ADDRESS +QString QIBusProxy::getAddress() +{ + QDBusReply<QDBusVariant> reply = Address(); + QVariant variant = reply.value().variant(); + if (!variant.isValid()) + return QString(); + return variant.toString(); +} +#endif + +#ifdef QIBUS_GET_ENGINES +QList<QIBusEngineDesc> QIBusProxy::getEngines() +{ + QList<QIBusEngineDesc> engines; + QDBusReply<QDBusVariant> reply = Engines(); + QVariant variant = reply.value().variant(); + if (!variant.isValid()) + return engines; + const QDBusArgument argument = variant.value<QDBusArgument>(); + qCDebug(qtQpaInputMethodsSerialize) << "QIBusProxy::getEngines()" << argument.currentSignature(); + + int i = 1; + argument.beginMap(); + while (!argument.atEnd()) { + QDBusVariant value; + argument >> value; + if (!value.variant().isValid()) { + qWarning() << "Warning in QIBusProxy::getEngines():" << QString::asprintf("%dth variant is wrong", i); + break; + } + const QDBusArgument desc_arg = value.variant().value<QDBusArgument>(); + + QIBusEngineDesc desc; + desc_arg >> desc; + engines.append(desc); + ++i; + } + argument.endMap(); + return engines; +} +#endif + QIBusEngineDesc QIBusProxy::getGlobalEngine() { QIBusEngineDesc desc; - QDBusReply<QDBusVariant> reply = GetGlobalEngine(); + QDBusReply<QDBusVariant> reply = GlobalEngine(); QVariant variant = reply.value().variant(); if (!variant.isValid()) return desc; diff --git a/src/plugins/platforminputcontexts/ibus/qibusproxy.h b/src/plugins/platforminputcontexts/ibus/qibusproxy.h index bbaebe1b96..839e972c34 100644 --- a/src/plugins/platforminputcontexts/ibus/qibusproxy.h +++ b/src/plugins/platforminputcontexts/ibus/qibusproxy.h @@ -54,24 +54,6 @@ public Q_SLOTS: // METHODS return asyncCallWithArgumentList(QLatin1String("Exit"), argumentList); } - inline QDBusPendingReply<QString> GetAddress() - { - QList<QVariant> argumentList; - return asyncCallWithArgumentList(QLatin1String("GetAddress"), argumentList); - } - - inline QDBusPendingReply<QVariantList> ListActiveEngines() - { - QList<QVariant> argumentList; - return asyncCallWithArgumentList(QLatin1String("ListActiveEngines"), argumentList); - } - - inline QDBusPendingReply<QVariantList> ListEngines() - { - QList<QVariant> argumentList; - return asyncCallWithArgumentList(QLatin1String("ListEngines"), argumentList); - } - inline QDBusPendingReply<QDBusVariant> Ping(const QDBusVariant &data) { QList<QVariant> argumentList; @@ -86,19 +68,45 @@ public Q_SLOTS: // METHODS return asyncCallWithArgumentList(QLatin1String("RegisterComponent"), argumentList); } - inline QDBusPendingReply<QDBusVariant> GetGlobalEngine() +// Property + inline QDBusPendingCall GetProperty(const QString method) { if (!this->isValid() || this->service().isEmpty() || this->path().isEmpty()) - return QDBusMessage::createError(this->lastError()); + return QDBusPendingCall::fromError(this->lastError()); QDBusMessage msg = QDBusMessage::createMethodCall(this->service(), this->path(), dbusInterfaceProperties(), QStringLiteral("Get")); - msg << this->interface() << QStringLiteral("GlobalEngine"); + msg << this->interface() << method; return this->connection().asyncCall(msg, this->timeout()); } +#ifdef QIBUS_GET_ADDRESS + inline QDBusPendingCall Address() + { + return GetProperty(QStringLiteral("Address")); + } +#endif + +#ifdef QIBUS_GET_ENGINES + inline QDBusPendingCall Engines() + { + return GetProperty(QStringLiteral("Engines")); + } +#endif + + inline QDBusPendingCall GlobalEngine() + { + return GetProperty(QStringLiteral("GlobalEngine")); + } + +#ifdef QIBUS_GET_ADDRESS + QString getAddress(); +#endif +#ifdef QIBUS_GET_ENGINES + QList<QIBusEngineDesc> getEngines(); +#endif QIBusEngineDesc getGlobalEngine(); private: |