xcb: stablilize xkb state when keymap updated
QXcbKeyboard only deals with core_device_id. With the reporter's test case: using xdotool to send a string, the deviceID is not changed, then we assume xkb_state_new() is more stable(or correct) than xkb_x11_state_new_from_device() in this case. See also https://www.x.org/releases/current/doc/man/man3/xcb_xkb_new_keyboard_notify_event_t.3.xhtml . Fixes: QTBUG-95933 Pick-to: 6.2 5.15 Change-Id: Ic595e1f1424fbc6814871a85ac159907f1aeb12a Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Zhang Hao <zhanghao@uniontech.com> Reviewed-by: Liang Qi <liang.qi@qt.io>
This commit is contained in:
parent
f92d4ffead
commit
27c25fc909
@ -773,7 +773,7 @@ void QXcbConnection::handleXcbEvent(xcb_generic_event_t *event)
|
||||
case XCB_XKB_NEW_KEYBOARD_NOTIFY: {
|
||||
xcb_xkb_new_keyboard_notify_event_t *ev = &xkb_event->new_keyboard_notify;
|
||||
if (ev->changed & XCB_XKB_NKN_DETAIL_KEYCODES)
|
||||
m_keyboard->updateKeymap();
|
||||
m_keyboard->updateKeymap(ev);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
|
@ -365,6 +365,17 @@ void QXcbKeyboard::updateKeymap(xcb_mapping_notify_event_t *event)
|
||||
updateKeymap();
|
||||
}
|
||||
|
||||
void QXcbKeyboard::updateKeymap(xcb_xkb_new_keyboard_notify_event_t *event)
|
||||
{
|
||||
if (!event)
|
||||
return;
|
||||
|
||||
if (event->deviceID != event->oldDeviceID)
|
||||
m_config = false;
|
||||
|
||||
updateKeymap();
|
||||
}
|
||||
|
||||
void QXcbKeyboard::updateKeymap()
|
||||
{
|
||||
KeysymModifierMap keysymMods;
|
||||
@ -372,8 +383,6 @@ void QXcbKeyboard::updateKeymap()
|
||||
keysymMods = keysymsToModifiers();
|
||||
updateModifiers(keysymMods);
|
||||
|
||||
m_config = true;
|
||||
|
||||
if (!m_xkbContext) {
|
||||
m_xkbContext.reset(xkb_context_new(XKB_CONTEXT_NO_DEFAULT_INCLUDES));
|
||||
if (!m_xkbContext) {
|
||||
@ -389,8 +398,13 @@ void QXcbKeyboard::updateKeymap()
|
||||
if (connection()->hasXKB()) {
|
||||
m_xkbKeymap.reset(xkb_x11_keymap_new_from_device(m_xkbContext.get(), xcb_connection(),
|
||||
core_device_id, XKB_KEYMAP_COMPILE_NO_FLAGS));
|
||||
if (m_xkbKeymap)
|
||||
m_xkbState.reset(xkb_x11_state_new_from_device(m_xkbKeymap.get(), xcb_connection(), core_device_id));
|
||||
if (m_xkbKeymap) {
|
||||
if (m_config)
|
||||
m_xkbState.reset(xkb_state_new(m_xkbKeymap.get()));
|
||||
else
|
||||
m_xkbState.reset(xkb_x11_state_new_from_device(m_xkbKeymap.get(), xcb_connection(), core_device_id));
|
||||
|
||||
}
|
||||
} else {
|
||||
m_xkbKeymap.reset(keymapFromCore(keysymMods));
|
||||
if (m_xkbKeymap)
|
||||
@ -411,6 +425,8 @@ void QXcbKeyboard::updateKeymap()
|
||||
updateXKBMods();
|
||||
|
||||
QXkbCommon::verifyHasLatinLayout(m_xkbKeymap.get());
|
||||
|
||||
m_config = true;
|
||||
}
|
||||
|
||||
QList<int> QXcbKeyboard::possibleKeys(const QKeyEvent *event) const
|
||||
|
@ -69,6 +69,7 @@ public:
|
||||
|
||||
Qt::KeyboardModifiers translateModifiers(int s) const;
|
||||
void updateKeymap(xcb_mapping_notify_event_t *event);
|
||||
void updateKeymap(xcb_xkb_new_keyboard_notify_event_t *event);
|
||||
void updateKeymap();
|
||||
QList<int> possibleKeys(const QKeyEvent *event) const;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user