qtkeycodes.cpp (41545B)
1 // SPDX-FileCopyrightText: 2019-2023 Connor McLaughlin <stenzek@gmail.com> 2 // SPDX-License-Identifier: (GPL-3.0 OR CC-BY-NC-ND-4.0) 3 4 #include "qtutils.h" 5 6 #include "common/string_util.h" 7 8 #include "IconsPromptFont.h" 9 10 #include "fmt/format.h" 11 #include "util/input_manager.h" 12 13 #include <QtGui/QKeyEvent> 14 15 struct KeyCodeName 16 { 17 int code; 18 const char* name; 19 const char* icon_name; 20 }; 21 22 static constexpr KeyCodeName s_qt_key_names[] = {{Qt::Key_Escape, "Escape", ICON_PF_ESC}, 23 {Qt::Key_Tab, "Tab", ICON_PF_TAB}, 24 {Qt::Key_Backtab, "Backtab", nullptr}, 25 {Qt::Key_Backspace, "Backspace", ICON_PF_BACKSPACE}, 26 {Qt::Key_Return, "Return", ICON_PF_ENTER}, 27 {Qt::Key_Enter, "Enter", ICON_PF_ENTER}, 28 {Qt::Key_Insert, "Insert", ICON_PF_INSERT}, 29 {Qt::Key_Delete, "Delete", ICON_PF_DELETE}, 30 {Qt::Key_Pause, "Pause", ICON_PF_PAUSE}, 31 {Qt::Key_Print, "Print", ICON_PF_PRTSC}, 32 {Qt::Key_SysReq, "SysReq", ICON_PF_PAUSE}, 33 {Qt::Key_Clear, "Clear", nullptr}, 34 {Qt::Key_Home, "Home", ICON_PF_HOME}, 35 {Qt::Key_End, "End", ICON_PF_END}, 36 {Qt::Key_Left, "Left", ICON_PF_ARROW_LEFT}, 37 {Qt::Key_Up, "Up", ICON_PF_ARROW_UP}, 38 {Qt::Key_Right, "Right", ICON_PF_ARROW_RIGHT}, 39 {Qt::Key_Down, "Down", ICON_PF_ARROW_DOWN}, 40 {Qt::Key_PageUp, "PageUp", ICON_PF_PAGE_UP}, 41 {Qt::Key_PageDown, "PageDown", ICON_PF_PAGE_DOWN}, 42 {Qt::Key_Shift, "Shift", ICON_PF_SHIFT}, 43 {Qt::Key_Control, "Control", ICON_PF_CTRL}, 44 {Qt::Key_Meta, "Meta", ICON_PF_SUPER}, 45 {Qt::Key_Alt, "Alt", ICON_PF_ALT}, 46 {Qt::Key_CapsLock, "CapsLock", ICON_PF_CAPS}, 47 {Qt::Key_NumLock, "NumLock", ICON_PF_NUMLOCK}, 48 {Qt::Key_ScrollLock, "ScrollLock", ICON_PF_SCRLK}, 49 {Qt::Key_F1, "F1", ICON_PF_F1}, 50 {Qt::Key_F2, "F2", ICON_PF_F2}, 51 {Qt::Key_F3, "F3", ICON_PF_F3}, 52 {Qt::Key_F4, "F4", ICON_PF_F4}, 53 {Qt::Key_F5, "F5", ICON_PF_F5}, 54 {Qt::Key_F6, "F6", ICON_PF_F6}, 55 {Qt::Key_F7, "F7", ICON_PF_F7}, 56 {Qt::Key_F8, "F8", ICON_PF_F8}, 57 {Qt::Key_F9, "F9", ICON_PF_F9}, 58 {Qt::Key_F10, "F10", ICON_PF_F10}, 59 {Qt::Key_F11, "F11", ICON_PF_F11}, 60 {Qt::Key_F12, "F12", ICON_PF_F12}, 61 {Qt::Key_F13, "F13", nullptr}, 62 {Qt::Key_F14, "F14", nullptr}, 63 {Qt::Key_F15, "F15", nullptr}, 64 {Qt::Key_F16, "F16", nullptr}, 65 {Qt::Key_F17, "F17", nullptr}, 66 {Qt::Key_F18, "F18", nullptr}, 67 {Qt::Key_F19, "F19", nullptr}, 68 {Qt::Key_F20, "F20", nullptr}, 69 {Qt::Key_F21, "F21", nullptr}, 70 {Qt::Key_F22, "F22", nullptr}, 71 {Qt::Key_F23, "F23", nullptr}, 72 {Qt::Key_F24, "F24", nullptr}, 73 {Qt::Key_F25, "F25", nullptr}, 74 {Qt::Key_F26, "F26", nullptr}, 75 {Qt::Key_F27, "F27", nullptr}, 76 {Qt::Key_F28, "F28", nullptr}, 77 {Qt::Key_F29, "F29", nullptr}, 78 {Qt::Key_F30, "F30", nullptr}, 79 {Qt::Key_F31, "F31", nullptr}, 80 {Qt::Key_F32, "F32", nullptr}, 81 {Qt::Key_F33, "F33", nullptr}, 82 {Qt::Key_F34, "F34", nullptr}, 83 {Qt::Key_F35, "F35", nullptr}, 84 {Qt::Key_Super_L, "Super_L", nullptr}, 85 {Qt::Key_Super_R, "Super_R", nullptr}, 86 {Qt::Key_Menu, "Menu", nullptr}, 87 {Qt::Key_Hyper_L, "Hyper_L", nullptr}, 88 {Qt::Key_Hyper_R, "Hyper_R", nullptr}, 89 {Qt::Key_Help, "Help", nullptr}, 90 {Qt::Key_Direction_L, "Direction_L", nullptr}, 91 {Qt::Key_Direction_R, "Direction_R", nullptr}, 92 {Qt::Key_Space, "Space", ICON_PF_SPACE}, 93 {Qt::Key_Any, "Any", nullptr}, 94 {Qt::Key_Exclam, "Exclam", nullptr}, 95 {Qt::Key_QuoteDbl, "QuoteDbl", nullptr}, 96 {Qt::Key_NumberSign, "NumberSign", nullptr}, 97 {Qt::Key_Dollar, "Dollar", nullptr}, 98 {Qt::Key_Percent, "Percent", nullptr}, 99 {Qt::Key_Ampersand, "Ampersand", nullptr}, 100 {Qt::Key_Apostrophe, "Apostrophe", nullptr}, 101 {Qt::Key_ParenLeft, "ParenLeft", nullptr}, 102 {Qt::Key_ParenRight, "ParenRight", nullptr}, 103 {Qt::Key_Asterisk, "Asterisk", nullptr}, 104 {Qt::Key_Plus, "Plus", nullptr}, 105 {Qt::Key_Comma, "Comma", nullptr}, 106 {Qt::Key_Minus, "Minus", nullptr}, 107 {Qt::Key_Period, "Period", nullptr}, 108 {Qt::Key_Slash, "Slash", nullptr}, 109 {Qt::Key_0, "0", ICON_PF_0}, 110 {Qt::Key_1, "1", ICON_PF_1}, 111 {Qt::Key_2, "2", ICON_PF_2}, 112 {Qt::Key_3, "3", ICON_PF_3}, 113 {Qt::Key_4, "4", ICON_PF_4}, 114 {Qt::Key_5, "5", ICON_PF_5}, 115 {Qt::Key_6, "6", ICON_PF_6}, 116 {Qt::Key_7, "7", ICON_PF_7}, 117 {Qt::Key_8, "8", ICON_PF_8}, 118 {Qt::Key_9, "9", ICON_PF_9}, 119 {Qt::Key_Colon, "Colon", nullptr}, 120 {Qt::Key_Semicolon, "Semicolon", nullptr}, 121 {Qt::Key_Less, "Less", nullptr}, 122 {Qt::Key_Equal, "Equal", nullptr}, 123 {Qt::Key_Greater, "Greater", nullptr}, 124 {Qt::Key_Question, "Question", nullptr}, 125 {Qt::Key_At, "At", nullptr}, 126 {Qt::Key_A, "A", ICON_PF_KEY_A}, 127 {Qt::Key_B, "B", ICON_PF_KEY_B}, 128 {Qt::Key_C, "C", ICON_PF_KEY_C}, 129 {Qt::Key_D, "D", ICON_PF_KEY_D}, 130 {Qt::Key_E, "E", ICON_PF_KEY_E}, 131 {Qt::Key_F, "F", ICON_PF_KEY_F}, 132 {Qt::Key_G, "G", ICON_PF_KEY_G}, 133 {Qt::Key_H, "H", ICON_PF_KEY_H}, 134 {Qt::Key_I, "I", ICON_PF_KEY_I}, 135 {Qt::Key_J, "J", ICON_PF_KEY_J}, 136 {Qt::Key_K, "K", ICON_PF_KEY_K}, 137 {Qt::Key_L, "L", ICON_PF_KEY_L}, 138 {Qt::Key_M, "M", ICON_PF_KEY_M}, 139 {Qt::Key_N, "N", ICON_PF_KEY_N}, 140 {Qt::Key_O, "O", ICON_PF_KEY_O}, 141 {Qt::Key_P, "P", ICON_PF_KEY_P}, 142 {Qt::Key_Q, "Q", ICON_PF_KEY_Q}, 143 {Qt::Key_R, "R", ICON_PF_KEY_R}, 144 {Qt::Key_S, "S", ICON_PF_KEY_S}, 145 {Qt::Key_T, "T", ICON_PF_KEY_T}, 146 {Qt::Key_U, "U", ICON_PF_KEY_U}, 147 {Qt::Key_V, "V", ICON_PF_KEY_V}, 148 {Qt::Key_W, "W", ICON_PF_KEY_W}, 149 {Qt::Key_X, "X", ICON_PF_KEY_X}, 150 {Qt::Key_Y, "Y", ICON_PF_KEY_Y}, 151 {Qt::Key_Z, "Z", ICON_PF_KEY_Z}, 152 {Qt::Key_BracketLeft, "BracketLeft", nullptr}, 153 {Qt::Key_Backslash, "Backslash", nullptr}, 154 {Qt::Key_BracketRight, "BracketRight", nullptr}, 155 {Qt::Key_AsciiCircum, "AsciiCircum", nullptr}, 156 {Qt::Key_Underscore, "Underscore", nullptr}, 157 {Qt::Key_QuoteLeft, "QuoteLeft", nullptr}, 158 {Qt::Key_BraceLeft, "BraceLeft", nullptr}, 159 {Qt::Key_Bar, "Bar", nullptr}, 160 {Qt::Key_BraceRight, "BraceRight", nullptr}, 161 {Qt::Key_AsciiTilde, "AsciiTilde", nullptr}, 162 {Qt::Key_nobreakspace, "nobreakspace", nullptr}, 163 {Qt::Key_exclamdown, "exclamdown", nullptr}, 164 {Qt::Key_cent, "cent", nullptr}, 165 {Qt::Key_sterling, "sterling", nullptr}, 166 {Qt::Key_currency, "currency", nullptr}, 167 {Qt::Key_yen, "yen", nullptr}, 168 {Qt::Key_brokenbar, "brokenbar", nullptr}, 169 {Qt::Key_section, "section", nullptr}, 170 {Qt::Key_diaeresis, "diaeresis", nullptr}, 171 {Qt::Key_copyright, "copyright", nullptr}, 172 {Qt::Key_ordfeminine, "ordfeminine", nullptr}, 173 {Qt::Key_guillemotleft, "guillemotleft", nullptr}, 174 {Qt::Key_notsign, "notsign", nullptr}, 175 {Qt::Key_hyphen, "hyphen", nullptr}, 176 {Qt::Key_registered, "registered", nullptr}, 177 {Qt::Key_macron, "macron", nullptr}, 178 {Qt::Key_degree, "degree", nullptr}, 179 {Qt::Key_plusminus, "plusminus", nullptr}, 180 {Qt::Key_twosuperior, "twosuperior", nullptr}, 181 {Qt::Key_threesuperior, "threesuperior", nullptr}, 182 {Qt::Key_acute, "acute", nullptr}, 183 {Qt::Key_micro, "micro", nullptr}, 184 {Qt::Key_paragraph, "paragraph", nullptr}, 185 {Qt::Key_periodcentered, "periodcentered", nullptr}, 186 {Qt::Key_cedilla, "cedilla", nullptr}, 187 {Qt::Key_onesuperior, "onesuperior", nullptr}, 188 {Qt::Key_masculine, "masculine", nullptr}, 189 {Qt::Key_guillemotright, "guillemotright", nullptr}, 190 {Qt::Key_onequarter, "onequarter", nullptr}, 191 {Qt::Key_onehalf, "onehalf", nullptr}, 192 {Qt::Key_threequarters, "threequarters", nullptr}, 193 {Qt::Key_questiondown, "questiondown", nullptr}, 194 {Qt::Key_Agrave, "Agrave", nullptr}, 195 {Qt::Key_Aacute, "Aacute", nullptr}, 196 {Qt::Key_Acircumflex, "Acircumflex", nullptr}, 197 {Qt::Key_Atilde, "Atilde", nullptr}, 198 {Qt::Key_Adiaeresis, "Adiaeresis", nullptr}, 199 {Qt::Key_Aring, "Aring", nullptr}, 200 {Qt::Key_AE, "AE", nullptr}, 201 {Qt::Key_Ccedilla, "Ccedilla", nullptr}, 202 {Qt::Key_Egrave, "Egrave", nullptr}, 203 {Qt::Key_Eacute, "Eacute", nullptr}, 204 {Qt::Key_Ecircumflex, "Ecircumflex", nullptr}, 205 {Qt::Key_Ediaeresis, "Ediaeresis", nullptr}, 206 {Qt::Key_Igrave, "Igrave", nullptr}, 207 {Qt::Key_Iacute, "Iacute", nullptr}, 208 {Qt::Key_Icircumflex, "Icircumflex", nullptr}, 209 {Qt::Key_Idiaeresis, "Idiaeresis", nullptr}, 210 {Qt::Key_ETH, "ETH", nullptr}, 211 {Qt::Key_Ntilde, "Ntilde", nullptr}, 212 {Qt::Key_Ograve, "Ograve", nullptr}, 213 {Qt::Key_Oacute, "Oacute", nullptr}, 214 {Qt::Key_Ocircumflex, "Ocircumflex", nullptr}, 215 {Qt::Key_Otilde, "Otilde", nullptr}, 216 {Qt::Key_Odiaeresis, "Odiaeresis", nullptr}, 217 {Qt::Key_multiply, "multiply", nullptr}, 218 {Qt::Key_Ooblique, "Ooblique", nullptr}, 219 {Qt::Key_Ugrave, "Ugrave", nullptr}, 220 {Qt::Key_Uacute, "Uacute", nullptr}, 221 {Qt::Key_Ucircumflex, "Ucircumflex", nullptr}, 222 {Qt::Key_Udiaeresis, "Udiaeresis", nullptr}, 223 {Qt::Key_Yacute, "Yacute", nullptr}, 224 {Qt::Key_THORN, "THORN", nullptr}, 225 {Qt::Key_ssharp, "ssharp", nullptr}, 226 {Qt::Key_division, "division", nullptr}, 227 {Qt::Key_ydiaeresis, "ydiaeresis", nullptr}, 228 {Qt::Key_AltGr, "AltGr", nullptr}, 229 {Qt::Key_Multi_key, "Multi_key", nullptr}, 230 {Qt::Key_Codeinput, "Codeinput", nullptr}, 231 {Qt::Key_SingleCandidate, "SingleCandidate", nullptr}, 232 {Qt::Key_MultipleCandidate, "MultipleCandidate", nullptr}, 233 {Qt::Key_PreviousCandidate, "PreviousCandidate", nullptr}, 234 {Qt::Key_Mode_switch, "Mode_switch", nullptr}, 235 {Qt::Key_Kanji, "Kanji", nullptr}, 236 {Qt::Key_Muhenkan, "Muhenkan", nullptr}, 237 {Qt::Key_Henkan, "Henkan", nullptr}, 238 {Qt::Key_Romaji, "Romaji", nullptr}, 239 {Qt::Key_Hiragana, "Hiragana", nullptr}, 240 {Qt::Key_Katakana, "Katakana", nullptr}, 241 {Qt::Key_Hiragana_Katakana, "Hiragana_Katakana", nullptr}, 242 {Qt::Key_Zenkaku, "Zenkaku", nullptr}, 243 {Qt::Key_Hankaku, "Hankaku", nullptr}, 244 {Qt::Key_Zenkaku_Hankaku, "Zenkaku_Hankaku", nullptr}, 245 {Qt::Key_Touroku, "Touroku", nullptr}, 246 {Qt::Key_Massyo, "Massyo", nullptr}, 247 {Qt::Key_Kana_Lock, "Kana_Lock", nullptr}, 248 {Qt::Key_Kana_Shift, "Kana_Shift", nullptr}, 249 {Qt::Key_Eisu_Shift, "Eisu_Shift", nullptr}, 250 {Qt::Key_Eisu_toggle, "Eisu_toggle", nullptr}, 251 {Qt::Key_Hangul, "Hangul", nullptr}, 252 {Qt::Key_Hangul_Start, "Hangul_Start", nullptr}, 253 {Qt::Key_Hangul_End, "Hangul_End", nullptr}, 254 {Qt::Key_Hangul_Hanja, "Hangul_Hanja", nullptr}, 255 {Qt::Key_Hangul_Jamo, "Hangul_Jamo", nullptr}, 256 {Qt::Key_Hangul_Romaja, "Hangul_Romaja", nullptr}, 257 {Qt::Key_Hangul_Jeonja, "Hangul_Jeonja", nullptr}, 258 {Qt::Key_Hangul_Banja, "Hangul_Banja", nullptr}, 259 {Qt::Key_Hangul_PreHanja, "Hangul_PreHanja", nullptr}, 260 {Qt::Key_Hangul_PostHanja, "Hangul_PostHanja", nullptr}, 261 {Qt::Key_Hangul_Special, "Hangul_Special", nullptr}, 262 {Qt::Key_Dead_Grave, "Dead_Grave", nullptr}, 263 {Qt::Key_Dead_Acute, "Dead_Acute", nullptr}, 264 {Qt::Key_Dead_Circumflex, "Dead_Circumflex", nullptr}, 265 {Qt::Key_Dead_Tilde, "Dead_Tilde", nullptr}, 266 {Qt::Key_Dead_Macron, "Dead_Macron", nullptr}, 267 {Qt::Key_Dead_Breve, "Dead_Breve", nullptr}, 268 {Qt::Key_Dead_Abovedot, "Dead_Abovedot", nullptr}, 269 {Qt::Key_Dead_Diaeresis, "Dead_Diaeresis", nullptr}, 270 {Qt::Key_Dead_Abovering, "Dead_Abovering", nullptr}, 271 {Qt::Key_Dead_Doubleacute, "Dead_Doubleacute", nullptr}, 272 {Qt::Key_Dead_Caron, "Dead_Caron", nullptr}, 273 {Qt::Key_Dead_Cedilla, "Dead_Cedilla", nullptr}, 274 {Qt::Key_Dead_Ogonek, "Dead_Ogonek", nullptr}, 275 {Qt::Key_Dead_Iota, "Dead_Iota", nullptr}, 276 {Qt::Key_Dead_Voiced_Sound, "Dead_Voiced_Sound", nullptr}, 277 {Qt::Key_Dead_Semivoiced_Sound, "Dead_Semivoiced_Sound", nullptr}, 278 {Qt::Key_Dead_Belowdot, "Dead_Belowdot", nullptr}, 279 {Qt::Key_Dead_Hook, "Dead_Hook", nullptr}, 280 {Qt::Key_Dead_Horn, "Dead_Horn", nullptr}, 281 {Qt::Key_Back, "Back", nullptr}, 282 {Qt::Key_Forward, "Forward", nullptr}, 283 {Qt::Key_Stop, "Stop", nullptr}, 284 {Qt::Key_Refresh, "Refresh", nullptr}, 285 {Qt::Key_VolumeDown, "VolumeDown", nullptr}, 286 {Qt::Key_VolumeMute, "VolumeMute", nullptr}, 287 {Qt::Key_VolumeUp, "VolumeUp", nullptr}, 288 {Qt::Key_BassBoost, "BassBoost", nullptr}, 289 {Qt::Key_BassUp, "BassUp", nullptr}, 290 {Qt::Key_BassDown, "BassDown", nullptr}, 291 {Qt::Key_TrebleUp, "TrebleUp", nullptr}, 292 {Qt::Key_TrebleDown, "TrebleDown", nullptr}, 293 {Qt::Key_MediaPlay, "MediaPlay", nullptr}, 294 {Qt::Key_MediaStop, "MediaStop", nullptr}, 295 {Qt::Key_MediaPrevious, "MediaPrevious", nullptr}, 296 {Qt::Key_MediaNext, "MediaNext", nullptr}, 297 {Qt::Key_MediaRecord, "MediaRecord", nullptr}, 298 {Qt::Key_MediaPause, "MediaPause", nullptr}, 299 {Qt::Key_MediaTogglePlayPause, "MediaTogglePlayPause", nullptr}, 300 {Qt::Key_HomePage, "HomePage", nullptr}, 301 {Qt::Key_Favorites, "Favorites", nullptr}, 302 {Qt::Key_Search, "Search", nullptr}, 303 {Qt::Key_Standby, "Standby", nullptr}, 304 {Qt::Key_OpenUrl, "OpenUrl", nullptr}, 305 {Qt::Key_LaunchMail, "LaunchMail", nullptr}, 306 {Qt::Key_LaunchMedia, "LaunchMedia", nullptr}, 307 {Qt::Key_Launch0, "Launch0", nullptr}, 308 {Qt::Key_Launch1, "Launch1", nullptr}, 309 {Qt::Key_Launch2, "Launch2", nullptr}, 310 {Qt::Key_Launch3, "Launch3", nullptr}, 311 {Qt::Key_Launch4, "Launch4", nullptr}, 312 {Qt::Key_Launch5, "Launch5", nullptr}, 313 {Qt::Key_Launch6, "Launch6", nullptr}, 314 {Qt::Key_Launch7, "Launch7", nullptr}, 315 {Qt::Key_Launch8, "Launch8", nullptr}, 316 {Qt::Key_Launch9, "Launch9", nullptr}, 317 {Qt::Key_LaunchA, "LaunchA", nullptr}, 318 {Qt::Key_LaunchB, "LaunchB", nullptr}, 319 {Qt::Key_LaunchC, "LaunchC", nullptr}, 320 {Qt::Key_LaunchD, "LaunchD", nullptr}, 321 {Qt::Key_LaunchE, "LaunchE", nullptr}, 322 {Qt::Key_LaunchF, "LaunchF", nullptr}, 323 {Qt::Key_MonBrightnessUp, "MonBrightnessUp", nullptr}, 324 {Qt::Key_MonBrightnessDown, "MonBrightnessDown", nullptr}, 325 {Qt::Key_KeyboardLightOnOff, "KeyboardLightOnOff", nullptr}, 326 {Qt::Key_KeyboardBrightnessUp, "KeyboardBrightnessUp", nullptr}, 327 {Qt::Key_KeyboardBrightnessDown, "KeyboardBrightnessDown", nullptr}, 328 {Qt::Key_PowerOff, "PowerOff", nullptr}, 329 {Qt::Key_WakeUp, "WakeUp", nullptr}, 330 {Qt::Key_Eject, "Eject", nullptr}, 331 {Qt::Key_ScreenSaver, "ScreenSaver", nullptr}, 332 {Qt::Key_WWW, "WWW", nullptr}, 333 {Qt::Key_Memo, "Memo", nullptr}, 334 {Qt::Key_LightBulb, "LightBulb", nullptr}, 335 {Qt::Key_Shop, "Shop", nullptr}, 336 {Qt::Key_History, "History", nullptr}, 337 {Qt::Key_AddFavorite, "AddFavorite", nullptr}, 338 {Qt::Key_HotLinks, "HotLinks", nullptr}, 339 {Qt::Key_BrightnessAdjust, "BrightnessAdjust", nullptr}, 340 {Qt::Key_Finance, "Finance", nullptr}, 341 {Qt::Key_Community, "Community", nullptr}, 342 {Qt::Key_AudioRewind, "AudioRewind", nullptr}, 343 {Qt::Key_BackForward, "BackForward", nullptr}, 344 {Qt::Key_ApplicationLeft, "ApplicationLeft", nullptr}, 345 {Qt::Key_ApplicationRight, "ApplicationRight", nullptr}, 346 {Qt::Key_Book, "Book", nullptr}, 347 {Qt::Key_CD, "CD", nullptr}, 348 {Qt::Key_Calculator, "Calculator", nullptr}, 349 {Qt::Key_ToDoList, "ToDoList", nullptr}, 350 {Qt::Key_ClearGrab, "ClearGrab", nullptr}, 351 {Qt::Key_Close, "Close", nullptr}, 352 {Qt::Key_Copy, "Copy", nullptr}, 353 {Qt::Key_Cut, "Cut", nullptr}, 354 {Qt::Key_Display, "Display", nullptr}, 355 {Qt::Key_DOS, "DOS", nullptr}, 356 {Qt::Key_Documents, "Documents", nullptr}, 357 {Qt::Key_Excel, "Excel", nullptr}, 358 {Qt::Key_Explorer, "Explorer", nullptr}, 359 {Qt::Key_Game, "Game", nullptr}, 360 {Qt::Key_Go, "Go", nullptr}, 361 {Qt::Key_iTouch, "iTouch", nullptr}, 362 {Qt::Key_LogOff, "LogOff", nullptr}, 363 {Qt::Key_Market, "Market", nullptr}, 364 {Qt::Key_Meeting, "Meeting", nullptr}, 365 {Qt::Key_MenuKB, "MenuKB", nullptr}, 366 {Qt::Key_MenuPB, "MenuPB", nullptr}, 367 {Qt::Key_MySites, "MySites", nullptr}, 368 {Qt::Key_News, "News", nullptr}, 369 {Qt::Key_OfficeHome, "OfficeHome", nullptr}, 370 {Qt::Key_Option, "Option", nullptr}, 371 {Qt::Key_Paste, "Paste", nullptr}, 372 {Qt::Key_Phone, "Phone", nullptr}, 373 {Qt::Key_Calendar, "Calendar", nullptr}, 374 {Qt::Key_Reply, "Reply", nullptr}, 375 {Qt::Key_Reload, "Reload", nullptr}, 376 {Qt::Key_RotateWindows, "RotateWindows", nullptr}, 377 {Qt::Key_RotationPB, "RotationPB", nullptr}, 378 {Qt::Key_RotationKB, "RotationKB", nullptr}, 379 {Qt::Key_Save, "Save", nullptr}, 380 {Qt::Key_Send, "Send", nullptr}, 381 {Qt::Key_Spell, "Spell", nullptr}, 382 {Qt::Key_SplitScreen, "SplitScreen", nullptr}, 383 {Qt::Key_Support, "Support", nullptr}, 384 {Qt::Key_TaskPane, "TaskPane", nullptr}, 385 {Qt::Key_Terminal, "Terminal", nullptr}, 386 {Qt::Key_Tools, "Tools", nullptr}, 387 {Qt::Key_Travel, "Travel", nullptr}, 388 {Qt::Key_Video, "Video", nullptr}, 389 {Qt::Key_Word, "Word", nullptr}, 390 {Qt::Key_Xfer, "Xfer", nullptr}, 391 {Qt::Key_ZoomIn, "ZoomIn", nullptr}, 392 {Qt::Key_ZoomOut, "ZoomOut", nullptr}, 393 {Qt::Key_Away, "Away", nullptr}, 394 {Qt::Key_Messenger, "Messenger", nullptr}, 395 {Qt::Key_WebCam, "WebCam", nullptr}, 396 {Qt::Key_MailForward, "MailForward", nullptr}, 397 {Qt::Key_Pictures, "Pictures", nullptr}, 398 {Qt::Key_Music, "Music", nullptr}, 399 {Qt::Key_Battery, "Battery", nullptr}, 400 {Qt::Key_Bluetooth, "Bluetooth", nullptr}, 401 {Qt::Key_WLAN, "WLAN", nullptr}, 402 {Qt::Key_UWB, "UWB", nullptr}, 403 {Qt::Key_AudioForward, "AudioForward", nullptr}, 404 {Qt::Key_AudioRepeat, "AudioRepeat", nullptr}, 405 {Qt::Key_AudioRandomPlay, "AudioRandomPlay", nullptr}, 406 {Qt::Key_Subtitle, "Subtitle", nullptr}, 407 {Qt::Key_AudioCycleTrack, "AudioCycleTrack", nullptr}, 408 {Qt::Key_Time, "Time", nullptr}, 409 {Qt::Key_Hibernate, "Hibernate", nullptr}, 410 {Qt::Key_View, "View", nullptr}, 411 {Qt::Key_TopMenu, "TopMenu", nullptr}, 412 {Qt::Key_PowerDown, "PowerDown", nullptr}, 413 {Qt::Key_Suspend, "Suspend", nullptr}, 414 {Qt::Key_ContrastAdjust, "ContrastAdjust", nullptr}, 415 {Qt::Key_LaunchG, "LaunchG", nullptr}, 416 {Qt::Key_LaunchH, "LaunchH", nullptr}, 417 {Qt::Key_TouchpadToggle, "TouchpadToggle", nullptr}, 418 {Qt::Key_TouchpadOn, "TouchpadOn", nullptr}, 419 {Qt::Key_TouchpadOff, "TouchpadOff", nullptr}, 420 {Qt::Key_MicMute, "MicMute", nullptr}, 421 {Qt::Key_Red, "Red", nullptr}, 422 {Qt::Key_Green, "Green", nullptr}, 423 {Qt::Key_Yellow, "Yellow", nullptr}, 424 {Qt::Key_Blue, "Blue", nullptr}, 425 {Qt::Key_ChannelUp, "ChannelUp", nullptr}, 426 {Qt::Key_ChannelDown, "ChannelDown", nullptr}, 427 {Qt::Key_Guide, "Guide", nullptr}, 428 {Qt::Key_Info, "Info", nullptr}, 429 {Qt::Key_Settings, "Settings", nullptr}, 430 {Qt::Key_MicVolumeUp, "MicVolumeUp", nullptr}, 431 {Qt::Key_MicVolumeDown, "MicVolumeDown", nullptr}, 432 {Qt::Key_New, "New", nullptr}, 433 {Qt::Key_Open, "Open", nullptr}, 434 {Qt::Key_Find, "Find", nullptr}, 435 {Qt::Key_Undo, "Undo", nullptr}, 436 {Qt::Key_Redo, "Redo", nullptr}, 437 {Qt::Key_MediaLast, "MediaLast", nullptr}, 438 {Qt::Key_Select, "Select", nullptr}, 439 {Qt::Key_Yes, "Yes", nullptr}, 440 {Qt::Key_No, "No", nullptr}, 441 {Qt::Key_Cancel, "Cancel", nullptr}, 442 {Qt::Key_Printer, "Printer", nullptr}, 443 {Qt::Key_Execute, "Execute", nullptr}, 444 {Qt::Key_Sleep, "Sleep", nullptr}, 445 {Qt::Key_Play, "Play", nullptr}, 446 {Qt::Key_Zoom, "Zoom", nullptr}, 447 {Qt::Key_Exit, "Exit", nullptr}, 448 {Qt::Key_Context1, "Context1", nullptr}, 449 {Qt::Key_Context2, "Context2", nullptr}, 450 {Qt::Key_Context3, "Context3", nullptr}, 451 {Qt::Key_Context4, "Context4", nullptr}, 452 {Qt::Key_Call, "Call", nullptr}, 453 {Qt::Key_Hangup, "Hangup", nullptr}, 454 {Qt::Key_Flip, "Flip", nullptr}, 455 {Qt::Key_ToggleCallHangup, "ToggleCallHangup", nullptr}, 456 {Qt::Key_VoiceDial, "VoiceDial", nullptr}, 457 {Qt::Key_LastNumberRedial, "LastNumberRedial", nullptr}, 458 {Qt::Key_Camera, "Camera", nullptr}, 459 {Qt::Key_CameraFocus, "CameraFocus", nullptr}}; 460 461 std::optional<u32> InputManager::ConvertHostKeyboardStringToCode(std::string_view str) 462 { 463 std::string_view compare_name = str; 464 u32 modifier_bits = 0; 465 if (compare_name.starts_with("Numpad")) 466 { 467 compare_name = compare_name.substr(6); 468 modifier_bits |= Qt::KeypadModifier; 469 } 470 471 for (const KeyCodeName& name : s_qt_key_names) 472 { 473 if (compare_name == name.name) 474 return static_cast<u32>(name.code) | modifier_bits; 475 } 476 477 return std::nullopt; 478 } 479 480 std::optional<std::string> InputManager::ConvertHostKeyboardCodeToString(u32 code) 481 { 482 std::optional<std::string> ret; 483 484 const u32 modifier_bits = (code & Qt::KeyboardModifierMask); 485 const u32 masked_code = (code & ~Qt::KeyboardModifierMask); 486 487 for (const KeyCodeName& name : s_qt_key_names) 488 { 489 if (static_cast<int>(masked_code) == name.code) 490 { 491 if (modifier_bits & Qt::KeypadModifier) 492 ret = fmt::format("Numpad{}", name.name); 493 else 494 ret = std::string(name.name); 495 496 break; 497 } 498 } 499 500 return ret; 501 } 502 503 const char* InputManager::ConvertHostKeyboardCodeToIcon(u32 code) 504 { 505 if (code & Qt::KeyboardModifierMask) 506 return nullptr; 507 508 const u32 masked_code = (code & ~Qt::KeyboardModifierMask); 509 for (const KeyCodeName& name : s_qt_key_names) 510 { 511 if (static_cast<int>(masked_code) == name.code) 512 return name.icon_name; 513 } 514 515 return nullptr; 516 } 517 518 u32 QtUtils::KeyEventToCode(const QKeyEvent* ev) 519 { 520 int key = ev->key(); 521 Qt::KeyboardModifiers modifiers = ev->modifiers(); 522 523 #ifdef __APPLE__ 524 // On macOS, Qt applies the Keypad modifier regardless of whether the arrow keys, or numpad was pressed. 525 // The only way to differentiate between the keypad and the arrow keys is by the text. 526 // Hopefully some keyboard layouts don't change the numpad positioning... 527 if (modifiers & Qt::KeypadModifier && key >= Qt::Key_Insert && key <= Qt::Key_PageDown) 528 { 529 if (ev->text().isEmpty()) 530 { 531 // Drop the modifier, because it's probably not actually a numpad push. 532 modifiers &= ~Qt::KeypadModifier; 533 } 534 } 535 #endif 536 537 return static_cast<u32>(key) | (static_cast<u32>(modifiers) & static_cast<u32>(Qt::KeypadModifier)); 538 }