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
parent
7796562998
commit
550cd1d68c
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue