IBus: Implement QPlatformInputContext::locale()

Listen to "GlobalEngineChanged" dbus signal.

Task-number: QTBUG-48772
Change-Id: Ia186a66c75fb3ce2fdf5ef9e358c1807f674594b
Reviewed-by: Lars Knoll <lars.knoll@theqtcompany.com>
bb10
Takao Fujiwara 2015-10-30 14:43:21 +09:00
parent 7796562998
commit 550cd1d68c
6 changed files with 227 additions and 7 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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