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)
|
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)
|
||||||
|
@ -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;
|
||||||
|
@ -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());
|
||||||
|
Loading…
x
Reference in New Issue
Block a user