duckstation

duckstation, but archived from the revision just before upstream changed it to a proprietary software project, this version is the libre one
git clone https://git.neptards.moe/u3shit/duckstation.git
Log | Files | Refs | README | LICENSE

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 }