diff options
-rw-r--r-- | src/client/qwaylanddisplay.cpp | 8 | ||||
-rw-r--r-- | src/client/qwaylanddisplay_p.h | 10 | ||||
-rw-r--r-- | src/client/qwaylandintegration.cpp | 38 |
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()); |