7#include <qpa/qwindowsysteminterface.h>
8#include <qpa/qplatforminputcontext.h>
9#include <qpa/qplatformintegration.h>
10#include <qpa/qplatformcursor.h>
12#include <QtCore/QMetaEnum>
14#include <private/qguiapplication_p.h>
16#include <xcb/xinput.h>
23 if (
s & XCB_MOD_MASK_SHIFT)
25 if (
s & XCB_MOD_MASK_CONTROL)
27 if (
s & rmod_masks.alt)
29 if (
s & rmod_masks.meta)
31 if (
s & rmod_masks.altgr)
44 if (shifted != XKB_KEY_NoSymbol)
52 && unshifted == xupper) {
62 while (
count > 0 && symbols[
count - 1] == XKB_KEY_NoSymbol)
66 for (
int symIndex = 0; symIndex <
count; symIndex++) {
67 xcb_keysym_t sym = symbols[symIndex];
69 if (sym == XKB_KEY_NoSymbol)
70 strcpy(symString,
"NoSymbol");
72 xkb_keysym_get_name(sym, symString,
sizeof(symString));
86 keymap +=
"xkb_keymap {\n";
94 "xkb_keycodes \"core\" {\n"
97 for (
int code = minKeycode; code <= maxKeycode; code++) {
99 keymap +=
"<K" + codeStr +
"> = " + codeStr +
";\n";
109 "xkb_types \"core\" {\n"
110 "virtual_modifiers NumLock,Alt,LevelThree;\n"
111 "type \"ONE_LEVEL\" {\n"
113 "level_name[Level1] = \"Any\";\n"
115 "type \"TWO_LEVEL\" {\n"
116 "modifiers= Shift;\n"
117 "map[Shift]= Level2;\n"
118 "level_name[Level1] = \"Base\";\n"
119 "level_name[Level2] = \"Shift\";\n"
121 "type \"ALPHABETIC\" {\n"
122 "modifiers= Shift+Lock;\n"
123 "map[Shift]= Level2;\n"
124 "map[Lock]= Level2;\n"
125 "level_name[Level1] = \"Base\";\n"
126 "level_name[Level2] = \"Caps\";\n"
128 "type \"KEYPAD\" {\n"
129 "modifiers= Shift+NumLock;\n"
130 "map[Shift]= Level2;\n"
131 "map[NumLock]= Level2;\n"
132 "level_name[Level1] = \"Base\";\n"
133 "level_name[Level2] = \"Number\";\n"
135 "type \"FOUR_LEVEL\" {\n"
136 "modifiers= Shift+LevelThree;\n"
137 "map[Shift]= Level2;\n"
138 "map[LevelThree]= Level3;\n"
139 "map[Shift+LevelThree]= Level4;\n"
140 "level_name[Level1] = \"Base\";\n"
141 "level_name[Level2] = \"Shift\";\n"
142 "level_name[Level3] = \"Alt Base\";\n"
143 "level_name[Level4] = \"Shift Alt\";\n"
145 "type \"FOUR_LEVEL_ALPHABETIC\" {\n"
146 "modifiers= Shift+Lock+LevelThree;\n"
147 "map[Shift]= Level2;\n"
148 "map[Lock]= Level2;\n"
149 "map[LevelThree]= Level3;\n"
150 "map[Shift+LevelThree]= Level4;\n"
151 "map[Lock+LevelThree]= Level4;\n"
152 "map[Shift+Lock+LevelThree]= Level3;\n"
153 "level_name[Level1] = \"Base\";\n"
154 "level_name[Level2] = \"Shift\";\n"
155 "level_name[Level3] = \"Alt Base\";\n"
156 "level_name[Level4] = \"Shift Alt\";\n"
158 "type \"FOUR_LEVEL_SEMIALPHABETIC\" {\n"
159 "modifiers= Shift+Lock+LevelThree;\n"
160 "map[Shift]= Level2;\n"
161 "map[Lock]= Level2;\n"
162 "map[LevelThree]= Level3;\n"
163 "map[Shift+LevelThree]= Level4;\n"
164 "map[Lock+LevelThree]= Level3;\n"
165 "preserve[Lock+LevelThree]= Lock;\n"
166 "map[Shift+Lock+LevelThree]= Level4;\n"
167 "preserve[Shift+Lock+LevelThree]= Lock;\n"
168 "level_name[Level1] = \"Base\";\n"
169 "level_name[Level2] = \"Shift\";\n"
170 "level_name[Level3] = \"Alt Base\";\n"
171 "level_name[Level4] = \"Shift Alt\";\n"
173 "type \"FOUR_LEVEL_KEYPAD\" {\n"
174 "modifiers= Shift+NumLock+LevelThree;\n"
175 "map[Shift]= Level2;\n"
176 "map[NumLock]= Level2;\n"
177 "map[LevelThree]= Level3;\n"
178 "map[Shift+LevelThree]= Level4;\n"
179 "map[NumLock+LevelThree]= Level4;\n"
180 "map[Shift+NumLock+LevelThree]= Level3;\n"
181 "level_name[Level1] = \"Base\";\n"
182 "level_name[Level2] = \"Number\";\n"
183 "level_name[Level3] = \"Alt Base\";\n"
184 "level_name[Level4] = \"Alt Number\";\n"
191 int keysymsPerKeycode = 0;
193 int keycodeCount = maxKeycode - minKeycode + 1;
195 minKeycode, keycodeCount)) {
196 keysymsPerKeycode = keymapReply->keysyms_per_keycode;
197 int numSyms = keycodeCount * keysymsPerKeycode;
198 auto keymapPtr = xcb_get_keyboard_mapping_keysyms(keymapReply.get());
200 for (
int i = 0;
i < numSyms;
i++)
201 xkeymap[
i] = keymapPtr[
i];
207 static const char *
const builtinModifiers[] =
208 {
"Shift",
"Lock",
"Control",
"Mod1",
"Mod2",
"Mod3",
"Mod4",
"Mod5" };
215 bool mapGroup2ToLevel3 = keysymsPerKeycode < 5;
217 keymap +=
"xkb_symbols \"core\" {\n";
218 for (
int code = minKeycode; code <= maxKeycode; code++) {
219 auto codeMap = xkeymap.
constData() + (code - minKeycode) * keysymsPerKeycode;
221 const int maxGroup1 = 4;
222 const int maxGroup2 = 2;
223 xcb_keysym_t symbolsGroup1[maxGroup1];
224 xcb_keysym_t symbolsGroup2[maxGroup2] = { XKB_KEY_NoSymbol, XKB_KEY_NoSymbol };
225 for (
int i = 0;
i < maxGroup1 + maxGroup2;
i++) {
226 xcb_keysym_t sym =
i < keysymsPerKeycode ? codeMap[
i] : XKB_KEY_NoSymbol;
227 if (mapGroup2ToLevel3) {
230 symbolsGroup1[
i] = sym;
234 symbolsGroup1[
i] = sym;
236 symbolsGroup2[
i - 2] = sym;
238 symbolsGroup1[
i - 2] = sym;
245 symbolsGroup1[1] = symbolsGroup1[0];
246 symbolsGroup1[0] = lowered;
249 symbolsGroup2[1] = symbolsGroup2[0];
250 symbolsGroup2[0] = lowered;
258 keymap +=
"symbols[Group1] = [ " + groupStr1 +
" ]";
261 keymap +=
", symbols[Group2] = [ " + groupStr2 +
" ]";
264 xcb_keysym_t modifierSym = XKB_KEY_NoSymbol;
265 for (
int symIndex = 0; symIndex < keysymsPerKeycode; symIndex++) {
266 xcb_keysym_t sym = codeMap[symIndex];
268 if (sym == XKB_KEY_Alt_L
269 || sym == XKB_KEY_Meta_L
270 || sym == XKB_KEY_Mode_switch
271 || sym == XKB_KEY_Super_L
272 || sym == XKB_KEY_Super_R
273 || sym == XKB_KEY_Hyper_L
274 || sym == XKB_KEY_Hyper_R) {
281 if (modifierSym == XKB_KEY_Mode_switch)
282 keymap +=
", virtualMods=LevelThree";
286 int modNum = keysymMods.
value(modifierSym, -1);
289 keymap +=
QByteArray(
"modifier_map ") + builtinModifiers[modNum]
299 "xkb_compatibility \"core\" {\n"
300 "virtual_modifiers NumLock,Alt,LevelThree;\n"
301 "interpret Alt_L+AnyOf(all) {\n"
302 "virtualModifier= Alt;\n"
303 "action= SetMods(modifiers=modMapMods,clearLocks);\n"
305 "interpret Alt_R+AnyOf(all) {\n"
306 "virtualModifier= Alt;\n"
307 "action= SetMods(modifiers=modMapMods,clearLocks);\n"
316 return xkb_keymap_new_from_buffer(m_xkbContext.get(),
319 XKB_KEYMAP_FORMAT_TEXT_V1,
320 XKB_KEYMAP_COMPILE_NO_FLAGS);
328 xcb_refresh_keyboard_mapping(m_key_symbols,
event);
342 m_xkbContext.reset(xkb_context_new(XKB_CONTEXT_NO_DEFAULT_INCLUDES));
344 qCWarning(lcQpaKeyboard,
"failed to create XKB context");
348 xkb_log_level
logLevel = lcQpaKeyboard().isDebugEnabled() ?
349 XKB_LOG_LEVEL_DEBUG : XKB_LOG_LEVEL_CRITICAL;
350 xkb_context_set_log_level(m_xkbContext.get(),
logLevel);
354 m_xkbKeymap.reset(xkb_x11_keymap_new_from_device(m_xkbContext.get(),
xcb_connection(),
355 core_device_id, XKB_KEYMAP_COMPILE_NO_FLAGS));
357 m_xkbState.reset(xkb_x11_state_new_from_device(m_xkbKeymap.get(),
xcb_connection(), core_device_id));
361 m_xkbState.reset(xkb_state_new(m_xkbKeymap.get()));
365 qCWarning(lcQpaKeyboard,
"failed to compile a keymap");
370 qCWarning(lcQpaKeyboard,
"failed to create XKB state");
388 const xkb_state_component changedComponents
389 = xkb_state_update_mask(m_xkbState.get(),
403 return (
state >> 13) & 3;
409 struct xkb_state *xkbState = m_xkbState.get();
410 xkb_mod_mask_t modsDepressed = xkb_state_serialize_mods(xkbState, XKB_STATE_MODS_DEPRESSED);
411 xkb_mod_mask_t modsLatched = xkb_state_serialize_mods(xkbState, XKB_STATE_MODS_LATCHED);
412 xkb_mod_mask_t modsLocked = xkb_state_serialize_mods(xkbState, XKB_STATE_MODS_LOCKED);
415 xkb_mod_mask_t latched = modsLatched & xkbMask;
416 xkb_mod_mask_t locked = modsLocked & xkbMask;
417 xkb_mod_mask_t depressed = modsDepressed & xkbMask;
419 depressed |= ~(depressed | latched | locked) & xkbMask;
421 xkb_state_component changedComponents = xkb_state_update_mask(
431 auto *mods =
static_cast<xcb_input_modifier_info_t *
>(modInfo);
432 auto *
group =
static_cast<xcb_input_group_info_t *
>(groupInfo);
433 const xkb_state_component changedComponents
434 = xkb_state_update_mask(m_xkbState.get(),
451 if ((changedComponents & XKB_STATE_LAYOUT_EFFECTIVE) == XKB_STATE_LAYOUT_EFFECTIVE)
452 qCDebug(lcQpaKeyboard,
"TODO: Support KeyboardLayoutChange on QPA (QTBUG-27681)");
457 xkb_mod_mask_t xkb_mask = 0;
459 if ((
state & XCB_MOD_MASK_SHIFT) && xkb_mods.shift != XKB_MOD_INVALID)
460 xkb_mask |= (1 << xkb_mods.shift);
461 if ((
state & XCB_MOD_MASK_LOCK) && xkb_mods.lock != XKB_MOD_INVALID)
462 xkb_mask |= (1 << xkb_mods.lock);
463 if ((
state & XCB_MOD_MASK_CONTROL) && xkb_mods.control != XKB_MOD_INVALID)
464 xkb_mask |= (1 << xkb_mods.control);
465 if ((
state & XCB_MOD_MASK_1) && xkb_mods.mod1 != XKB_MOD_INVALID)
466 xkb_mask |= (1 << xkb_mods.mod1);
467 if ((
state & XCB_MOD_MASK_2) && xkb_mods.mod2 != XKB_MOD_INVALID)
468 xkb_mask |= (1 << xkb_mods.mod2);
469 if ((
state & XCB_MOD_MASK_3) && xkb_mods.mod3 != XKB_MOD_INVALID)
470 xkb_mask |= (1 << xkb_mods.mod3);
471 if ((
state & XCB_MOD_MASK_4) && xkb_mods.mod4 != XKB_MOD_INVALID)
472 xkb_mask |= (1 << xkb_mods.mod4);
473 if ((
state & XCB_MOD_MASK_5) && xkb_mods.mod5 != XKB_MOD_INVALID)
474 xkb_mask |= (1 << xkb_mods.mod5);
482 xkb_mods.lock = xkb_keymap_mod_get_index(m_xkbKeymap.get(), XKB_MOD_NAME_CAPS);
483 xkb_mods.control = xkb_keymap_mod_get_index(m_xkbKeymap.get(),
XKB_MOD_NAME_CTRL);
484 xkb_mods.mod1 = xkb_keymap_mod_get_index(m_xkbKeymap.get(),
"Mod1");
485 xkb_mods.mod2 = xkb_keymap_mod_get_index(m_xkbKeymap.get(),
"Mod2");
486 xkb_mods.mod3 = xkb_keymap_mod_get_index(m_xkbKeymap.get(),
"Mod3");
487 xkb_mods.mod4 = xkb_keymap_mod_get_index(m_xkbKeymap.get(),
"Mod4");
488 xkb_mods.mod5 = xkb_keymap_mod_get_index(m_xkbKeymap.get(),
"Mod5");
497 core_device_id = xkb_x11_get_core_keyboard_device_id(
xcb_connection());
498 if (core_device_id == -1) {
499 qCWarning(lcQpaXcb,
"failed to get core keyboard device info");
512 xcb_key_symbols_free(m_key_symbols);
523 const uint16_t required_map_parts = (XCB_XKB_MAP_PART_KEY_TYPES |
524 XCB_XKB_MAP_PART_KEY_SYMS |
525 XCB_XKB_MAP_PART_MODIFIER_MAP |
526 XCB_XKB_MAP_PART_EXPLICIT_COMPONENTS |
527 XCB_XKB_MAP_PART_KEY_ACTIONS |
528 XCB_XKB_MAP_PART_KEY_BEHAVIORS |
529 XCB_XKB_MAP_PART_VIRTUAL_MODS |
530 XCB_XKB_MAP_PART_VIRTUAL_MOD_MAP);
532 const uint16_t required_events = (XCB_XKB_EVENT_TYPE_NEW_KEYBOARD_NOTIFY |
533 XCB_XKB_EVENT_TYPE_MAP_NOTIFY |
534 XCB_XKB_EVENT_TYPE_STATE_NOTIFY);
538 xcb_void_cookie_t
select = xcb_xkb_select_events_checked(
540 XCB_XKB_ID_USE_CORE_KBD,
551 qCWarning(lcQpaXcb,
"failed to select notify events from XKB");
557 xcb_xkb_get_names_value_list_t names_list;
559 memset(&vmod_masks, 0,
sizeof(vmod_masks));
562 XCB_XKB_ID_USE_CORE_KBD,
563 XCB_XKB_NAME_DETAIL_VIRTUAL_MOD_NAMES);
565 qWarning(
"Qt: failed to retrieve the virtual modifier names from XKB");
569 const void *
buffer = xcb_xkb_get_names_value_list(name_reply.get());
570 xcb_xkb_get_names_value_list_unpack(
buffer,
572 name_reply->indicators,
573 name_reply->virtualMods,
574 name_reply->groupNames,
576 name_reply->nKeyAliases,
577 name_reply->nRadioGroups,
584 vmod_mask = name_reply->virtualMods;
586 for (bit = 1; vmod_mask; bit <<= 1) {
589 if (!(vmod_mask & bit))
596 vmod_name = atomName.
data();
603 if (
qstrcmp(vmod_name,
"Alt") == 0)
604 vmod_masks.alt = bit;
605 else if (
qstrcmp(vmod_name,
"Meta") == 0)
606 vmod_masks.meta = bit;
607 else if (
qstrcmp(vmod_name,
"AltGr") == 0)
608 vmod_masks.altgr = bit;
609 else if (
qstrcmp(vmod_name,
"Super") == 0)
610 vmod_masks.super = bit;
611 else if (
qstrcmp(vmod_name,
"Hyper") == 0)
612 vmod_masks.hyper = bit;
618 xcb_xkb_get_map_map_t
map;
620 memset(&rmod_masks, 0,
sizeof(rmod_masks));
624 XCB_XKB_ID_USE_CORE_KBD,
625 XCB_XKB_MAP_PART_VIRTUAL_MODS,
626 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
628 qWarning(
"Qt: failed to retrieve the virtual modifier map from XKB");
632 const void *
buffer = xcb_xkb_get_map_map(map_reply.get());
633 xcb_xkb_get_map_map_unpack(
buffer,
636 map_reply->nKeyActions,
637 map_reply->totalActions,
638 map_reply->totalKeyBehaviors,
639 map_reply->nVModMapKeys,
640 map_reply->totalKeyExplicit,
641 map_reply->totalModMapKeys,
642 map_reply->totalVModMapKeys,
649 vmod_mask = map_reply->virtualMods;
652 for (bit = 1; vmod_mask; bit <<= 1) {
655 if (!(vmod_mask & bit))
663 if (vmod_masks.alt == bit)
664 rmod_masks.alt = modmap;
665 else if (vmod_masks.meta == bit)
666 rmod_masks.meta = modmap;
667 else if (vmod_masks.altgr == bit)
668 rmod_masks.altgr = modmap;
669 else if (vmod_masks.super == bit)
670 rmod_masks.super = modmap;
671 else if (vmod_masks.hyper == bit)
672 rmod_masks.hyper = modmap;
679 if (modifierBit >= 0 && modifierBit < 8)
680 *
mask |= 1 << modifierBit;
689 memset(&rmod_masks, 0,
sizeof(rmod_masks));
708 while (*codes != XCB_NO_SYMBOL) {
709 if (*codes == which)
return true;
727 qWarning(
"Qt: failed to get modifier mapping");
732 static const xcb_keysym_t symbols[] = {
733 XKB_KEY_Alt_L, XKB_KEY_Meta_L, XKB_KEY_Mode_switch, XKB_KEY_Super_L, XKB_KEY_Super_R,
734 XKB_KEY_Hyper_L, XKB_KEY_Hyper_R
736 static const size_t numSymbols =
sizeof symbols /
sizeof *symbols;
739 xcb_keycode_t* modKeyCodes[numSymbols];
740 for (
size_t i = 0;
i < numSymbols; ++
i)
741 modKeyCodes[
i] = xcb_key_symbols_get_keycode(m_key_symbols, symbols[
i]);
743 xcb_keycode_t *modMap = xcb_get_modifier_mapping_keycodes(modMapReply.get());
744 const int modMapLength = xcb_get_modifier_mapping_keycodes_length(modMapReply.get());
779 for (
int i = 0;
i < modMapLength;
i++) {
780 if (modMap[
i] == XCB_NO_SYMBOL)
783 for (
size_t k = 0; k < numSymbols; k++) {
786 xcb_keysym_t sym = symbols[k];
790 map[sym] =
i / modMapReply->keycodes_per_modifier;
796 for (
size_t i = 0;
i < numSymbols; ++
i)
797 free(modKeyCodes[
i]);
807 if (rmod_masks.alt == rmod_masks.meta)
810 if (rmod_masks.meta == 0) {
812 rmod_masks.meta = rmod_masks.super;
813 if (rmod_masks.meta == 0) {
815 rmod_masks.meta = rmod_masks.hyper;
820 if (rmod_masks.meta && rmod_masks.meta == rmod_masks.super)
821 m_superAsMeta =
true;
822 if (rmod_masks.meta && rmod_masks.meta == rmod_masks.hyper)
823 m_hyperAsMeta =
true;
834 if (!targetWindow || !
source)
845 sendEventState.reset(xkb_state_new(m_xkbKeymap.get()));
850 xkb_state_update_mask(sendEventState.get(), depressed, 0, 0, 0, 0,
lockedGroup(
state));
853 struct xkb_state *xkbState =
fromSendEvent ? sendEventState.get() : m_xkbState.get();
855 xcb_keysym_t sym = xkb_state_key_get_one_sym(xkbState, code);
865 if (m_isAutoRepeat && m_autoRepeatCode != code)
867 m_isAutoRepeat =
false;
869 m_isAutoRepeat =
false;
873 if (
type == XCB_KEY_PRESS) {
874 auto keyPress =
reinterpret_cast<xcb_key_press_event_t *
>(
event);
875 m_isAutoRepeat = keyPress->time ==
time && keyPress->detail == code;
877 m_autoRepeatCode = code;
883 bool filtered =
false;
886 event.setTimestamp(
time);
887 filtered = inputContext->filterEvent(&
event);
892#ifndef QT_NO_CONTEXTMENU
894 const QPoint globalPos =
window->screen()->handle()->cursor()->pos();
909 const xcb_generic_event_t *
e =
reinterpret_cast<const xcb_generic_event_t *
>(
event);
910 return (
e->response_type & 0x80) != 0;
char * data()
\macro QT_NO_CAST_FROM_BYTEARRAY
qsizetype size() const noexcept
Returns the number of bytes in this byte array.
const char * constData() const noexcept
Returns a pointer to the const data stored in the byte array.
bool isEmpty() const noexcept
Returns true if the byte array has size 0; otherwise returns false.
static QByteArray number(int, int base=10)
Returns a byte-array representing the whole number n as text.
Type
This enum type defines the valid event types in Qt.
static QPlatformIntegration * platformIntegration()
The QKeyEvent class describes a key event.
const_pointer constData() const noexcept
bool isEmpty() const noexcept
void resize(qsizetype size)
T value(const Key &key, const T &defaultValue=T()) const
\inmodule QtCore\reentrant
\macro QT_RESTRICTED_CAST_FROM_ASCII
qsizetype size() const
Returns the number of characters in this string.
static void handleContextMenuEvent(QWindow *window, bool mouseTriggered, const QPoint &pos, const QPoint &globalPos, Qt::KeyboardModifiers modifiers)
static bool handleExtendedKeyEvent(QWindow *window, QEvent::Type type, int key, Qt::KeyboardModifiers modifiers, quint32 nativeScanCode, quint32 nativeVirtualKey, quint32 nativeModifiers, const QString &text=QString(), bool autorep=false, ushort count=1)
QByteArray atomName(xcb_atom_t atom)
const xcb_setup_t * setup() const
QXcbWindow * focusWindow() const
QXcbEventQueue * eventQueue() const
QXcbWindow * platformWindowFromId(xcb_window_t id)
xcb_generic_event_t * peek(Peeker &&peeker)
void handleKeyPressEvent(const xcb_key_press_event_t *event)
void handleKeyReleaseEvent(const xcb_key_release_event_t *event)
void resolveMaskConflicts()
QList< int > possibleKeys(const QKeyEvent *event) const
void handleKeyEvent(xcb_window_t sourceWindow, QEvent::Type type, xcb_keycode_t code, quint16 state, xcb_timestamp_t time, bool fromSendEvent)
xkb_mod_mask_t xkbModMask(quint16 state)
void updateXKBState(xcb_xkb_state_notify_event_t *state)
void updateVModToRModMapping()
Qt::KeyboardModifiers translateModifiers(int s) const
QXcbKeyboard(QXcbConnection *connection)
void updateXKBStateFromCore(quint16 state)
void handleStateChanges(xkb_state_component changedComponents)
KeysymModifierMap keysymsToModifiers()
void updateXKBStateFromXI(void *modInfo, void *groupInfo)
void updateModifiers(const KeysymModifierMap &keysymMods)
struct xkb_keymap * keymapFromCore(const KeysymModifierMap &keysymMods)
QXcbConnection * connection() const
xcb_connection_t * xcb_connection() const
void updateNetWmUserTime(xcb_timestamp_t timestamp)
static void xkbcommon_XConvertCase(xkb_keysym_t sym, xkb_keysym_t *lower, xkb_keysym_t *upper)
static QString lookupString(struct xkb_state *state, xkb_keycode_t code)
static void verifyHasLatinLayout(xkb_keymap *keymap)
std::unique_ptr< struct xkb_state, XKBStateDeleter > ScopedXKBState
static QList< int > possibleKeys(xkb_state *state, const QKeyEvent *event, bool superAsMeta=false, bool hyperAsMeta=false)
static void setXkbContext(QPlatformInputContext *inputContext, struct xkb_context *context)
static bool isKeypad(xkb_keysym_t sym)
static int keysymToQtKey(xkb_keysym_t keysym, Qt::KeyboardModifiers modifiers)
EGLImageKHR int int EGLuint64KHR * modifiers
QMap< QString, QString > map
[6]
Combined button and popup list for selecting options.
Q_CORE_EXPORT int qstrcmp(const char *str1, const char *str2)
DBusConnection const char DBusError * error
DBusConnection * connection
#define qCWarning(category,...)
#define qCDebug(category,...)
GLsizei GLsizei GLchar * groupString
GLenum GLenum GLsizei count
GLint GLint GLint GLint GLint GLint GLint GLbitfield mask
GLsizei GLsizei GLchar * source
#define XKB_MOD_NAME_SHIFT
#define XKB_MOD_NAME_CTRL
#define Q_XCB_REPLY(call,...)
static xcb_keysym_t getUnshiftedXKey(xcb_keysym_t unshifted, xcb_keysym_t shifted)
static xkb_layout_index_t lockedGroup(quint16 state)
static void applyModifier(uint *mask, int modifierBit)
static bool keycodes_contains(xcb_keycode_t *codes, xcb_keycode_t which)
static bool fromSendEvent(const void *event)
static QByteArray symbolsGroupString(const xcb_keysym_t *symbols, int count)
selection select(topLeft, bottomRight)