diff --git a/autotests/CMakeLists.txt b/autotests/CMakeLists.txt --- a/autotests/CMakeLists.txt +++ b/autotests/CMakeLists.txt @@ -370,3 +370,20 @@ target_link_libraries(testOpenGLContextAttributeBuilder Qt5::Test) add_test(kwin-testOpenGLContextAttributeBuilder testOpenGLContextAttributeBuilder) ecm_mark_as_test(testOpenGLContextAttributeBuilder) + +set(testXkb_SRCS + test_xkb.cpp + ../xkb.cpp +) +add_executable(testXkb ${testXkb_SRCS}) +target_link_libraries(testXkb + Qt5::Test + Qt5::Gui + Qt5::Widgets + KF5::ConfigCore + KF5::WindowSystem + KF5::WaylandServer + XKB::XKB +) +add_test(kwin-testXkb testXkb) +ecm_mark_as_test(testXkb) diff --git a/autotests/test_xkb.cpp b/autotests/test_xkb.cpp new file mode 100644 --- /dev/null +++ b/autotests/test_xkb.cpp @@ -0,0 +1,491 @@ +/******************************************************************** + KWin - the KDE window manager + This file is part of the KDE project. + +Copyright (C) 2017 Martin Flöser + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*********************************************************************/ +#include "../xkb.h" + +#include +#include + +using namespace KWin; + +class XkbTest : public QObject +{ + Q_OBJECT +private Q_SLOTS: + void testToQtKey_data(); + void testToQtKey(); +}; + +// from kwindowsystem/src/platforms/xcb/kkeyserver.cpp +// adjusted to xkb +struct TransKey { + Qt::Key keySymQt; + xkb_keysym_t keySymX; +}; + +static const TransKey g_rgQtToSymX[] = { + { Qt::Key_Escape, XKB_KEY_Escape }, + { Qt::Key_Tab, XKB_KEY_Tab }, + { Qt::Key_Backtab, XKB_KEY_ISO_Left_Tab }, + { Qt::Key_Backspace, XKB_KEY_BackSpace }, + { Qt::Key_Return, XKB_KEY_Return }, + { Qt::Key_Insert, XKB_KEY_Insert }, + { Qt::Key_Delete, XKB_KEY_Delete }, + { Qt::Key_Pause, XKB_KEY_Pause }, + { Qt::Key_Print, XKB_KEY_Print }, + { Qt::Key_SysReq, XKB_KEY_Sys_Req }, + { Qt::Key_Home, XKB_KEY_Home }, + { Qt::Key_End, XKB_KEY_End }, + { Qt::Key_Left, XKB_KEY_Left }, + { Qt::Key_Up, XKB_KEY_Up }, + { Qt::Key_Right, XKB_KEY_Right }, + { Qt::Key_Down, XKB_KEY_Down }, + { Qt::Key_PageUp, XKB_KEY_Prior }, + { Qt::Key_PageDown, XKB_KEY_Next }, + { Qt::Key_CapsLock, XKB_KEY_Caps_Lock }, + { Qt::Key_NumLock, XKB_KEY_Num_Lock }, + { Qt::Key_ScrollLock, XKB_KEY_Scroll_Lock }, + { Qt::Key_F1, XKB_KEY_F1 }, + { Qt::Key_F2, XKB_KEY_F2 }, + { Qt::Key_F3, XKB_KEY_F3 }, + { Qt::Key_F4, XKB_KEY_F4 }, + { Qt::Key_F5, XKB_KEY_F5 }, + { Qt::Key_F6, XKB_KEY_F6 }, + { Qt::Key_F7, XKB_KEY_F7 }, + { Qt::Key_F8, XKB_KEY_F8 }, + { Qt::Key_F9, XKB_KEY_F9 }, + { Qt::Key_F10, XKB_KEY_F10 }, + { Qt::Key_F11, XKB_KEY_F11 }, + { Qt::Key_F12, XKB_KEY_F12 }, + { Qt::Key_F13, XKB_KEY_F13 }, + { Qt::Key_F14, XKB_KEY_F14 }, + { Qt::Key_F15, XKB_KEY_F15 }, + { Qt::Key_F16, XKB_KEY_F16 }, + { Qt::Key_F17, XKB_KEY_F17 }, + { Qt::Key_F18, XKB_KEY_F18 }, + { Qt::Key_F19, XKB_KEY_F19 }, + { Qt::Key_F20, XKB_KEY_F20 }, + { Qt::Key_F21, XKB_KEY_F21 }, + { Qt::Key_F22, XKB_KEY_F22 }, + { Qt::Key_F23, XKB_KEY_F23 }, + { Qt::Key_F24, XKB_KEY_F24 }, + { Qt::Key_F25, XKB_KEY_F25 }, + { Qt::Key_F26, XKB_KEY_F26 }, + { Qt::Key_F27, XKB_KEY_F27 }, + { Qt::Key_F28, XKB_KEY_F28 }, + { Qt::Key_F29, XKB_KEY_F29 }, + { Qt::Key_F30, XKB_KEY_F30 }, + { Qt::Key_F31, XKB_KEY_F31 }, + { Qt::Key_F32, XKB_KEY_F32 }, + { Qt::Key_F33, XKB_KEY_F33 }, + { Qt::Key_F34, XKB_KEY_F34 }, + { Qt::Key_F35, XKB_KEY_F35 }, + { Qt::Key_Super_L, XKB_KEY_Super_L }, + { Qt::Key_Super_R, XKB_KEY_Super_R }, + { Qt::Key_Menu, XKB_KEY_Menu }, + { Qt::Key_Hyper_L, XKB_KEY_Hyper_L }, + { Qt::Key_Hyper_R, XKB_KEY_Hyper_R }, + { Qt::Key_Help, XKB_KEY_Help }, + { Qt::Key_Space, XKB_KEY_KP_Space }, + { Qt::Key_Tab, XKB_KEY_KP_Tab }, + { Qt::Key_Enter, XKB_KEY_KP_Enter }, + { Qt::Key_Home, XKB_KEY_KP_Home }, + { Qt::Key_Left, XKB_KEY_KP_Left }, + { Qt::Key_Up, XKB_KEY_KP_Up }, + { Qt::Key_Right, XKB_KEY_KP_Right }, + { Qt::Key_Down, XKB_KEY_KP_Down }, + { Qt::Key_PageUp, XKB_KEY_KP_Prior }, + { Qt::Key_PageDown, XKB_KEY_KP_Next }, + { Qt::Key_End, XKB_KEY_KP_End }, + { Qt::Key_Clear, XKB_KEY_KP_Begin }, + { Qt::Key_Insert, XKB_KEY_KP_Insert }, + { Qt::Key_Delete, XKB_KEY_KP_Delete }, + { Qt::Key_Equal, XKB_KEY_KP_Equal }, + { Qt::Key_Asterisk, XKB_KEY_KP_Multiply }, + { Qt::Key_Plus, XKB_KEY_KP_Add }, + { Qt::Key_Comma, XKB_KEY_KP_Separator }, + { Qt::Key_Minus, XKB_KEY_KP_Subtract }, + { Qt::Key_Period, XKB_KEY_KP_Decimal }, + { Qt::Key_Slash, XKB_KEY_KP_Divide }, + { Qt::Key_Back, XKB_KEY_XF86Back }, + { Qt::Key_Forward, XKB_KEY_XF86Forward }, + { Qt::Key_Stop, XKB_KEY_XF86Stop }, + { Qt::Key_Refresh, XKB_KEY_XF86Refresh }, + { Qt::Key_Favorites, XKB_KEY_XF86Favorites }, + { Qt::Key_LaunchMedia, XKB_KEY_XF86AudioMedia }, + { Qt::Key_OpenUrl, XKB_KEY_XF86OpenURL }, + { Qt::Key_HomePage, XKB_KEY_XF86HomePage }, + { Qt::Key_Search, XKB_KEY_XF86Search }, + { Qt::Key_VolumeDown, XKB_KEY_XF86AudioLowerVolume }, + { Qt::Key_VolumeMute, XKB_KEY_XF86AudioMute }, + { Qt::Key_VolumeUp, XKB_KEY_XF86AudioRaiseVolume }, + { Qt::Key_MediaPlay, XKB_KEY_XF86AudioPlay }, + { Qt::Key_MediaStop, XKB_KEY_XF86AudioStop }, + { Qt::Key_MediaPrevious, XKB_KEY_XF86AudioPrev }, + { Qt::Key_MediaNext, XKB_KEY_XF86AudioNext }, + { Qt::Key_MediaRecord, XKB_KEY_XF86AudioRecord }, + { Qt::Key_LaunchMail, XKB_KEY_XF86Mail }, + { Qt::Key_Launch0, XKB_KEY_XF86MyComputer }, + { Qt::Key_Launch1, XKB_KEY_XF86Calculator }, + { Qt::Key_Memo, XKB_KEY_XF86Memo }, + { Qt::Key_ToDoList, XKB_KEY_XF86ToDoList }, + { Qt::Key_Calendar, XKB_KEY_XF86Calendar }, + { Qt::Key_PowerDown, XKB_KEY_XF86PowerDown }, + { Qt::Key_ContrastAdjust, XKB_KEY_XF86ContrastAdjust }, + { Qt::Key_Standby, XKB_KEY_XF86Standby }, + { Qt::Key_MonBrightnessUp, XKB_KEY_XF86MonBrightnessUp }, + { Qt::Key_MonBrightnessDown, XKB_KEY_XF86MonBrightnessDown }, + { Qt::Key_KeyboardLightOnOff, XKB_KEY_XF86KbdLightOnOff }, + { Qt::Key_KeyboardBrightnessUp, XKB_KEY_XF86KbdBrightnessUp }, + { Qt::Key_KeyboardBrightnessDown, XKB_KEY_XF86KbdBrightnessDown }, + { Qt::Key_PowerOff, XKB_KEY_XF86PowerOff }, + { Qt::Key_WakeUp, XKB_KEY_XF86WakeUp }, + { Qt::Key_Eject, XKB_KEY_XF86Eject }, + { Qt::Key_ScreenSaver, XKB_KEY_XF86ScreenSaver }, + { Qt::Key_WWW, XKB_KEY_XF86WWW }, + { Qt::Key_Sleep, XKB_KEY_XF86Sleep }, + { Qt::Key_LightBulb, XKB_KEY_XF86LightBulb }, + { Qt::Key_Shop, XKB_KEY_XF86Shop }, + { Qt::Key_History, XKB_KEY_XF86History }, + { Qt::Key_AddFavorite, XKB_KEY_XF86AddFavorite }, + { Qt::Key_HotLinks, XKB_KEY_XF86HotLinks }, + { Qt::Key_BrightnessAdjust, XKB_KEY_XF86BrightnessAdjust }, + { Qt::Key_Finance, XKB_KEY_XF86Finance }, + { Qt::Key_Community, XKB_KEY_XF86Community }, + { Qt::Key_AudioRewind, XKB_KEY_XF86AudioRewind }, + { Qt::Key_BackForward, XKB_KEY_XF86BackForward }, + { Qt::Key_ApplicationLeft, XKB_KEY_XF86ApplicationLeft }, + { Qt::Key_ApplicationRight, XKB_KEY_XF86ApplicationRight }, + { Qt::Key_Book, XKB_KEY_XF86Book }, + { Qt::Key_CD, XKB_KEY_XF86CD }, + { Qt::Key_Calculator, XKB_KEY_XF86Calculater }, + { Qt::Key_Clear, XKB_KEY_XF86Clear }, + { Qt::Key_ClearGrab, XKB_KEY_XF86ClearGrab }, + { Qt::Key_Close, XKB_KEY_XF86Close }, + { Qt::Key_Copy, XKB_KEY_XF86Copy }, + { Qt::Key_Cut, XKB_KEY_XF86Cut }, + { Qt::Key_Display, XKB_KEY_XF86Display }, + { Qt::Key_DOS, XKB_KEY_XF86DOS }, + { Qt::Key_Documents, XKB_KEY_XF86Documents }, + { Qt::Key_Excel, XKB_KEY_XF86Excel }, + { Qt::Key_Explorer, XKB_KEY_XF86Explorer }, + { Qt::Key_Game, XKB_KEY_XF86Game }, + { Qt::Key_Go, XKB_KEY_XF86Go }, + { Qt::Key_iTouch, XKB_KEY_XF86iTouch }, + { Qt::Key_LogOff, XKB_KEY_XF86LogOff }, + { Qt::Key_Market, XKB_KEY_XF86Market }, + { Qt::Key_Meeting, XKB_KEY_XF86Meeting }, + { Qt::Key_MenuKB, XKB_KEY_XF86MenuKB }, + { Qt::Key_MenuPB, XKB_KEY_XF86MenuPB }, + { Qt::Key_MySites, XKB_KEY_XF86MySites }, + { Qt::Key_News, XKB_KEY_XF86News }, + { Qt::Key_OfficeHome, XKB_KEY_XF86OfficeHome }, + { Qt::Key_Option, XKB_KEY_XF86Option }, + { Qt::Key_Paste, XKB_KEY_XF86Paste }, + { Qt::Key_Phone, XKB_KEY_XF86Phone }, + { Qt::Key_Reply, XKB_KEY_XF86Reply }, + { Qt::Key_Reload, XKB_KEY_XF86Reload }, + { Qt::Key_RotateWindows, XKB_KEY_XF86RotateWindows }, + { Qt::Key_RotationPB, XKB_KEY_XF86RotationPB }, + { Qt::Key_RotationKB, XKB_KEY_XF86RotationKB }, + { Qt::Key_Save, XKB_KEY_XF86Save }, + { Qt::Key_Send, XKB_KEY_XF86Send }, + { Qt::Key_Spell, XKB_KEY_XF86Spell }, + { Qt::Key_SplitScreen, XKB_KEY_XF86SplitScreen }, + { Qt::Key_Support, XKB_KEY_XF86Support }, + { Qt::Key_TaskPane, XKB_KEY_XF86TaskPane }, + { Qt::Key_Terminal, XKB_KEY_XF86Terminal }, + { Qt::Key_Tools, XKB_KEY_XF86Tools }, + { Qt::Key_Travel, XKB_KEY_XF86Travel }, + { Qt::Key_Video, XKB_KEY_XF86Video }, + { Qt::Key_Word, XKB_KEY_XF86Word }, + { Qt::Key_Xfer, XKB_KEY_XF86Xfer }, + { Qt::Key_ZoomIn, XKB_KEY_XF86ZoomIn }, + { Qt::Key_ZoomOut, XKB_KEY_XF86ZoomOut }, + { Qt::Key_Away, XKB_KEY_XF86Away }, + { Qt::Key_Messenger, XKB_KEY_XF86Messenger }, + { Qt::Key_WebCam, XKB_KEY_XF86WebCam }, + { Qt::Key_MailForward, XKB_KEY_XF86MailForward }, + { Qt::Key_Pictures, XKB_KEY_XF86Pictures }, + { Qt::Key_Music, XKB_KEY_XF86Music }, + { Qt::Key_Battery, XKB_KEY_XF86Battery }, + { Qt::Key_Bluetooth, XKB_KEY_XF86Bluetooth }, + { Qt::Key_WLAN, XKB_KEY_XF86WLAN }, + { Qt::Key_UWB, XKB_KEY_XF86UWB }, + { Qt::Key_AudioForward, XKB_KEY_XF86AudioForward }, + { Qt::Key_AudioRepeat, XKB_KEY_XF86AudioRepeat }, + { Qt::Key_AudioRandomPlay, XKB_KEY_XF86AudioRandomPlay }, + { Qt::Key_Subtitle, XKB_KEY_XF86Subtitle }, + { Qt::Key_AudioCycleTrack, XKB_KEY_XF86AudioCycleTrack }, + { Qt::Key_Time, XKB_KEY_XF86Time }, + { Qt::Key_Select, XKB_KEY_XF86Select }, + { Qt::Key_View, XKB_KEY_XF86View }, + { Qt::Key_TopMenu, XKB_KEY_XF86TopMenu }, + { Qt::Key_Bluetooth, XKB_KEY_XF86Bluetooth }, + { Qt::Key_Suspend, XKB_KEY_XF86Suspend }, + { Qt::Key_Hibernate, XKB_KEY_XF86Hibernate }, + { Qt::Key_TouchpadToggle, XKB_KEY_XF86TouchpadToggle }, + { Qt::Key_TouchpadOn, XKB_KEY_XF86TouchpadOn }, + { Qt::Key_TouchpadOff, XKB_KEY_XF86TouchpadOff }, + { Qt::Key_MicMute, XKB_KEY_XF86AudioMicMute }, + { Qt::Key_Launch2, XKB_KEY_XF86Launch0 }, + { Qt::Key_Launch3, XKB_KEY_XF86Launch1 }, + { Qt::Key_Launch4, XKB_KEY_XF86Launch2 }, + { Qt::Key_Launch5, XKB_KEY_XF86Launch3 }, + { Qt::Key_Launch6, XKB_KEY_XF86Launch4 }, + { Qt::Key_Launch7, XKB_KEY_XF86Launch5 }, + { Qt::Key_Launch8, XKB_KEY_XF86Launch6 }, + { Qt::Key_Launch9, XKB_KEY_XF86Launch7 }, + { Qt::Key_LaunchA, XKB_KEY_XF86Launch8 }, + { Qt::Key_LaunchB, XKB_KEY_XF86Launch9 }, + { Qt::Key_LaunchC, XKB_KEY_XF86LaunchA }, + { Qt::Key_LaunchD, XKB_KEY_XF86LaunchB }, + { Qt::Key_LaunchE, XKB_KEY_XF86LaunchC }, + { Qt::Key_LaunchF, XKB_KEY_XF86LaunchD }, + +/* + * Latin 1 + * (ISO/IEC 8859-1 = Unicode U+0020..U+00FF) + * Byte 3 = 0 + */ + { Qt::Key_Exclam, XKB_KEY_exclam }, + { Qt::Key_QuoteDbl, XKB_KEY_quotedbl }, + { Qt::Key_NumberSign, XKB_KEY_numbersign }, + { Qt::Key_Dollar, XKB_KEY_dollar }, + { Qt::Key_Percent, XKB_KEY_percent }, + { Qt::Key_Ampersand, XKB_KEY_ampersand }, + { Qt::Key_Apostrophe, XKB_KEY_apostrophe }, + { Qt::Key_ParenLeft, XKB_KEY_parenleft }, + { Qt::Key_ParenRight, XKB_KEY_parenright }, + { Qt::Key_Asterisk, XKB_KEY_asterisk }, + { Qt::Key_Plus, XKB_KEY_plus }, + { Qt::Key_Comma, XKB_KEY_comma }, + { Qt::Key_Minus, XKB_KEY_minus }, + { Qt::Key_Period, XKB_KEY_period }, + { Qt::Key_Slash, XKB_KEY_slash }, + { Qt::Key_0, XKB_KEY_0 }, + { Qt::Key_1, XKB_KEY_1 }, + { Qt::Key_2, XKB_KEY_2 }, + { Qt::Key_3, XKB_KEY_3 }, + { Qt::Key_4, XKB_KEY_4 }, + { Qt::Key_5, XKB_KEY_5 }, + { Qt::Key_6, XKB_KEY_6 }, + { Qt::Key_7, XKB_KEY_7 }, + { Qt::Key_8, XKB_KEY_8 }, + { Qt::Key_9, XKB_KEY_9 }, + { Qt::Key_Colon, XKB_KEY_colon }, + { Qt::Key_Semicolon, XKB_KEY_semicolon }, + { Qt::Key_Less, XKB_KEY_less }, + { Qt::Key_Equal, XKB_KEY_equal }, + { Qt::Key_Greater, XKB_KEY_greater }, + { Qt::Key_Question, XKB_KEY_question }, + { Qt::Key_At, XKB_KEY_at }, + { Qt::Key_A, XKB_KEY_A }, + { Qt::Key_B, XKB_KEY_B }, + { Qt::Key_C, XKB_KEY_C }, + { Qt::Key_D, XKB_KEY_D }, + { Qt::Key_E, XKB_KEY_E }, + { Qt::Key_F, XKB_KEY_F }, + { Qt::Key_G, XKB_KEY_G }, + { Qt::Key_H, XKB_KEY_H }, + { Qt::Key_I, XKB_KEY_I }, + { Qt::Key_J, XKB_KEY_J }, + { Qt::Key_K, XKB_KEY_K }, + { Qt::Key_L, XKB_KEY_L }, + { Qt::Key_M, XKB_KEY_M }, + { Qt::Key_N, XKB_KEY_N }, + { Qt::Key_O, XKB_KEY_O }, + { Qt::Key_P, XKB_KEY_P }, + { Qt::Key_Q, XKB_KEY_Q }, + { Qt::Key_R, XKB_KEY_R }, + { Qt::Key_S, XKB_KEY_S }, + { Qt::Key_T, XKB_KEY_T }, + { Qt::Key_U, XKB_KEY_U }, + { Qt::Key_V, XKB_KEY_V }, + { Qt::Key_W, XKB_KEY_W }, + { Qt::Key_X, XKB_KEY_X }, + { Qt::Key_Y, XKB_KEY_Y }, + { Qt::Key_Z, XKB_KEY_Z }, + { Qt::Key_BracketLeft, XKB_KEY_bracketleft }, + { Qt::Key_Backslash, XKB_KEY_backslash }, + { Qt::Key_BracketRight, XKB_KEY_bracketright}, + { Qt::Key_AsciiCircum, XKB_KEY_asciicircum }, + { Qt::Key_Underscore, XKB_KEY_underscore }, + { Qt::Key_QuoteLeft, XKB_KEY_quoteleft }, + { Qt::Key_A, XKB_KEY_a }, + { Qt::Key_B, XKB_KEY_b }, + { Qt::Key_C, XKB_KEY_c }, + { Qt::Key_D, XKB_KEY_d }, + { Qt::Key_E, XKB_KEY_e }, + { Qt::Key_F, XKB_KEY_f }, + { Qt::Key_G, XKB_KEY_g }, + { Qt::Key_H, XKB_KEY_h }, + { Qt::Key_I, XKB_KEY_i }, + { Qt::Key_J, XKB_KEY_j }, + { Qt::Key_K, XKB_KEY_k }, + { Qt::Key_L, XKB_KEY_l }, + { Qt::Key_M, XKB_KEY_m }, + { Qt::Key_N, XKB_KEY_n }, + { Qt::Key_O, XKB_KEY_o }, + { Qt::Key_P, XKB_KEY_p }, + { Qt::Key_Q, XKB_KEY_q }, + { Qt::Key_R, XKB_KEY_r }, + { Qt::Key_S, XKB_KEY_s }, + { Qt::Key_T, XKB_KEY_t }, + { Qt::Key_U, XKB_KEY_u }, + { Qt::Key_V, XKB_KEY_v }, + { Qt::Key_W, XKB_KEY_w }, + { Qt::Key_X, XKB_KEY_x }, + { Qt::Key_Y, XKB_KEY_y }, + { Qt::Key_Z, XKB_KEY_z }, + { Qt::Key_BraceLeft, XKB_KEY_braceleft }, + { Qt::Key_Bar, XKB_KEY_bar }, + { Qt::Key_BraceRight, XKB_KEY_braceright }, + { Qt::Key_AsciiTilde, XKB_KEY_asciitilde }, + + { Qt::Key_nobreakspace, XKB_KEY_nobreakspace }, + { Qt::Key_exclamdown, XKB_KEY_exclamdown }, + { Qt::Key_cent, XKB_KEY_cent }, + { Qt::Key_sterling, XKB_KEY_sterling }, + { Qt::Key_currency, XKB_KEY_currency }, + { Qt::Key_yen, XKB_KEY_yen }, + { Qt::Key_brokenbar, XKB_KEY_brokenbar }, + { Qt::Key_section, XKB_KEY_section }, + { Qt::Key_diaeresis, XKB_KEY_diaeresis }, + { Qt::Key_copyright, XKB_KEY_copyright }, + { Qt::Key_ordfeminine, XKB_KEY_ordfeminine }, + { Qt::Key_guillemotleft, XKB_KEY_guillemotleft }, + { Qt::Key_notsign, XKB_KEY_notsign }, + { Qt::Key_hyphen, XKB_KEY_hyphen }, + { Qt::Key_registered, XKB_KEY_registered }, + { Qt::Key_macron, XKB_KEY_macron }, + { Qt::Key_degree, XKB_KEY_degree }, + { Qt::Key_plusminus, XKB_KEY_plusminus }, + { Qt::Key_twosuperior, XKB_KEY_twosuperior }, + { Qt::Key_threesuperior, XKB_KEY_threesuperior }, + { Qt::Key_acute, XKB_KEY_acute }, + { Qt::Key_mu, XKB_KEY_mu }, + { Qt::Key_paragraph, XKB_KEY_paragraph }, + { Qt::Key_periodcentered, XKB_KEY_periodcentered }, + { Qt::Key_cedilla, XKB_KEY_cedilla }, + { Qt::Key_onesuperior, XKB_KEY_onesuperior }, + { Qt::Key_masculine, XKB_KEY_masculine }, + { Qt::Key_guillemotright, XKB_KEY_guillemotright }, + { Qt::Key_onequarter, XKB_KEY_onequarter }, + { Qt::Key_onehalf, XKB_KEY_onehalf }, + { Qt::Key_threequarters, XKB_KEY_threequarters }, + { Qt::Key_questiondown, XKB_KEY_questiondown }, + { Qt::Key_Agrave, XKB_KEY_Agrave }, + { Qt::Key_Aacute, XKB_KEY_Aacute }, + { Qt::Key_Acircumflex, XKB_KEY_Acircumflex }, + { Qt::Key_Atilde, XKB_KEY_Atilde }, + { Qt::Key_Adiaeresis, XKB_KEY_Adiaeresis }, + { Qt::Key_Aring, XKB_KEY_Aring }, + { Qt::Key_AE, XKB_KEY_AE }, + { Qt::Key_Ccedilla, XKB_KEY_Ccedilla }, + { Qt::Key_Egrave, XKB_KEY_Egrave }, + { Qt::Key_Eacute, XKB_KEY_Eacute }, + { Qt::Key_Ecircumflex, XKB_KEY_Ecircumflex }, + { Qt::Key_Ediaeresis, XKB_KEY_Ediaeresis }, + { Qt::Key_Igrave, XKB_KEY_Igrave }, + { Qt::Key_Iacute, XKB_KEY_Iacute }, + { Qt::Key_Icircumflex, XKB_KEY_Icircumflex }, + { Qt::Key_Idiaeresis, XKB_KEY_Idiaeresis }, + { Qt::Key_ETH, XKB_KEY_ETH }, + { Qt::Key_Ntilde, XKB_KEY_Ntilde }, + { Qt::Key_Ograve, XKB_KEY_Ograve }, + { Qt::Key_Oacute, XKB_KEY_Oacute }, + { Qt::Key_Ocircumflex, XKB_KEY_Ocircumflex }, + { Qt::Key_Otilde, XKB_KEY_Otilde }, + { Qt::Key_Odiaeresis, XKB_KEY_Odiaeresis }, + { Qt::Key_multiply, XKB_KEY_multiply }, + { Qt::Key_Ooblique, XKB_KEY_Ooblique }, + { Qt::Key_Ugrave, XKB_KEY_Ugrave }, + { Qt::Key_Uacute, XKB_KEY_Uacute }, + { Qt::Key_Ucircumflex, XKB_KEY_Ucircumflex }, + { Qt::Key_Udiaeresis, XKB_KEY_Udiaeresis }, + { Qt::Key_Yacute, XKB_KEY_Yacute }, + { Qt::Key_THORN, XKB_KEY_THORN }, + { Qt::Key_ssharp, XKB_KEY_ssharp }, + { Qt::Key_Agrave, XKB_KEY_agrave }, + { Qt::Key_Aacute, XKB_KEY_aacute }, + { Qt::Key_Acircumflex, XKB_KEY_acircumflex }, + { Qt::Key_Atilde, XKB_KEY_atilde }, + { Qt::Key_Adiaeresis, XKB_KEY_adiaeresis }, + { Qt::Key_Aring, XKB_KEY_aring }, + { Qt::Key_AE, XKB_KEY_ae }, + { Qt::Key_Ccedilla, XKB_KEY_ccedilla }, + { Qt::Key_Egrave, XKB_KEY_egrave }, + { Qt::Key_Eacute, XKB_KEY_eacute }, + { Qt::Key_Ecircumflex, XKB_KEY_ecircumflex }, + { Qt::Key_Ediaeresis, XKB_KEY_ediaeresis }, + { Qt::Key_Igrave, XKB_KEY_igrave }, + { Qt::Key_Iacute, XKB_KEY_iacute }, + { Qt::Key_Icircumflex, XKB_KEY_icircumflex }, + { Qt::Key_Idiaeresis, XKB_KEY_idiaeresis }, + { Qt::Key_ETH, XKB_KEY_eth }, + { Qt::Key_Ntilde, XKB_KEY_ntilde }, + { Qt::Key_Ograve, XKB_KEY_ograve }, + { Qt::Key_Oacute, XKB_KEY_oacute }, + { Qt::Key_Ocircumflex, XKB_KEY_ocircumflex }, + { Qt::Key_Otilde, XKB_KEY_otilde }, + { Qt::Key_Odiaeresis, XKB_KEY_odiaeresis }, + { Qt::Key_division, XKB_KEY_division }, + { Qt::Key_Ooblique, XKB_KEY_ooblique }, + { Qt::Key_Ugrave, XKB_KEY_ugrave }, + { Qt::Key_Uacute, XKB_KEY_uacute }, + { Qt::Key_Ucircumflex, XKB_KEY_ucircumflex }, + { Qt::Key_Udiaeresis, XKB_KEY_udiaeresis }, + { Qt::Key_Yacute, XKB_KEY_yacute }, + { Qt::Key_THORN, XKB_KEY_thorn }, + { Qt::Key_ydiaeresis, XKB_KEY_ydiaeresis }, + /* + * Numpad + **/ + { Qt::Key_0, XKB_KEY_KP_0}, + { Qt::Key_1, XKB_KEY_KP_1}, + { Qt::Key_2, XKB_KEY_KP_2}, + { Qt::Key_3, XKB_KEY_KP_3}, + { Qt::Key_4, XKB_KEY_KP_4}, + { Qt::Key_5, XKB_KEY_KP_5}, + { Qt::Key_6, XKB_KEY_KP_6}, + { Qt::Key_7, XKB_KEY_KP_7}, + { Qt::Key_8, XKB_KEY_KP_8}, + { Qt::Key_9, XKB_KEY_KP_9} +}; + +void XkbTest::testToQtKey_data() +{ + QTest::addColumn("qt"); + QTest::addColumn("keySym"); + for (std::size_t i = 0; i < sizeof(g_rgQtToSymX) / sizeof(TransKey); i++) { + const QByteArray row = QByteArray::number(g_rgQtToSymX[i].keySymX, 16); + QTest::newRow(row.constData()) << g_rgQtToSymX[i].keySymQt << g_rgQtToSymX[i].keySymX; + } +} + +void XkbTest::testToQtKey() +{ + Xkb xkb; + QFETCH(xkb_keysym_t, keySym); + QTEST(xkb.toQtKey(keySym), "qt"); +} + +QTEST_MAIN(XkbTest) +#include "test_xkb.moc" diff --git a/keyboard_input.cpp b/keyboard_input.cpp --- a/keyboard_input.cpp +++ b/keyboard_input.cpp @@ -47,6 +47,10 @@ , m_input(parent) , m_xkb(new Xkb(parent)) { + connect(m_xkb.data(), &Xkb::ledsChanged, this, &KeyboardInputRedirection::ledsChanged); + if (waylandServer()) { + m_xkb->setSeat(waylandServer()->seat()); + } } KeyboardInputRedirection::~KeyboardInputRedirection() = default; diff --git a/xkb.h b/xkb.h --- a/xkb.h +++ b/xkb.h @@ -38,13 +38,22 @@ typedef uint32_t xkb_keysym_t; typedef uint32_t xkb_layout_index_t; +namespace KWayland +{ +namespace Server +{ + class SeatInterface; +} +} + namespace KWin { -class KWIN_EXPORT Xkb +class KWIN_EXPORT Xkb : public QObject { + Q_OBJECT public: - Xkb(InputRedirection *input); + Xkb(QObject *parent = nullptr); ~Xkb(); void setConfig(KSharedConfigPtr config) { m_config = config; @@ -98,15 +107,19 @@ **/ void forwardModifiers(); + void setSeat(KWayland::Server::SeatInterface *seat); + +Q_SIGNALS: + void ledsChanged(const LEDs &leds); + private: xkb_keymap *loadKeymapFromConfig(); xkb_keymap *loadDefaultKeymap(); void updateKeymap(xkb_keymap *keymap); void createKeymapFile(); void updateModifiers(); void updateConsumedModifiers(uint32_t key); QString layoutName(xkb_layout_index_t layout) const; - InputRedirection *m_input; xkb_context *m_context; xkb_keymap *m_keymap; xkb_state *m_state; @@ -135,6 +148,8 @@ xkb_mod_index_t latched = 0; xkb_mod_index_t locked = 0; } m_modifierState; + + QPointer m_seat; }; inline diff --git a/xkb.cpp b/xkb.cpp --- a/xkb.cpp +++ b/xkb.cpp @@ -18,12 +18,10 @@ along with this program. If not, see . *********************************************************************/ #include "xkb.h" -#include "keyboard_input.h" +#include "xkb_qt_mapping.h" #include "utils.h" -#include "wayland_server.h" // frameworks #include -#include // KWayland #include // Qt @@ -66,8 +64,8 @@ } } -Xkb::Xkb(InputRedirection *input) - : m_input(input) +Xkb::Xkb(QObject *parent) + : QObject(parent) , m_context(xkb_context_new(static_cast(0))) , m_keymap(NULL) , m_state(NULL) @@ -223,7 +221,7 @@ void Xkb::createKeymapFile() { - if (!waylandServer()) { + if (!m_seat) { return; } // TODO: uninstall keymap on server? @@ -237,7 +235,7 @@ } const uint size = qstrlen(keymapString.data()) + 1; - QTemporaryFile *tmp = new QTemporaryFile(m_input); + QTemporaryFile *tmp = new QTemporaryFile(this); if (!tmp->open()) { delete tmp; return; @@ -255,7 +253,7 @@ delete tmp; return; } - waylandServer()->seat()->setKeymap(tmp->handle(), size); + m_seat->setKeymap(tmp->handle(), size); } void Xkb::updateModifiers(uint32_t modsDepressed, uint32_t modsLatched, uint32_t modsLocked, uint32_t group) @@ -327,7 +325,7 @@ } if (m_leds != leds) { m_leds = leds; - emit m_input->keyboard()->ledsChanged(m_leds); + emit ledsChanged(m_leds); } m_currentLayout = xkb_state_serialize_layout(m_state, XKB_STATE_LAYOUT_EFFECTIVE); @@ -338,10 +336,10 @@ void Xkb::forwardModifiers() { - if (!waylandServer()) { + if (!m_seat) { return; } - waylandServer()->seat()->updateKeyboardModifiers(m_modifierState.depressed, + m_seat->updateKeyboardModifiers(m_modifierState.depressed, m_modifierState.latched, m_modifierState.locked, m_currentLayout); @@ -444,12 +442,7 @@ Qt::Key Xkb::toQtKey(xkb_keysym_t keysym) const { - int key = Qt::Key_unknown; - KKeyServer::symXToKeyQt(keysym, &key); - if (key & Qt::KeyboardModifierMask) { - key &= ~Qt::KeyboardModifierMask; - } - return static_cast(key); + return xkbToQtKey(keysym); } bool Xkb::shouldKeyRepeat(quint32 key) const @@ -503,4 +496,9 @@ return xkb_keymap_num_layouts(m_keymap); } +void Xkb::setSeat(KWayland::Server::SeatInterface *seat) +{ + m_seat = QPointer(seat); +} + } diff --git a/xkb_qt_mapping.h b/xkb_qt_mapping.h new file mode 100644 --- /dev/null +++ b/xkb_qt_mapping.h @@ -0,0 +1,278 @@ +/******************************************************************** + KWin - the KDE window manager + This file is part of the KDE project. + +Copyright (C) 2017 Martin Flöser + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*********************************************************************/ +#ifndef KWIN_XKB_QT_MAPPING_H +#define KWIN_XKB_QT_MAPPING_H + +#include + +#include +#include + +namespace KWin +{ + +// based on mapping in kwindowsystem/src/platforms/xcb/kkeyserver.cpp +// adjusted to XKB +static const std::map s_mapping{ + { 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_Pause, Qt::Key_Pause }, + { XKB_KEY_Print, Qt::Key_Print }, + { XKB_KEY_Sys_Req, Qt::Key_SysReq }, + { 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 }, + { XKB_KEY_Caps_Lock, Qt::Key_CapsLock }, + { XKB_KEY_Num_Lock, Qt::Key_NumLock }, + { XKB_KEY_Scroll_Lock, Qt::Key_ScrollLock }, + { XKB_KEY_F1, Qt::Key_F1 }, + { XKB_KEY_F2, Qt::Key_F2 }, + { XKB_KEY_F3, Qt::Key_F3 }, + { XKB_KEY_F4, Qt::Key_F4 }, + { XKB_KEY_F5, Qt::Key_F5 }, + { XKB_KEY_F6, Qt::Key_F6 }, + { XKB_KEY_F7, Qt::Key_F7 }, + { XKB_KEY_F8, Qt::Key_F8 }, + { XKB_KEY_F9, Qt::Key_F9 }, + { XKB_KEY_F10, Qt::Key_F10 }, + { XKB_KEY_F11, Qt::Key_F11 }, + { XKB_KEY_F12, Qt::Key_F12 }, + { XKB_KEY_F13, Qt::Key_F13 }, + { XKB_KEY_F14, Qt::Key_F14 }, + { XKB_KEY_F15, Qt::Key_F15 }, + { XKB_KEY_F16, Qt::Key_F16 }, + { XKB_KEY_F17, Qt::Key_F17 }, + { XKB_KEY_F18, Qt::Key_F18 }, + { XKB_KEY_F19, Qt::Key_F19 }, + { XKB_KEY_F20, Qt::Key_F20 }, + { XKB_KEY_F21, Qt::Key_F21 }, + { XKB_KEY_F22, Qt::Key_F22 }, + { XKB_KEY_F23, Qt::Key_F23 }, + { XKB_KEY_F24, Qt::Key_F24 }, + { XKB_KEY_F25, Qt::Key_F25 }, + { XKB_KEY_F26, Qt::Key_F26 }, + { XKB_KEY_F27, Qt::Key_F27 }, + { XKB_KEY_F28, Qt::Key_F28 }, + { XKB_KEY_F29, Qt::Key_F29 }, + { XKB_KEY_F30, Qt::Key_F30 }, + { XKB_KEY_F31, Qt::Key_F31 }, + { XKB_KEY_F32, Qt::Key_F32 }, + { XKB_KEY_F33, Qt::Key_F33 }, + { XKB_KEY_F34, Qt::Key_F34 }, + { XKB_KEY_F35, Qt::Key_F35 }, + { 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 }, + { XKB_KEY_KP_Space, Qt::Key_Space }, + { XKB_KEY_KP_Tab, Qt::Key_Tab }, + { XKB_KEY_KP_Enter, Qt::Key_Enter }, + { 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 }, + { 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_XF86Mail, Qt::Key_LaunchMail }, + { XKB_KEY_XF86MyComputer, Qt::Key_Launch0 }, + { 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_XF86News, Qt::Key_News }, + { XKB_KEY_XF86OfficeHome, Qt::Key_OfficeHome }, + { 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_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 }, + { 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 } +}; + +static inline Qt::Key xkbToQtKey(xkb_keysym_t keySym) +{ + Qt::Key key = Qt::Key_unknown; + if (keySym >= XKB_KEY_KP_0 && keySym <= XKB_KEY_KP_9) { + // numeric keypad keys + key = Qt::Key(int(Qt::Key_0) + int(keySym) - XKB_KEY_KP_0); + } else if ((keySym >= XKB_KEY_a && keySym <= XKB_KEY_z) || + (keySym >= XKB_KEY_agrave && keySym < XKB_KEY_division) || + (keySym > XKB_KEY_division && keySym <= XKB_KEY_thorn)) { + key = Qt::Key(QChar(keySym).toUpper().unicode()); + } else if (keySym < 0x3000) { + key = Qt::Key(keySym); + } + if (key == Qt::Key_unknown) { + const auto it = s_mapping.find(keySym); + if (it != s_mapping.end()) { + key = it->second; + } + } + return key; +} + +} + +#endif