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)
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)

View File

@ -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;

View File

@ -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());