Revert "xcb: stablilize xkb state when keymap updated"
This reverts commit 27c25fc909.
Currently Qt only supports core device of keyboard, not every
real keyboard. Create a new xkb state during
xcb_xkb_new_keyboard_notify_event_t, it will lose the correct
state before the event, for example, when using the second
or later layout than the first one. The new xkb state will
use the first layout. It's difficult to sync the xkb states.
Fixes: QTBUG-102493
Fixes: QTBUG-102640
Task-number: QTBUG-95933
Pick-to: 6.3 6.2 5.15
Change-Id: Iaa5369ff9f5495e194577dcbb8f78303158c9a73
Reviewed-by: Lu YaNing <luyaning@uniontech.com>
Reviewed-by: Zhang Hao <543985125@qq.com>
Reviewed-by: Liang Qi <liang.qi@qt.io>
Reviewed-by: Ilya Fedin <fedin-ilja2010@ya.ru>
bb10
parent
71684763b7
commit
9b92c5314e
|
|
@ -775,7 +775,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(ev);
|
||||
m_keyboard->updateKeymap();
|
||||
break;
|
||||
}
|
||||
default:
|
||||
|
|
|
|||
|
|
@ -365,17 +365,6 @@ 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;
|
||||
|
|
@ -383,6 +372,8 @@ 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) {
|
||||
|
|
@ -398,13 +389,8 @@ 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) {
|
||||
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));
|
||||
|
||||
}
|
||||
if (m_xkbKeymap)
|
||||
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)
|
||||
|
|
@ -425,8 +411,6 @@ void QXcbKeyboard::updateKeymap()
|
|||
updateXKBMods();
|
||||
|
||||
QXkbCommon::verifyHasLatinLayout(m_xkbKeymap.get());
|
||||
|
||||
m_config = true;
|
||||
}
|
||||
|
||||
QList<int> QXcbKeyboard::possibleKeys(const QKeyEvent *event) const
|
||||
|
|
|
|||
|
|
@ -69,7 +69,6 @@ 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