From 84cf0e2be54d9ad183db063fd429b792c67edd18 Mon Sep 17 00:00:00 2001 From: Inho Lee Date: Fri, 5 Jan 2024 21:22:54 +0100 Subject: [PATCH] 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.7 6.6 6.5 Change-Id: I6bb78921ce04cdd3197cba9e2fb00376d5e0ac8b Reviewed-by: Liang Qi --- .../org.freedesktop.IBus.InputContext.xml | 12 ++++ .../platforminputcontexts/ibus/main.cpp | 2 + .../ibus/qibusinputcontextproxy.cpp | 3 +- .../ibus/qibusinputcontextproxy.h | 68 +++++++++++-------- .../ibus/qibusplatforminputcontext.cpp | 35 ++++++++-- .../ibus/qibusplatforminputcontext.h | 3 + .../ibus/qibusproxyportal.cpp | 3 +- .../ibus/qibusproxyportal.h | 19 +++--- .../platforminputcontexts/ibus/qibustypes.cpp | 40 +++++++++++ .../platforminputcontexts/ibus/qibustypes.h | 40 +++++++++++ 10 files changed, 180 insertions(+), 45 deletions(-) diff --git a/src/plugins/platforminputcontexts/ibus/interfaces/org.freedesktop.IBus.InputContext.xml b/src/plugins/platforminputcontexts/ibus/interfaces/org.freedesktop.IBus.InputContext.xml index 30c326d06fc..30fa7431c30 100644 --- a/src/plugins/platforminputcontexts/ibus/interfaces/org.freedesktop.IBus.InputContext.xml +++ b/src/plugins/platforminputcontexts/ibus/interfaces/org.freedesktop.IBus.InputContext.xml @@ -2,6 +2,12 @@ "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd"> + + + + + + @@ -62,6 +68,12 @@ + + + + + + diff --git a/src/plugins/platforminputcontexts/ibus/main.cpp b/src/plugins/platforminputcontexts/ibus/main.cpp index a0036db31e7..d74be4bedf6 100644 --- a/src/plugins/platforminputcontexts/ibus/main.cpp +++ b/src/plugins/platforminputcontexts/ibus/main.cpp @@ -28,6 +28,8 @@ QIBusPlatformInputContext *QIbusPlatformInputContextPlugin::create(const QString qDBusRegisterMetaType(); qDBusRegisterMetaType(); qDBusRegisterMetaType(); + qDBusRegisterMetaType(); + qDBusRegisterMetaType(); return new QIBusPlatformInputContext; } diff --git a/src/plugins/platforminputcontexts/ibus/qibusinputcontextproxy.cpp b/src/plugins/platforminputcontexts/ibus/qibusinputcontextproxy.cpp index 8e2027272a6..248abbc32b2 100644 --- a/src/plugins/platforminputcontexts/ibus/qibusinputcontextproxy.cpp +++ b/src/plugins/platforminputcontexts/ibus/qibusinputcontextproxy.cpp @@ -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" diff --git a/src/plugins/platforminputcontexts/ibus/qibusinputcontextproxy.h b/src/plugins/platforminputcontexts/ibus/qibusinputcontextproxy.h index 31a181eec29..82e78aa35b7 100644 --- a/src/plugins/platforminputcontexts/ibus/qibusinputcontextproxy.h +++ b/src/plugins/platforminputcontexts/ibus/qibusinputcontextproxy.h @@ -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 -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +// 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 argumentList; - return asyncCallWithArgumentList(QLatin1String("Destroy"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("Destroy"), argumentList); } inline QDBusPendingReply<> Disable() { QList argumentList; - return asyncCallWithArgumentList(QLatin1String("Disable"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("Disable"), argumentList); } inline QDBusPendingReply<> Enable() { QList argumentList; - return asyncCallWithArgumentList(QLatin1String("Enable"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("Enable"), argumentList); } inline QDBusPendingReply<> FocusIn() { QList argumentList; - return asyncCallWithArgumentList(QLatin1String("FocusIn"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("FocusIn"), argumentList); } inline QDBusPendingReply<> FocusOut() { QList argumentList; - return asyncCallWithArgumentList(QLatin1String("FocusOut"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("FocusOut"), argumentList); } inline QDBusPendingReply GetEngine() { QList argumentList; - return asyncCallWithArgumentList(QLatin1String("GetEngine"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("GetEngine"), argumentList); } inline QDBusPendingReply IsEnabled() { QList argumentList; - return asyncCallWithArgumentList(QLatin1String("IsEnabled"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("IsEnabled"), argumentList); } inline QDBusPendingReply ProcessKeyEvent(uint keyval, uint keycode, uint state) { QList 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 argumentList; argumentList << QVariant::fromValue(name) << QVariant::fromValue(state); - return asyncCallWithArgumentList(QLatin1String("PropertyActivate"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("PropertyActivate"), argumentList); } inline QDBusPendingReply<> Reset() { QList argumentList; - return asyncCallWithArgumentList(QLatin1String("Reset"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("Reset"), argumentList); } inline QDBusPendingReply<> SetCapabilities(uint caps) { QList 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 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 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 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 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); }; diff --git a/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp b/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp index b14772e1c78..4a1e9db75e6 100644 --- a/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp +++ b/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp @@ -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 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())); diff --git a/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.h b/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.h index 33ddb7af5dd..ef8c0b7c8f3 100644 --- a/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.h +++ b/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.h @@ -14,6 +14,8 @@ #include #include +#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); diff --git a/src/plugins/platforminputcontexts/ibus/qibusproxyportal.cpp b/src/plugins/platforminputcontexts/ibus/qibusproxyportal.cpp index 54d8f731fbb..dc5b37aa6e4 100644 --- a/src/plugins/platforminputcontexts/ibus/qibusproxyportal.cpp +++ b/src/plugins/platforminputcontexts/ibus/qibusproxyportal.cpp @@ -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" diff --git a/src/plugins/platforminputcontexts/ibus/qibusproxyportal.h b/src/plugins/platforminputcontexts/ibus/qibusproxyportal.h index 4b921db8142..450205f12a4 100644 --- a/src/plugins/platforminputcontexts/ibus/qibusproxyportal.h +++ b/src/plugins/platforminputcontexts/ibus/qibusproxyportal.h @@ -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 -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include /* * Proxy class for interface org.freedesktop.IBus.Portal diff --git a/src/plugins/platforminputcontexts/ibus/qibustypes.cpp b/src/plugins/platforminputcontexts/ibus/qibustypes.cpp index 9d61d61eb3b..ab1a244b6d9 100644 --- a/src/plugins/platforminputcontexts/ibus/qibustypes.cpp +++ b/src/plugins/platforminputcontexts/ibus/qibustypes.cpp @@ -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 diff --git a/src/plugins/platforminputcontexts/ibus/qibustypes.h b/src/plugins/platforminputcontexts/ibus/qibustypes.h index 60f24bcf54e..b697e432a07 100644 --- a/src/plugins/platforminputcontexts/ibus/qibustypes.h +++ b/src/plugins/platforminputcontexts/ibus/qibustypes.h @@ -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