24QLibInputKeyboard::QLibInputKeyboard()
26#if QT_CONFIG(xkbcommon)
27 qCDebug(qLcLibInput) <<
"Using xkbcommon for key mapping";
28 m_ctx = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
30 qWarning(
"Failed to create xkb context");
33 m_keymap = xkb_keymap_new_from_names(m_ctx,
nullptr, XKB_KEYMAP_COMPILE_NO_FLAGS);
35 qCWarning(qLcLibInput,
"Failed to compile keymap");
38 m_state = xkb_state_new(m_keymap);
40 qCWarning(qLcLibInput,
"Failed to create xkb state");
44 m_repeatTimer.setSingleShot(
true);
45 connect(&m_repeatTimer, &QTimer::timeout,
this, &QLibInputKeyboard::handleRepeat);
47 qCWarning(qLcLibInput) <<
"xkbcommon not available, not performing key mapping";
63void QLibInputKeyboard::processKey(libinput_event_keyboard *e)
65#if QT_CONFIG(xkbcommon)
66 if (!m_ctx || !m_keymap || !m_state)
69 const uint32_t keycode = libinput_event_keyboard_get_key(e) + 8;
70 const xkb_keysym_t sym = xkb_state_key_get_one_sym(m_state, keycode);
71 const bool pressed = libinput_event_keyboard_get_key_state(e) == LIBINPUT_KEY_STATE_PRESSED;
76 Qt::KeyboardModifiers modifiers = QXkbCommon::modifiers(m_state);
78 const QString text = QXkbCommon::lookupString(m_state, keycode);
79 const int qtkey = QXkbCommon::keysymToQtKey(sym, modifiers, m_state, keycode);
81 xkb_state_update_key(m_state, keycode, pressed ? XKB_KEY_DOWN : XKB_KEY_UP);
83 Qt::KeyboardModifiers modifiersAfterStateChange = QXkbCommon::modifiers(m_state, sym);
84 QGuiApplicationPrivate::inputDeviceManager()->setKeyboardModifiers(modifiersAfterStateChange);
86 QWindowSystemInterface::handleExtendedKeyEvent(
nullptr,
87 pressed ? QEvent::KeyPress : QEvent::KeyRelease,
88 qtkey, modifiers, keycode, sym, modifiers, text);
90 if (pressed && xkb_keymap_key_repeats(m_keymap, keycode)) {
91 m_repeatData.qtkey = qtkey;
92 m_repeatData.mods = modifiers;
93 m_repeatData.nativeScanCode = keycode;
94 m_repeatData.virtualKey = sym;
95 m_repeatData.nativeMods = modifiers;
96 m_repeatData.unicodeText = text;
97 m_repeatData.repeatCount = 1;
98 m_repeatTimer.setInterval(REPEAT_DELAY);
99 m_repeatTimer.start();
100 }
else if (m_repeatTimer.isActive()) {
101 m_repeatTimer.stop();
114 m_repeatData.nativeScanCode, m_repeatData.virtualKey, m_repeatData.nativeMods,
115 m_repeatData.unicodeText,
true, m_repeatData.repeatCount);