IBus: Support a property ClientCommitPreedit

IBus added the ClientCommitPreedit property to handle
preedit in case.
If this writable property is set,
ibus_engine tells the client whether current preeditText
should be committed or not in the client side when
focusOutEvent.
(Qt's old behavior is always committing in the client side.)

Fixes: QTBUG-109576
Fixes: QTBUG-58005
Pick-to: 6.6 6.5
Change-Id: I6bb78921ce04cdd3197cba9e2fb00376d5e0ac8b
Reviewed-by: Liang Qi <liang.qi@qt.io>
(cherry picked from commit 84cf0e2be54d9ad183db063fd429b792c67edd18)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Inho Lee 2024-01-05 21:22:54 +01:00 committed by Qt Cherry-pick Bot
parent 023dd3adb1
commit c4dfea83b6
10 changed files with 180 additions and 45 deletions

View File

@ -2,6 +2,12 @@
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node>
<interface name="org.freedesktop.IBus.InputContext">
<property name="ClientCommitPreedit" type="(b)" access="readwrite">
<annotation name="org.qtproject.QtDBus.QtTypeName" value="QIBusPropTypeClientCommitPreedit"/>
</property>
<property name='ContentType' type='(uu)' access='readwrite'>
<annotation name="org.qtproject.QtDBus.QtTypeName" value="QIBusPropTypeContentType"/>
</property>
<method name="ProcessKeyEvent">
<arg name="keyval" direction="in" type="u"/>
<arg name="keycode" direction="in" type="u"/>
@ -62,6 +68,12 @@
<arg name="cursor_pos" type="u"/>
<arg name="visible" type="b"/>
</signal>
<signal name="UpdatePreeditTextWithMode">
<arg name="text" type="v"/>
<arg name="cursor_pos" type="u"/>
<arg name="visible" type="b"/>
<arg name="mode" type="u"/>
</signal>
<signal name="ShowPreeditText"/>
<signal name="HidePreeditText"/>
<signal name="UpdateAuxiliaryText">

View File

@ -28,6 +28,8 @@ QIBusPlatformInputContext *QIbusPlatformInputContextPlugin::create(const QString
qDBusRegisterMetaType<QIBusAttribute>();
qDBusRegisterMetaType<QIBusAttributeList>();
qDBusRegisterMetaType<QIBusText>();
qDBusRegisterMetaType<QIBusPropTypeClientCommitPreedit>();
qDBusRegisterMetaType<QIBusPropTypeContentType>();
return new QIBusPlatformInputContext;
}

View File

@ -2,7 +2,7 @@
* This file was generated by qdbusxml2cpp version 0.8
* Command line was: qdbusxml2cpp -N -p qibusinputcontextproxy -c QIBusInputContextProxy interfaces/org.freedesktop.IBus.InputContext.xml
*
* qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd.
* qdbusxml2cpp is Copyright (C) 2023 The Qt Company Ltd and other contributors.
*
* This is an auto-generated file.
* This file may have been hand-edited. Look for HAND-EDIT comments
@ -24,4 +24,3 @@ QIBusInputContextProxy::~QIBusInputContextProxy()
{
}
#include "moc_qibusinputcontextproxy.cpp"

View File

@ -2,25 +2,26 @@
* This file was generated by qdbusxml2cpp version 0.8
* Command line was: qdbusxml2cpp -N -p qibusinputcontextproxy -c QIBusInputContextProxy interfaces/org.freedesktop.IBus.InputContext.xml
*
* qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd.
* qdbusxml2cpp is Copyright (C) 2023 The Qt Company Ltd and other contributors.
*
* This is an auto-generated file.
* Do not edit! All changes made to it will be lost.
*/
#ifndef QIBUSINPUTCONTEXTPROXY_H_1394889529
#define QIBUSINPUTCONTEXTPROXY_H_1394889529
#ifndef QIBUSINPUTCONTEXTPROXY_H
#define QIBUSINPUTCONTEXTPROXY_H
#include <QObject>
#include <QByteArray>
#include <QList>
#include <QMap>
#include <QString>
#include <QStringList>
#include <QVariant>
#include <QDBusAbstractInterface>
#include <QDBusPendingReply>
#include <QtCore/QObject>
#include <QtCore/QByteArray>
#include <QtCore/QList>
#include <QtCore/QMap>
#include <QtCore/QString>
#include <QtCore/QStringList>
#include <QtCore/QVariant>
#include <QtDBus/QtDBus>
// Added for QIBusPropTypeClientCommitPreedit and QIBusPropTypeContentType
#include "qibustypes.h"
/*
* Proxy class for interface org.freedesktop.IBus.InputContext
@ -37,102 +38,114 @@ public:
~QIBusInputContextProxy();
Q_PROPERTY(QIBusPropTypeClientCommitPreedit ClientCommitPreedit READ clientCommitPreedit WRITE setClientCommitPreedit)
inline QIBusPropTypeClientCommitPreedit clientCommitPreedit() const
{ return qvariant_cast< QIBusPropTypeClientCommitPreedit >(property("ClientCommitPreedit")); }
inline void setClientCommitPreedit(const QIBusPropTypeClientCommitPreedit &value)
{ setProperty("ClientCommitPreedit", QVariant::fromValue(value)); }
Q_PROPERTY(QIBusPropTypeContentType ContentType READ contentType WRITE setContentType)
inline QIBusPropTypeContentType contentType() const
{ return qvariant_cast< QIBusPropTypeContentType >(property("ContentType")); }
inline void setContentType(const QIBusPropTypeContentType &value)
{ setProperty("ContentType", QVariant::fromValue(value)); }
public Q_SLOTS: // METHODS
inline QDBusPendingReply<> Destroy()
{
QList<QVariant> argumentList;
return asyncCallWithArgumentList(QLatin1String("Destroy"), argumentList);
return asyncCallWithArgumentList(QStringLiteral("Destroy"), argumentList);
}
inline QDBusPendingReply<> Disable()
{
QList<QVariant> argumentList;
return asyncCallWithArgumentList(QLatin1String("Disable"), argumentList);
return asyncCallWithArgumentList(QStringLiteral("Disable"), argumentList);
}
inline QDBusPendingReply<> Enable()
{
QList<QVariant> argumentList;
return asyncCallWithArgumentList(QLatin1String("Enable"), argumentList);
return asyncCallWithArgumentList(QStringLiteral("Enable"), argumentList);
}
inline QDBusPendingReply<> FocusIn()
{
QList<QVariant> argumentList;
return asyncCallWithArgumentList(QLatin1String("FocusIn"), argumentList);
return asyncCallWithArgumentList(QStringLiteral("FocusIn"), argumentList);
}
inline QDBusPendingReply<> FocusOut()
{
QList<QVariant> argumentList;
return asyncCallWithArgumentList(QLatin1String("FocusOut"), argumentList);
return asyncCallWithArgumentList(QStringLiteral("FocusOut"), argumentList);
}
inline QDBusPendingReply<QDBusVariant> GetEngine()
{
QList<QVariant> argumentList;
return asyncCallWithArgumentList(QLatin1String("GetEngine"), argumentList);
return asyncCallWithArgumentList(QStringLiteral("GetEngine"), argumentList);
}
inline QDBusPendingReply<bool> IsEnabled()
{
QList<QVariant> argumentList;
return asyncCallWithArgumentList(QLatin1String("IsEnabled"), argumentList);
return asyncCallWithArgumentList(QStringLiteral("IsEnabled"), argumentList);
}
inline QDBusPendingReply<bool> ProcessKeyEvent(uint keyval, uint keycode, uint state)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(keyval) << QVariant::fromValue(keycode) << QVariant::fromValue(state);
return asyncCallWithArgumentList(QLatin1String("ProcessKeyEvent"), argumentList);
return asyncCallWithArgumentList(QStringLiteral("ProcessKeyEvent"), argumentList);
}
inline QDBusPendingReply<> PropertyActivate(const QString &name, int state)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(name) << QVariant::fromValue(state);
return asyncCallWithArgumentList(QLatin1String("PropertyActivate"), argumentList);
return asyncCallWithArgumentList(QStringLiteral("PropertyActivate"), argumentList);
}
inline QDBusPendingReply<> Reset()
{
QList<QVariant> argumentList;
return asyncCallWithArgumentList(QLatin1String("Reset"), argumentList);
return asyncCallWithArgumentList(QStringLiteral("Reset"), argumentList);
}
inline QDBusPendingReply<> SetCapabilities(uint caps)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(caps);
return asyncCallWithArgumentList(QLatin1String("SetCapabilities"), argumentList);
return asyncCallWithArgumentList(QStringLiteral("SetCapabilities"), argumentList);
}
inline QDBusPendingReply<> SetCursorLocation(int x, int y, int w, int h)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(x) << QVariant::fromValue(y) << QVariant::fromValue(w) << QVariant::fromValue(h);
return asyncCallWithArgumentList(QLatin1String("SetCursorLocation"), argumentList);
return asyncCallWithArgumentList(QStringLiteral("SetCursorLocation"), argumentList);
}
inline QDBusPendingReply<> SetCursorLocationRelative(int x, int y, int w, int h)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(x) << QVariant::fromValue(y) << QVariant::fromValue(w) << QVariant::fromValue(h);
return asyncCallWithArgumentList(QLatin1String("SetCursorLocationRelative"), argumentList);
return asyncCallWithArgumentList(QStringLiteral("SetCursorLocationRelative"), argumentList);
}
inline QDBusPendingReply<> SetEngine(const QString &name)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(name);
return asyncCallWithArgumentList(QLatin1String("SetEngine"), argumentList);
return asyncCallWithArgumentList(QStringLiteral("SetEngine"), argumentList);
}
inline QDBusPendingReply<> SetSurroundingText(const QDBusVariant &text, uint cursor_pos, uint anchor_pos)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(text) << QVariant::fromValue(cursor_pos) << QVariant::fromValue(anchor_pos);
return asyncCallWithArgumentList(QLatin1String("SetSurroundingText"), argumentList);
return asyncCallWithArgumentList(QStringLiteral("SetSurroundingText"), argumentList);
}
Q_SIGNALS: // SIGNALS
@ -156,6 +169,7 @@ Q_SIGNALS: // SIGNALS
void UpdateAuxiliaryText(const QDBusVariant &text, bool visible);
void UpdateLookupTable(const QDBusVariant &table, bool visible);
void UpdatePreeditText(const QDBusVariant &text, uint cursor_pos, bool visible);
void UpdatePreeditTextWithMode(const QDBusVariant &text, uint cursor_pos, bool visible, uint mode);
void UpdateProperty(const QDBusVariant &prop);
};

View File

@ -51,6 +51,13 @@ class QIBusPlatformInputContextPrivate
{
Q_DISABLE_COPY_MOVE(QIBusPlatformInputContextPrivate)
public:
// This enum might be synced with IBusPreeditFocusMode
// in ibustypes.h of IBUS project
enum PreeditFocusMode {
PREEDIT_CLEAR = 0,
PREEDIT_COMMIT = 1,
};
QIBusPlatformInputContextPrivate();
~QIBusPlatformInputContextPrivate()
{
@ -80,6 +87,7 @@ public:
QList<QInputMethodEvent::Attribute> attributes;
bool needsSurroundingText;
QLocale locale;
PreeditFocusMode preeditFocusMode = PREEDIT_COMMIT; // for backward compatibility
};
@ -117,6 +125,7 @@ QIBusPlatformInputContext::QIBusPlatformInputContext ()
if (ok && enableSync == 1)
m_eventFilterUseSynchronousMode = true;
}
d->context->setClientCommitPreedit(QIBusPropTypeClientCommitPreedit(true));
}
QIBusPlatformInputContext::~QIBusPlatformInputContext (void)
@ -171,10 +180,18 @@ void QIBusPlatformInputContext::commit()
return;
}
if (!d->predit.isEmpty()) {
QInputMethodEvent event;
event.setCommitString(d->predit);
QCoreApplication::sendEvent(input, &event);
if (d->preeditFocusMode == QIBusPlatformInputContextPrivate::PREEDIT_COMMIT) {
if (!d->predit.isEmpty()) {
QInputMethodEvent event;
event.setCommitString(d->predit);
QCoreApplication::sendEvent(input, &event);
}
} else {
if (!d->predit.isEmpty()) {
// Clear the existing preedit
QInputMethodEvent event;
QCoreApplication::sendEvent(input, &event);
}
}
d->context->Reset();
@ -318,6 +335,15 @@ void QIBusPlatformInputContext::updatePreeditText(const QDBusVariant &text, uint
d->predit = t.text;
}
void QIBusPlatformInputContext::updatePreeditTextWithMode(const QDBusVariant &text, uint cursorPos, bool visible, uint mode)
{
updatePreeditText(text, cursorPos, visible);
if (mode > 0)
d->preeditFocusMode = QIBusPlatformInputContextPrivate::PreeditFocusMode::PREEDIT_COMMIT;
else
d->preeditFocusMode = QIBusPlatformInputContextPrivate::PreeditFocusMode::PREEDIT_CLEAR;
}
void QIBusPlatformInputContext::forwardKeyEvent(uint keyval, uint keycode, uint state)
{
if (!qApp)
@ -587,6 +613,7 @@ void QIBusPlatformInputContext::connectToContextSignals()
if (d->context) {
connect(d->context.get(), SIGNAL(CommitText(QDBusVariant)), SLOT(commitText(QDBusVariant)));
connect(d->context.get(), SIGNAL(UpdatePreeditText(QDBusVariant,uint,bool)), this, SLOT(updatePreeditText(QDBusVariant,uint,bool)));
connect(d->context.get(), SIGNAL(UpdatePreeditTextWithMode(QDBusVariant,uint,bool,uint)), this, SLOT(updatePreeditTextWithMode(QDBusVariant,uint,bool,uint)));
connect(d->context.get(), SIGNAL(ForwardKeyEvent(uint,uint,uint)), this, SLOT(forwardKeyEvent(uint,uint,uint)));
connect(d->context.get(), SIGNAL(DeleteSurroundingText(int,uint)), this, SLOT(deleteSurroundingText(int,uint)));
connect(d->context.get(), SIGNAL(RequireSurroundingText()), this, SLOT(surroundingTextRequired()));

View File

@ -14,6 +14,8 @@
#include <QTimer>
#include <QWindow>
#include "qibustypes.h"
QT_BEGIN_NAMESPACE
class QIBusPlatformInputContextPrivate;
@ -66,6 +68,7 @@ public:
public Q_SLOTS:
void commitText(const QDBusVariant &text);
void updatePreeditText(const QDBusVariant &text, uint cursor_pos, bool visible);
void updatePreeditTextWithMode(const QDBusVariant &text, uint cursor_pos, bool visible, uint mode);
void forwardKeyEvent(uint keyval, uint keycode, uint state);
void cursorRectChanged();
void deleteSurroundingText(int offset, uint n_chars);

View File

@ -2,7 +2,7 @@
* This file was generated by qdbusxml2cpp version 0.8
* Command line was: qdbusxml2cpp -N -p qibusproxyportal -c QIBusProxyPortal interfaces/org.freedesktop.IBus.Portal.xml
*
* qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd.
* qdbusxml2cpp is Copyright (C) 2023 The Qt Company Ltd and other contributors.
*
* This is an auto-generated file.
* This file may have been hand-edited. Look for HAND-EDIT comments
@ -24,4 +24,3 @@ QIBusProxyPortal::~QIBusProxyPortal()
{
}
#include "moc_qibusproxyportal.cpp"

View File

@ -2,7 +2,7 @@
* This file was generated by qdbusxml2cpp version 0.8
* Command line was: qdbusxml2cpp -N -p qibusproxyportal -c QIBusProxyPortal interfaces/org.freedesktop.IBus.Portal.xml
*
* qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd.
* qdbusxml2cpp is Copyright (C) 2023 The Qt Company Ltd and other contributors.
*
* This is an auto-generated file.
* Do not edit! All changes made to it will be lost.
@ -11,15 +11,14 @@
#ifndef QIBUSPROXYPORTAL_H
#define QIBUSPROXYPORTAL_H
#include <QObject>
#include <QByteArray>
#include <QList>
#include <QMap>
#include <QString>
#include <QStringList>
#include <QVariant>
#include <QDBusAbstractInterface>
#include <QDBusPendingReply>
#include <QtCore/QObject>
#include <QtCore/QByteArray>
#include <QtCore/QList>
#include <QtCore/QMap>
#include <QtCore/QString>
#include <QtCore/QStringList>
#include <QtCore/QVariant>
#include <QtDBus/QtDBus>
/*
* Proxy class for interface org.freedesktop.IBus.Portal

View File

@ -322,4 +322,44 @@ newest:
argument.endStructure();
}
QIBusPropTypeClientCommitPreedit::QIBusPropTypeClientCommitPreedit(bool inClientCommitPreedit)
: clientCommitPreedit(inClientCommitPreedit)
{
}
void QIBusPropTypeClientCommitPreedit::serializeTo(QDBusArgument &argument) const
{
argument.beginStructure();
argument << clientCommitPreedit;
argument.endStructure();
}
void QIBusPropTypeClientCommitPreedit::deserializeFrom(const QDBusArgument &argument)
{
argument.beginStructure();
argument >> clientCommitPreedit;
argument.endStructure();
}
QIBusPropTypeContentType::QIBusPropTypeContentType(unsigned int inPurpose, unsigned int inHints)
: purpose(inPurpose)
, hints(inHints)
{
}
void QIBusPropTypeContentType::serializeTo(QDBusArgument &argument) const
{
argument.beginStructure();
argument << purpose << hints;
argument.endStructure();
}
void QIBusPropTypeContentType::deserializeFrom(const QDBusArgument &argument)
{
argument.beginStructure();
argument >> purpose;
argument >> hints;
argument.endStructure();
}
QT_END_NAMESPACE

View File

@ -133,6 +133,44 @@ inline QDBusArgument &operator<<(QDBusArgument &argument, const QIBusEngineDesc
inline const QDBusArgument &operator>>(const QDBusArgument &argument, QIBusEngineDesc &desc)
{ desc.deserializeFrom(argument); return argument; }
class QIBusPropTypeClientCommitPreedit
{
public:
QIBusPropTypeClientCommitPreedit() {};
QIBusPropTypeClientCommitPreedit(bool inClientCommitPreedit);
void serializeTo(QDBusArgument &argument) const;
void deserializeFrom(const QDBusArgument &argument);
bool clientCommitPreedit;
};
inline QDBusArgument &operator<<(QDBusArgument &argument, const QIBusPropTypeClientCommitPreedit &data)
{ data.serializeTo(argument); return argument; }
inline const QDBusArgument &operator>>(const QDBusArgument &argument, QIBusPropTypeClientCommitPreedit &data)
{ data.deserializeFrom(argument); return argument; }
class QIBusPropTypeContentType
{
public:
QIBusPropTypeContentType() {};
QIBusPropTypeContentType(unsigned int inPurpose, unsigned int inHint);
void serializeTo(QDBusArgument &argument) const;
void deserializeFrom(const QDBusArgument &argument);
unsigned int purpose;
unsigned int hints;
};
inline QDBusArgument &operator<<(QDBusArgument &argument, const QIBusPropTypeContentType &data)
{ data.serializeTo(argument); return argument; }
inline const QDBusArgument &operator>>(const QDBusArgument &argument, QIBusPropTypeContentType &data)
{ data.deserializeFrom(argument); return argument; }
Q_DECLARE_TYPEINFO(QIBusPropTypeClientCommitPreedit, Q_RELOCATABLE_TYPE);
Q_DECLARE_TYPEINFO(QIBusPropTypeContentType, Q_RELOCATABLE_TYPE);
QT_END_NAMESPACE
Q_DECLARE_METATYPE(QIBusAttribute)
@ -140,4 +178,6 @@ Q_DECLARE_METATYPE(QIBusAttributeList)
Q_DECLARE_METATYPE(QIBusText)
Q_DECLARE_METATYPE(QIBusEngineDesc)
Q_DECLARE_METATYPE(QIBusPropTypeClientCommitPreedit)
Q_DECLARE_METATYPE(QIBusPropTypeContentType)
#endif