7#include <private/qmakearray_p.h>
9#include <QtCore/private/qstringiterator_p.h>
10#include <QtCore/qvarlengtharray.h>
11#include <QtCore/QMetaMethod>
13#include <QtGui/QKeyEvent>
14#include <QtGui/private/qguiapplication_p.h>
16#include <qpa/qplatforminputcontext.h>
17#include <qpa/qplatformintegration.h>
22 xkb_state *state, xkb_keycode_t code,
23 bool superAsMeta,
bool hyperAsMeta);
41template<
std::size_t Xkb,
std::size_t Qt>
48static constexpr const auto KeyTbl = qMakeArray(
52 Xkb2Qt<XKB_KEY_Escape, Qt::Key_Escape>,
53 Xkb2Qt<XKB_KEY_Tab, Qt::Key_Tab>,
54 Xkb2Qt<XKB_KEY_ISO_Left_Tab, Qt::Key_Backtab>,
55 Xkb2Qt<XKB_KEY_BackSpace, Qt::Key_Backspace>,
56 Xkb2Qt<XKB_KEY_Return, Qt::Key_Return>,
57 Xkb2Qt<XKB_KEY_Insert, Qt::Key_Insert>,
58 Xkb2Qt<XKB_KEY_Delete, Qt::Key_Delete>,
59 Xkb2Qt<XKB_KEY_Clear, Qt::Key_Delete>,
60 Xkb2Qt<XKB_KEY_Pause, Qt::Key_Pause>,
61 Xkb2Qt<XKB_KEY_Print, Qt::Key_Print>,
62 Xkb2Qt<XKB_KEY_Sys_Req, Qt::Key_SysReq>,
63 Xkb2Qt<0x1005FF60, Qt::Key_SysReq>,
64 Xkb2Qt<0x1007ff00, Qt::Key_SysReq>,
68 Xkb2Qt<XKB_KEY_Home, Qt::Key_Home>,
69 Xkb2Qt<XKB_KEY_End, Qt::Key_End>,
70 Xkb2Qt<XKB_KEY_Left, Qt::Key_Left>,
71 Xkb2Qt<XKB_KEY_Up, Qt::Key_Up>,
72 Xkb2Qt<XKB_KEY_Right, Qt::Key_Right>,
73 Xkb2Qt<XKB_KEY_Down, Qt::Key_Down>,
74 Xkb2Qt<XKB_KEY_Prior, Qt::Key_PageUp>,
75 Xkb2Qt<XKB_KEY_Next, Qt::Key_PageDown>,
79 Xkb2Qt<XKB_KEY_Shift_L, Qt::Key_Shift>,
80 Xkb2Qt<XKB_KEY_Shift_R, Qt::Key_Shift>,
81 Xkb2Qt<XKB_KEY_Shift_Lock, Qt::Key_Shift>,
82 Xkb2Qt<XKB_KEY_Control_L, Qt::Key_Control>,
83 Xkb2Qt<XKB_KEY_Control_R, Qt::Key_Control>,
84 Xkb2Qt<XKB_KEY_Meta_L, Qt::Key_Meta>,
85 Xkb2Qt<XKB_KEY_Meta_R, Qt::Key_Meta>,
86 Xkb2Qt<XKB_KEY_Alt_L, Qt::Key_Alt>,
87 Xkb2Qt<XKB_KEY_Alt_R, Qt::Key_Alt>,
88 Xkb2Qt<XKB_KEY_Caps_Lock, Qt::Key_CapsLock>,
89 Xkb2Qt<XKB_KEY_Num_Lock, Qt::Key_NumLock>,
90 Xkb2Qt<XKB_KEY_Scroll_Lock, Qt::Key_ScrollLock>,
91 Xkb2Qt<XKB_KEY_Super_L, Qt::Key_Super_L>,
92 Xkb2Qt<XKB_KEY_Super_R, Qt::Key_Super_R>,
93 Xkb2Qt<XKB_KEY_Menu, Qt::Key_Menu>,
94 Xkb2Qt<XKB_KEY_Hyper_L, Qt::Key_Hyper_L>,
95 Xkb2Qt<XKB_KEY_Hyper_R, Qt::Key_Hyper_R>,
96 Xkb2Qt<XKB_KEY_Help, Qt::Key_Help>,
97 Xkb2Qt<0x1000FF74, Qt::Key_Backtab>,
98 Xkb2Qt<0x1005FF10, Qt::Key_F11>,
99 Xkb2Qt<0x1005FF11, Qt::Key_F12>,
103 Xkb2Qt<XKB_KEY_KP_Space, Qt::Key_Space>,
104 Xkb2Qt<XKB_KEY_KP_Tab, Qt::Key_Tab>,
105 Xkb2Qt<XKB_KEY_KP_Enter, Qt::Key_Enter>,
106 Xkb2Qt<XKB_KEY_KP_Home, Qt::Key_Home>,
107 Xkb2Qt<XKB_KEY_KP_Left, Qt::Key_Left>,
108 Xkb2Qt<XKB_KEY_KP_Up, Qt::Key_Up>,
109 Xkb2Qt<XKB_KEY_KP_Right, Qt::Key_Right>,
110 Xkb2Qt<XKB_KEY_KP_Down, Qt::Key_Down>,
111 Xkb2Qt<XKB_KEY_KP_Prior, Qt::Key_PageUp>,
112 Xkb2Qt<XKB_KEY_KP_Next, Qt::Key_PageDown>,
113 Xkb2Qt<XKB_KEY_KP_End, Qt::Key_End>,
114 Xkb2Qt<XKB_KEY_KP_Begin, Qt::Key_Clear>,
115 Xkb2Qt<XKB_KEY_KP_Insert, Qt::Key_Insert>,
116 Xkb2Qt<XKB_KEY_KP_Delete, Qt::Key_Delete>,
117 Xkb2Qt<XKB_KEY_KP_Equal, Qt::Key_Equal>,
118 Xkb2Qt<XKB_KEY_KP_Multiply, Qt::Key_Asterisk>,
119 Xkb2Qt<XKB_KEY_KP_Add, Qt::Key_Plus>,
120 Xkb2Qt<XKB_KEY_KP_Separator, Qt::Key_Comma>,
121 Xkb2Qt<XKB_KEY_KP_Subtract, Qt::Key_Minus>,
122 Xkb2Qt<XKB_KEY_KP_Decimal, Qt::Key_Period>,
123 Xkb2Qt<XKB_KEY_KP_Divide, Qt::Key_Slash>,
127 Xkb2Qt<XKB_KEY_Undo, Qt::Key_Undo>,
128 Xkb2Qt<XKB_KEY_Redo, Qt::Key_Redo>,
129 Xkb2Qt<XKB_KEY_Find, Qt::Key_Find>,
130 Xkb2Qt<XKB_KEY_Cancel, Qt::Key_Cancel>,
135 Xkb2Qt<XKB_KEY_ISO_Level3_Shift, Qt::Key_AltGr>,
136 Xkb2Qt<XKB_KEY_Multi_key, Qt::Key_Multi_key>,
137 Xkb2Qt<XKB_KEY_Codeinput, Qt::Key_Codeinput>,
138 Xkb2Qt<XKB_KEY_SingleCandidate, Qt::Key_SingleCandidate>,
139 Xkb2Qt<XKB_KEY_MultipleCandidate, Qt::Key_MultipleCandidate>,
140 Xkb2Qt<XKB_KEY_PreviousCandidate, Qt::Key_PreviousCandidate>,
143 Xkb2Qt<XKB_KEY_Mode_switch, Qt::Key_Mode_switch>,
144 Xkb2Qt<XKB_KEY_script_switch, Qt::Key_Mode_switch>,
147 Xkb2Qt<XKB_KEY_Kanji, Qt::Key_Kanji>,
148 Xkb2Qt<XKB_KEY_Muhenkan, Qt::Key_Muhenkan>,
150 Xkb2Qt<XKB_KEY_Henkan_Mode, Qt::Key_Henkan>,
151 Xkb2Qt<XKB_KEY_Henkan, Qt::Key_Henkan>,
152 Xkb2Qt<XKB_KEY_Romaji, Qt::Key_Romaji>,
153 Xkb2Qt<XKB_KEY_Hiragana, Qt::Key_Hiragana>,
154 Xkb2Qt<XKB_KEY_Katakana, Qt::Key_Katakana>,
155 Xkb2Qt<XKB_KEY_Hiragana_Katakana, Qt::Key_Hiragana_Katakana>,
156 Xkb2Qt<XKB_KEY_Zenkaku, Qt::Key_Zenkaku>,
157 Xkb2Qt<XKB_KEY_Hankaku, Qt::Key_Hankaku>,
158 Xkb2Qt<XKB_KEY_Zenkaku_Hankaku, Qt::Key_Zenkaku_Hankaku>,
159 Xkb2Qt<XKB_KEY_Touroku, Qt::Key_Touroku>,
160 Xkb2Qt<XKB_KEY_Massyo, Qt::Key_Massyo>,
161 Xkb2Qt<XKB_KEY_Kana_Lock, Qt::Key_Kana_Lock>,
162 Xkb2Qt<XKB_KEY_Kana_Shift, Qt::Key_Kana_Shift>,
163 Xkb2Qt<XKB_KEY_Eisu_Shift, Qt::Key_Eisu_Shift>,
164 Xkb2Qt<XKB_KEY_Eisu_toggle, Qt::Key_Eisu_toggle>,
168 Xkb2Qt<XKB_KEY_Kanji_Bangou, Qt::Key_Codeinput>,
169 Xkb2Qt<XKB_KEY_Zen_Koho, Qt::Key_MultipleCandidate>,
170 Xkb2Qt<XKB_KEY_Mae_Koho, Qt::Key_PreviousCandidate>,
173 Xkb2Qt<XKB_KEY_Hangul, Qt::Key_Hangul>,
174 Xkb2Qt<XKB_KEY_Hangul_Start, Qt::Key_Hangul_Start>,
175 Xkb2Qt<XKB_KEY_Hangul_End, Qt::Key_Hangul_End>,
176 Xkb2Qt<XKB_KEY_Hangul_Hanja, Qt::Key_Hangul_Hanja>,
177 Xkb2Qt<XKB_KEY_Hangul_Jamo, Qt::Key_Hangul_Jamo>,
178 Xkb2Qt<XKB_KEY_Hangul_Romaja, Qt::Key_Hangul_Romaja>,
180 Xkb2Qt<XKB_KEY_Hangul_Codeinput, Qt::Key_Codeinput>,
181 Xkb2Qt<XKB_KEY_Hangul_Jeonja, Qt::Key_Hangul_Jeonja>,
182 Xkb2Qt<XKB_KEY_Hangul_Banja, Qt::Key_Hangul_Banja>,
183 Xkb2Qt<XKB_KEY_Hangul_PreHanja, Qt::Key_Hangul_PreHanja>,
184 Xkb2Qt<XKB_KEY_Hangul_PostHanja, Qt::Key_Hangul_PostHanja>,
188 Xkb2Qt<XKB_KEY_Hangul_SingleCandidate, Qt::Key_SingleCandidate>,
189 Xkb2Qt<XKB_KEY_Hangul_MultipleCandidate,Qt::Key_MultipleCandidate>,
190 Xkb2Qt<XKB_KEY_Hangul_PreviousCandidate,Qt::Key_PreviousCandidate>,
191 Xkb2Qt<XKB_KEY_Hangul_Special, Qt::Key_Hangul_Special>,
193 Xkb2Qt<XKB_KEY_Hangul_switch, Qt::Key_Mode_switch>,
196 Xkb2Qt<XKB_KEY_dead_grave, Qt::Key_Dead_Grave>,
197 Xkb2Qt<XKB_KEY_dead_acute, Qt::Key_Dead_Acute>,
198 Xkb2Qt<XKB_KEY_dead_circumflex, Qt::Key_Dead_Circumflex>,
199 Xkb2Qt<XKB_KEY_dead_tilde, Qt::Key_Dead_Tilde>,
200 Xkb2Qt<XKB_KEY_dead_macron, Qt::Key_Dead_Macron>,
201 Xkb2Qt<XKB_KEY_dead_breve, Qt::Key_Dead_Breve>,
202 Xkb2Qt<XKB_KEY_dead_abovedot, Qt::Key_Dead_Abovedot>,
203 Xkb2Qt<XKB_KEY_dead_diaeresis, Qt::Key_Dead_Diaeresis>,
204 Xkb2Qt<XKB_KEY_dead_abovering, Qt::Key_Dead_Abovering>,
205 Xkb2Qt<XKB_KEY_dead_doubleacute, Qt::Key_Dead_Doubleacute>,
206 Xkb2Qt<XKB_KEY_dead_caron, Qt::Key_Dead_Caron>,
207 Xkb2Qt<XKB_KEY_dead_cedilla, Qt::Key_Dead_Cedilla>,
208 Xkb2Qt<XKB_KEY_dead_ogonek, Qt::Key_Dead_Ogonek>,
209 Xkb2Qt<XKB_KEY_dead_iota, Qt::Key_Dead_Iota>,
210 Xkb2Qt<XKB_KEY_dead_voiced_sound, Qt::Key_Dead_Voiced_Sound>,
211 Xkb2Qt<XKB_KEY_dead_semivoiced_sound, Qt::Key_Dead_Semivoiced_Sound>,
212 Xkb2Qt<XKB_KEY_dead_belowdot, Qt::Key_Dead_Belowdot>,
213 Xkb2Qt<XKB_KEY_dead_hook, Qt::Key_Dead_Hook>,
214 Xkb2Qt<XKB_KEY_dead_horn, Qt::Key_Dead_Horn>,
215 Xkb2Qt<XKB_KEY_dead_stroke, Qt::Key_Dead_Stroke>,
216 Xkb2Qt<XKB_KEY_dead_abovecomma, Qt::Key_Dead_Abovecomma>,
217 Xkb2Qt<XKB_KEY_dead_abovereversedcomma, Qt::Key_Dead_Abovereversedcomma>,
218 Xkb2Qt<XKB_KEY_dead_doublegrave, Qt::Key_Dead_Doublegrave>,
219 Xkb2Qt<XKB_KEY_dead_belowring, Qt::Key_Dead_Belowring>,
220 Xkb2Qt<XKB_KEY_dead_belowmacron, Qt::Key_Dead_Belowmacron>,
221 Xkb2Qt<XKB_KEY_dead_belowcircumflex, Qt::Key_Dead_Belowcircumflex>,
222 Xkb2Qt<XKB_KEY_dead_belowtilde, Qt::Key_Dead_Belowtilde>,
223 Xkb2Qt<XKB_KEY_dead_belowbreve, Qt::Key_Dead_Belowbreve>,
224 Xkb2Qt<XKB_KEY_dead_belowdiaeresis, Qt::Key_Dead_Belowdiaeresis>,
225 Xkb2Qt<XKB_KEY_dead_invertedbreve, Qt::Key_Dead_Invertedbreve>,
226 Xkb2Qt<XKB_KEY_dead_belowcomma, Qt::Key_Dead_Belowcomma>,
227 Xkb2Qt<XKB_KEY_dead_currency, Qt::Key_Dead_Currency>,
228 Xkb2Qt<XKB_KEY_dead_a, Qt::Key_Dead_a>,
229 Xkb2Qt<XKB_KEY_dead_A, Qt::Key_Dead_A>,
230 Xkb2Qt<XKB_KEY_dead_e, Qt::Key_Dead_e>,
231 Xkb2Qt<XKB_KEY_dead_E, Qt::Key_Dead_E>,
232 Xkb2Qt<XKB_KEY_dead_i, Qt::Key_Dead_i>,
233 Xkb2Qt<XKB_KEY_dead_I, Qt::Key_Dead_I>,
234 Xkb2Qt<XKB_KEY_dead_o, Qt::Key_Dead_o>,
235 Xkb2Qt<XKB_KEY_dead_O, Qt::Key_Dead_O>,
236 Xkb2Qt<XKB_KEY_dead_u, Qt::Key_Dead_u>,
237 Xkb2Qt<XKB_KEY_dead_U, Qt::Key_Dead_U>,
238 Xkb2Qt<XKB_KEY_dead_small_schwa, Qt::Key_Dead_Small_Schwa>,
239 Xkb2Qt<XKB_KEY_dead_capital_schwa, Qt::Key_Dead_Capital_Schwa>,
240 Xkb2Qt<XKB_KEY_dead_greek, Qt::Key_Dead_Greek>,
242
243#ifdef XKB_KEY_dead_lowline
244 Xkb2Qt<XKB_KEY_dead_lowline, Qt::Key_Dead_Lowline>,
245 Xkb2Qt<XKB_KEY_dead_aboveverticalline, Qt::Key_Dead_Aboveverticalline>,
246 Xkb2Qt<XKB_KEY_dead_belowverticalline, Qt::Key_Dead_Belowverticalline>,
247 Xkb2Qt<XKB_KEY_dead_longsolidusoverlay, Qt::Key_Dead_Longsolidusoverlay>,
252 Xkb2Qt<XKB_KEY_XF86Back, Qt::Key_Back>,
253 Xkb2Qt<XKB_KEY_XF86Forward, Qt::Key_Forward>,
254 Xkb2Qt<XKB_KEY_XF86Stop, Qt::Key_Stop>,
255 Xkb2Qt<XKB_KEY_XF86Refresh, Qt::Key_Refresh>,
256 Xkb2Qt<XKB_KEY_XF86Favorites, Qt::Key_Favorites>,
257 Xkb2Qt<XKB_KEY_XF86AudioMedia, Qt::Key_LaunchMedia>,
258 Xkb2Qt<XKB_KEY_XF86OpenURL, Qt::Key_OpenUrl>,
259 Xkb2Qt<XKB_KEY_XF86HomePage, Qt::Key_HomePage>,
260 Xkb2Qt<XKB_KEY_XF86Search, Qt::Key_Search>,
261 Xkb2Qt<XKB_KEY_XF86AudioLowerVolume, Qt::Key_VolumeDown>,
262 Xkb2Qt<XKB_KEY_XF86AudioMute, Qt::Key_VolumeMute>,
263 Xkb2Qt<XKB_KEY_XF86AudioRaiseVolume, Qt::Key_VolumeUp>,
264 Xkb2Qt<XKB_KEY_XF86AudioPlay, Qt::Key_MediaPlay>,
265 Xkb2Qt<XKB_KEY_XF86AudioStop, Qt::Key_MediaStop>,
266 Xkb2Qt<XKB_KEY_XF86AudioPrev, Qt::Key_MediaPrevious>,
267 Xkb2Qt<XKB_KEY_XF86AudioNext, Qt::Key_MediaNext>,
268 Xkb2Qt<XKB_KEY_XF86AudioRecord, Qt::Key_MediaRecord>,
269 Xkb2Qt<XKB_KEY_XF86AudioPause, Qt::Key_MediaPause>,
270 Xkb2Qt<XKB_KEY_XF86Mail, Qt::Key_LaunchMail>,
271 Xkb2Qt<XKB_KEY_XF86MyComputer, Qt::Key_LaunchMedia>,
272 Xkb2Qt<XKB_KEY_XF86Memo, Qt::Key_Memo>,
273 Xkb2Qt<XKB_KEY_XF86ToDoList, Qt::Key_ToDoList>,
274 Xkb2Qt<XKB_KEY_XF86Calendar, Qt::Key_Calendar>,
275 Xkb2Qt<XKB_KEY_XF86PowerDown, Qt::Key_PowerDown>,
276 Xkb2Qt<XKB_KEY_XF86ContrastAdjust, Qt::Key_ContrastAdjust>,
277 Xkb2Qt<XKB_KEY_XF86Standby, Qt::Key_Standby>,
278 Xkb2Qt<XKB_KEY_XF86MonBrightnessUp, Qt::Key_MonBrightnessUp>,
279 Xkb2Qt<XKB_KEY_XF86MonBrightnessDown, Qt::Key_MonBrightnessDown>,
280 Xkb2Qt<XKB_KEY_XF86KbdLightOnOff, Qt::Key_KeyboardLightOnOff>,
281 Xkb2Qt<XKB_KEY_XF86KbdBrightnessUp, Qt::Key_KeyboardBrightnessUp>,
282 Xkb2Qt<XKB_KEY_XF86KbdBrightnessDown, Qt::Key_KeyboardBrightnessDown>,
283 Xkb2Qt<XKB_KEY_XF86PowerOff, Qt::Key_PowerOff>,
284 Xkb2Qt<XKB_KEY_XF86WakeUp, Qt::Key_WakeUp>,
285 Xkb2Qt<XKB_KEY_XF86Eject, Qt::Key_Eject>,
286 Xkb2Qt<XKB_KEY_XF86ScreenSaver, Qt::Key_ScreenSaver>,
287 Xkb2Qt<XKB_KEY_XF86WWW, Qt::Key_WWW>,
288 Xkb2Qt<XKB_KEY_XF86Sleep, Qt::Key_Sleep>,
289 Xkb2Qt<XKB_KEY_XF86LightBulb, Qt::Key_LightBulb>,
290 Xkb2Qt<XKB_KEY_XF86Shop, Qt::Key_Shop>,
291 Xkb2Qt<XKB_KEY_XF86History, Qt::Key_History>,
292 Xkb2Qt<XKB_KEY_XF86AddFavorite, Qt::Key_AddFavorite>,
293 Xkb2Qt<XKB_KEY_XF86HotLinks, Qt::Key_HotLinks>,
294 Xkb2Qt<XKB_KEY_XF86BrightnessAdjust, Qt::Key_BrightnessAdjust>,
295 Xkb2Qt<XKB_KEY_XF86Finance, Qt::Key_Finance>,
296 Xkb2Qt<XKB_KEY_XF86Community, Qt::Key_Community>,
297 Xkb2Qt<XKB_KEY_XF86AudioRewind, Qt::Key_AudioRewind>,
298 Xkb2Qt<XKB_KEY_XF86BackForward, Qt::Key_BackForward>,
299 Xkb2Qt<XKB_KEY_XF86ApplicationLeft, Qt::Key_ApplicationLeft>,
300 Xkb2Qt<XKB_KEY_XF86ApplicationRight, Qt::Key_ApplicationRight>,
301 Xkb2Qt<XKB_KEY_XF86Book, Qt::Key_Book>,
302 Xkb2Qt<XKB_KEY_XF86CD, Qt::Key_CD>,
303 Xkb2Qt<XKB_KEY_XF86Calculater, Qt::Key_Calculator>,
304 Xkb2Qt<XKB_KEY_XF86Calculator, Qt::Key_Calculator>,
305 Xkb2Qt<XKB_KEY_XF86Clear, Qt::Key_Clear>,
306 Xkb2Qt<XKB_KEY_XF86ClearGrab, Qt::Key_ClearGrab>,
307 Xkb2Qt<XKB_KEY_XF86Close, Qt::Key_Close>,
308 Xkb2Qt<XKB_KEY_XF86Copy, Qt::Key_Copy>,
309 Xkb2Qt<XKB_KEY_XF86Cut, Qt::Key_Cut>,
310 Xkb2Qt<XKB_KEY_XF86Display, Qt::Key_Display>,
311 Xkb2Qt<XKB_KEY_XF86DOS, Qt::Key_DOS>,
312 Xkb2Qt<XKB_KEY_XF86Documents, Qt::Key_Documents>,
313 Xkb2Qt<XKB_KEY_XF86Excel, Qt::Key_Excel>,
314 Xkb2Qt<XKB_KEY_XF86Explorer, Qt::Key_Explorer>,
315 Xkb2Qt<XKB_KEY_XF86Game, Qt::Key_Game>,
316 Xkb2Qt<XKB_KEY_XF86Go, Qt::Key_Go>,
317 Xkb2Qt<XKB_KEY_XF86iTouch, Qt::Key_iTouch>,
318 Xkb2Qt<XKB_KEY_XF86LogOff, Qt::Key_LogOff>,
319 Xkb2Qt<XKB_KEY_XF86Market, Qt::Key_Market>,
320 Xkb2Qt<XKB_KEY_XF86Meeting, Qt::Key_Meeting>,
321 Xkb2Qt<XKB_KEY_XF86MenuKB, Qt::Key_MenuKB>,
322 Xkb2Qt<XKB_KEY_XF86MenuPB, Qt::Key_MenuPB>,
323 Xkb2Qt<XKB_KEY_XF86MySites, Qt::Key_MySites>,
324 Xkb2Qt<XKB_KEY_XF86New, Qt::Key_New>,
325 Xkb2Qt<XKB_KEY_XF86News, Qt::Key_News>,
326 Xkb2Qt<XKB_KEY_XF86OfficeHome, Qt::Key_OfficeHome>,
327 Xkb2Qt<XKB_KEY_XF86Open, Qt::Key_Open>,
328 Xkb2Qt<XKB_KEY_XF86Option, Qt::Key_Option>,
329 Xkb2Qt<XKB_KEY_XF86Paste, Qt::Key_Paste>,
330 Xkb2Qt<XKB_KEY_XF86Phone, Qt::Key_Phone>,
331#ifdef XKB_KEY_XF86PickupPhone
332 Xkb2Qt<XKB_KEY_XF86PickupPhone, Qt::Key_Call>,
334#ifdef XKB_KEY_XF86HangupPhone
335 Xkb2Qt<XKB_KEY_XF86HangupPhone, Qt::Key_Hangup>,
337 Xkb2Qt<XKB_KEY_XF86Reply, Qt::Key_Reply>,
338 Xkb2Qt<XKB_KEY_XF86Reload, Qt::Key_Reload>,
339 Xkb2Qt<XKB_KEY_XF86RotateWindows, Qt::Key_RotateWindows>,
340 Xkb2Qt<XKB_KEY_XF86RotationPB, Qt::Key_RotationPB>,
341 Xkb2Qt<XKB_KEY_XF86RotationKB, Qt::Key_RotationKB>,
342 Xkb2Qt<XKB_KEY_XF86Save, Qt::Key_Save>,
343 Xkb2Qt<XKB_KEY_XF86Send, Qt::Key_Send>,
344 Xkb2Qt<XKB_KEY_XF86Spell, Qt::Key_Spell>,
345 Xkb2Qt<XKB_KEY_XF86SplitScreen, Qt::Key_SplitScreen>,
346 Xkb2Qt<XKB_KEY_XF86Support, Qt::Key_Support>,
347 Xkb2Qt<XKB_KEY_XF86TaskPane, Qt::Key_TaskPane>,
348 Xkb2Qt<XKB_KEY_XF86Terminal, Qt::Key_Terminal>,
349 Xkb2Qt<XKB_KEY_XF86Tools, Qt::Key_Tools>,
350 Xkb2Qt<XKB_KEY_XF86Travel, Qt::Key_Travel>,
351 Xkb2Qt<XKB_KEY_XF86Video, Qt::Key_Video>,
352 Xkb2Qt<XKB_KEY_XF86Word, Qt::Key_Word>,
353 Xkb2Qt<XKB_KEY_XF86Xfer, Qt::Key_Xfer>,
354 Xkb2Qt<XKB_KEY_XF86ZoomIn, Qt::Key_ZoomIn>,
355 Xkb2Qt<XKB_KEY_XF86ZoomOut, Qt::Key_ZoomOut>,
356 Xkb2Qt<XKB_KEY_XF86Away, Qt::Key_Away>,
357 Xkb2Qt<XKB_KEY_XF86Messenger, Qt::Key_Messenger>,
358 Xkb2Qt<XKB_KEY_XF86WebCam, Qt::Key_WebCam>,
359 Xkb2Qt<XKB_KEY_XF86MailForward, Qt::Key_MailForward>,
360 Xkb2Qt<XKB_KEY_XF86Pictures, Qt::Key_Pictures>,
361 Xkb2Qt<XKB_KEY_XF86Music, Qt::Key_Music>,
362 Xkb2Qt<XKB_KEY_XF86Battery, Qt::Key_Battery>,
363 Xkb2Qt<XKB_KEY_XF86Bluetooth, Qt::Key_Bluetooth>,
364 Xkb2Qt<XKB_KEY_XF86WLAN, Qt::Key_WLAN>,
365 Xkb2Qt<XKB_KEY_XF86UWB, Qt::Key_UWB>,
366 Xkb2Qt<XKB_KEY_XF86AudioForward, Qt::Key_AudioForward>,
367 Xkb2Qt<XKB_KEY_XF86AudioRepeat, Qt::Key_AudioRepeat>,
368 Xkb2Qt<XKB_KEY_XF86AudioRandomPlay, Qt::Key_AudioRandomPlay>,
369 Xkb2Qt<XKB_KEY_XF86Subtitle, Qt::Key_Subtitle>,
370 Xkb2Qt<XKB_KEY_XF86AudioCycleTrack, Qt::Key_AudioCycleTrack>,
371 Xkb2Qt<XKB_KEY_XF86Time, Qt::Key_Time>,
372 Xkb2Qt<XKB_KEY_XF86Select, Qt::Key_Select>,
373 Xkb2Qt<XKB_KEY_XF86View, Qt::Key_View>,
374 Xkb2Qt<XKB_KEY_XF86TopMenu, Qt::Key_TopMenu>,
375 Xkb2Qt<XKB_KEY_XF86Red, Qt::Key_Red>,
376 Xkb2Qt<XKB_KEY_XF86Green, Qt::Key_Green>,
377 Xkb2Qt<XKB_KEY_XF86Yellow, Qt::Key_Yellow>,
378 Xkb2Qt<XKB_KEY_XF86Blue, Qt::Key_Blue>,
379 Xkb2Qt<XKB_KEY_XF86Bluetooth, Qt::Key_Bluetooth>,
380 Xkb2Qt<XKB_KEY_XF86Suspend, Qt::Key_Suspend>,
381 Xkb2Qt<XKB_KEY_XF86Hibernate, Qt::Key_Hibernate>,
382 Xkb2Qt<XKB_KEY_XF86TouchpadToggle, Qt::Key_TouchpadToggle>,
383 Xkb2Qt<XKB_KEY_XF86TouchpadOn, Qt::Key_TouchpadOn>,
384 Xkb2Qt<XKB_KEY_XF86TouchpadOff, Qt::Key_TouchpadOff>,
385 Xkb2Qt<XKB_KEY_XF86AudioMicMute, Qt::Key_MicMute>,
386 Xkb2Qt<XKB_KEY_XF86Keyboard, Qt::Key_Keyboard>,
387 Xkb2Qt<XKB_KEY_XF86Launch0, Qt::Key_Launch0>,
388 Xkb2Qt<XKB_KEY_XF86Launch1, Qt::Key_Launch1>,
389 Xkb2Qt<XKB_KEY_XF86Launch2, Qt::Key_Launch2>,
390 Xkb2Qt<XKB_KEY_XF86Launch3, Qt::Key_Launch3>,
391 Xkb2Qt<XKB_KEY_XF86Launch4, Qt::Key_Launch4>,
392 Xkb2Qt<XKB_KEY_XF86Launch5, Qt::Key_Launch5>,
393 Xkb2Qt<XKB_KEY_XF86Launch6, Qt::Key_Launch6>,
394 Xkb2Qt<XKB_KEY_XF86Launch7, Qt::Key_Launch7>,
395 Xkb2Qt<XKB_KEY_XF86Launch8, Qt::Key_Launch8>,
396 Xkb2Qt<XKB_KEY_XF86Launch9, Qt::Key_Launch9>,
397 Xkb2Qt<XKB_KEY_XF86LaunchA, Qt::Key_LaunchA>,
398 Xkb2Qt<XKB_KEY_XF86LaunchB, Qt::Key_LaunchB>,
399 Xkb2Qt<XKB_KEY_XF86LaunchC, Qt::Key_LaunchC>,
400 Xkb2Qt<XKB_KEY_XF86LaunchD, Qt::Key_LaunchD>,
401 Xkb2Qt<XKB_KEY_XF86LaunchE, Qt::Key_LaunchE>,
402 Xkb2Qt<XKB_KEY_XF86LaunchF, Qt::Key_LaunchF>
406xkb_keysym_t QXkbCommon::qxkbcommon_xkb_keysym_to_upper(xkb_keysym_t ks)
408 xkb_keysym_t lower, upper;
410 xkbcommon_XConvertCase(ks, &lower, &upper);
415QString QXkbCommon::lookupString(
struct xkb_state *state, xkb_keycode_t code)
417 QVarLengthArray<
char, 32> chars(32);
418 const int size = xkb_state_key_get_utf8(state, code, chars.data(), chars.size());
419 if (Q_UNLIKELY(size + 1 > chars.size())) {
420 chars.resize(size + 1);
421 xkb_state_key_get_utf8(state, code, chars.data(), chars.size());
423 return QString::fromUtf8(chars.constData(), size);
426QString QXkbCommon::lookupStringNoKeysymTransformations(xkb_keysym_t keysym)
428 QVarLengthArray<
char, 32> chars(32);
429 const int size = xkb_keysym_to_utf8(keysym, chars.data(), chars.size());
433 if (Q_UNLIKELY(size > chars.size())) {
435 xkb_keysym_to_utf8(keysym, chars.data(), chars.size());
437 return QString::fromUtf8(chars.constData(), size - 1);
440QList<xkb_keysym_t> QXkbCommon::toKeysym(QKeyEvent *event)
442 QList<xkb_keysym_t> keysyms;
443 int qtKey = event->key();
445 if (qtKey >= Qt::Key_F1 && qtKey <= Qt::Key_F35) {
446 keysyms.append(XKB_KEY_F1 + (qtKey - Qt::Key_F1));
447 }
else if (event->modifiers() & Qt::KeypadModifier) {
448 if (qtKey >= Qt::Key_0 && qtKey <= Qt::Key_9)
449 keysyms.append(XKB_KEY_KP_0 + (qtKey - Qt::Key_0));
450 }
else if (isLatin1(qtKey) && event->text().isUpper()) {
451 keysyms.append(qtKey);
454 if (!keysyms.isEmpty())
458 auto it = std::find_if(KeyTbl.cbegin(), KeyTbl.cend(), [&qtKey](xkb2qt_t elem) {
459 return elem.qt ==
static_cast<uint>(qtKey);
461 if (it != KeyTbl.end()) {
462 keysyms.append(it->xkb);
467 if (event->text().isEmpty())
470 ucs4 = event->text().toUcs4();
475 for (uint utf32 : std::as_const(ucs4))
476 keysyms.append(utf32 | 0x01000000);
481int QXkbCommon::keysymToQtKey(xkb_keysym_t keysym, Qt::KeyboardModifiers modifiers)
483 return keysymToQtKey(keysym, modifiers,
nullptr, 0);
486int QXkbCommon::keysymToQtKey(xkb_keysym_t keysym, Qt::KeyboardModifiers modifiers,
487 xkb_state *state, xkb_keycode_t code,
488 bool superAsMeta,
bool hyperAsMeta)
498 if (modifiers & Qt::ControlModifier) {
502 if (!QXkbCommon::isLatin1(keysym)) {
503 xkb_keysym_t latinKeysym = QXkbCommon::lookupLatinKeysym(state, code);
504 if (latinKeysym != XKB_KEY_NoSymbol)
505 keysym = latinKeysym;
509 return keysymToQtKey_internal(keysym, modifiers, state, code, superAsMeta, hyperAsMeta);
513 xkb_state *state, xkb_keycode_t code,
514 bool superAsMeta,
bool hyperAsMeta)
519 if (keysym >= XKB_KEY_F1 && keysym <= XKB_KEY_F35) {
521 qtKey = Qt::Key_F1 + (keysym - XKB_KEY_F1);
522 }
else if (keysym >= XKB_KEY_KP_0 && keysym <= XKB_KEY_KP_9) {
524 qtKey = Qt::Key_0 + (keysym - XKB_KEY_KP_0);
525 }
else if (QXkbCommon::isLatin1(keysym)) {
528 qtKey = QXkbCommon::qxkbcommon_xkb_keysym_to_upper(keysym);
533 if (!QXkbCommon::isLatin1(qtKey))
537 xkb2qt_t searchKey{keysym, 0};
538 auto it =
std::lower_bound(KeyTbl.cbegin(), KeyTbl.cend(), searchKey);
539 if (it != KeyTbl.end() && !(searchKey < *it))
543 if (superAsMeta && (qtKey == Qt::Key_Super_L || qtKey == Qt::Key_Super_R))
544 qtKey = Qt::Key_Meta;
545 if (hyperAsMeta && (qtKey == Qt::Key_Hyper_L || qtKey == Qt::Key_Hyper_R))
546 qtKey = Qt::Key_Meta;
554 if (!state || modifiers & Qt::ControlModifier) {
559 text = QXkbCommon::lookupStringNoKeysymTransformations(keysym);
561 text = QXkbCommon::lookupString(state, code);
563 if (!text.isEmpty()) {
564 if (text.unicode()->isDigit()) {
567 qtKey = Qt::Key_0 + text.unicode()->digitValue();
569 text = text.toUpper();
570 QStringIterator i(text);
578Qt::KeyboardModifiers QXkbCommon::modifiers(
struct xkb_state *state, xkb_keysym_t keysym)
580 Qt::KeyboardModifiers modifiers = Qt::NoModifier;
582 if (xkb_state_mod_name_is_active(state,
XKB_MOD_NAME_CTRL, XKB_STATE_MODS_EFFECTIVE) > 0)
583 modifiers |= Qt::ControlModifier;
584 if (xkb_state_mod_name_is_active(state,
XKB_MOD_NAME_ALT, XKB_STATE_MODS_EFFECTIVE) > 0)
585 modifiers |= Qt::AltModifier;
586 if (xkb_state_mod_name_is_active(state,
XKB_MOD_NAME_SHIFT, XKB_STATE_MODS_EFFECTIVE) > 0)
587 modifiers |= Qt::ShiftModifier;
588 if (xkb_state_mod_name_is_active(state,
XKB_MOD_NAME_LOGO, XKB_STATE_MODS_EFFECTIVE) > 0)
589 modifiers |= Qt::MetaModifier;
591 if (isKeypad(keysym))
592 modifiers |= Qt::KeypadModifier;
602 Qt::ControlModifier | Qt::ShiftModifier,
604 Qt::AltModifier | Qt::ShiftModifier,
605 Qt::AltModifier | Qt::ControlModifier,
606 Qt::AltModifier | Qt::ShiftModifier | Qt::ControlModifier,
611
612
613QList<
int> QXkbCommon::possibleKeys(xkb_state *state,
const QKeyEvent *event,
614 bool superAsMeta,
bool hyperAsMeta)
617 auto keyCombinations = possibleKeyCombinations(state, event, superAsMeta, hyperAsMeta);
618 for (
auto keyCombination : keyCombinations)
619 result << keyCombination.toCombined();
624QList<QKeyCombination> QXkbCommon::possibleKeyCombinations(xkb_state *state,
const QKeyEvent *event,
625 bool superAsMeta,
bool hyperAsMeta)
627 QList<QKeyCombination> result;
628 quint32 keycode = event->nativeScanCode();
632 Qt::KeyboardModifiers modifiers = event->modifiers();
633 xkb_keymap *keymap = xkb_state_get_keymap(state);
635 Qt::KeyboardModifiers notNeeded = Qt::KeypadModifier | Qt::GroupSwitchModifier;
636 modifiers &= ~notNeeded;
638 ScopedXKBState scopedXkbQueryState(xkb_state_new(keymap));
639 xkb_state *queryState = scopedXkbQueryState.get();
641 qCWarning(lcQpaKeyMapper) << Q_FUNC_INFO <<
"failed to compile xkb keymap";
645 xkb_layout_index_t lockedLayout = xkb_state_serialize_layout(state, XKB_STATE_LAYOUT_LOCKED);
646 xkb_mod_mask_t latchedMods = xkb_state_serialize_mods(state, XKB_STATE_MODS_LATCHED);
647 xkb_mod_mask_t lockedMods = xkb_state_serialize_mods(state, XKB_STATE_MODS_LOCKED);
648 xkb_mod_mask_t depressedMods = xkb_state_serialize_mods(state, XKB_STATE_MODS_DEPRESSED);
649 xkb_state_update_mask(queryState, depressedMods, latchedMods, lockedMods, 0, 0, lockedLayout);
651 xkb_layout_index_t layoutIndex = xkb_state_key_get_layout(queryState, keycode);
652 xkb_level_index_t levelIndex = 0;
653 if (layoutIndex != XKB_LAYOUT_INVALID) {
654 levelIndex = xkb_state_key_get_level(queryState, keycode, layoutIndex);
655 if (levelIndex == XKB_LEVEL_INVALID)
659 xkb_state_update_mask(queryState, 0, latchedMods, lockedMods, 0, 0, lockedLayout);
661 xkb_keysym_t sym = xkb_state_key_get_one_sym(queryState, keycode);
662 if (sym == XKB_KEY_NoSymbol)
665 int baseQtKey = keysymToQtKey_internal(sym, modifiers, queryState, keycode, superAsMeta, hyperAsMeta);
667 result += QKeyCombination::fromCombined(baseQtKey +
int(modifiers));
669 xkb_mod_index_t shiftMod = xkb_keymap_mod_get_index(keymap,
"Shift");
670 xkb_mod_index_t altMod = xkb_keymap_mod_get_index(keymap,
"Alt");
671 xkb_mod_index_t controlMod = xkb_keymap_mod_get_index(keymap,
"Control");
672 xkb_mod_index_t metaMod = xkb_keymap_mod_get_index(keymap,
"Meta");
674 Q_ASSERT(shiftMod < 32);
675 Q_ASSERT(altMod < 32);
676 Q_ASSERT(controlMod < 32);
678 xkb_mod_mask_t depressed;
681 for (uint i = 1; i <
sizeof(ModsTbl) /
sizeof(*ModsTbl) ; ++i) {
682 Qt::KeyboardModifiers neededMods = ModsTbl[i];
683 if ((modifiers & neededMods) == neededMods) {
685 if (isLatin1(baseQtKey))
688 sym = lookupLatinKeysym(state, keycode);
691 if (neededMods & Qt::AltModifier)
692 depressed |= (1 << altMod);
693 if (neededMods & Qt::ShiftModifier)
694 depressed |= (1 << shiftMod);
695 if (neededMods & Qt::ControlModifier)
696 depressed |= (1 << controlMod);
697 if (metaMod < 32 && neededMods & Qt::MetaModifier)
698 depressed |= (1 << metaMod);
699 xkb_state_update_mask(queryState, depressed, latchedMods, lockedMods, 0, 0, lockedLayout);
700 sym = xkb_state_key_get_one_sym(queryState, keycode);
702 if (sym == XKB_KEY_NoSymbol)
705 Qt::KeyboardModifiers mods = modifiers & ~neededMods;
706 qtKey = keysymToQtKey_internal(sym, mods, queryState, keycode, superAsMeta, hyperAsMeta);
707 if (!qtKey || qtKey == baseQtKey)
712 bool ambiguous =
false;
713 for (
auto keyCombination : std::as_const(result)) {
714 if (keyCombination.key() == qtKey
715 && (keyCombination.keyboardModifiers() & mods) == mods) {
723 result += QKeyCombination::fromCombined(qtKey +
int(mods));
730void QXkbCommon::verifyHasLatinLayout(xkb_keymap *keymap)
732 const xkb_layout_index_t layoutCount = xkb_keymap_num_layouts(keymap);
733 const xkb_keycode_t minKeycode = xkb_keymap_min_keycode(keymap);
734 const xkb_keycode_t maxKeycode = xkb_keymap_max_keycode(keymap);
736 const xkb_keysym_t *keysyms =
nullptr;
738 for (xkb_layout_index_t layout = 0; layout < layoutCount; ++layout) {
739 for (xkb_keycode_t code = minKeycode; code < maxKeycode; ++code) {
740 xkb_keymap_key_get_syms_by_level(keymap, code, layout, 0, &keysyms);
741 if (keysyms && isLatin1(keysyms[0]))
743 if (nrLatinKeys > 10)
755 qCDebug(lcQpaKeyMapper,
"no keyboard layouts with latin keys present");
758xkb_keysym_t QXkbCommon::lookupLatinKeysym(xkb_state *state, xkb_keycode_t keycode)
760 xkb_layout_index_t layout;
761 xkb_keysym_t sym = XKB_KEY_NoSymbol;
764 xkb_keymap *keymap = xkb_state_get_keymap(state);
765 const xkb_layout_index_t layoutCount = xkb_keymap_num_layouts_for_key(keymap, keycode);
766 const xkb_layout_index_t currentLayout = xkb_state_key_get_layout(state, keycode);
769 for (layout = 0; layout < layoutCount; ++layout) {
770 if (layout == currentLayout)
772 const xkb_keysym_t *syms =
nullptr;
773 xkb_level_index_t level = xkb_state_key_get_level(state, keycode, layout);
774 if (xkb_keymap_key_get_syms_by_level(keymap, keycode, layout, level, &syms) != 1)
776 if (isLatin1(syms[0])) {
782 if (sym == XKB_KEY_NoSymbol)
785 xkb_mod_mask_t latchedMods = xkb_state_serialize_mods(state, XKB_STATE_MODS_LATCHED);
786 xkb_mod_mask_t lockedMods = xkb_state_serialize_mods(state, XKB_STATE_MODS_LOCKED);
796 const xkb_keycode_t minKeycode = xkb_keymap_min_keycode(keymap);
797 const xkb_keycode_t maxKeycode = xkb_keymap_max_keycode(keymap);
798 ScopedXKBState queryState(xkb_state_new(keymap));
799 for (xkb_layout_index_t prevLayout = 0; prevLayout < layout; ++prevLayout) {
800 xkb_state_update_mask(queryState.get(), 0, latchedMods, lockedMods, 0, 0, prevLayout);
801 for (xkb_keycode_t code = minKeycode; code < maxKeycode; ++code) {
802 xkb_keysym_t prevSym = xkb_state_key_get_one_sym(queryState.get(), code);
803 if (prevSym == sym) {
804 sym = XKB_KEY_NoSymbol;
813void QXkbCommon::setXkbContext(QPlatformInputContext *inputContext,
struct xkb_context *context)
815 if (!inputContext || !context)
818 const char *
const inputContextClassName =
"QComposeInputContext";
819 const char *
const normalizedSignature =
"setXkbContext(xkb_context*)";
821 if (inputContext->objectName() != QLatin1StringView(inputContextClassName))
824 static const QMetaMethod setXkbContext = [&]() {
825 int methodIndex = inputContext->metaObject()->indexOfMethod(normalizedSignature);
826 QMetaMethod method = inputContext->metaObject()->method(methodIndex);
827 Q_ASSERT(method.isValid());
828 if (!method.isValid())
829 qCWarning(lcQpaKeyMapper) << normalizedSignature <<
"not found on" << inputContextClassName;
833 if (!setXkbContext.isValid())
836 setXkbContext.invoke(inputContext, Qt::DirectConnection, Q_ARG(
struct xkb_context*, context));
Combined button and popup list for selecting options.
#define XKB_MOD_NAME_SHIFT
#define XKB_MOD_NAME_LOGO
#define XKB_MOD_NAME_CTRL
static const Qt::KeyboardModifiers ModsTbl[]
static QT_BEGIN_NAMESPACE int keysymToQtKey_internal(xkb_keysym_t keysym, Qt::KeyboardModifiers modifiers, xkb_state *state, xkb_keycode_t code, bool superAsMeta, bool hyperAsMeta)
static constexpr const auto KeyTbl
static constexpr Type data() noexcept
constexpr bool operator<=(const xkb2qt &that) const noexcept
constexpr bool operator<(const xkb2qt &that) const noexcept