summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforminputcontexts/ibus
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/platforminputcontexts/ibus')
-rw-r--r--src/plugins/platforminputcontexts/ibus/main.cpp2
-rw-r--r--src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp71
-rw-r--r--src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.h21
-rw-r--r--src/plugins/platforminputcontexts/ibus/qibusproxy.cpp45
-rw-r--r--src/plugins/platforminputcontexts/ibus/qibusproxy.h50
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: