summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJiDe Zhang <zhangjide@uniontech.com>2024-03-05 16:08:00 +0000
committerTor Arne Vestbø <tor.arne.vestbo@qt.io>2024-03-10 16:51:56 +0000
commitfc3df6d3d62759e7abd2518792a77a1daf3fb6c8 (patch)
treeda7b02b9bbc93fba6fdb5f089288cfced01aa717 /src
parent95b8818ae1c3f24fb9dac1e59929c77a08b47b16 (diff)
Support multi-key for input context plugin
Sync from QPlatformInputContextFactory::requested in 8596998cb025a8338c9403f5ef9db5a23f5cc682 of qtbase to QPlatformInputContextFactory. Fixes: QTBUG-120202 Change-Id: Ib15d8a59c4cb3baaa19355ed5d7c30c87a7a1c16 Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/client/qwaylanddisplay.cpp8
-rw-r--r--src/client/qwaylanddisplay_p.h10
-rw-r--r--src/client/qwaylandintegration.cpp38
3 files changed, 35 insertions, 21 deletions
diff --git a/src/client/qwaylanddisplay.cpp b/src/client/qwaylanddisplay.cpp
index 7bc8d1889..97b04b1dc 100644
--- a/src/client/qwaylanddisplay.cpp
+++ b/src/client/qwaylanddisplay.cpp
@@ -342,7 +342,7 @@ void QWaylandDisplay::setupConnection()
if (!mXkbContext)
qCWarning(lcQpaWayland, "failed to create xkb context");
#endif
- if (!mClientSideInputContextRequested)
+ if (mWaylandInputContextRequested)
checkTextInputProtocol();
}
@@ -397,7 +397,7 @@ bool QWaylandDisplay::initialize()
// Give wl_output.done and zxdg_output_v1.done events a chance to arrive
forceRoundTrip();
}
- if (!mClientSideInputContextRequested)
+ if (mWaylandInputContextRequested)
mTextInputManagerIndex = INT_MAX;
return qEnvironmentVariableIntValue("QT_WAYLAND_DONT_CHECK_SHELL_INTEGRATION") || shellIntegration();
@@ -1015,8 +1015,8 @@ bool QWaylandDisplay::isKeyboardAvailable() const
[](const QWaylandInputDevice *device) { return device->keyboard() != nullptr; });
}
-bool QWaylandDisplay::isClientSideInputContextRequested() const {
- return mClientSideInputContextRequested;
+bool QWaylandDisplay::isWaylandInputContextRequested() const {
+ return mWaylandInputContextRequested;
}
#if QT_CONFIG(cursor)
diff --git a/src/client/qwaylanddisplay_p.h b/src/client/qwaylanddisplay_p.h
index 234524925..5b564c8d7 100644
--- a/src/client/qwaylanddisplay_p.h
+++ b/src/client/qwaylanddisplay_p.h
@@ -40,6 +40,8 @@ struct wp_viewport;
QT_BEGIN_NAMESPACE
+#define WAYLAND_IM_KEY "wayland"
+
class QAbstractEventDispatcher;
class QSocketNotifier;
class QPlatformScreen;
@@ -253,7 +255,7 @@ public:
wl_event_queue *frameEventQueue() { return m_frameEventQueue; };
bool isKeyboardAvailable() const;
- bool isClientSideInputContextRequested() const;
+ bool isWaylandInputContextRequested() const;
void initEventThread();
@@ -357,9 +359,9 @@ private:
static const wl_callback_listener syncCallbackListener;
bool mWaylandTryReconnect = false;
- bool mClientSideInputContextRequested = [] () {
- const QString& requested = QPlatformInputContextFactory::requested();
- return !requested.isEmpty() && requested != QLatin1String("wayland");
+ bool mWaylandInputContextRequested = [] () {
+ const auto requested = QPlatformInputContextFactory::requested();
+ return requested.isEmpty() || requested.contains(QLatin1String(WAYLAND_IM_KEY));
}();
QStringList mTextInputManagerList;
int mTextInputManagerIndex = INT_MAX;
diff --git a/src/client/qwaylandintegration.cpp b/src/client/qwaylandintegration.cpp
index 846556d4e..eb19be45d 100644
--- a/src/client/qwaylandintegration.cpp
+++ b/src/client/qwaylandintegration.cpp
@@ -462,23 +462,35 @@ void QWaylandIntegration::reconfigureInputContext()
return;
}
- const QString &requested = QPlatformInputContextFactory::requested();
- if (requested == QLatin1String("qtvirtualkeyboard"))
+ auto requested = QPlatformInputContextFactory::requested();
+ if (requested.contains(QLatin1String("qtvirtualkeyboard")))
qCWarning(lcQpaWayland) << "qtvirtualkeyboard currently is not supported at client-side,"
- " use QT_IM_MODULE=qtvirtualkeyboard at compositor-side.";
+ " use QT_IM_MODULES=qtvirtualkeyboard at compositor-side.";
- if (!mDisplay->isClientSideInputContextRequested()) {
- if (mDisplay->textInputMethodManager() != nullptr)
- mInputContext.reset(new QWaylandInputMethodContext(mDisplay.data()));
- else if (mDisplay->textInputManagerv1() != nullptr || mDisplay->textInputManagerv2() != nullptr || mDisplay->textInputManagerv3() != nullptr)
- mInputContext.reset(new QWaylandInputContext(mDisplay.data()));
- } else {
- mInputContext.reset(QPlatformInputContextFactory::create(requested));
- }
+ if (mDisplay->isWaylandInputContextRequested()
+ && !requested.contains(QLatin1String(WAYLAND_IM_KEY)))
+ requested.append(QLatin1String(WAYLAND_IM_KEY));
const QString defaultInputContext(QStringLiteral("compose"));
- if ((!mInputContext || !mInputContext->isValid()) && requested != defaultInputContext)
- mInputContext.reset(QPlatformInputContextFactory::create(defaultInputContext));
+ if (!requested.contains(defaultInputContext))
+ requested.append(defaultInputContext);
+
+ for (const QString &imKey : requested) {
+ if (imKey == QLatin1String(WAYLAND_IM_KEY)) {
+ Q_ASSERT(mDisplay->isWaylandInputContextRequested());
+ if (mDisplay->textInputMethodManager() != nullptr)
+ mInputContext.reset(new QWaylandInputMethodContext(mDisplay.data()));
+ else if (mDisplay->textInputManagerv1() != nullptr
+ || mDisplay->textInputManagerv2() != nullptr
+ || mDisplay->textInputManagerv3() != nullptr)
+ mInputContext.reset(new QWaylandInputContext(mDisplay.data()));
+ } else {
+ mInputContext.reset(QPlatformInputContextFactory::create(imKey));
+ }
+
+ if (mInputContext && mInputContext->isValid())
+ break;
+ }
#if QT_CONFIG(xkbcommon)
QXkbCommon::setXkbContext(mInputContext.data(), mDisplay->xkbContext());