From 1219fc26a041164dd4cb362b25f3d097501c9371 Mon Sep 17 00:00:00 2001 From: Gatis Paeglis Date: Fri, 19 Jan 2018 12:17:36 +0100 Subject: xcb: use keysym defs from xkbcommon, instead of X11 headers xkbcommon-keysyms.h is generated from X11 header files, so it contains all the same values. Removed all of #ifndef XK_* as those keysyms are present in xkbcommon-keysyms.h (checked the header from 0.4.1, the minimal required version). The same for XF86XK_* defines. This will allow to reuse some of this code on platforms that don't depend on X11, for details see QTBUG-65503. Task-number: QTBUG-65503 Change-Id: I68083e11cea1f29d775a6ed46503a06b04b9a05c Reviewed-by: Gatis Paeglis --- src/plugins/platforms/xcb/qxcbkeyboard.cpp | 912 ++++++++++------------------- 1 file changed, 322 insertions(+), 590 deletions(-) (limited to 'src/plugins/platforms') diff --git a/src/plugins/platforms/xcb/qxcbkeyboard.cpp b/src/plugins/platforms/xcb/qxcbkeyboard.cpp index d00d69586a..8781969521 100644 --- a/src/plugins/platforms/xcb/qxcbkeyboard.cpp +++ b/src/plugins/platforms/xcb/qxcbkeyboard.cpp @@ -50,622 +50,354 @@ #include -#include +#include #if QT_CONFIG(xinput2) #include #undef KeyPress #undef KeyRelease #endif - -#ifndef XK_ISO_Left_Tab -#define XK_ISO_Left_Tab 0xFE20 -#endif - -#ifndef XK_dead_a -#define XK_dead_a 0xFE80 -#endif - -#ifndef XK_dead_A -#define XK_dead_A 0xFE81 -#endif - -#ifndef XK_dead_e -#define XK_dead_e 0xFE82 -#endif - -#ifndef XK_dead_E -#define XK_dead_E 0xFE83 -#endif - -#ifndef XK_dead_i -#define XK_dead_i 0xFE84 -#endif - -#ifndef XK_dead_I -#define XK_dead_I 0xFE85 -#endif - -#ifndef XK_dead_o -#define XK_dead_o 0xFE86 -#endif - -#ifndef XK_dead_O -#define XK_dead_O 0xFE87 -#endif - -#ifndef XK_dead_u -#define XK_dead_u 0xFE88 -#endif - -#ifndef XK_dead_U -#define XK_dead_U 0xFE89 -#endif - -#ifndef XK_dead_small_schwa -#define XK_dead_small_schwa 0xFE8A -#endif - -#ifndef XK_dead_capital_schwa -#define XK_dead_capital_schwa 0xFE8B -#endif - -#ifndef XK_dead_greek -#define XK_dead_greek 0xFE8C -#endif - -#ifndef XK_dead_lowline -#define XK_dead_lowline 0xFE90 -#endif - -#ifndef XK_dead_aboveverticalline -#define XK_dead_aboveverticalline 0xFE91 -#endif - -#ifndef XK_dead_belowverticalline -#define XK_dead_belowverticalline 0xFE92 -#endif - -#ifndef XK_dead_longsolidusoverlay -#define XK_dead_longsolidusoverlay 0xFE93 -#endif - - -#ifndef XK_Codeinput -#define XK_Codeinput 0xFF37 -#endif - -#ifndef XK_Kanji_Bangou -#define XK_Kanji_Bangou 0xFF37 /* same as codeinput */ -#endif - -// Fix old X libraries -#ifndef XK_KP_Home -#define XK_KP_Home 0xFF95 -#endif -#ifndef XK_KP_Left -#define XK_KP_Left 0xFF96 -#endif -#ifndef XK_KP_Up -#define XK_KP_Up 0xFF97 -#endif -#ifndef XK_KP_Right -#define XK_KP_Right 0xFF98 -#endif -#ifndef XK_KP_Down -#define XK_KP_Down 0xFF99 -#endif -#ifndef XK_KP_Prior -#define XK_KP_Prior 0xFF9A -#endif -#ifndef XK_KP_Next -#define XK_KP_Next 0xFF9B -#endif -#ifndef XK_KP_End -#define XK_KP_End 0xFF9C -#endif -#ifndef XK_KP_Insert -#define XK_KP_Insert 0xFF9E -#endif -#ifndef XK_KP_Delete -#define XK_KP_Delete 0xFF9F -#endif - -// the next lines are taken on 10/2009 from X.org (X11/XF86keysym.h), defining some special -// multimedia keys. They are included here as not every system has them. -#define XF86XK_MonBrightnessUp 0x1008FF02 -#define XF86XK_MonBrightnessDown 0x1008FF03 -#define XF86XK_KbdLightOnOff 0x1008FF04 -#define XF86XK_KbdBrightnessUp 0x1008FF05 -#define XF86XK_KbdBrightnessDown 0x1008FF06 -#define XF86XK_Standby 0x1008FF10 -#define XF86XK_AudioLowerVolume 0x1008FF11 -#define XF86XK_AudioMute 0x1008FF12 -#define XF86XK_AudioRaiseVolume 0x1008FF13 -#define XF86XK_AudioPlay 0x1008FF14 -#define XF86XK_AudioStop 0x1008FF15 -#define XF86XK_AudioPrev 0x1008FF16 -#define XF86XK_AudioNext 0x1008FF17 -#define XF86XK_HomePage 0x1008FF18 -#define XF86XK_Mail 0x1008FF19 -#define XF86XK_Start 0x1008FF1A -#define XF86XK_Search 0x1008FF1B -#define XF86XK_AudioRecord 0x1008FF1C -#define XF86XK_Calculator 0x1008FF1D -#define XF86XK_Memo 0x1008FF1E -#define XF86XK_ToDoList 0x1008FF1F -#define XF86XK_Calendar 0x1008FF20 -#define XF86XK_PowerDown 0x1008FF21 -#define XF86XK_ContrastAdjust 0x1008FF22 -#define XF86XK_Back 0x1008FF26 -#define XF86XK_Forward 0x1008FF27 -#define XF86XK_Stop 0x1008FF28 -#define XF86XK_Refresh 0x1008FF29 -#define XF86XK_PowerOff 0x1008FF2A -#define XF86XK_WakeUp 0x1008FF2B -#define XF86XK_Eject 0x1008FF2C -#define XF86XK_ScreenSaver 0x1008FF2D -#define XF86XK_WWW 0x1008FF2E -#define XF86XK_Sleep 0x1008FF2F -#define XF86XK_Favorites 0x1008FF30 -#define XF86XK_AudioPause 0x1008FF31 -#define XF86XK_AudioMedia 0x1008FF32 -#define XF86XK_MyComputer 0x1008FF33 -#define XF86XK_LightBulb 0x1008FF35 -#define XF86XK_Shop 0x1008FF36 -#define XF86XK_History 0x1008FF37 -#define XF86XK_OpenURL 0x1008FF38 -#define XF86XK_AddFavorite 0x1008FF39 -#define XF86XK_HotLinks 0x1008FF3A -#define XF86XK_BrightnessAdjust 0x1008FF3B -#define XF86XK_Finance 0x1008FF3C -#define XF86XK_Community 0x1008FF3D -#define XF86XK_AudioRewind 0x1008FF3E -#define XF86XK_BackForward 0x1008FF3F -#define XF86XK_Launch0 0x1008FF40 -#define XF86XK_Launch1 0x1008FF41 -#define XF86XK_Launch2 0x1008FF42 -#define XF86XK_Launch3 0x1008FF43 -#define XF86XK_Launch4 0x1008FF44 -#define XF86XK_Launch5 0x1008FF45 -#define XF86XK_Launch6 0x1008FF46 -#define XF86XK_Launch7 0x1008FF47 -#define XF86XK_Launch8 0x1008FF48 -#define XF86XK_Launch9 0x1008FF49 -#define XF86XK_LaunchA 0x1008FF4A -#define XF86XK_LaunchB 0x1008FF4B -#define XF86XK_LaunchC 0x1008FF4C -#define XF86XK_LaunchD 0x1008FF4D -#define XF86XK_LaunchE 0x1008FF4E -#define XF86XK_LaunchF 0x1008FF4F -#define XF86XK_ApplicationLeft 0x1008FF50 -#define XF86XK_ApplicationRight 0x1008FF51 -#define XF86XK_Book 0x1008FF52 -#define XF86XK_CD 0x1008FF53 -#define XF86XK_Calculater 0x1008FF54 -#define XF86XK_Clear 0x1008FF55 -#define XF86XK_ClearGrab 0x1008FE21 -#define XF86XK_Close 0x1008FF56 -#define XF86XK_Copy 0x1008FF57 -#define XF86XK_Cut 0x1008FF58 -#define XF86XK_Display 0x1008FF59 -#define XF86XK_DOS 0x1008FF5A -#define XF86XK_Documents 0x1008FF5B -#define XF86XK_Excel 0x1008FF5C -#define XF86XK_Explorer 0x1008FF5D -#define XF86XK_Game 0x1008FF5E -#define XF86XK_Go 0x1008FF5F -#define XF86XK_iTouch 0x1008FF60 -#define XF86XK_LogOff 0x1008FF61 -#define XF86XK_Market 0x1008FF62 -#define XF86XK_Meeting 0x1008FF63 -#define XF86XK_MenuKB 0x1008FF65 -#define XF86XK_MenuPB 0x1008FF66 -#define XF86XK_MySites 0x1008FF67 -#define XF86XK_New 0x1008FF68 -#define XF86XK_News 0x1008FF69 -#define XF86XK_OfficeHome 0x1008FF6A -#define XF86XK_Open 0x1008FF6B -#define XF86XK_Option 0x1008FF6C -#define XF86XK_Paste 0x1008FF6D -#define XF86XK_Phone 0x1008FF6E -#define XF86XK_Reply 0x1008FF72 -#define XF86XK_Reload 0x1008FF73 -#define XF86XK_RotateWindows 0x1008FF74 -#define XF86XK_RotationPB 0x1008FF75 -#define XF86XK_RotationKB 0x1008FF76 -#define XF86XK_Save 0x1008FF77 -#define XF86XK_Send 0x1008FF7B -#define XF86XK_Spell 0x1008FF7C -#define XF86XK_SplitScreen 0x1008FF7D -#define XF86XK_Support 0x1008FF7E -#define XF86XK_TaskPane 0x1008FF7F -#define XF86XK_Terminal 0x1008FF80 -#define XF86XK_Tools 0x1008FF81 -#define XF86XK_Travel 0x1008FF82 -#define XF86XK_Video 0x1008FF87 -#define XF86XK_Word 0x1008FF89 -#define XF86XK_Xfer 0x1008FF8A -#define XF86XK_ZoomIn 0x1008FF8B -#define XF86XK_ZoomOut 0x1008FF8C -#define XF86XK_Away 0x1008FF8D -#define XF86XK_Messenger 0x1008FF8E -#define XF86XK_WebCam 0x1008FF8F -#define XF86XK_MailForward 0x1008FF90 -#define XF86XK_Pictures 0x1008FF91 -#define XF86XK_Music 0x1008FF92 -#define XF86XK_Battery 0x1008FF93 -#define XF86XK_Bluetooth 0x1008FF94 -#define XF86XK_WLAN 0x1008FF95 -#define XF86XK_UWB 0x1008FF96 -#define XF86XK_AudioForward 0x1008FF97 -#define XF86XK_AudioRepeat 0x1008FF98 -#define XF86XK_AudioRandomPlay 0x1008FF99 -#define XF86XK_Subtitle 0x1008FF9A -#define XF86XK_AudioCycleTrack 0x1008FF9B -#define XF86XK_Time 0x1008FF9F -#define XF86XK_Select 0x1008FFA0 -#define XF86XK_View 0x1008FFA1 -#define XF86XK_TopMenu 0x1008FFA2 -#define XF86XK_Red 0x1008FFA3 -#define XF86XK_Green 0x1008FFA4 -#define XF86XK_Yellow 0x1008FFA5 -#define XF86XK_Blue 0x1008FFA6 -#define XF86XK_Suspend 0x1008FFA7 -#define XF86XK_Hibernate 0x1008FFA8 -#define XF86XK_TouchpadToggle 0x1008FFA9 -#define XF86XK_TouchpadOn 0x1008FFB0 -#define XF86XK_TouchpadOff 0x1008FFB1 -#define XF86XK_AudioMicMute 0x1008FFB2 - - -// end of XF86keysyms.h - QT_BEGIN_NAMESPACE -// keyboard mapping table static const unsigned int KeyTbl[] = { - // misc keys - XK_Escape, Qt::Key_Escape, - XK_Tab, Qt::Key_Tab, - XK_ISO_Left_Tab, Qt::Key_Backtab, - XK_BackSpace, Qt::Key_Backspace, - XK_Return, Qt::Key_Return, - XK_Insert, Qt::Key_Insert, - XK_Delete, Qt::Key_Delete, - XK_Clear, Qt::Key_Delete, - XK_Pause, Qt::Key_Pause, - XK_Print, Qt::Key_Print, + XKB_KEY_Escape, Qt::Key_Escape, + XKB_KEY_Tab, Qt::Key_Tab, + XKB_KEY_ISO_Left_Tab, Qt::Key_Backtab, + XKB_KEY_BackSpace, Qt::Key_Backspace, + XKB_KEY_Return, Qt::Key_Return, + XKB_KEY_Insert, Qt::Key_Insert, + XKB_KEY_Delete, Qt::Key_Delete, + XKB_KEY_Clear, Qt::Key_Delete, + XKB_KEY_Pause, Qt::Key_Pause, + XKB_KEY_Print, Qt::Key_Print, 0x1005FF60, Qt::Key_SysReq, // hardcoded Sun SysReq 0x1007ff00, Qt::Key_SysReq, // hardcoded X386 SysReq // cursor movement - XK_Home, Qt::Key_Home, - XK_End, Qt::Key_End, - XK_Left, Qt::Key_Left, - XK_Up, Qt::Key_Up, - XK_Right, Qt::Key_Right, - XK_Down, Qt::Key_Down, - XK_Prior, Qt::Key_PageUp, - XK_Next, Qt::Key_PageDown, + XKB_KEY_Home, Qt::Key_Home, + XKB_KEY_End, Qt::Key_End, + XKB_KEY_Left, Qt::Key_Left, + XKB_KEY_Up, Qt::Key_Up, + XKB_KEY_Right, Qt::Key_Right, + XKB_KEY_Down, Qt::Key_Down, + XKB_KEY_Prior, Qt::Key_PageUp, + XKB_KEY_Next, Qt::Key_PageDown, // modifiers - XK_Shift_L, Qt::Key_Shift, - XK_Shift_R, Qt::Key_Shift, - XK_Shift_Lock, Qt::Key_Shift, - XK_Control_L, Qt::Key_Control, - XK_Control_R, Qt::Key_Control, - XK_Meta_L, Qt::Key_Meta, - XK_Meta_R, Qt::Key_Meta, - XK_Alt_L, Qt::Key_Alt, - XK_Alt_R, Qt::Key_Alt, - XK_Caps_Lock, Qt::Key_CapsLock, - XK_Num_Lock, Qt::Key_NumLock, - XK_Scroll_Lock, Qt::Key_ScrollLock, - XK_Super_L, Qt::Key_Super_L, - XK_Super_R, Qt::Key_Super_R, - XK_Menu, Qt::Key_Menu, - XK_Hyper_L, Qt::Key_Hyper_L, - XK_Hyper_R, Qt::Key_Hyper_R, - XK_Help, Qt::Key_Help, + XKB_KEY_Shift_L, Qt::Key_Shift, + XKB_KEY_Shift_R, Qt::Key_Shift, + XKB_KEY_Shift_Lock, Qt::Key_Shift, + XKB_KEY_Control_L, Qt::Key_Control, + XKB_KEY_Control_R, Qt::Key_Control, + XKB_KEY_Meta_L, Qt::Key_Meta, + XKB_KEY_Meta_R, Qt::Key_Meta, + XKB_KEY_Alt_L, Qt::Key_Alt, + XKB_KEY_Alt_R, Qt::Key_Alt, + XKB_KEY_Caps_Lock, Qt::Key_CapsLock, + XKB_KEY_Num_Lock, Qt::Key_NumLock, + XKB_KEY_Scroll_Lock, Qt::Key_ScrollLock, + XKB_KEY_Super_L, Qt::Key_Super_L, + XKB_KEY_Super_R, Qt::Key_Super_R, + XKB_KEY_Menu, Qt::Key_Menu, + XKB_KEY_Hyper_L, Qt::Key_Hyper_L, + XKB_KEY_Hyper_R, Qt::Key_Hyper_R, + XKB_KEY_Help, Qt::Key_Help, 0x1000FF74, Qt::Key_Backtab, // hardcoded HP backtab 0x1005FF10, Qt::Key_F11, // hardcoded Sun F36 (labeled F11) 0x1005FF11, Qt::Key_F12, // hardcoded Sun F37 (labeled F12) // numeric and function keypad keys - XK_KP_Space, Qt::Key_Space, - XK_KP_Tab, Qt::Key_Tab, - XK_KP_Enter, Qt::Key_Enter, - //XK_KP_F1, Qt::Key_F1, - //XK_KP_F2, Qt::Key_F2, - //XK_KP_F3, Qt::Key_F3, - //XK_KP_F4, Qt::Key_F4, - XK_KP_Home, Qt::Key_Home, - XK_KP_Left, Qt::Key_Left, - XK_KP_Up, Qt::Key_Up, - XK_KP_Right, Qt::Key_Right, - XK_KP_Down, Qt::Key_Down, - XK_KP_Prior, Qt::Key_PageUp, - XK_KP_Next, Qt::Key_PageDown, - XK_KP_End, Qt::Key_End, - XK_KP_Begin, Qt::Key_Clear, - XK_KP_Insert, Qt::Key_Insert, - XK_KP_Delete, Qt::Key_Delete, - XK_KP_Equal, Qt::Key_Equal, - XK_KP_Multiply, Qt::Key_Asterisk, - XK_KP_Add, Qt::Key_Plus, - XK_KP_Separator, Qt::Key_Comma, - XK_KP_Subtract, Qt::Key_Minus, - XK_KP_Decimal, Qt::Key_Period, - XK_KP_Divide, Qt::Key_Slash, + XKB_KEY_KP_Space, Qt::Key_Space, + XKB_KEY_KP_Tab, Qt::Key_Tab, + XKB_KEY_KP_Enter, Qt::Key_Enter, + //XKB_KEY_KP_F1, Qt::Key_F1, + //XKB_KEY_KP_F2, Qt::Key_F2, + //XKB_KEY_KP_F3, Qt::Key_F3, + //XKB_KEY_KP_F4, Qt::Key_F4, + XKB_KEY_KP_Home, Qt::Key_Home, + XKB_KEY_KP_Left, Qt::Key_Left, + XKB_KEY_KP_Up, Qt::Key_Up, + XKB_KEY_KP_Right, Qt::Key_Right, + XKB_KEY_KP_Down, Qt::Key_Down, + XKB_KEY_KP_Prior, Qt::Key_PageUp, + XKB_KEY_KP_Next, Qt::Key_PageDown, + XKB_KEY_KP_End, Qt::Key_End, + XKB_KEY_KP_Begin, Qt::Key_Clear, + XKB_KEY_KP_Insert, Qt::Key_Insert, + XKB_KEY_KP_Delete, Qt::Key_Delete, + XKB_KEY_KP_Equal, Qt::Key_Equal, + XKB_KEY_KP_Multiply, Qt::Key_Asterisk, + XKB_KEY_KP_Add, Qt::Key_Plus, + XKB_KEY_KP_Separator, Qt::Key_Comma, + XKB_KEY_KP_Subtract, Qt::Key_Minus, + XKB_KEY_KP_Decimal, Qt::Key_Period, + XKB_KEY_KP_Divide, Qt::Key_Slash, // International input method support keys // International & multi-key character composition - XK_ISO_Level3_Shift, Qt::Key_AltGr, - XK_Multi_key, Qt::Key_Multi_key, - XK_Codeinput, Qt::Key_Codeinput, - XK_SingleCandidate, Qt::Key_SingleCandidate, - XK_MultipleCandidate, Qt::Key_MultipleCandidate, - XK_PreviousCandidate, Qt::Key_PreviousCandidate, + XKB_KEY_ISO_Level3_Shift, Qt::Key_AltGr, + XKB_KEY_Multi_key, Qt::Key_Multi_key, + XKB_KEY_Codeinput, Qt::Key_Codeinput, + XKB_KEY_SingleCandidate, Qt::Key_SingleCandidate, + XKB_KEY_MultipleCandidate, Qt::Key_MultipleCandidate, + XKB_KEY_PreviousCandidate, Qt::Key_PreviousCandidate, // Misc Functions - XK_Mode_switch, Qt::Key_Mode_switch, - XK_script_switch, Qt::Key_Mode_switch, + XKB_KEY_Mode_switch, Qt::Key_Mode_switch, + XKB_KEY_script_switch, Qt::Key_Mode_switch, // Japanese keyboard support - XK_Kanji, Qt::Key_Kanji, - XK_Muhenkan, Qt::Key_Muhenkan, - //XK_Henkan_Mode, Qt::Key_Henkan_Mode, - XK_Henkan_Mode, Qt::Key_Henkan, - XK_Henkan, Qt::Key_Henkan, - XK_Romaji, Qt::Key_Romaji, - XK_Hiragana, Qt::Key_Hiragana, - XK_Katakana, Qt::Key_Katakana, - XK_Hiragana_Katakana, Qt::Key_Hiragana_Katakana, - XK_Zenkaku, Qt::Key_Zenkaku, - XK_Hankaku, Qt::Key_Hankaku, - XK_Zenkaku_Hankaku, Qt::Key_Zenkaku_Hankaku, - XK_Touroku, Qt::Key_Touroku, - XK_Massyo, Qt::Key_Massyo, - XK_Kana_Lock, Qt::Key_Kana_Lock, - XK_Kana_Shift, Qt::Key_Kana_Shift, - XK_Eisu_Shift, Qt::Key_Eisu_Shift, - XK_Eisu_toggle, Qt::Key_Eisu_toggle, - //XK_Kanji_Bangou, Qt::Key_Kanji_Bangou, - //XK_Zen_Koho, Qt::Key_Zen_Koho, - //XK_Mae_Koho, Qt::Key_Mae_Koho, - XK_Kanji_Bangou, Qt::Key_Codeinput, - XK_Zen_Koho, Qt::Key_MultipleCandidate, - XK_Mae_Koho, Qt::Key_PreviousCandidate, - -#ifdef XK_KOREAN + XKB_KEY_Kanji, Qt::Key_Kanji, + XKB_KEY_Muhenkan, Qt::Key_Muhenkan, + //XKB_KEY_Henkan_Mode, Qt::Key_Henkan_Mode, + XKB_KEY_Henkan_Mode, Qt::Key_Henkan, + XKB_KEY_Henkan, Qt::Key_Henkan, + XKB_KEY_Romaji, Qt::Key_Romaji, + XKB_KEY_Hiragana, Qt::Key_Hiragana, + XKB_KEY_Katakana, Qt::Key_Katakana, + XKB_KEY_Hiragana_Katakana, Qt::Key_Hiragana_Katakana, + XKB_KEY_Zenkaku, Qt::Key_Zenkaku, + XKB_KEY_Hankaku, Qt::Key_Hankaku, + XKB_KEY_Zenkaku_Hankaku, Qt::Key_Zenkaku_Hankaku, + XKB_KEY_Touroku, Qt::Key_Touroku, + XKB_KEY_Massyo, Qt::Key_Massyo, + XKB_KEY_Kana_Lock, Qt::Key_Kana_Lock, + XKB_KEY_Kana_Shift, Qt::Key_Kana_Shift, + XKB_KEY_Eisu_Shift, Qt::Key_Eisu_Shift, + XKB_KEY_Eisu_toggle, Qt::Key_Eisu_toggle, + //XKB_KEY_Kanji_Bangou, Qt::Key_Kanji_Bangou, + //XKB_KEY_Zen_Koho, Qt::Key_Zen_Koho, + //XKB_KEY_Mae_Koho, Qt::Key_Mae_Koho, + XKB_KEY_Kanji_Bangou, Qt::Key_Codeinput, + XKB_KEY_Zen_Koho, Qt::Key_MultipleCandidate, + XKB_KEY_Mae_Koho, Qt::Key_PreviousCandidate, + // Korean keyboard support - XK_Hangul, Qt::Key_Hangul, - XK_Hangul_Start, Qt::Key_Hangul_Start, - XK_Hangul_End, Qt::Key_Hangul_End, - XK_Hangul_Hanja, Qt::Key_Hangul_Hanja, - XK_Hangul_Jamo, Qt::Key_Hangul_Jamo, - XK_Hangul_Romaja, Qt::Key_Hangul_Romaja, - //XK_Hangul_Codeinput, Qt::Key_Hangul_Codeinput, - XK_Hangul_Codeinput, Qt::Key_Codeinput, - XK_Hangul_Jeonja, Qt::Key_Hangul_Jeonja, - XK_Hangul_Banja, Qt::Key_Hangul_Banja, - XK_Hangul_PreHanja, Qt::Key_Hangul_PreHanja, - XK_Hangul_PostHanja, Qt::Key_Hangul_PostHanja, - //XK_Hangul_SingleCandidate,Qt::Key_Hangul_SingleCandidate, - //XK_Hangul_MultipleCandidate,Qt::Key_Hangul_MultipleCandidate, - //XK_Hangul_PreviousCandidate,Qt::Key_Hangul_PreviousCandidate, - XK_Hangul_SingleCandidate, Qt::Key_SingleCandidate, - XK_Hangul_MultipleCandidate,Qt::Key_MultipleCandidate, - XK_Hangul_PreviousCandidate,Qt::Key_PreviousCandidate, - XK_Hangul_Special, Qt::Key_Hangul_Special, - //XK_Hangul_switch, Qt::Key_Hangul_switch, - XK_Hangul_switch, Qt::Key_Mode_switch, -#endif // XK_KOREAN + XKB_KEY_Hangul, Qt::Key_Hangul, + XKB_KEY_Hangul_Start, Qt::Key_Hangul_Start, + XKB_KEY_Hangul_End, Qt::Key_Hangul_End, + XKB_KEY_Hangul_Hanja, Qt::Key_Hangul_Hanja, + XKB_KEY_Hangul_Jamo, Qt::Key_Hangul_Jamo, + XKB_KEY_Hangul_Romaja, Qt::Key_Hangul_Romaja, + //XKB_KEY_Hangul_Codeinput, Qt::Key_Hangul_Codeinput, + XKB_KEY_Hangul_Codeinput, Qt::Key_Codeinput, + XKB_KEY_Hangul_Jeonja, Qt::Key_Hangul_Jeonja, + XKB_KEY_Hangul_Banja, Qt::Key_Hangul_Banja, + XKB_KEY_Hangul_PreHanja, Qt::Key_Hangul_PreHanja, + XKB_KEY_Hangul_PostHanja, Qt::Key_Hangul_PostHanja, + //XKB_KEY_Hangul_SingleCandidate,Qt::Key_Hangul_SingleCandidate, + //XKB_KEY_Hangul_MultipleCandidate,Qt::Key_Hangul_MultipleCandidate, + //XKB_KEY_Hangul_PreviousCandidate,Qt::Key_Hangul_PreviousCandidate, + XKB_KEY_Hangul_SingleCandidate, Qt::Key_SingleCandidate, + XKB_KEY_Hangul_MultipleCandidate,Qt::Key_MultipleCandidate, + XKB_KEY_Hangul_PreviousCandidate,Qt::Key_PreviousCandidate, + XKB_KEY_Hangul_Special, Qt::Key_Hangul_Special, + //XKB_KEY_Hangul_switch, Qt::Key_Hangul_switch, + XKB_KEY_Hangul_switch, Qt::Key_Mode_switch, // dead keys - XK_dead_grave, Qt::Key_Dead_Grave, - XK_dead_acute, Qt::Key_Dead_Acute, - XK_dead_circumflex, Qt::Key_Dead_Circumflex, - XK_dead_tilde, Qt::Key_Dead_Tilde, - XK_dead_macron, Qt::Key_Dead_Macron, - XK_dead_breve, Qt::Key_Dead_Breve, - XK_dead_abovedot, Qt::Key_Dead_Abovedot, - XK_dead_diaeresis, Qt::Key_Dead_Diaeresis, - XK_dead_abovering, Qt::Key_Dead_Abovering, - XK_dead_doubleacute, Qt::Key_Dead_Doubleacute, - XK_dead_caron, Qt::Key_Dead_Caron, - XK_dead_cedilla, Qt::Key_Dead_Cedilla, - XK_dead_ogonek, Qt::Key_Dead_Ogonek, - XK_dead_iota, Qt::Key_Dead_Iota, - XK_dead_voiced_sound, Qt::Key_Dead_Voiced_Sound, - XK_dead_semivoiced_sound, Qt::Key_Dead_Semivoiced_Sound, - XK_dead_belowdot, Qt::Key_Dead_Belowdot, - XK_dead_hook, Qt::Key_Dead_Hook, - XK_dead_horn, Qt::Key_Dead_Horn, - XK_dead_stroke, Qt::Key_Dead_Stroke, - XK_dead_abovecomma, Qt::Key_Dead_Abovecomma, - XK_dead_abovereversedcomma, Qt::Key_Dead_Abovereversedcomma, - XK_dead_doublegrave, Qt::Key_Dead_Doublegrave, - XK_dead_belowring, Qt::Key_Dead_Belowring, - XK_dead_belowmacron, Qt::Key_Dead_Belowmacron, - XK_dead_belowcircumflex, Qt::Key_Dead_Belowcircumflex, - XK_dead_belowtilde, Qt::Key_Dead_Belowtilde, - XK_dead_belowbreve, Qt::Key_Dead_Belowbreve, - XK_dead_belowdiaeresis, Qt::Key_Dead_Belowdiaeresis, - XK_dead_invertedbreve, Qt::Key_Dead_Invertedbreve, - XK_dead_belowcomma, Qt::Key_Dead_Belowcomma, - XK_dead_currency, Qt::Key_Dead_Currency, - XK_dead_a, Qt::Key_Dead_a, - XK_dead_A, Qt::Key_Dead_A, - XK_dead_e, Qt::Key_Dead_e, - XK_dead_E, Qt::Key_Dead_E, - XK_dead_i, Qt::Key_Dead_i, - XK_dead_I, Qt::Key_Dead_I, - XK_dead_o, Qt::Key_Dead_o, - XK_dead_O, Qt::Key_Dead_O, - XK_dead_u, Qt::Key_Dead_u, - XK_dead_U, Qt::Key_Dead_U, - XK_dead_small_schwa, Qt::Key_Dead_Small_Schwa, - XK_dead_capital_schwa, Qt::Key_Dead_Capital_Schwa, - XK_dead_greek, Qt::Key_Dead_Greek, - XK_dead_lowline, Qt::Key_Dead_Lowline, - XK_dead_aboveverticalline, Qt::Key_Dead_Aboveverticalline, - XK_dead_belowverticalline, Qt::Key_Dead_Belowverticalline, - XK_dead_longsolidusoverlay, Qt::Key_Dead_Longsolidusoverlay, + XKB_KEY_dead_grave, Qt::Key_Dead_Grave, + XKB_KEY_dead_acute, Qt::Key_Dead_Acute, + XKB_KEY_dead_circumflex, Qt::Key_Dead_Circumflex, + XKB_KEY_dead_tilde, Qt::Key_Dead_Tilde, + XKB_KEY_dead_macron, Qt::Key_Dead_Macron, + XKB_KEY_dead_breve, Qt::Key_Dead_Breve, + XKB_KEY_dead_abovedot, Qt::Key_Dead_Abovedot, + XKB_KEY_dead_diaeresis, Qt::Key_Dead_Diaeresis, + XKB_KEY_dead_abovering, Qt::Key_Dead_Abovering, + XKB_KEY_dead_doubleacute, Qt::Key_Dead_Doubleacute, + XKB_KEY_dead_caron, Qt::Key_Dead_Caron, + XKB_KEY_dead_cedilla, Qt::Key_Dead_Cedilla, + XKB_KEY_dead_ogonek, Qt::Key_Dead_Ogonek, + XKB_KEY_dead_iota, Qt::Key_Dead_Iota, + XKB_KEY_dead_voiced_sound, Qt::Key_Dead_Voiced_Sound, + XKB_KEY_dead_semivoiced_sound, Qt::Key_Dead_Semivoiced_Sound, + XKB_KEY_dead_belowdot, Qt::Key_Dead_Belowdot, + XKB_KEY_dead_hook, Qt::Key_Dead_Hook, + XKB_KEY_dead_horn, Qt::Key_Dead_Horn, + XKB_KEY_dead_stroke, Qt::Key_Dead_Stroke, + XKB_KEY_dead_abovecomma, Qt::Key_Dead_Abovecomma, + XKB_KEY_dead_abovereversedcomma, Qt::Key_Dead_Abovereversedcomma, + XKB_KEY_dead_doublegrave, Qt::Key_Dead_Doublegrave, + XKB_KEY_dead_belowring, Qt::Key_Dead_Belowring, + XKB_KEY_dead_belowmacron, Qt::Key_Dead_Belowmacron, + XKB_KEY_dead_belowcircumflex, Qt::Key_Dead_Belowcircumflex, + XKB_KEY_dead_belowtilde, Qt::Key_Dead_Belowtilde, + XKB_KEY_dead_belowbreve, Qt::Key_Dead_Belowbreve, + XKB_KEY_dead_belowdiaeresis, Qt::Key_Dead_Belowdiaeresis, + XKB_KEY_dead_invertedbreve, Qt::Key_Dead_Invertedbreve, + XKB_KEY_dead_belowcomma, Qt::Key_Dead_Belowcomma, + XKB_KEY_dead_currency, Qt::Key_Dead_Currency, + XKB_KEY_dead_a, Qt::Key_Dead_a, + XKB_KEY_dead_A, Qt::Key_Dead_A, + XKB_KEY_dead_e, Qt::Key_Dead_e, + XKB_KEY_dead_E, Qt::Key_Dead_E, + XKB_KEY_dead_i, Qt::Key_Dead_i, + XKB_KEY_dead_I, Qt::Key_Dead_I, + XKB_KEY_dead_o, Qt::Key_Dead_o, + XKB_KEY_dead_O, Qt::Key_Dead_O, + XKB_KEY_dead_u, Qt::Key_Dead_u, + XKB_KEY_dead_U, Qt::Key_Dead_U, + XKB_KEY_dead_small_schwa, Qt::Key_Dead_Small_Schwa, + XKB_KEY_dead_capital_schwa, Qt::Key_Dead_Capital_Schwa, + XKB_KEY_dead_greek, Qt::Key_Dead_Greek, + XKB_KEY_dead_lowline, Qt::Key_Dead_Lowline, + XKB_KEY_dead_aboveverticalline, Qt::Key_Dead_Aboveverticalline, + XKB_KEY_dead_belowverticalline, Qt::Key_Dead_Belowverticalline, + XKB_KEY_dead_longsolidusoverlay, Qt::Key_Dead_Longsolidusoverlay, // Special keys from X.org - This include multimedia keys, - // wireless/bluetooth/uwb keys, special launcher keys, etc. - XF86XK_Back, Qt::Key_Back, - XF86XK_Forward, Qt::Key_Forward, - XF86XK_Stop, Qt::Key_Stop, - XF86XK_Refresh, Qt::Key_Refresh, - XF86XK_Favorites, Qt::Key_Favorites, - XF86XK_AudioMedia, Qt::Key_LaunchMedia, - XF86XK_OpenURL, Qt::Key_OpenUrl, - XF86XK_HomePage, Qt::Key_HomePage, - XF86XK_Search, Qt::Key_Search, - XF86XK_AudioLowerVolume, Qt::Key_VolumeDown, - XF86XK_AudioMute, Qt::Key_VolumeMute, - XF86XK_AudioRaiseVolume, Qt::Key_VolumeUp, - XF86XK_AudioPlay, Qt::Key_MediaPlay, - XF86XK_AudioStop, Qt::Key_MediaStop, - XF86XK_AudioPrev, Qt::Key_MediaPrevious, - XF86XK_AudioNext, Qt::Key_MediaNext, - XF86XK_AudioRecord, Qt::Key_MediaRecord, - XF86XK_AudioPause, Qt::Key_MediaPause, - XF86XK_Mail, Qt::Key_LaunchMail, - XF86XK_MyComputer, Qt::Key_Launch0, // ### Qt 6: remap properly - XF86XK_Calculator, Qt::Key_Launch1, - XF86XK_Memo, Qt::Key_Memo, - XF86XK_ToDoList, Qt::Key_ToDoList, - XF86XK_Calendar, Qt::Key_Calendar, - XF86XK_PowerDown, Qt::Key_PowerDown, - XF86XK_ContrastAdjust, Qt::Key_ContrastAdjust, - XF86XK_Standby, Qt::Key_Standby, - XF86XK_MonBrightnessUp, Qt::Key_MonBrightnessUp, - XF86XK_MonBrightnessDown, Qt::Key_MonBrightnessDown, - XF86XK_KbdLightOnOff, Qt::Key_KeyboardLightOnOff, - XF86XK_KbdBrightnessUp, Qt::Key_KeyboardBrightnessUp, - XF86XK_KbdBrightnessDown, Qt::Key_KeyboardBrightnessDown, - XF86XK_PowerOff, Qt::Key_PowerOff, - XF86XK_WakeUp, Qt::Key_WakeUp, - XF86XK_Eject, Qt::Key_Eject, - XF86XK_ScreenSaver, Qt::Key_ScreenSaver, - XF86XK_WWW, Qt::Key_WWW, - XF86XK_Sleep, Qt::Key_Sleep, - XF86XK_LightBulb, Qt::Key_LightBulb, - XF86XK_Shop, Qt::Key_Shop, - XF86XK_History, Qt::Key_History, - XF86XK_AddFavorite, Qt::Key_AddFavorite, - XF86XK_HotLinks, Qt::Key_HotLinks, - XF86XK_BrightnessAdjust, Qt::Key_BrightnessAdjust, - XF86XK_Finance, Qt::Key_Finance, - XF86XK_Community, Qt::Key_Community, - XF86XK_AudioRewind, Qt::Key_AudioRewind, - XF86XK_BackForward, Qt::Key_BackForward, - XF86XK_ApplicationLeft, Qt::Key_ApplicationLeft, - XF86XK_ApplicationRight, Qt::Key_ApplicationRight, - XF86XK_Book, Qt::Key_Book, - XF86XK_CD, Qt::Key_CD, - XF86XK_Calculater, Qt::Key_Calculator, - XF86XK_Clear, Qt::Key_Clear, - XF86XK_ClearGrab, Qt::Key_ClearGrab, - XF86XK_Close, Qt::Key_Close, - XF86XK_Copy, Qt::Key_Copy, - XF86XK_Cut, Qt::Key_Cut, - XF86XK_Display, Qt::Key_Display, - XF86XK_DOS, Qt::Key_DOS, - XF86XK_Documents, Qt::Key_Documents, - XF86XK_Excel, Qt::Key_Excel, - XF86XK_Explorer, Qt::Key_Explorer, - XF86XK_Game, Qt::Key_Game, - XF86XK_Go, Qt::Key_Go, - XF86XK_iTouch, Qt::Key_iTouch, - XF86XK_LogOff, Qt::Key_LogOff, - XF86XK_Market, Qt::Key_Market, - XF86XK_Meeting, Qt::Key_Meeting, - XF86XK_MenuKB, Qt::Key_MenuKB, - XF86XK_MenuPB, Qt::Key_MenuPB, - XF86XK_MySites, Qt::Key_MySites, - XF86XK_New, Qt::Key_New, - XF86XK_News, Qt::Key_News, - XF86XK_OfficeHome, Qt::Key_OfficeHome, - XF86XK_Open, Qt::Key_Open, - XF86XK_Option, Qt::Key_Option, - XF86XK_Paste, Qt::Key_Paste, - XF86XK_Phone, Qt::Key_Phone, - XF86XK_Reply, Qt::Key_Reply, - XF86XK_Reload, Qt::Key_Reload, - XF86XK_RotateWindows, Qt::Key_RotateWindows, - XF86XK_RotationPB, Qt::Key_RotationPB, - XF86XK_RotationKB, Qt::Key_RotationKB, - XF86XK_Save, Qt::Key_Save, - XF86XK_Send, Qt::Key_Send, - XF86XK_Spell, Qt::Key_Spell, - XF86XK_SplitScreen, Qt::Key_SplitScreen, - XF86XK_Support, Qt::Key_Support, - XF86XK_TaskPane, Qt::Key_TaskPane, - XF86XK_Terminal, Qt::Key_Terminal, - XF86XK_Tools, Qt::Key_Tools, - XF86XK_Travel, Qt::Key_Travel, - XF86XK_Video, Qt::Key_Video, - XF86XK_Word, Qt::Key_Word, - XF86XK_Xfer, Qt::Key_Xfer, - XF86XK_ZoomIn, Qt::Key_ZoomIn, - XF86XK_ZoomOut, Qt::Key_ZoomOut, - XF86XK_Away, Qt::Key_Away, - XF86XK_Messenger, Qt::Key_Messenger, - XF86XK_WebCam, Qt::Key_WebCam, - XF86XK_MailForward, Qt::Key_MailForward, - XF86XK_Pictures, Qt::Key_Pictures, - XF86XK_Music, Qt::Key_Music, - XF86XK_Battery, Qt::Key_Battery, - XF86XK_Bluetooth, Qt::Key_Bluetooth, - XF86XK_WLAN, Qt::Key_WLAN, - XF86XK_UWB, Qt::Key_UWB, - XF86XK_AudioForward, Qt::Key_AudioForward, - XF86XK_AudioRepeat, Qt::Key_AudioRepeat, - XF86XK_AudioRandomPlay, Qt::Key_AudioRandomPlay, - XF86XK_Subtitle, Qt::Key_Subtitle, - XF86XK_AudioCycleTrack, Qt::Key_AudioCycleTrack, - XF86XK_Time, Qt::Key_Time, - XF86XK_Select, Qt::Key_Select, - XF86XK_View, Qt::Key_View, - XF86XK_TopMenu, Qt::Key_TopMenu, - XF86XK_Red, Qt::Key_Red, - XF86XK_Green, Qt::Key_Green, - XF86XK_Yellow, Qt::Key_Yellow, - XF86XK_Blue, Qt::Key_Blue, - XF86XK_Bluetooth, Qt::Key_Bluetooth, - XF86XK_Suspend, Qt::Key_Suspend, - XF86XK_Hibernate, Qt::Key_Hibernate, - XF86XK_TouchpadToggle, Qt::Key_TouchpadToggle, - XF86XK_TouchpadOn, Qt::Key_TouchpadOn, - XF86XK_TouchpadOff, Qt::Key_TouchpadOff, - XF86XK_AudioMicMute, Qt::Key_MicMute, - XF86XK_Launch0, Qt::Key_Launch2, // ### Qt 6: remap properly - XF86XK_Launch1, Qt::Key_Launch3, - XF86XK_Launch2, Qt::Key_Launch4, - XF86XK_Launch3, Qt::Key_Launch5, - XF86XK_Launch4, Qt::Key_Launch6, - XF86XK_Launch5, Qt::Key_Launch7, - XF86XK_Launch6, Qt::Key_Launch8, - XF86XK_Launch7, Qt::Key_Launch9, - XF86XK_Launch8, Qt::Key_LaunchA, - XF86XK_Launch9, Qt::Key_LaunchB, - XF86XK_LaunchA, Qt::Key_LaunchC, - XF86XK_LaunchB, Qt::Key_LaunchD, - XF86XK_LaunchC, Qt::Key_LaunchE, - XF86XK_LaunchD, Qt::Key_LaunchF, - XF86XK_LaunchE, Qt::Key_LaunchG, - XF86XK_LaunchF, Qt::Key_LaunchH, + // wireless/bluetooth/uwb keys, special launcher keys, etc. + XKB_KEY_XF86Back, Qt::Key_Back, + XKB_KEY_XF86Forward, Qt::Key_Forward, + XKB_KEY_XF86Stop, Qt::Key_Stop, + XKB_KEY_XF86Refresh, Qt::Key_Refresh, + XKB_KEY_XF86Favorites, Qt::Key_Favorites, + XKB_KEY_XF86AudioMedia, Qt::Key_LaunchMedia, + XKB_KEY_XF86OpenURL, Qt::Key_OpenUrl, + XKB_KEY_XF86HomePage, Qt::Key_HomePage, + XKB_KEY_XF86Search, Qt::Key_Search, + XKB_KEY_XF86AudioLowerVolume, Qt::Key_VolumeDown, + XKB_KEY_XF86AudioMute, Qt::Key_VolumeMute, + XKB_KEY_XF86AudioRaiseVolume, Qt::Key_VolumeUp, + XKB_KEY_XF86AudioPlay, Qt::Key_MediaPlay, + XKB_KEY_XF86AudioStop, Qt::Key_MediaStop, + XKB_KEY_XF86AudioPrev, Qt::Key_MediaPrevious, + XKB_KEY_XF86AudioNext, Qt::Key_MediaNext, + XKB_KEY_XF86AudioRecord, Qt::Key_MediaRecord, + XKB_KEY_XF86AudioPause, Qt::Key_MediaPause, + XKB_KEY_XF86Mail, Qt::Key_LaunchMail, + XKB_KEY_XF86MyComputer, Qt::Key_Launch0, // ### Qt 6: remap properly + XKB_KEY_XF86Calculator, Qt::Key_Launch1, + XKB_KEY_XF86Memo, Qt::Key_Memo, + XKB_KEY_XF86ToDoList, Qt::Key_ToDoList, + XKB_KEY_XF86Calendar, Qt::Key_Calendar, + XKB_KEY_XF86PowerDown, Qt::Key_PowerDown, + XKB_KEY_XF86ContrastAdjust, Qt::Key_ContrastAdjust, + XKB_KEY_XF86Standby, Qt::Key_Standby, + XKB_KEY_XF86MonBrightnessUp, Qt::Key_MonBrightnessUp, + XKB_KEY_XF86MonBrightnessDown, Qt::Key_MonBrightnessDown, + XKB_KEY_XF86KbdLightOnOff, Qt::Key_KeyboardLightOnOff, + XKB_KEY_XF86KbdBrightnessUp, Qt::Key_KeyboardBrightnessUp, + XKB_KEY_XF86KbdBrightnessDown, Qt::Key_KeyboardBrightnessDown, + XKB_KEY_XF86PowerOff, Qt::Key_PowerOff, + XKB_KEY_XF86WakeUp, Qt::Key_WakeUp, + XKB_KEY_XF86Eject, Qt::Key_Eject, + XKB_KEY_XF86ScreenSaver, Qt::Key_ScreenSaver, + XKB_KEY_XF86WWW, Qt::Key_WWW, + XKB_KEY_XF86Sleep, Qt::Key_Sleep, + XKB_KEY_XF86LightBulb, Qt::Key_LightBulb, + XKB_KEY_XF86Shop, Qt::Key_Shop, + XKB_KEY_XF86History, Qt::Key_History, + XKB_KEY_XF86AddFavorite, Qt::Key_AddFavorite, + XKB_KEY_XF86HotLinks, Qt::Key_HotLinks, + XKB_KEY_XF86BrightnessAdjust, Qt::Key_BrightnessAdjust, + XKB_KEY_XF86Finance, Qt::Key_Finance, + XKB_KEY_XF86Community, Qt::Key_Community, + XKB_KEY_XF86AudioRewind, Qt::Key_AudioRewind, + XKB_KEY_XF86BackForward, Qt::Key_BackForward, + XKB_KEY_XF86ApplicationLeft, Qt::Key_ApplicationLeft, + XKB_KEY_XF86ApplicationRight, Qt::Key_ApplicationRight, + XKB_KEY_XF86Book, Qt::Key_Book, + XKB_KEY_XF86CD, Qt::Key_CD, + XKB_KEY_XF86Calculater, Qt::Key_Calculator, + XKB_KEY_XF86Clear, Qt::Key_Clear, + XKB_KEY_XF86ClearGrab, Qt::Key_ClearGrab, + XKB_KEY_XF86Close, Qt::Key_Close, + XKB_KEY_XF86Copy, Qt::Key_Copy, + XKB_KEY_XF86Cut, Qt::Key_Cut, + XKB_KEY_XF86Display, Qt::Key_Display, + XKB_KEY_XF86DOS, Qt::Key_DOS, + XKB_KEY_XF86Documents, Qt::Key_Documents, + XKB_KEY_XF86Excel, Qt::Key_Excel, + XKB_KEY_XF86Explorer, Qt::Key_Explorer, + XKB_KEY_XF86Game, Qt::Key_Game, + XKB_KEY_XF86Go, Qt::Key_Go, + XKB_KEY_XF86iTouch, Qt::Key_iTouch, + XKB_KEY_XF86LogOff, Qt::Key_LogOff, + XKB_KEY_XF86Market, Qt::Key_Market, + XKB_KEY_XF86Meeting, Qt::Key_Meeting, + XKB_KEY_XF86MenuKB, Qt::Key_MenuKB, + XKB_KEY_XF86MenuPB, Qt::Key_MenuPB, + XKB_KEY_XF86MySites, Qt::Key_MySites, + XKB_KEY_XF86New, Qt::Key_New, + XKB_KEY_XF86News, Qt::Key_News, + XKB_KEY_XF86OfficeHome, Qt::Key_OfficeHome, + XKB_KEY_XF86Open, Qt::Key_Open, + XKB_KEY_XF86Option, Qt::Key_Option, + XKB_KEY_XF86Paste, Qt::Key_Paste, + XKB_KEY_XF86Phone, Qt::Key_Phone, + XKB_KEY_XF86Reply, Qt::Key_Reply, + XKB_KEY_XF86Reload, Qt::Key_Reload, + XKB_KEY_XF86RotateWindows, Qt::Key_RotateWindows, + XKB_KEY_XF86RotationPB, Qt::Key_RotationPB, + XKB_KEY_XF86RotationKB, Qt::Key_RotationKB, + XKB_KEY_XF86Save, Qt::Key_Save, + XKB_KEY_XF86Send, Qt::Key_Send, + XKB_KEY_XF86Spell, Qt::Key_Spell, + XKB_KEY_XF86SplitScreen, Qt::Key_SplitScreen, + XKB_KEY_XF86Support, Qt::Key_Support, + XKB_KEY_XF86TaskPane, Qt::Key_TaskPane, + XKB_KEY_XF86Terminal, Qt::Key_Terminal, + XKB_KEY_XF86Tools, Qt::Key_Tools, + XKB_KEY_XF86Travel, Qt::Key_Travel, + XKB_KEY_XF86Video, Qt::Key_Video, + XKB_KEY_XF86Word, Qt::Key_Word, + XKB_KEY_XF86Xfer, Qt::Key_Xfer, + XKB_KEY_XF86ZoomIn, Qt::Key_ZoomIn, + XKB_KEY_XF86ZoomOut, Qt::Key_ZoomOut, + XKB_KEY_XF86Away, Qt::Key_Away, + XKB_KEY_XF86Messenger, Qt::Key_Messenger, + XKB_KEY_XF86WebCam, Qt::Key_WebCam, + XKB_KEY_XF86MailForward, Qt::Key_MailForward, + XKB_KEY_XF86Pictures, Qt::Key_Pictures, + XKB_KEY_XF86Music, Qt::Key_Music, + XKB_KEY_XF86Battery, Qt::Key_Battery, + XKB_KEY_XF86Bluetooth, Qt::Key_Bluetooth, + XKB_KEY_XF86WLAN, Qt::Key_WLAN, + XKB_KEY_XF86UWB, Qt::Key_UWB, + XKB_KEY_XF86AudioForward, Qt::Key_AudioForward, + XKB_KEY_XF86AudioRepeat, Qt::Key_AudioRepeat, + XKB_KEY_XF86AudioRandomPlay, Qt::Key_AudioRandomPlay, + XKB_KEY_XF86Subtitle, Qt::Key_Subtitle, + XKB_KEY_XF86AudioCycleTrack, Qt::Key_AudioCycleTrack, + XKB_KEY_XF86Time, Qt::Key_Time, + XKB_KEY_XF86Select, Qt::Key_Select, + XKB_KEY_XF86View, Qt::Key_View, + XKB_KEY_XF86TopMenu, Qt::Key_TopMenu, + XKB_KEY_XF86Red, Qt::Key_Red, + XKB_KEY_XF86Green, Qt::Key_Green, + XKB_KEY_XF86Yellow, Qt::Key_Yellow, + XKB_KEY_XF86Blue, Qt::Key_Blue, + XKB_KEY_XF86Bluetooth, Qt::Key_Bluetooth, + XKB_KEY_XF86Suspend, Qt::Key_Suspend, + XKB_KEY_XF86Hibernate, Qt::Key_Hibernate, + XKB_KEY_XF86TouchpadToggle, Qt::Key_TouchpadToggle, + XKB_KEY_XF86TouchpadOn, Qt::Key_TouchpadOn, + XKB_KEY_XF86TouchpadOff, Qt::Key_TouchpadOff, + XKB_KEY_XF86AudioMicMute, Qt::Key_MicMute, + XKB_KEY_XF86Launch0, Qt::Key_Launch2, // ### Qt 6: remap properly + XKB_KEY_XF86Launch1, Qt::Key_Launch3, + XKB_KEY_XF86Launch2, Qt::Key_Launch4, + XKB_KEY_XF86Launch3, Qt::Key_Launch5, + XKB_KEY_XF86Launch4, Qt::Key_Launch6, + XKB_KEY_XF86Launch5, Qt::Key_Launch7, + XKB_KEY_XF86Launch6, Qt::Key_Launch8, + XKB_KEY_XF86Launch7, Qt::Key_Launch9, + XKB_KEY_XF86Launch8, Qt::Key_LaunchA, + XKB_KEY_XF86Launch9, Qt::Key_LaunchB, + XKB_KEY_XF86LaunchA, Qt::Key_LaunchC, + XKB_KEY_XF86LaunchB, Qt::Key_LaunchD, + XKB_KEY_XF86LaunchC, Qt::Key_LaunchE, + XKB_KEY_XF86LaunchD, Qt::Key_LaunchF, + XKB_KEY_XF86LaunchE, Qt::Key_LaunchG, + XKB_KEY_XF86LaunchF, Qt::Key_LaunchH, 0, 0 }; @@ -1163,7 +895,7 @@ void QXcbKeyboard::checkForLatinLayout() const xkb_keysym_t sym = xkb_state_key_get_one_sym(state.get(), code); // if layout can produce any of these latin letters (chosen // arbitrarily) then it must be a latin key based layout - if (sym == XK_q || sym == XK_a || sym == XK_e) + if (sym == XKB_KEY_q || sym == XKB_KEY_a || sym == XKB_KEY_e) return; } } @@ -1584,15 +1316,15 @@ void QXcbKeyboard::updateModifiers() // Compute X modifier bits for Qt modifiers KeysymModifierMap keysymMods(keysymsToModifiers()); - applyModifier(&rmod_masks.alt, keysymMods.value(XK_Alt_L, -1)); - applyModifier(&rmod_masks.alt, keysymMods.value(XK_Alt_R, -1)); - applyModifier(&rmod_masks.meta, keysymMods.value(XK_Meta_L, -1)); - applyModifier(&rmod_masks.meta, keysymMods.value(XK_Meta_R, -1)); - applyModifier(&rmod_masks.altgr, keysymMods.value(XK_Mode_switch, -1)); - applyModifier(&rmod_masks.super, keysymMods.value(XK_Super_L, -1)); - applyModifier(&rmod_masks.super, keysymMods.value(XK_Super_R, -1)); - applyModifier(&rmod_masks.hyper, keysymMods.value(XK_Hyper_L, -1)); - applyModifier(&rmod_masks.hyper, keysymMods.value(XK_Hyper_R, -1)); + applyModifier(&rmod_masks.alt, keysymMods.value(XKB_KEY_Alt_L, -1)); + applyModifier(&rmod_masks.alt, keysymMods.value(XKB_KEY_Alt_R, -1)); + applyModifier(&rmod_masks.meta, keysymMods.value(XKB_KEY_Meta_L, -1)); + applyModifier(&rmod_masks.meta, keysymMods.value(XKB_KEY_Meta_R, -1)); + applyModifier(&rmod_masks.altgr, keysymMods.value(XKB_KEY_Mode_switch, -1)); + applyModifier(&rmod_masks.super, keysymMods.value(XKB_KEY_Super_L, -1)); + applyModifier(&rmod_masks.super, keysymMods.value(XKB_KEY_Super_R, -1)); + applyModifier(&rmod_masks.hyper, keysymMods.value(XKB_KEY_Hyper_L, -1)); + applyModifier(&rmod_masks.hyper, keysymMods.value(XKB_KEY_Hyper_R, -1)); resolveMaskConflicts(); } @@ -1625,8 +1357,8 @@ QXcbKeyboard::KeysymModifierMap QXcbKeyboard::keysymsToModifiers() // for Alt and Meta L and R are the same static const xcb_keysym_t symbols[] = { - XK_Alt_L, XK_Meta_L, XK_Mode_switch, XK_Super_L, XK_Super_R, - XK_Hyper_L, XK_Hyper_R + XKB_KEY_Alt_L, XKB_KEY_Meta_L, XKB_KEY_Mode_switch, XKB_KEY_Super_L, XKB_KEY_Super_R, + XKB_KEY_Hyper_L, XKB_KEY_Hyper_R }; static const size_t numSymbols = sizeof symbols / sizeof *symbols; -- cgit v1.2.3 From 7c01c759aef565162e4d5f04527a8946857c56ff Mon Sep 17 00:00:00 2001 From: Gatis Paeglis Date: Thu, 1 Feb 2018 16:04:43 +0100 Subject: xcb: have a proper detection of key events originating from SendEvent This is a more correct fix for QTBUG-48795. The original fix was unnecessarily using non-XKB code path for updating state for all incoming key events. This would result in losing some valuable bits from xkb state. Task-number: QTBUG-48795 Change-Id: Ic4fb28b2d834272f1db2cbf5888cafb209707847 Reviewed-by: Allan Sandfeld Jensen --- src/plugins/platforms/xcb/qxcbkeyboard.cpp | 98 +++++++++++++++++------------- src/plugins/platforms/xcb/qxcbkeyboard.h | 7 +-- 2 files changed, 58 insertions(+), 47 deletions(-) (limited to 'src/plugins/platforms') diff --git a/src/plugins/platforms/xcb/qxcbkeyboard.cpp b/src/plugins/platforms/xcb/qxcbkeyboard.cpp index 8781969521..7428e419db 100644 --- a/src/plugins/platforms/xcb/qxcbkeyboard.cpp +++ b/src/plugins/platforms/xcb/qxcbkeyboard.cpp @@ -786,37 +786,32 @@ void QXcbKeyboard::updateXKBState(xcb_xkb_state_notify_event_t *state) } #endif -void QXcbKeyboard::updateXKBStateFromState(struct xkb_state *kb_state, quint16 state) +static xkb_layout_index_t lockedGroup(quint16 state) { - const quint32 modsDepressed = xkb_state_serialize_mods(kb_state, XKB_STATE_MODS_DEPRESSED); - const quint32 modsLatched = xkb_state_serialize_mods(kb_state, XKB_STATE_MODS_LATCHED); - const quint32 modsLocked = xkb_state_serialize_mods(kb_state, XKB_STATE_MODS_LOCKED); - const quint32 xkbMask = xkbModMask(state); - - const quint32 latched = modsLatched & xkbMask; - const quint32 locked = modsLocked & xkbMask; - quint32 depressed = modsDepressed & xkbMask; - // set modifiers in depressed if they don't appear in any of the final masks - depressed |= ~(depressed | latched | locked) & xkbMask; - - const xkb_state_component newState - = xkb_state_update_mask(kb_state, - depressed, - latched, - locked, - 0, - 0, - (state >> 13) & 3); // bits 13 and 14 report the state keyboard group - - if ((newState & XKB_STATE_LAYOUT_EFFECTIVE) == XKB_STATE_LAYOUT_EFFECTIVE) { - //qWarning("TODO: Support KeyboardLayoutChange on QPA (QTBUG-27681)"); - } + return (state >> 13) & 3; // bits 13 and 14 report the state keyboard group } void QXcbKeyboard::updateXKBStateFromCore(quint16 state) { if (m_config && !connection()->hasXKB()) { - updateXKBStateFromState(m_xkbState.get(), state); + struct xkb_state *xkbState = m_xkbState.get(); + xkb_mod_mask_t modsDepressed = xkb_state_serialize_mods(xkbState, XKB_STATE_MODS_DEPRESSED); + xkb_mod_mask_t modsLatched = xkb_state_serialize_mods(xkbState, XKB_STATE_MODS_LATCHED); + xkb_mod_mask_t modsLocked = xkb_state_serialize_mods(xkbState, XKB_STATE_MODS_LOCKED); + xkb_mod_mask_t xkbMask = xkbModMask(state); + + xkb_mod_mask_t latched = modsLatched & xkbMask; + xkb_mod_mask_t locked = modsLocked & xkbMask; + xkb_mod_mask_t depressed = modsDepressed & xkbMask; + // set modifiers in depressed if they don't appear in any of the final masks + depressed |= ~(depressed | latched | locked) & xkbMask; + + xkb_state_component changedComponents = xkb_state_update_mask( + xkbState, depressed, latched, locked, 0, 0, lockedGroup(state)); + + if ((changedComponents & XKB_STATE_LAYOUT_EFFECTIVE) == XKB_STATE_LAYOUT_EFFECTIVE) { + //qWarning("TODO: Support KeyboardLayoutChange on QPA (QTBUG-27681)"); + } } } @@ -841,9 +836,9 @@ void QXcbKeyboard::updateXKBStateFromXI(void *modInfo, void *groupInfo) } #endif -quint32 QXcbKeyboard::xkbModMask(quint16 state) +xkb_mod_mask_t QXcbKeyboard::xkbModMask(quint16 state) { - quint32 xkb_mask = 0; + xkb_mod_mask_t xkb_mask = 0; if ((state & XCB_MOD_MASK_SHIFT) && xkb_mods.shift != XKB_MOD_INVALID) xkb_mask |= (1 << xkb_mods.shift); @@ -1503,7 +1498,7 @@ private: }; void QXcbKeyboard::handleKeyEvent(xcb_window_t sourceWindow, QEvent::Type type, xcb_keycode_t code, - quint16 state, xcb_timestamp_t time) + quint16 state, xcb_timestamp_t time, bool fromSendEvent) { if (!m_config) return; @@ -1515,17 +1510,25 @@ void QXcbKeyboard::handleKeyEvent(xcb_window_t sourceWindow, QEvent::Type type, if (type == QEvent::KeyPress) targetWindow->updateNetWmUserTime(time); - // Have a temporary keyboard state filled in from state - // this way we allow for synthetic events to have different state - // from the current state i.e. you can have Alt+Ctrl pressed - // and receive a synthetic key event that has neither Alt nor Ctrl pressed - ScopedXKBState xkbState(xkb_state_new(m_xkbKeymap.get())); - if (!xkbState) - return; - updateXKBStateFromState(xkbState.get(), state); - xcb_keysym_t sym = xkb_state_key_get_one_sym(xkbState.get(), code); - QString string = lookupString(xkbState.get(), code); + ScopedXKBState sendEventState; + if (fromSendEvent) { + // Have a temporary keyboard state filled in from state + // this way we allow for synthetic events to have different state + // from the current state i.e. you can have Alt+Ctrl pressed + // and receive a synthetic key event that has neither Alt nor Ctrl pressed + sendEventState.reset(xkb_state_new(m_xkbKeymap.get())); + if (!sendEventState) + return; + + xkb_mod_mask_t depressed = xkbModMask(state); + xkb_state_update_mask(sendEventState.get(), depressed, 0, 0, 0, 0, lockedGroup(state)); + } + + struct xkb_state *xkbState = fromSendEvent ? sendEventState.get() : m_xkbState.get(); + + xcb_keysym_t sym = xkb_state_key_get_one_sym(xkbState, code); + QString string = lookupString(xkbState, code); Qt::KeyboardModifiers modifiers = translateModifiers(state); if (sym >= XKB_KEY_KP_Space && sym <= XKB_KEY_KP_9) @@ -1548,7 +1551,7 @@ void QXcbKeyboard::handleKeyEvent(xcb_window_t sourceWindow, QEvent::Type type, } int qtcode = keysymToQtKey(latinKeysym != XKB_KEY_NoSymbol ? latinKeysym : sym, - modifiers, xkbState.get(), code); + modifiers, xkbState, code); bool isAutoRepeat = false; if (type == QEvent::KeyPress) { @@ -1624,14 +1627,23 @@ QString QXcbKeyboard::lookupStringNoKeysymTransformations(xkb_keysym_t keysym) c return QString::fromUtf8(chars.constData(), size); } -void QXcbKeyboard::handleKeyPressEvent(const xcb_key_press_event_t *event) +static bool fromSendEvent(const void *event) +{ + // From X11 protocol: Every event contains an 8-bit type code. The most + // significant bit in this code is set if the event was generated from + // a SendEvent request. + const xcb_generic_event_t *e = reinterpret_cast(event); + return (e->response_type & 0x80) != 0; +} + +void QXcbKeyboard::handleKeyPressEvent(const xcb_key_press_event_t *e) { - handleKeyEvent(event->event, QEvent::KeyPress, event->detail, event->state, event->time); + handleKeyEvent(e->event, QEvent::KeyPress, e->detail, e->state, e->time, fromSendEvent(e)); } -void QXcbKeyboard::handleKeyReleaseEvent(const xcb_key_release_event_t *event) +void QXcbKeyboard::handleKeyReleaseEvent(const xcb_key_release_event_t *e) { - handleKeyEvent(event->event, QEvent::KeyRelease, event->detail, event->state, event->time); + handleKeyEvent(e->event, QEvent::KeyRelease, e->detail, e->state, e->time, fromSendEvent(e)); } void QXcbKeyboard::handleMappingNotifyEvent(const void *event) diff --git a/src/plugins/platforms/xcb/qxcbkeyboard.h b/src/plugins/platforms/xcb/qxcbkeyboard.h index 736b32a2fd..a7ab88b9d9 100644 --- a/src/plugins/platforms/xcb/qxcbkeyboard.h +++ b/src/plugins/platforms/xcb/qxcbkeyboard.h @@ -72,7 +72,7 @@ public: // when XKEYBOARD not present on the X server void updateXKBMods(); - quint32 xkbModMask(quint16 state); + xkb_mod_mask_t xkbModMask(quint16 state); void updateXKBStateFromCore(quint16 state); #if QT_CONFIG(xinput2) void updateXKBStateFromXI(void *modInfo, void *groupInfo); @@ -84,7 +84,8 @@ public: #endif protected: - void handleKeyEvent(xcb_window_t sourceWindow, QEvent::Type type, xcb_keycode_t code, quint16 state, xcb_timestamp_t time); + void handleKeyEvent(xcb_window_t sourceWindow, QEvent::Type type, xcb_keycode_t code, + quint16 state, xcb_timestamp_t time, bool fromSendEvent); void resolveMaskConflicts(); QString lookupString(struct xkb_state *state, xcb_keycode_t code) const; @@ -106,8 +107,6 @@ protected: void checkForLatinLayout() const; private: - void updateXKBStateFromState(struct xkb_state *kb_state, quint16 state); - bool m_config = false; xcb_keycode_t m_autorepeat_code = 0; -- cgit v1.2.3 From 6c88dc0c16545a06d57c7d3ee0b56aba14ddaefc Mon Sep 17 00:00:00 2001 From: Gatis Paeglis Date: Fri, 2 Feb 2018 14:33:18 +0100 Subject: xcb: remove X11 deps from QXcbKeyboard::checkForLatinLayout/lookupLatinKeysym() This will allow us to reuse these functions on systems that do not rely on X11, but use libxkbcommon for handling keyboard input. Task-number: QTBUG-65503 Change-Id: I78034238771be96fbb38e8187801fefbee1a5fed Reviewed-by: Allan Sandfeld Jensen --- src/plugins/platforms/xcb/qxcbkeyboard.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/plugins/platforms') diff --git a/src/plugins/platforms/xcb/qxcbkeyboard.cpp b/src/plugins/platforms/xcb/qxcbkeyboard.cpp index 7428e419db..f24d2f6f6d 100644 --- a/src/plugins/platforms/xcb/qxcbkeyboard.cpp +++ b/src/plugins/platforms/xcb/qxcbkeyboard.cpp @@ -880,8 +880,8 @@ static bool isLatin(xkb_keysym_t sym) void QXcbKeyboard::checkForLatinLayout() const { const xkb_layout_index_t layoutCount = xkb_keymap_num_layouts(m_xkbKeymap.get()); - const xcb_keycode_t minKeycode = connection()->setup()->min_keycode; - const xcb_keycode_t maxKeycode = connection()->setup()->max_keycode; + const xcb_keycode_t minKeycode = xkb_keymap_min_keycode(m_xkbKeymap.get()); + const xcb_keycode_t maxKeycode = xkb_keymap_max_keycode(m_xkbKeymap.get()); ScopedXKBState state(xkb_state_new(m_xkbKeymap.get())); for (xkb_layout_index_t layout = 0; layout < layoutCount; ++layout) { @@ -940,8 +940,8 @@ xkb_keysym_t QXcbKeyboard::lookupLatinKeysym(xkb_keycode_t keycode) const // then the obtained key is not unique. This prevents ctrl+ from generating a ctrl+q // shortcut in the above described setup. We don't want ctrl+ and ctrl+ to // generate the same shortcut event in this case. - const xcb_keycode_t minKeycode = connection()->setup()->min_keycode; - const xcb_keycode_t maxKeycode = connection()->setup()->max_keycode; + const xcb_keycode_t minKeycode = xkb_keymap_min_keycode(m_xkbKeymap.get()); + const xcb_keycode_t maxKeycode = xkb_keymap_max_keycode(m_xkbKeymap.get()); ScopedXKBState state(xkb_state_new(m_xkbKeymap.get())); for (xkb_layout_index_t prevLayout = 0; prevLayout < layout; ++prevLayout) { xkb_state_update_mask(state.get(), 0, latchedMods, lockedMods, 0, 0, prevLayout); -- cgit v1.2.3 From 50865aeeefb41750fc9c1a0adc704fc879f0b63c Mon Sep 17 00:00:00 2001 From: Gatis Paeglis Date: Fri, 2 Feb 2018 14:38:37 +0100 Subject: xcb: minor refactoring in QXcbKeyboard::checkForLatinLayout() We don't need xkb state APIs to check for keys on first level. Change-Id: I728e6bfe09bce127ad8eae78ecee7cefd620f52e Reviewed-by: Gatis Paeglis --- src/plugins/platforms/xcb/qxcbkeyboard.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'src/plugins/platforms') diff --git a/src/plugins/platforms/xcb/qxcbkeyboard.cpp b/src/plugins/platforms/xcb/qxcbkeyboard.cpp index f24d2f6f6d..b267cc6dc1 100644 --- a/src/plugins/platforms/xcb/qxcbkeyboard.cpp +++ b/src/plugins/platforms/xcb/qxcbkeyboard.cpp @@ -883,14 +883,14 @@ void QXcbKeyboard::checkForLatinLayout() const const xcb_keycode_t minKeycode = xkb_keymap_min_keycode(m_xkbKeymap.get()); const xcb_keycode_t maxKeycode = xkb_keymap_max_keycode(m_xkbKeymap.get()); - ScopedXKBState state(xkb_state_new(m_xkbKeymap.get())); + const xkb_keysym_t *keysyms = nullptr; + int nrLatinKeys = 0; for (xkb_layout_index_t layout = 0; layout < layoutCount; ++layout) { - xkb_state_update_mask(state.get(), 0, 0, 0, 0, 0, layout); for (xcb_keycode_t code = minKeycode; code < maxKeycode; ++code) { - xkb_keysym_t sym = xkb_state_key_get_one_sym(state.get(), code); - // if layout can produce any of these latin letters (chosen - // arbitrarily) then it must be a latin key based layout - if (sym == XKB_KEY_q || sym == XKB_KEY_a || sym == XKB_KEY_e) + xkb_keymap_key_get_syms_by_level(m_xkbKeymap.get(), code, layout, 0, &keysyms); + if (keysyms && isLatin(keysyms[0])) + nrLatinKeys++; + if (nrLatinKeys > 10) // arbitrarily chosen threshold return; } } -- cgit v1.2.3 From 1a341d8333c95708759706aa78fbc7828d837bf2 Mon Sep 17 00:00:00 2001 From: Gatis Paeglis Date: Fri, 2 Feb 2018 15:03:39 +0100 Subject: xcb: cleanup TODOs for KeyboardLayoutChange Change-Id: I5d2207fdb21cbabb04460faf73c35275bc76b7b0 Reviewed-by: Allan Sandfeld Jensen --- src/plugins/platforms/xcb/qxcbkeyboard.cpp | 40 ++++++++++++++++-------------- src/plugins/platforms/xcb/qxcbkeyboard.h | 1 + 2 files changed, 23 insertions(+), 18 deletions(-) (limited to 'src/plugins/platforms') diff --git a/src/plugins/platforms/xcb/qxcbkeyboard.cpp b/src/plugins/platforms/xcb/qxcbkeyboard.cpp index b267cc6dc1..b097ca7b45 100644 --- a/src/plugins/platforms/xcb/qxcbkeyboard.cpp +++ b/src/plugins/platforms/xcb/qxcbkeyboard.cpp @@ -770,7 +770,7 @@ void QXcbKeyboard::updateKeymap() void QXcbKeyboard::updateXKBState(xcb_xkb_state_notify_event_t *state) { if (m_config && connection()->hasXKB()) { - const xkb_state_component newState + const xkb_state_component changedComponents = xkb_state_update_mask(m_xkbState.get(), state->baseMods, state->latchedMods, @@ -779,9 +779,7 @@ void QXcbKeyboard::updateXKBState(xcb_xkb_state_notify_event_t *state) state->latchedGroup, state->lockedGroup); - if ((newState & XKB_STATE_LAYOUT_EFFECTIVE) == XKB_STATE_LAYOUT_EFFECTIVE) { - //qWarning("TODO: Support KeyboardLayoutChange on QPA (QTBUG-27681)"); - } + handleStateChanges(changedComponents); } } #endif @@ -809,9 +807,7 @@ void QXcbKeyboard::updateXKBStateFromCore(quint16 state) xkb_state_component changedComponents = xkb_state_update_mask( xkbState, depressed, latched, locked, 0, 0, lockedGroup(state)); - if ((changedComponents & XKB_STATE_LAYOUT_EFFECTIVE) == XKB_STATE_LAYOUT_EFFECTIVE) { - //qWarning("TODO: Support KeyboardLayoutChange on QPA (QTBUG-27681)"); - } + handleStateChanges(changedComponents); } } @@ -821,21 +817,29 @@ void QXcbKeyboard::updateXKBStateFromXI(void *modInfo, void *groupInfo) if (m_config && !connection()->hasXKB()) { xXIModifierInfo *mods = static_cast(modInfo); xXIGroupInfo *group = static_cast(groupInfo); - const xkb_state_component newState = xkb_state_update_mask(m_xkbState.get(), - mods->base_mods, - mods->latched_mods, - mods->locked_mods, - group->base_group, - group->latched_group, - group->locked_group); - - if ((newState & XKB_STATE_LAYOUT_EFFECTIVE) == XKB_STATE_LAYOUT_EFFECTIVE) { - //qWarning("TODO: Support KeyboardLayoutChange on QPA (QTBUG-27681)"); - } + const xkb_state_component changedComponents + = xkb_state_update_mask(m_xkbState.get(), + mods->base_mods, + mods->latched_mods, + mods->locked_mods, + group->base_group, + group->latched_group, + group->locked_group); + + handleStateChanges(changedComponents); } } #endif +void QXcbKeyboard::handleStateChanges(xkb_state_component changedComponents) +{ + // Note: Ubuntu (with Unity) always creates a new keymap when layout is changed + // via system settings, which means that the layout change would not be detected + // by this code. That can be solved by emitting KeyboardLayoutChange also from updateKeymap(). + if ((changedComponents & XKB_STATE_LAYOUT_EFFECTIVE) == XKB_STATE_LAYOUT_EFFECTIVE) + qCDebug(lcQpaKeyboard, "TODO: Support KeyboardLayoutChange on QPA (QTBUG-27681)"); +} + xkb_mod_mask_t QXcbKeyboard::xkbModMask(quint16 state) { xkb_mod_mask_t xkb_mask = 0; diff --git a/src/plugins/platforms/xcb/qxcbkeyboard.h b/src/plugins/platforms/xcb/qxcbkeyboard.h index a7ab88b9d9..eab917e5b4 100644 --- a/src/plugins/platforms/xcb/qxcbkeyboard.h +++ b/src/plugins/platforms/xcb/qxcbkeyboard.h @@ -82,6 +82,7 @@ public: int coreDeviceId() const { return core_device_id; } void updateXKBState(xcb_xkb_state_notify_event_t *state); #endif + void handleStateChanges(xkb_state_component changedComponents); protected: void handleKeyEvent(xcb_window_t sourceWindow, QEvent::Type type, xcb_keycode_t code, -- cgit v1.2.3 From 669070c404b9cbeac9ad8050600ec6b90bdcb756 Mon Sep 17 00:00:00 2001 From: Gatis Paeglis Date: Thu, 8 Feb 2018 13:01:25 +0100 Subject: xcb: simplify handling of keymap updates The old code was somewhat too scattered. Change-Id: Ib0445c66653f757ccac28778f34f4bcb5df49a70 Reviewed-by: Shawn Rutledge --- src/plugins/platforms/xcb/qxcbconnection.cpp | 4 +- src/plugins/platforms/xcb/qxcbkeyboard.cpp | 70 ++++++++++++++-------------- src/plugins/platforms/xcb/qxcbkeyboard.h | 10 ++-- 3 files changed, 41 insertions(+), 43 deletions(-) (limited to 'src/plugins/platforms') diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp index c6fd006f95..2431f99ab8 100644 --- a/src/plugins/platforms/xcb/qxcbconnection.cpp +++ b/src/plugins/platforms/xcb/qxcbconnection.cpp @@ -1132,7 +1132,7 @@ void QXcbConnection::handleXcbEvent(xcb_generic_event_t *event) m_keyboard->updateXKBStateFromCore(((xcb_key_release_event_t *)event)->state); HANDLE_KEYBOARD_EVENT(xcb_key_release_event_t, handleKeyReleaseEvent); case XCB_MAPPING_NOTIFY: - m_keyboard->handleMappingNotifyEvent(reinterpret_cast(event)); + m_keyboard->updateKeymap(reinterpret_cast(event)); break; case XCB_SELECTION_REQUEST: { @@ -1220,7 +1220,7 @@ void QXcbConnection::handleXcbEvent(xcb_generic_event_t *event) handled = true; break; case XCB_XKB_MAP_NOTIFY: - m_keyboard->handleMappingNotifyEvent(&xkb_event->map_notify); + m_keyboard->updateKeymap(); handled = true; break; case XCB_XKB_NEW_KEYBOARD_NOTIFY: { diff --git a/src/plugins/platforms/xcb/qxcbkeyboard.cpp b/src/plugins/platforms/xcb/qxcbkeyboard.cpp index b097ca7b45..e4551b0139 100644 --- a/src/plugins/platforms/xcb/qxcbkeyboard.cpp +++ b/src/plugins/platforms/xcb/qxcbkeyboard.cpp @@ -476,7 +476,7 @@ static QByteArray symbolsGroupString(const xcb_keysym_t *symbols, int count) return groupString; } -struct xkb_keymap *QXcbKeyboard::keymapFromCore() +struct xkb_keymap *QXcbKeyboard::keymapFromCore(const KeysymModifierMap &keysymMods) { /* Construct an XKB keymap string from information queried from * the X server */ @@ -602,7 +602,6 @@ struct xkb_keymap *QXcbKeyboard::keymapFromCore() if (xkeymap.isEmpty()) return nullptr; - KeysymModifierMap keysymMods(keysymsToModifiers()); static const char *const builtinModifiers[] = { "Shift", "Lock", "Control", "Mod1", "Mod2", "Mod3", "Mod4", "Mod5" }; @@ -719,8 +718,22 @@ struct xkb_keymap *QXcbKeyboard::keymapFromCore() XKB_KEYMAP_COMPILE_NO_FLAGS); } +void QXcbKeyboard::updateKeymap(xcb_mapping_notify_event_t *event) +{ + if (connection()->hasXKB() || event->request == XCB_MAPPING_POINTER) + return; + + xcb_refresh_keyboard_mapping(m_key_symbols, event); + updateKeymap(); +} + void QXcbKeyboard::updateKeymap() { + KeysymModifierMap keysymMods; + if (!connection()->hasXKB()) + keysymMods = keysymsToModifiers(); + updateModifiers(keysymMods); + m_config = true; if (!m_xkbContext) { @@ -743,7 +756,7 @@ void QXcbKeyboard::updateKeymap() m_xkbState.reset(xkb_x11_state_new_from_device(m_xkbKeymap.get(), xcb_connection(), core_device_id)); } else { #endif - m_xkbKeymap.reset(keymapFromCore()); + m_xkbKeymap.reset(keymapFromCore(keysymMods)); if (m_xkbKeymap) m_xkbState.reset(xkb_state_new(m_xkbKeymap.get())); #if QT_CONFIG(xkb) @@ -1152,8 +1165,6 @@ QXcbKeyboard::QXcbKeyboard(QXcbConnection *connection) #if QT_CONFIG(xkb) core_device_id = 0; if (connection->hasXKB()) { - updateVModMapping(); - updateVModToRModMapping(); core_device_id = xkb_x11_get_core_keyboard_device_id(xcb_connection()); if (core_device_id == -1) { qWarning("Qt: couldn't get core keyboard device info"); @@ -1162,7 +1173,6 @@ QXcbKeyboard::QXcbKeyboard(QXcbConnection *connection) } else { #endif m_key_symbols = xcb_key_symbols_alloc(xcb_connection()); - updateModifiers(); #if QT_CONFIG(xkb) } #endif @@ -1171,7 +1181,7 @@ QXcbKeyboard::QXcbKeyboard(QXcbConnection *connection) QXcbKeyboard::~QXcbKeyboard() { - if (!connection()->hasXKB()) + if (m_key_symbols) xcb_key_symbols_free(m_key_symbols); } @@ -1297,8 +1307,6 @@ void QXcbKeyboard::updateVModToRModMapping() else if (vmod_masks.hyper == bit) rmod_masks.hyper = modmap; } - - resolveMaskConflicts(); #endif } @@ -1309,21 +1317,24 @@ static inline void applyModifier(uint *mask, int modifierBit) *mask |= 1 << modifierBit; } -void QXcbKeyboard::updateModifiers() +void QXcbKeyboard::updateModifiers(const KeysymModifierMap &keysymMods) { - memset(&rmod_masks, 0, sizeof(rmod_masks)); - - // Compute X modifier bits for Qt modifiers - KeysymModifierMap keysymMods(keysymsToModifiers()); - applyModifier(&rmod_masks.alt, keysymMods.value(XKB_KEY_Alt_L, -1)); - applyModifier(&rmod_masks.alt, keysymMods.value(XKB_KEY_Alt_R, -1)); - applyModifier(&rmod_masks.meta, keysymMods.value(XKB_KEY_Meta_L, -1)); - applyModifier(&rmod_masks.meta, keysymMods.value(XKB_KEY_Meta_R, -1)); - applyModifier(&rmod_masks.altgr, keysymMods.value(XKB_KEY_Mode_switch, -1)); - applyModifier(&rmod_masks.super, keysymMods.value(XKB_KEY_Super_L, -1)); - applyModifier(&rmod_masks.super, keysymMods.value(XKB_KEY_Super_R, -1)); - applyModifier(&rmod_masks.hyper, keysymMods.value(XKB_KEY_Hyper_L, -1)); - applyModifier(&rmod_masks.hyper, keysymMods.value(XKB_KEY_Hyper_R, -1)); + if (connection()->hasXKB()) { + updateVModMapping(); + updateVModToRModMapping(); + } else { + memset(&rmod_masks, 0, sizeof(rmod_masks)); + // Compute X modifier bits for Qt modifiers + applyModifier(&rmod_masks.alt, keysymMods.value(XKB_KEY_Alt_L, -1)); + applyModifier(&rmod_masks.alt, keysymMods.value(XKB_KEY_Alt_R, -1)); + applyModifier(&rmod_masks.meta, keysymMods.value(XKB_KEY_Meta_L, -1)); + applyModifier(&rmod_masks.meta, keysymMods.value(XKB_KEY_Meta_R, -1)); + applyModifier(&rmod_masks.altgr, keysymMods.value(XKB_KEY_Mode_switch, -1)); + applyModifier(&rmod_masks.super, keysymMods.value(XKB_KEY_Super_L, -1)); + applyModifier(&rmod_masks.super, keysymMods.value(XKB_KEY_Super_R, -1)); + applyModifier(&rmod_masks.hyper, keysymMods.value(XKB_KEY_Hyper_L, -1)); + applyModifier(&rmod_masks.hyper, keysymMods.value(XKB_KEY_Hyper_R, -1)); + } resolveMaskConflicts(); } @@ -1650,17 +1661,4 @@ void QXcbKeyboard::handleKeyReleaseEvent(const xcb_key_release_event_t *e) handleKeyEvent(e->event, QEvent::KeyRelease, e->detail, e->state, e->time, fromSendEvent(e)); } -void QXcbKeyboard::handleMappingNotifyEvent(const void *event) -{ - updateKeymap(); - if (connection()->hasXKB()) { - updateVModMapping(); - updateVModToRModMapping(); - } else { - void *ev = const_cast(event); - xcb_refresh_keyboard_mapping(m_key_symbols, static_cast(ev)); - updateModifiers(); - } -} - QT_END_NAMESPACE diff --git a/src/plugins/platforms/xcb/qxcbkeyboard.h b/src/plugins/platforms/xcb/qxcbkeyboard.h index eab917e5b4..c131d69267 100644 --- a/src/plugins/platforms/xcb/qxcbkeyboard.h +++ b/src/plugins/platforms/xcb/qxcbkeyboard.h @@ -64,9 +64,9 @@ public: void handleKeyPressEvent(const xcb_key_press_event_t *event); void handleKeyReleaseEvent(const xcb_key_release_event_t *event); - void handleMappingNotifyEvent(const void *event); Qt::KeyboardModifiers translateModifiers(int s) const; + void updateKeymap(xcb_mapping_notify_event_t *event); void updateKeymap(); QList possibleKeys(const QKeyEvent *e) const; @@ -94,11 +94,11 @@ protected: int keysymToQtKey(xcb_keysym_t keysym, Qt::KeyboardModifiers modifiers, struct xkb_state *state, xcb_keycode_t code) const; - struct xkb_keymap *keymapFromCore(); + typedef QMap KeysymModifierMap; + struct xkb_keymap *keymapFromCore(const KeysymModifierMap &keysymMods); // when XKEYBOARD not present on the X server - void updateModifiers(); - typedef QMap KeysymModifierMap; + void updateModifiers(const KeysymModifierMap &keysymMods); KeysymModifierMap keysymsToModifiers(); // when XKEYBOARD is present on the X server void updateVModMapping(); @@ -122,7 +122,7 @@ private: _mod_masks rmod_masks; // when XKEYBOARD not present on the X server - xcb_key_symbols_t *m_key_symbols; + xcb_key_symbols_t *m_key_symbols = nullptr; struct _xkb_mods { xkb_mod_index_t shift; xkb_mod_index_t lock; -- cgit v1.2.3 From 8bb33c2509a9c7011bba5f6cade34dc293fb85af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20Johan=20S=C3=B8rvig?= Date: Thu, 22 Feb 2018 09:24:32 +0100 Subject: Cocoa: Fix incorrect QSystemTrayIcon::geometry() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The coordinate conversion was wrong. Use QCocoaScreen::mapFromNative() instead. Task-number: QTBUG-53184 Change-Id: I50f18d68ba5d7e1cb5046523a608bfa2e076d7ea Reviewed-by: Gabriel de Dietrich Reviewed-by: Morten Johan Sørvig --- src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'src/plugins/platforms') diff --git a/src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm b/src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm index f4c968ab57..5e6913a89a 100644 --- a/src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm +++ b/src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm @@ -84,6 +84,8 @@ #include "qt_mac_p.h" #include "qcocoahelpers.h" +#include "qcocoaintegration.h" +#include "qcocoascreen.h" #include #import @@ -385,9 +387,8 @@ QT_END_NAMESPACE } -(QRectF)geometry { if (NSWindow *window = [[item view] window]) { - NSRect screenRect = [[window screen] frame]; - NSRect windowRect = [window frame]; - return QRectF(windowRect.origin.x, screenRect.size.height-windowRect.origin.y-windowRect.size.height, windowRect.size.width, windowRect.size.height); + if (QCocoaScreen *screen = QCocoaIntegration::instance()->screenForNSScreen([window screen])) + return screen->mapFromNative([window frame]); } return QRectF(); } -- cgit v1.2.3