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>
This commit is contained in:
JiDe Zhang 2024-03-05 16:08:00 +00:00 committed by Tor Arne Vestbø
parent 5fb45c9590
commit d3adcc073a
3 changed files with 35 additions and 21 deletions

View File

@ -342,7 +342,7 @@ void QWaylandDisplay::setupConnection()
if (!mXkbContext) if (!mXkbContext)
qCWarning(lcQpaWayland, "failed to create xkb context"); qCWarning(lcQpaWayland, "failed to create xkb context");
#endif #endif
if (!mClientSideInputContextRequested) if (mWaylandInputContextRequested)
checkTextInputProtocol(); checkTextInputProtocol();
} }
@ -397,7 +397,7 @@ bool QWaylandDisplay::initialize()
// Give wl_output.done and zxdg_output_v1.done events a chance to arrive // Give wl_output.done and zxdg_output_v1.done events a chance to arrive
forceRoundTrip(); forceRoundTrip();
} }
if (!mClientSideInputContextRequested) if (mWaylandInputContextRequested)
mTextInputManagerIndex = INT_MAX; mTextInputManagerIndex = INT_MAX;
return qEnvironmentVariableIntValue("QT_WAYLAND_DONT_CHECK_SHELL_INTEGRATION") || shellIntegration(); return qEnvironmentVariableIntValue("QT_WAYLAND_DONT_CHECK_SHELL_INTEGRATION") || shellIntegration();
@ -1015,8 +1015,8 @@ bool QWaylandDisplay::isKeyboardAvailable() const
[](const QWaylandInputDevice *device) { return device->keyboard() != nullptr; }); [](const QWaylandInputDevice *device) { return device->keyboard() != nullptr; });
} }
bool QWaylandDisplay::isClientSideInputContextRequested() const { bool QWaylandDisplay::isWaylandInputContextRequested() const {
return mClientSideInputContextRequested; return mWaylandInputContextRequested;
} }
#if QT_CONFIG(cursor) #if QT_CONFIG(cursor)

View File

@ -40,6 +40,8 @@ struct wp_viewport;
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
#define WAYLAND_IM_KEY "wayland"
class QAbstractEventDispatcher; class QAbstractEventDispatcher;
class QSocketNotifier; class QSocketNotifier;
class QPlatformScreen; class QPlatformScreen;
@ -253,7 +255,7 @@ public:
wl_event_queue *frameEventQueue() { return m_frameEventQueue; }; wl_event_queue *frameEventQueue() { return m_frameEventQueue; };
bool isKeyboardAvailable() const; bool isKeyboardAvailable() const;
bool isClientSideInputContextRequested() const; bool isWaylandInputContextRequested() const;
void initEventThread(); void initEventThread();
@ -357,9 +359,9 @@ private:
static const wl_callback_listener syncCallbackListener; static const wl_callback_listener syncCallbackListener;
bool mWaylandTryReconnect = false; bool mWaylandTryReconnect = false;
bool mClientSideInputContextRequested = [] () { bool mWaylandInputContextRequested = [] () {
const QString& requested = QPlatformInputContextFactory::requested(); const auto requested = QPlatformInputContextFactory::requested();
return !requested.isEmpty() && requested != QLatin1String("wayland"); return requested.isEmpty() || requested.contains(QLatin1String(WAYLAND_IM_KEY));
}(); }();
QStringList mTextInputManagerList; QStringList mTextInputManagerList;
int mTextInputManagerIndex = INT_MAX; int mTextInputManagerIndex = INT_MAX;

View File

@ -462,23 +462,35 @@ void QWaylandIntegration::reconfigureInputContext()
return; return;
} }
const QString &requested = QPlatformInputContextFactory::requested(); auto requested = QPlatformInputContextFactory::requested();
if (requested == QLatin1String("qtvirtualkeyboard")) if (requested.contains(QLatin1String("qtvirtualkeyboard")))
qCWarning(lcQpaWayland) << "qtvirtualkeyboard currently is not supported at client-side," 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->isWaylandInputContextRequested()
if (mDisplay->textInputMethodManager() != nullptr) && !requested.contains(QLatin1String(WAYLAND_IM_KEY)))
mInputContext.reset(new QWaylandInputMethodContext(mDisplay.data())); requested.append(QLatin1String(WAYLAND_IM_KEY));
else if (mDisplay->textInputManagerv1() != nullptr || mDisplay->textInputManagerv2() != nullptr || mDisplay->textInputManagerv3() != nullptr)
mInputContext.reset(new QWaylandInputContext(mDisplay.data()));
} else {
mInputContext.reset(QPlatformInputContextFactory::create(requested));
}
const QString defaultInputContext(QStringLiteral("compose")); const QString defaultInputContext(QStringLiteral("compose"));
if ((!mInputContext || !mInputContext->isValid()) && requested != defaultInputContext) if (!requested.contains(defaultInputContext))
mInputContext.reset(QPlatformInputContextFactory::create(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) #if QT_CONFIG(xkbcommon)
QXkbCommon::setXkbContext(mInputContext.data(), mDisplay->xkbContext()); QXkbCommon::setXkbContext(mInputContext.data(), mDisplay->xkbContext());