40 : m_xkbContext(xkb_context_new(XKB_CONTEXT_NO_FLAGS))
42 const xcb_query_extension_reply_t *reply = xcb_get_extension_data(kwinApp()->x11Connection(), &xcb_xkb_id);
43 if (!reply || !reply->present) {
44 qWarning() <<
"XKeyboard extension is unavailable";
48 m_deviceId = xkb_x11_get_core_keyboard_device_id(kwinApp()->x11Connection());
49 if (m_deviceId == -1) {
50 qWarning() <<
"xkb_x11_get_core_keyboard_device_id() failed";
56 (XCB_XKB_EVENT_TYPE_NEW_KEYBOARD_NOTIFY
57 | XCB_XKB_EVENT_TYPE_MAP_NOTIFY
58 | XCB_XKB_EVENT_TYPE_STATE_NOTIFY),
61 (XCB_XKB_NKN_DETAIL_KEYCODES),
64 (XCB_XKB_MAP_PART_KEY_TYPES
65 | XCB_XKB_MAP_PART_KEY_SYMS
66 | XCB_XKB_MAP_PART_MODIFIER_MAP
67 | XCB_XKB_MAP_PART_EXPLICIT_COMPONENTS
68 | XCB_XKB_MAP_PART_KEY_ACTIONS
69 | XCB_XKB_MAP_PART_VIRTUAL_MODS
70 | XCB_XKB_MAP_PART_VIRTUAL_MOD_MAP),
72 requiredStateDetails =
73 (XCB_XKB_STATE_PART_MODIFIER_BASE
74 | XCB_XKB_STATE_PART_MODIFIER_LATCH
75 | XCB_XKB_STATE_PART_MODIFIER_LOCK
76 | XCB_XKB_STATE_PART_GROUP_BASE
77 | XCB_XKB_STATE_PART_GROUP_LATCH
78 | XCB_XKB_STATE_PART_GROUP_LOCK),
81 static const xcb_xkb_select_events_details_t details = {
82 .affectNewKeyboard = requiredNknDetails,
83 .newKeyboardDetails = requiredNknDetails,
84 .affectState = requiredStateDetails,
85 .stateDetails = requiredStateDetails,
88 xcb_void_cookie_t cookie =
89 xcb_xkb_select_events_aux_checked(kwinApp()->x11Connection(),
98 xcb_generic_error_t *error = xcb_request_check(kwinApp()->x11Connection(), cookie);
106 m_filter = std::make_unique<X11KeyboardFilter>(
this, reply->first_event);
130 uint8_t response_type;
133 xcb_timestamp_t time;
136 xcb_xkb_new_keyboard_notify_event_t new_keyboard_notify;
137 xcb_xkb_map_notify_event_t map_notify;
138 xcb_xkb_state_notify_event_t state_notify;
139 } *
event =
reinterpret_cast<union xkb_event *
>(gevent);
141 if (
event->any.deviceID == m_deviceId) {
142 switch (
event->any.xkbType) {
143 case XCB_XKB_NEW_KEYBOARD_NOTIFY:
144 if (
event->new_keyboard_notify.changed & XCB_XKB_NKN_DETAIL_KEYCODES) {
149 case XCB_XKB_MAP_NOTIFY:
153 case XCB_XKB_STATE_NOTIFY:
154 xkb_state_update_mask(m_xkbState,
155 event->state_notify.baseMods,
156 event->state_notify.latchedMods,
157 event->state_notify.lockedMods,
158 event->state_notify.baseGroup,
159 event->state_notify.latchedGroup,
160 event->state_notify.lockedGroup);
170 xkb_keymap *keymap = xkb_x11_keymap_new_from_device(m_xkbContext, kwinApp()->x11Connection(), m_deviceId, XKB_KEYMAP_COMPILE_NO_FLAGS);
206 Qt::KeyboardModifiers mods;
208 if (xkb_state_mod_name_is_active(m_xkbState, XKB_MOD_NAME_SHIFT, XKB_STATE_MODS_EFFECTIVE) == 1 || xkb_state_mod_name_is_active(m_xkbState, XKB_MOD_NAME_CAPS, XKB_STATE_MODS_EFFECTIVE) == 1) {
209 mods |= Qt::ShiftModifier;
211 if (xkb_state_mod_name_is_active(m_xkbState, XKB_MOD_NAME_ALT, XKB_STATE_MODS_EFFECTIVE) == 1) {
212 mods |= Qt::AltModifier;
214 if (xkb_state_mod_name_is_active(m_xkbState, XKB_MOD_NAME_CTRL, XKB_STATE_MODS_EFFECTIVE) == 1) {
215 mods |= Qt::ControlModifier;
217 if (xkb_state_mod_name_is_active(m_xkbState, XKB_MOD_NAME_LOGO, XKB_STATE_MODS_EFFECTIVE) == 1) {
218 mods |= Qt::MetaModifier;