summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforminputcontexts/ibus
diff options
context:
space:
mode:
authorTakao Fujiwara <takao.fujiwara1@gmail.com>2015-10-30 14:43:21 +0900
committerTakao Fujiwara <takao.fujiwara1@gmail.com>2015-11-02 01:16:01 +0000
commit550cd1d68c01e62b465c393b35a5f2c76b2d1fc5 (patch)
treec908bd1d6444284e27f538471a7465749eb4a3b8 /src/plugins/platforminputcontexts/ibus
parent779656299897c5d85fd7bfd0f766cb45c3d82e4e (diff)
IBus: Implement QPlatformInputContext::locale()
Listen to "GlobalEngineChanged" dbus signal. Task-number: QTBUG-48772 Change-Id: Ia186a66c75fb3ce2fdf5ef9e358c1807f674594b Reviewed-by: Lars Knoll <lars.knoll@theqtcompany.com>
Diffstat (limited to 'src/plugins/platforminputcontexts/ibus')
-rw-r--r--src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp33
-rw-r--r--src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.h6
-rw-r--r--src/plugins/platforminputcontexts/ibus/qibusproxy.cpp29
-rw-r--r--src/plugins/platforminputcontexts/ibus/qibusproxy.h23
-rw-r--r--src/plugins/platforminputcontexts/ibus/qibustypes.cpp110
-rw-r--r--src/plugins/platforminputcontexts/ibus/qibustypes.h33
6 files changed, 227 insertions, 7 deletions
diff --git a/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp b/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp
index dca21245aa..a952123576 100644
--- a/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp
+++ b/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp
@@ -58,8 +58,6 @@
QT_BEGIN_NAMESPACE
-Q_LOGGING_CATEGORY(qtQpaInputMethods, "qt.qpa.input.methods")
-
enum { debug = 0 };
class QIBusPlatformInputContextPrivate
@@ -87,6 +85,7 @@ public:
bool busConnected;
QString predit;
bool needsSurroundingText;
+ QLocale locale;
};
@@ -412,6 +411,11 @@ void QIBusPlatformInputContext::filterEventFinished(QDBusPendingCallWatcher *cal
call->deleteLater();
}
+QLocale QIBusPlatformInputContext::locale() const
+{
+ return d->locale;
+}
+
void QIBusPlatformInputContext::socketChanged(const QString &str)
{
qCDebug(qtQpaInputMethods) << "socketChanged";
@@ -421,6 +425,8 @@ void QIBusPlatformInputContext::socketChanged(const QString &str)
if (d->context)
disconnect(d->context);
+ if (d->bus && d->bus->isValid())
+ disconnect(d->bus);
if (d->connection)
d->connection->disconnectFromBus(QLatin1String("QIBusProxy"));
@@ -439,8 +445,26 @@ void QIBusPlatformInputContext::connectToBus()
m_socketWatcher.addPath(QIBusPlatformInputContextPrivate::getSocketPath());
}
+void QIBusPlatformInputContext::globalEngineChanged(const QString &engine_name)
+{
+ if (!d->bus || !d->bus->isValid())
+ return;
+
+ QIBusEngineDesc desc = d->bus->getGlobalEngine();
+ Q_ASSERT(engine_name == desc.engine_name);
+ QLocale locale(desc.language);
+ if (d->locale != locale) {
+ d->locale = locale;
+ emitLocaleChanged();
+ }
+}
+
void QIBusPlatformInputContext::connectToContextSignals()
{
+ if (d->bus && d->bus->isValid()) {
+ connect(d->bus, SIGNAL(GlobalEngineChanged(QString)), this, SLOT(globalEngineChanged(QString)));
+ }
+
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)));
@@ -461,6 +485,11 @@ QIBusPlatformInputContextPrivate::QIBusPlatformInputContextPrivate()
if (!valid)
return;
initBus();
+
+ if (bus && bus->isValid()) {
+ QIBusEngineDesc desc = bus->getGlobalEngine();
+ locale = QLocale(desc.language);
+ }
}
void QIBusPlatformInputContextPrivate::initBus()
diff --git a/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.h b/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.h
index a8efd9deb3..824e9c2073 100644
--- a/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.h
+++ b/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.h
@@ -36,16 +36,14 @@
#include <qpa/qplatforminputcontext.h>
#include <QtCore/qpointer.h>
+#include <QtCore/QLocale>
#include <QtDBus/qdbuspendingreply.h>
#include <QFileSystemWatcher>
-#include <QLoggingCategory>
#include <QTimer>
#include <QWindow>
QT_BEGIN_NAMESPACE
-Q_DECLARE_LOGGING_CATEGORY(qtQpaInputMethods)
-
class QIBusPlatformInputContextPrivate;
class QDBusVariant;
@@ -90,6 +88,7 @@ public:
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;
public Q_SLOTS:
void commitText(const QDBusVariant &text);
@@ -100,6 +99,7 @@ public Q_SLOTS:
void filterEventFinished(QDBusPendingCallWatcher *call);
void socketChanged(const QString &str);
void connectToBus();
+ void globalEngineChanged(const QString &engine_name);
private:
QIBusPlatformInputContextPrivate *d;
diff --git a/src/plugins/platforminputcontexts/ibus/qibusproxy.cpp b/src/plugins/platforminputcontexts/ibus/qibusproxy.cpp
index e6b255a06d..9efa6f7eb0 100644
--- a/src/plugins/platforminputcontexts/ibus/qibusproxy.cpp
+++ b/src/plugins/platforminputcontexts/ibus/qibusproxy.cpp
@@ -9,6 +9,8 @@
* before re-generating it.
*/
+#include <QtDBus/qdbusextratypes.h>
+
#include "qibusproxy.h"
/*
@@ -18,9 +20,36 @@
QIBusProxy::QIBusProxy(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent)
: QDBusAbstractInterface(service, path, staticInterfaceName(), connection, parent)
{
+ this->connection().connect(service,
+ path,
+ this->interface(), // interface
+ QStringLiteral("GlobalEngineChanged"),
+ QStringList(),
+ QString(), // signature
+ this, SLOT(globalEngineChanged(QString)));
}
QIBusProxy::~QIBusProxy()
{
}
+QIBusEngineDesc QIBusProxy::getGlobalEngine()
+{
+ QIBusEngineDesc desc;
+ QDBusReply<QDBusVariant> reply = GetGlobalEngine();
+ QVariant variant = reply.value().variant();
+ if (!variant.isValid())
+ return desc;
+ QVariant child = variant.value<QDBusVariant>().variant();
+ if (!child.isValid())
+ return desc;
+ const QDBusArgument argument = child.value<QDBusArgument>();
+ argument >> desc;
+ return desc;
+}
+
+void QIBusProxy::globalEngineChanged(const QString &engine_name)
+{
+ emit GlobalEngineChanged(engine_name);
+}
+
diff --git a/src/plugins/platforminputcontexts/ibus/qibusproxy.h b/src/plugins/platforminputcontexts/ibus/qibusproxy.h
index 69443a524d..bbaebe1b96 100644
--- a/src/plugins/platforminputcontexts/ibus/qibusproxy.h
+++ b/src/plugins/platforminputcontexts/ibus/qibusproxy.h
@@ -20,6 +20,8 @@
#include <QtCore/QVariant>
#include <QtDBus/QtDBus>
+#include "qibustypes.h"
+
/*
* Proxy class for interface org.freedesktop.IBus
*/
@@ -29,6 +31,8 @@ class QIBusProxy: public QDBusAbstractInterface
public:
static inline const char *staticInterfaceName()
{ return "org.freedesktop.IBus"; }
+ static inline QString dbusInterfaceProperties()
+ { return QStringLiteral("org.freedesktop.DBus.Properties"); }
public:
QIBusProxy(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0);
@@ -82,7 +86,26 @@ public Q_SLOTS: // METHODS
return asyncCallWithArgumentList(QLatin1String("RegisterComponent"), argumentList);
}
+ inline QDBusPendingReply<QDBusVariant> GetGlobalEngine()
+ {
+ if (!this->isValid() || this->service().isEmpty() || this->path().isEmpty())
+ return QDBusMessage::createError(this->lastError());
+
+ QDBusMessage msg = QDBusMessage::createMethodCall(this->service(),
+ this->path(),
+ dbusInterfaceProperties(),
+ QStringLiteral("Get"));
+ msg << this->interface() << QStringLiteral("GlobalEngine");
+ return this->connection().asyncCall(msg, this->timeout());
+ }
+
+ QIBusEngineDesc getGlobalEngine();
+
+private:
+ void globalEngineChanged(const QString &engine_name);
+
Q_SIGNALS: // SIGNALS
+ void GlobalEngineChanged(const QString &engine_name);
};
#endif
diff --git a/src/plugins/platforminputcontexts/ibus/qibustypes.cpp b/src/plugins/platforminputcontexts/ibus/qibustypes.cpp
index f88e5ca5a3..7cf3b24570 100644
--- a/src/plugins/platforminputcontexts/ibus/qibustypes.cpp
+++ b/src/plugins/platforminputcontexts/ibus/qibustypes.cpp
@@ -37,6 +37,9 @@
QT_BEGIN_NAMESPACE
+Q_LOGGING_CATEGORY(qtQpaInputMethods, "qt.qpa.input.methods")
+Q_LOGGING_CATEGORY(qtQpaInputMethodsSerialize, "qt.qpa.input.methods.serialize")
+
QIBusSerializable::QIBusSerializable()
{
}
@@ -202,7 +205,7 @@ QDBusArgument &operator<<(QDBusArgument &argument, const QIBusAttributeList &att
const QDBusArgument &operator>>(const QDBusArgument &arg, QIBusAttributeList &attrList)
{
-// qDebug() << "QIBusAttributeList::fromDBusArgument()" << arg.currentSignature();
+ qCDebug(qtQpaInputMethodsSerialize) << "QIBusAttributeList::fromDBusArgument()" << arg.currentSignature();
arg.beginStructure();
arg >> static_cast<QIBusSerializable &>(attrList);
@@ -277,7 +280,7 @@ QDBusArgument &operator<<(QDBusArgument &argument, const QIBusText &text)
const QDBusArgument &operator>>(const QDBusArgument &argument, QIBusText &text)
{
-// qDebug() << "QIBusText::fromDBusArgument()" << arg.currentSignature();
+ qCDebug(qtQpaInputMethodsSerialize) << "QIBusText::fromDBusArgument()" << argument.currentSignature();
argument.beginStructure();
argument >> static_cast<QIBusSerializable &>(text);
@@ -291,4 +294,107 @@ const QDBusArgument &operator>>(const QDBusArgument &argument, QIBusText &text)
return argument;
}
+QIBusEngineDesc::QIBusEngineDesc()
+ : engine_name(""),
+ longname(""),
+ description(""),
+ language(""),
+ license(""),
+ author(""),
+ icon(""),
+ layout(""),
+ rank(0),
+ hotkeys(""),
+ symbol(""),
+ setup(""),
+ layout_variant(""),
+ layout_option(""),
+ version(""),
+ textdomain(""),
+ iconpropkey("")
+{
+ name = "IBusEngineDesc";
+}
+
+QIBusEngineDesc::~QIBusEngineDesc()
+{
+}
+
+QDBusArgument &operator<<(QDBusArgument &argument, const QIBusEngineDesc &desc)
+{
+ argument.beginStructure();
+
+ argument << static_cast<const QIBusSerializable &>(desc);
+
+ argument << desc.engine_name;
+ argument << desc.longname;
+ argument << desc.description;
+ argument << desc.language;
+ argument << desc.license;
+ argument << desc.author;
+ argument << desc.icon;
+ argument << desc.layout;
+ argument << desc.rank;
+ argument << desc.hotkeys;
+ argument << desc.symbol;
+ argument << desc.setup;
+ argument << desc.layout_variant;
+ argument << desc.layout_option;
+ argument << desc.version;
+ argument << desc.textdomain;
+ argument << desc.iconpropkey;
+
+ argument.endStructure();
+ return argument;
+}
+
+const QDBusArgument &operator>>(const QDBusArgument &argument, QIBusEngineDesc &desc)
+{
+ qCDebug(qtQpaInputMethodsSerialize) << "QIBusEngineDesc::fromDBusArgument()" << argument.currentSignature();
+ argument.beginStructure();
+
+ argument >> static_cast<QIBusSerializable &>(desc);
+
+ argument >> desc.engine_name;
+ argument >> desc.longname;
+ argument >> desc.description;
+ argument >> desc.language;
+ argument >> desc.license;
+ argument >> desc.author;
+ argument >> desc.icon;
+ argument >> desc.layout;
+ argument >> desc.rank;
+ argument >> desc.hotkeys;
+ argument >> desc.symbol;
+ argument >> desc.setup;
+ // Previous IBusEngineDesc supports the arguments between engine_name
+ // and setup.
+ if (argument.currentSignature() == "") {
+ argument.endStructure();
+ return argument;
+ }
+ argument >> desc.layout_variant;
+ argument >> desc.layout_option;
+ // Previous IBusEngineDesc supports the arguments between engine_name
+ // and layout_option.
+ if (argument.currentSignature() == "") {
+ argument.endStructure();
+ return argument;
+ }
+ argument >> desc.version;
+ if (argument.currentSignature() == "") {
+ argument.endStructure();
+ return argument;
+ }
+ argument >> desc.textdomain;
+ if (argument.currentSignature() == "") {
+ argument.endStructure();
+ return argument;
+ }
+ argument >> desc.iconpropkey;
+
+ argument.endStructure();
+ return argument;
+}
+
QT_END_NAMESPACE
diff --git a/src/plugins/platforminputcontexts/ibus/qibustypes.h b/src/plugins/platforminputcontexts/ibus/qibustypes.h
index cb0d9ff2aa..b4145863bc 100644
--- a/src/plugins/platforminputcontexts/ibus/qibustypes.h
+++ b/src/plugins/platforminputcontexts/ibus/qibustypes.h
@@ -37,9 +37,13 @@
#include <qevent.h>
#include <QDBusArgument>
#include <QTextCharFormat>
+#include <QLoggingCategory>
QT_BEGIN_NAMESPACE
+Q_DECLARE_LOGGING_CATEGORY(qtQpaInputMethods)
+Q_DECLARE_LOGGING_CATEGORY(qtQpaInputMethodsSerialize)
+
class QIBusSerializable
{
public:
@@ -100,6 +104,31 @@ public:
QIBusAttributeList attributes;
};
+class QIBusEngineDesc : public QIBusSerializable
+{
+public:
+ QIBusEngineDesc();
+ ~QIBusEngineDesc();
+
+ QString engine_name;
+ QString longname;
+ QString description;
+ QString language;
+ QString license;
+ QString author;
+ QString icon;
+ QString layout;
+ unsigned int rank;
+ QString hotkeys;
+ QString symbol;
+ QString setup;
+ QString layout_variant;
+ QString layout_option;
+ QString version;
+ QString textdomain;
+ QString iconpropkey;
+};
+
QDBusArgument &operator<<(QDBusArgument &argument, const QIBusSerializable &object);
const QDBusArgument &operator>>(const QDBusArgument &argument, QIBusSerializable &object);
@@ -112,11 +141,15 @@ const QDBusArgument &operator>>(const QDBusArgument &arg, QIBusAttributeList &at
QDBusArgument &operator<<(QDBusArgument &argument, const QIBusText &text);
const QDBusArgument &operator>>(const QDBusArgument &argument, QIBusText &text);
+QDBusArgument &operator<<(QDBusArgument &argument, const QIBusEngineDesc &desc);
+const QDBusArgument &operator>>(const QDBusArgument &argument, QIBusEngineDesc &desc);
+
QT_END_NAMESPACE
Q_DECLARE_METATYPE(QIBusSerializable)
Q_DECLARE_METATYPE(QIBusAttribute)
Q_DECLARE_METATYPE(QIBusAttributeList)
Q_DECLARE_METATYPE(QIBusText)
+Q_DECLARE_METATYPE(QIBusEngineDesc)
#endif