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:
parent
5fb45c9590
commit
d3adcc073a
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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());
|
||||
|
Loading…
x
Reference in New Issue
Block a user