From c33131d1530c09f7a2b3d0aa16aad16594f6fb33 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Sun, 3 Aug 2025 00:29:37 +1000 Subject: [PATCH] InputManager: Use scancodes for key mapping --- src/common/CMakeLists.txt | 2 + src/common/common.vcxproj | 4 + src/common/common.vcxproj.filters | 8 + src/common/thirdparty/usb_key_code_data.h | 236 ++++++++ src/common/thirdparty/usb_key_code_data.inl | 234 ++++++++ src/duckstation-mini/CMakeLists.txt | 1 - src/duckstation-mini/duckstation-mini.vcxproj | 1 - .../duckstation-mini.vcxproj.filters | 1 - src/duckstation-mini/mini_host.cpp | 29 +- src/duckstation-mini/sdl_key_names.h | 265 --------- src/duckstation-qt/CMakeLists.txt | 1 - src/duckstation-qt/displaywidget.cpp | 10 +- src/duckstation-qt/displaywidget.h | 2 +- src/duckstation-qt/duckstation-qt.vcxproj | 1 - .../duckstation-qt.vcxproj.filters | 1 - src/duckstation-qt/inputbindingdialog.cpp | 3 +- src/duckstation-qt/inputbindingwidgets.cpp | 3 +- src/duckstation-qt/qtkeycodes.cpp | 538 ------------------ src/duckstation-qt/qtutils.cpp | 66 ++- src/duckstation-qt/qtutils.h | 3 +- src/duckstation-regtest/regtest_host.cpp | 15 - src/util/input_manager.cpp | 80 ++- src/util/input_manager.h | 3 + 23 files changed, 642 insertions(+), 865 deletions(-) create mode 100644 src/common/thirdparty/usb_key_code_data.h create mode 100644 src/common/thirdparty/usb_key_code_data.inl delete mode 100644 src/duckstation-mini/sdl_key_names.h delete mode 100644 src/duckstation-qt/qtkeycodes.cpp diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 2007adf3f..95f09e5d6 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -60,6 +60,8 @@ add_library(common thirdparty/SmallVector.h thirdparty/aes.cpp thirdparty/aes.h + thirdparty/usb_key_code_data.h + thirdparty/usb_key_code_data.inl task_queue.cpp task_queue.h threading.cpp diff --git a/src/common/common.vcxproj b/src/common/common.vcxproj index e302aab2b..6b53194bb 100644 --- a/src/common/common.vcxproj +++ b/src/common/common.vcxproj @@ -44,6 +44,7 @@ + @@ -101,6 +102,9 @@ {8be398e6-b882-4248-9065-fecc8728e038} + + + diff --git a/src/common/common.vcxproj.filters b/src/common/common.vcxproj.filters index c67d63fad..4318f4452 100644 --- a/src/common/common.vcxproj.filters +++ b/src/common/common.vcxproj.filters @@ -54,6 +54,9 @@ + + thirdparty + @@ -104,4 +107,9 @@ + + + thirdparty + + \ No newline at end of file diff --git a/src/common/thirdparty/usb_key_code_data.h b/src/common/thirdparty/usb_key_code_data.h new file mode 100644 index 000000000..ea725fe94 --- /dev/null +++ b/src/common/thirdparty/usb_key_code_data.h @@ -0,0 +1,236 @@ +#pragma once + +#include + +enum class USBKeyCode : uint32_t +{ + Hyper = 0x10, + Super = 0x11, + Fn = 0x12, + PrivacyScreenToggle = 0x17, + Sleep = 0x10082, + WakeUp = 0x10083, + DisplayToggleIntExt = 0x100b5, + A = 0x70004, + B = 0x70005, + C = 0x70006, + D = 0x70007, + E = 0x70008, + F = 0x70009, + G = 0x7000a, + H = 0x7000b, + I = 0x7000c, + J = 0x7000d, + K = 0x7000e, + L = 0x7000f, + M = 0x70010, + N = 0x70011, + O = 0x70012, + P = 0x70013, + Q = 0x70014, + R = 0x70015, + S = 0x70016, + T = 0x70017, + U = 0x70018, + V = 0x70019, + W = 0x7001a, + X = 0x7001b, + Y = 0x7001c, + Z = 0x7001d, + Digit1 = 0x7001e, + Digit2 = 0x7001f, + Digit3 = 0x70020, + Digit4 = 0x70021, + Digit5 = 0x70022, + Digit6 = 0x70023, + Digit7 = 0x70024, + Digit8 = 0x70025, + Digit9 = 0x70026, + Digit0 = 0x70027, + Enter = 0x70028, + Escape = 0x70029, + Backspace = 0x7002a, + Tab = 0x7002b, + Space = 0x7002c, + Minus = 0x7002d, + Equal = 0x7002e, + BracketLeft = 0x7002f, + BracketRight = 0x70030, + Backslash = 0x70031, + Semicolon = 0x70033, + Quote = 0x70034, + Backquote = 0x70035, + Comma = 0x70036, + Period = 0x70037, + Slash = 0x70038, + CapsLock = 0x70039, + F1 = 0x7003a, + F2 = 0x7003b, + F3 = 0x7003c, + F4 = 0x7003d, + F5 = 0x7003e, + F6 = 0x7003f, + F7 = 0x70040, + F8 = 0x70041, + F9 = 0x70042, + F10 = 0x70043, + F11 = 0x70044, + F12 = 0x70045, + PrintScreen = 0x70046, + ScrollLock = 0x70047, + Pause = 0x70048, + Insert = 0x70049, + Home = 0x7004a, + PageUp = 0x7004b, + Delete = 0x7004c, + End = 0x7004d, + PageDown = 0x7004e, + ArrowRight = 0x7004f, + ArrowLeft = 0x70050, + ArrowDown = 0x70051, + ArrowUp = 0x70052, + NumLock = 0x70053, + NumpadDivide = 0x70054, + NumpadMultiply = 0x70055, + NumpadSubtract = 0x70056, + NumpadAdd = 0x70057, + NumpadEnter = 0x70058, + Numpad1 = 0x70059, + Numpad2 = 0x7005a, + Numpad3 = 0x7005b, + Numpad4 = 0x7005c, + Numpad5 = 0x7005d, + Numpad6 = 0x7005e, + Numpad7 = 0x7005f, + Numpad8 = 0x70060, + Numpad9 = 0x70061, + Numpad0 = 0x70062, + NumpadDecimal = 0x70063, + IntlBackslash = 0x70064, + ContextMenu = 0x70065, + Power = 0x70066, + NumpadEqual = 0x70067, + F13 = 0x70068, + F14 = 0x70069, + F15 = 0x7006a, + F16 = 0x7006b, + F17 = 0x7006c, + F18 = 0x7006d, + F19 = 0x7006e, + F20 = 0x7006f, + F21 = 0x70070, + F22 = 0x70071, + F23 = 0x70072, + F24 = 0x70073, + Open = 0x70074, + Help = 0x70075, + Select = 0x70077, + Again = 0x70079, + Undo = 0x7007a, + Cut = 0x7007b, + Copy = 0x7007c, + Paste = 0x7007d, + Find = 0x7007e, + AudioVolumeMute = 0x7007f, + AudioVolumeUp = 0x70080, + AudioVolumeDown = 0x70081, + NumpadComma = 0x70085, + IntlRo = 0x70087, + KanaMode = 0x70088, + IntlYen = 0x70089, + Convert = 0x7008a, + NonConvert = 0x7008b, + Lang1 = 0x70090, + Lang2 = 0x70091, + Lang3 = 0x70092, + Lang4 = 0x70093, + Lang5 = 0x70094, + Abort = 0x7009b, + Props = 0x700a3, + NumpadParenLeft = 0x700b6, + NumpadParenRight = 0x700b7, + NumpadBackspace = 0x700bb, + NumpadMemoryStore = 0x700d0, + NumpadMemoryRecall = 0x700d1, + NumpadMemoryClear = 0x700d2, + NumpadMemoryAdd = 0x700d3, + NumpadMemorySubtract = 0x700d4, + NumpadSignChange = 0x700d7, + NumpadClear = 0x700d8, + NumpadClearEntry = 0x700d9, + ControlLeft = 0x700e0, + ShiftLeft = 0x700e1, + AltLeft = 0x700e2, + MetaLeft = 0x700e3, + ControlRight = 0x700e4, + ShiftRight = 0x700e5, + AltRight = 0x700e6, + MetaRight = 0x700e7, + Info = 0xc0060, + ClosedCaptionToggle = 0xc0061, + BrightnessUp = 0xc006f, + BrightnessDown = 0xc0070, + BrightnessToggle = 0xc0072, + BrightnessMinimum = 0xc0073, + BrightnessMaximum = 0xc0074, + BrightnessAuto = 0xc0075, + IllumUp = 0xc0079, + IllumDown = 0xc007a, + MediaLast = 0xc0083, + LaunchPhone = 0xc008c, + ProgramGuide = 0xc008d, + Exit = 0xc0094, + ChannelUp = 0xc009c, + ChannelDown = 0xc009d, + MediaPlay = 0xc00b0, + MediaPause = 0xc00b1, + MediaRecord = 0xc00b2, + MediaFastForward = 0xc00b3, + MediaRewind = 0xc00b4, + MediaTrackNext = 0xc00b5, + MediaTrackPrevious = 0xc00b6, + MediaStop = 0xc00b7, + Eject = 0xc00b8, + MediaPlayPause = 0xc00cd, + SpeechInputToggle = 0xc00cf, + BassBoost = 0xc00e5, + MediaSelect = 0xc0183, + LaunchWordProcessor = 0xc0184, + LaunchSpreadsheet = 0xc0186, + LaunchMail = 0xc018a, + LaunchContacts = 0xc018d, + LaunchCalendar = 0xc018e, + LaunchApp2 = 0xc0192, + LaunchApp1 = 0xc0194, + LaunchInternetBrowser = 0xc0196, + LogOff = 0xc019c, + LockScreen = 0xc019e, + LaunchControlPanel = 0xc019f, + SelectTask = 0xc01a2, + LaunchDocuments = 0xc01a7, + SpellCheck = 0xc01ab, + LaunchKeyboardLayout = 0xc01ae, + LaunchScreenSaver = 0xc01b1, + LaunchAudioBrowser = 0xc01b7, + LaunchAssistant = 0xc01cb, + New = 0xc0201, + Close = 0xc0203, + Save = 0xc0207, + Print = 0xc0208, + BrowserSearch = 0xc0221, + BrowserHome = 0xc0223, + BrowserBack = 0xc0224, + BrowserForward = 0xc0225, + BrowserStop = 0xc0226, + BrowserRefresh = 0xc0227, + BrowserFavorites = 0xc022a, + ZoomIn = 0xc022d, + ZoomOut = 0xc022e, + ZoomToggle = 0xc0232, + Redo = 0xc0279, + MailReply = 0xc0289, + MailForward = 0xc028b, + MailSend = 0xc028c, + KeyboardLayoutSelect = 0xc029d, + ShowAllWindows = 0xc029f, +}; diff --git a/src/common/thirdparty/usb_key_code_data.inl b/src/common/thirdparty/usb_key_code_data.inl new file mode 100644 index 000000000..7c7c77f87 --- /dev/null +++ b/src/common/thirdparty/usb_key_code_data.inl @@ -0,0 +1,234 @@ +// Derived from Chromium dom_code_data.inc. +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +KEY_ENTRY(HYPER, 0x0010, 0x0000, 0x0000, 0x0000, 0xffff, "Hyper", nullptr) +KEY_ENTRY(SUPER, 0x0011, 0x0000, 0x0000, 0x0000, 0xffff, "Super", ICON_PF_SUPER) +KEY_ENTRY(FN, 0x0012, 0x0000, 0x0000, 0x0000, 0xffff, "Fn", ICON_PF_FN) +KEY_ENTRY(PRIVACY_SCREEN_TOGGLE, 0x0017, 0x0279, 0x0281, 0x0000, 0xffff, "PrivacyScreenToggle", nullptr) +KEY_ENTRY(SLEEP, 0x10082, 0x008e, 0x0096, 0xe05f, 0xffff, "Sleep", nullptr) +KEY_ENTRY(WAKE_UP, 0x10083, 0x008f, 0x0097, 0xe063, 0xffff, "WakeUp", nullptr) +KEY_ENTRY(DISPLAY_TOGGLE_INT_EXT, 0x100b5, 0x00e3, 0x00eb, 0x0000, 0xffff, "DisplayToggleIntExt", nullptr) +KEY_ENTRY(A, 0x70004, 0x001e, 0x0026, 0x001e, 0x0000, "A", ICON_PF_KEY_A) +KEY_ENTRY(B, 0x70005, 0x0030, 0x0038, 0x0030, 0x000b, "B", ICON_PF_KEY_B) +KEY_ENTRY(C, 0x70006, 0x002e, 0x0036, 0x002e, 0x0008, "C", ICON_PF_KEY_C) +KEY_ENTRY(D, 0x70007, 0x0020, 0x0028, 0x0020, 0x0002, "D", ICON_PF_KEY_D) +KEY_ENTRY(E, 0x70008, 0x0012, 0x001a, 0x0012, 0x000e, "E", ICON_PF_KEY_E) +KEY_ENTRY(F, 0x70009, 0x0021, 0x0029, 0x0021, 0x0003, "F", ICON_PF_KEY_F) +KEY_ENTRY(G, 0x7000a, 0x0022, 0x002a, 0x0022, 0x0005, "G", ICON_PF_KEY_G) +KEY_ENTRY(H, 0x7000b, 0x0023, 0x002b, 0x0023, 0x0004, "H", ICON_PF_KEY_H) +KEY_ENTRY(I, 0x7000c, 0x0017, 0x001f, 0x0017, 0x0022, "I", ICON_PF_KEY_I) +KEY_ENTRY(J, 0x7000d, 0x0024, 0x002c, 0x0024, 0x0026, "J", ICON_PF_KEY_J) +KEY_ENTRY(K, 0x7000e, 0x0025, 0x002d, 0x0025, 0x0028, "K", ICON_PF_KEY_K) +KEY_ENTRY(L, 0x7000f, 0x0026, 0x002e, 0x0026, 0x0025, "L", ICON_PF_KEY_L) +KEY_ENTRY(M, 0x70010, 0x0032, 0x003a, 0x0032, 0x002e, "M", ICON_PF_KEY_M) +KEY_ENTRY(N, 0x70011, 0x0031, 0x0039, 0x0031, 0x002d, "N", ICON_PF_KEY_N) +KEY_ENTRY(O, 0x70012, 0x0018, 0x0020, 0x0018, 0x001f, "O", ICON_PF_KEY_O) +KEY_ENTRY(P, 0x70013, 0x0019, 0x0021, 0x0019, 0x0023, "P", ICON_PF_KEY_P) +KEY_ENTRY(Q, 0x70014, 0x0010, 0x0018, 0x0010, 0x000c, "Q", ICON_PF_KEY_Q) +KEY_ENTRY(R, 0x70015, 0x0013, 0x001b, 0x0013, 0x000f, "R", ICON_PF_KEY_R) +KEY_ENTRY(S, 0x70016, 0x001f, 0x0027, 0x001f, 0x0001, "S", ICON_PF_KEY_S) +KEY_ENTRY(T, 0x70017, 0x0014, 0x001c, 0x0014, 0x0011, "T", ICON_PF_KEY_T) +KEY_ENTRY(U, 0x70018, 0x0016, 0x001e, 0x0016, 0x0020, "U", ICON_PF_KEY_U) +KEY_ENTRY(V, 0x70019, 0x002f, 0x0037, 0x002f, 0x0009, "V", ICON_PF_KEY_V) +KEY_ENTRY(W, 0x7001a, 0x0011, 0x0019, 0x0011, 0x000d, "W", ICON_PF_KEY_W) +KEY_ENTRY(X, 0x7001b, 0x002d, 0x0035, 0x002d, 0x0007, "X", ICON_PF_KEY_X) +KEY_ENTRY(Y, 0x7001c, 0x0015, 0x001d, 0x0015, 0x0010, "Y", ICON_PF_KEY_Y) +KEY_ENTRY(Z, 0x7001d, 0x002c, 0x0034, 0x002c, 0x0006, "Z", ICON_PF_KEY_Z) +KEY_ENTRY(1, 0x7001e, 0x0002, 0x000a, 0x0002, 0x0012, "1", ICON_PF_KEY_1) +KEY_ENTRY(2, 0x7001f, 0x0003, 0x000b, 0x0003, 0x0013, "2", ICON_PF_KEY_2) +KEY_ENTRY(3, 0x70020, 0x0004, 0x000c, 0x0004, 0x0014, "3", ICON_PF_KEY_3) +KEY_ENTRY(4, 0x70021, 0x0005, 0x000d, 0x0005, 0x0015, "4", ICON_PF_KEY_4) +KEY_ENTRY(5, 0x70022, 0x0006, 0x000e, 0x0006, 0x0017, "5", ICON_PF_KEY_5) +KEY_ENTRY(6, 0x70023, 0x0007, 0x000f, 0x0007, 0x0016, "6", ICON_PF_KEY_6) +KEY_ENTRY(7, 0x70024, 0x0008, 0x0010, 0x0008, 0x001a, "7", ICON_PF_KEY_7) +KEY_ENTRY(8, 0x70025, 0x0009, 0x0011, 0x0009, 0x001c, "8", ICON_PF_KEY_8) +KEY_ENTRY(9, 0x70026, 0x000a, 0x0012, 0x000a, 0x0019, "9", ICON_PF_KEY_9) +KEY_ENTRY(0, 0x70027, 0x000b, 0x0013, 0x000b, 0x001d, "0", ICON_PF_KEY_0) +KEY_ENTRY(ENTER, 0x70028, 0x001c, 0x0024, 0x001c, 0x0024, "Enter", ICON_PF_ENTER) +KEY_ENTRY(ESCAPE, 0x70029, 0x0001, 0x0009, 0x0001, 0x0035, "Escape", ICON_PF_ESC) +KEY_ENTRY(BACKSPACE, 0x7002a, 0x000e, 0x0016, 0x000e, 0x0033, "Backspace", ICON_PF_BACKSPACE) +KEY_ENTRY(TAB, 0x7002b, 0x000f, 0x0017, 0x000f, 0x0030, "Tab", ICON_PF_TAB) +KEY_ENTRY(SPACE, 0x7002c, 0x0039, 0x0041, 0x0039, 0x0031, "Space", ICON_PF_SPACE) +KEY_ENTRY(MINUS, 0x7002d, 0x000c, 0x0014, 0x000c, 0x001b, "Minus", ICON_PF_MINUS) +KEY_ENTRY(EQUAL, 0x7002e, 0x000d, 0x0015, 0x000d, 0x0018, "Equal", ICON_PF_KEY_EQUAL) +KEY_ENTRY(BRACKET_LEFT, 0x7002f, 0x001a, 0x0022, 0x001a, 0x0021, "BracketLeft", ICON_PF_KEY_OPEN_BRACKET) +KEY_ENTRY(BRACKET_RIGHT, 0x70030, 0x001b, 0x0023, 0x001b, 0x001e, "BracketRight", ICON_PF_KEY_CLOSE_BRACKET) +KEY_ENTRY(BACKSLASH, 0x70031, 0x002b, 0x0033, 0x002b, 0x002a, "Backslash", ICON_PF_KEY_BACKSLASH) +KEY_ENTRY(SEMICOLON, 0x70033, 0x0027, 0x002f, 0x0027, 0x0029, "Semicolon", ICON_PF_KEY_SEMICOLON) +KEY_ENTRY(QUOTE, 0x70034, 0x0028, 0x0030, 0x0028, 0x0027, "Quote", ICON_PF_KEY_APOSTROPHE) +KEY_ENTRY(BACKQUOTE, 0x70035, 0x0029, 0x0031, 0x0029, 0x0032, "Backquote", ICON_PF_KEY_TILDE) +KEY_ENTRY(COMMA, 0x70036, 0x0033, 0x003b, 0x0033, 0x002b, "Comma", ICON_PF_KEY_COMMA) +KEY_ENTRY(PERIOD, 0x70037, 0x0034, 0x003c, 0x0034, 0x002f, "Period", ICON_PF_KEY_PERIOD) +KEY_ENTRY(SLASH, 0x70038, 0x0035, 0x003d, 0x0035, 0x002c, "Slash", ICON_PF_KEY_SLASH) +KEY_ENTRY(CAPS_LOCK, 0x70039, 0x003a, 0x0042, 0x003a, 0x0039, "CapsLock", ICON_PF_CAPS) +KEY_ENTRY(F1, 0x7003a, 0x003b, 0x0043, 0x003b, 0x007a, "F1", ICON_PF_F1) +KEY_ENTRY(F2, 0x7003b, 0x003c, 0x0044, 0x003c, 0x0078, "F2", ICON_PF_F2) +KEY_ENTRY(F3, 0x7003c, 0x003d, 0x0045, 0x003d, 0x0063, "F3", ICON_PF_F3) +KEY_ENTRY(F4, 0x7003d, 0x003e, 0x0046, 0x003e, 0x0076, "F4", ICON_PF_F4) +KEY_ENTRY(F5, 0x7003e, 0x003f, 0x0047, 0x003f, 0x0060, "F5", ICON_PF_F5) +KEY_ENTRY(F6, 0x7003f, 0x0040, 0x0048, 0x0040, 0x0061, "F6", ICON_PF_F6) +KEY_ENTRY(F7, 0x70040, 0x0041, 0x0049, 0x0041, 0x0062, "F7", ICON_PF_F7) +KEY_ENTRY(F8, 0x70041, 0x0042, 0x004a, 0x0042, 0x0064, "F8", ICON_PF_F8) +KEY_ENTRY(F9, 0x70042, 0x0043, 0x004b, 0x0043, 0x0065, "F9", ICON_PF_F9) +KEY_ENTRY(F10, 0x70043, 0x0044, 0x004c, 0x0044, 0x006d, "F10", ICON_PF_F10) +KEY_ENTRY(F11, 0x70044, 0x0057, 0x005f, 0x0057, 0x0067, "F11", ICON_PF_F11) +KEY_ENTRY(F12, 0x70045, 0x0058, 0x0060, 0x0058, 0x006f, "F12", ICON_PF_F12) +KEY_ENTRY(PRINT_SCREEN, 0x70046, 0x0063, 0x006b, 0xe037, 0xffff, "PrintScreen", ICON_PF_PRTSC) +KEY_ENTRY(SCROLL_LOCK, 0x70047, 0x0046, 0x004e, 0x0046, 0xffff, "ScrollLock", ICON_PF_SCRLK) +KEY_ENTRY(PAUSE, 0x70048, 0x0077, 0x007f, 0x0045, 0xffff, "Pause", ICON_PF_PAUSE) +KEY_ENTRY(INSERT, 0x70049, 0x006e, 0x0076, 0xe052, 0x0072, "Insert", ICON_PF_INSERT) +KEY_ENTRY(HOME, 0x7004a, 0x0066, 0x006e, 0xe047, 0x0073, "Home", ICON_PF_HOME) +KEY_ENTRY(PAGE_UP, 0x7004b, 0x0068, 0x0070, 0xe049, 0x0074, "PageUp", ICON_PF_PAGE_UP) +KEY_ENTRY(DEL, 0x7004c, 0x006f, 0x0077, 0xe053, 0x0075, "Delete", ICON_PF_DELETE) +KEY_ENTRY(END, 0x7004d, 0x006b, 0x0073, 0xe04f, 0x0077, "End", ICON_PF_END) +KEY_ENTRY(PAGE_DOWN, 0x7004e, 0x006d, 0x0075, 0xe051, 0x0079, "PageDown", ICON_PF_PAGE_DOWN) +KEY_ENTRY(ARROW_RIGHT, 0x7004f, 0x006a, 0x0072, 0xe04d, 0x007c, "RightArrow", ICON_PF_ARROW_RIGHT) +KEY_ENTRY(ARROW_LEFT, 0x70050, 0x0069, 0x0071, 0xe04b, 0x007b, "LeftArrow", ICON_PF_ARROW_LEFT) +KEY_ENTRY(ARROW_DOWN, 0x70051, 0x006c, 0x0074, 0xe050, 0x007d, "DownArrow", ICON_PF_ARROW_DOWN) +KEY_ENTRY(ARROW_UP, 0x70052, 0x0067, 0x006f, 0xe048, 0x007e, "UpArrow", ICON_PF_ARROW_UP) +KEY_ENTRY(NUM_LOCK, 0x70053, 0x0045, 0x004d, 0xe045, 0x0047, "NumLock", ICON_PF_NUMLOCK) +KEY_ENTRY(NUMPAD_DIVIDE, 0x70054, 0x0062, 0x006a, 0xe035, 0x004b, "NumpadDivide", nullptr) +KEY_ENTRY(NUMPAD_MULTIPLY, 0x70055, 0x0037, 0x003f, 0x0037, 0x0043, "NumpadMultiply", nullptr) +KEY_ENTRY(NUMPAD_SUBTRACT, 0x70056, 0x004a, 0x0052, 0x004a, 0x004e, "NumpadSubtract", nullptr) +KEY_ENTRY(NUMPAD_ADD, 0x70057, 0x004e, 0x0056, 0x004e, 0x0045, "NumpadAdd", nullptr) +KEY_ENTRY(NUMPAD_ENTER, 0x70058, 0x0060, 0x0068, 0xe01c, 0x004c, "NumpadEnter", nullptr) +KEY_ENTRY(NUMPAD1, 0x70059, 0x004f, 0x0057, 0x004f, 0x0053, "Numpad1", nullptr) +KEY_ENTRY(NUMPAD2, 0x7005a, 0x0050, 0x0058, 0x0050, 0x0054, "Numpad2", nullptr) +KEY_ENTRY(NUMPAD3, 0x7005b, 0x0051, 0x0059, 0x0051, 0x0055, "Numpad3", nullptr) +KEY_ENTRY(NUMPAD4, 0x7005c, 0x004b, 0x0053, 0x004b, 0x0056, "Numpad4", nullptr) +KEY_ENTRY(NUMPAD5, 0x7005d, 0x004c, 0x0054, 0x004c, 0x0057, "Numpad5", nullptr) +KEY_ENTRY(NUMPAD6, 0x7005e, 0x004d, 0x0055, 0x004d, 0x0058, "Numpad6", nullptr) +KEY_ENTRY(NUMPAD7, 0x7005f, 0x0047, 0x004f, 0x0047, 0x0059, "Numpad7", nullptr) +KEY_ENTRY(NUMPAD8, 0x70060, 0x0048, 0x0050, 0x0048, 0x005b, "Numpad8", nullptr) +KEY_ENTRY(NUMPAD9, 0x70061, 0x0049, 0x0051, 0x0049, 0x005c, "Numpad9", nullptr) +KEY_ENTRY(NUMPAD0, 0x70062, 0x0052, 0x005a, 0x0052, 0x0052, "Numpad0", nullptr) +KEY_ENTRY(NUMPAD_DECIMAL, 0x70063, 0x0053, 0x005b, 0x0053, 0x0041, "NumpadDecimal", nullptr) +KEY_ENTRY(INTL_BACKSLASH, 0x70064, 0x0056, 0x005e, 0x0056, 0x000a, "IntlBackslash", nullptr) +KEY_ENTRY(CONTEXT_MENU, 0x70065, 0x007f, 0x0087, 0xe05d, 0x006e, "ContextMenu", nullptr) +KEY_ENTRY(POWER, 0x70066, 0x0074, 0x007c, 0xe05e, 0xffff, "Power", nullptr) +KEY_ENTRY(NUMPAD_EQUAL, 0x70067, 0x0075, 0x007d, 0x0059, 0x0051, "NumpadEqual", nullptr) +KEY_ENTRY(F13, 0x70068, 0x00b7, 0x00bf, 0x0064, 0x0069, "F13", nullptr) +KEY_ENTRY(F14, 0x70069, 0x00b8, 0x00c0, 0x0065, 0x006b, "F14", nullptr) +KEY_ENTRY(F15, 0x7006a, 0x00b9, 0x00c1, 0x0066, 0x0071, "F15", nullptr) +KEY_ENTRY(F16, 0x7006b, 0x00ba, 0x00c2, 0x0067, 0x006a, "F16", nullptr) +KEY_ENTRY(F17, 0x7006c, 0x00bb, 0x00c3, 0x0068, 0x0040, "F17", nullptr) +KEY_ENTRY(F18, 0x7006d, 0x00bc, 0x00c4, 0x0069, 0x004f, "F18", nullptr) +KEY_ENTRY(F19, 0x7006e, 0x00bd, 0x00c5, 0x006a, 0x0050, "F19", nullptr) +KEY_ENTRY(F20, 0x7006f, 0x00be, 0x00c6, 0x006b, 0x005a, "F20", nullptr) +KEY_ENTRY(F21, 0x70070, 0x00bf, 0x00c7, 0x006c, 0xffff, "F21", nullptr) +KEY_ENTRY(F22, 0x70071, 0x00c0, 0x00c8, 0x006d, 0xffff, "F22", nullptr) +KEY_ENTRY(F23, 0x70072, 0x00c1, 0x00c9, 0x006e, 0xffff, "F23", nullptr) +KEY_ENTRY(F24, 0x70073, 0x00c2, 0x00ca, 0x0076, 0xffff, "F24", nullptr) +KEY_ENTRY(OPEN, 0x70074, 0x0086, 0x008e, 0x0000, 0xffff, "Open", nullptr) +KEY_ENTRY(HELP, 0x70075, 0x008a, 0x0092, 0xe03b, 0xffff, "Help", nullptr) +KEY_ENTRY(SELECT, 0x70077, 0x0084, 0x008c, 0x0000, 0xffff, "Select", nullptr) +KEY_ENTRY(AGAIN, 0x70079, 0x0081, 0x0089, 0x0000, 0xffff, "Again", nullptr) +KEY_ENTRY(UNDO, 0x7007a, 0x0083, 0x008b, 0xe008, 0xffff, "Undo", nullptr) +KEY_ENTRY(CUT, 0x7007b, 0x0089, 0x0091, 0xe017, 0xffff, "Cut", nullptr) +KEY_ENTRY(COPY, 0x7007c, 0x0085, 0x008d, 0xe018, 0xffff, "Copy", nullptr) +KEY_ENTRY(PASTE, 0x7007d, 0x0087, 0x008f, 0xe00a, 0xffff, "Paste", nullptr) +KEY_ENTRY(FIND, 0x7007e, 0x0088, 0x0090, 0x0000, 0xffff, "Find", nullptr) +KEY_ENTRY(VOLUME_MUTE, 0x7007f, 0x0071, 0x0079, 0xe020, 0x004a, "AudioVolumeMute", nullptr) +KEY_ENTRY(VOLUME_UP, 0x70080, 0x0073, 0x007b, 0xe030, 0x0048, "AudioVolumeUp", nullptr) +KEY_ENTRY(VOLUME_DOWN, 0x70081, 0x0072, 0x007a, 0xe02e, 0x0049, "AudioVolumeDown", nullptr) +KEY_ENTRY(NUMPAD_COMMA, 0x70085, 0x0079, 0x0081, 0x007e, 0x005f, "NumpadComma", nullptr) +KEY_ENTRY(INTL_RO, 0x70087, 0x0059, 0x0061, 0x0073, 0x005e, "IntlRo", nullptr) +KEY_ENTRY(KANA_MODE, 0x70088, 0x005d, 0x0065, 0x0070, 0xffff, "KanaMode", nullptr) +KEY_ENTRY(INTL_YEN, 0x70089, 0x007c, 0x0084, 0x007d, 0x005d, "IntlYen", nullptr) +KEY_ENTRY(CONVERT, 0x7008a, 0x005c, 0x0064, 0x0079, 0xffff, "Convert", nullptr) +KEY_ENTRY(NON_CONVERT, 0x7008b, 0x005e, 0x0066, 0x007b, 0xffff, "NonConvert", nullptr) +KEY_ENTRY(LANG1, 0x70090, 0x007a, 0x0082, 0x0072, 0x0068, "Lang1", nullptr) +KEY_ENTRY(LANG2, 0x70091, 0x007b, 0x0083, 0x0071, 0x0066, "Lang2", nullptr) +KEY_ENTRY(LANG3, 0x70092, 0x005a, 0x0062, 0x0078, 0xffff, "Lang3", nullptr) +KEY_ENTRY(LANG4, 0x70093, 0x005b, 0x0063, 0x0077, 0xffff, "Lang4", nullptr) +KEY_ENTRY(LANG5, 0x70094, 0x0055, 0x005d, 0x0000, 0xffff, "Lang5", nullptr) +KEY_ENTRY(ABORT, 0x7009b, 0x0000, 0x0000, 0x0000, 0xffff, "Abort", nullptr) +KEY_ENTRY(PROPS, 0x700a3, 0x0000, 0x0000, 0x0000, 0xffff, "Props", nullptr) +KEY_ENTRY(NUMPAD_PAREN_LEFT, 0x700b6, 0x00b3, 0x00bb, 0x0000, 0xffff, "NumpadParenLeft", nullptr) +KEY_ENTRY(NUMPAD_PAREN_RIGHT, 0x700b7, 0x00b4, 0x00bc, 0x0000, 0xffff, "NumpadParenRight", nullptr) +KEY_ENTRY(NUMPAD_BACKSPACE, 0x700bb, 0x0000, 0x0000, 0x0000, 0xffff, "NumpadBackspace", nullptr) +KEY_ENTRY(NUMPAD_MEMORY_STORE, 0x700d0, 0x0000, 0x0000, 0x0000, 0xffff, "NumpadMemoryStore", nullptr) +KEY_ENTRY(NUMPAD_MEMORY_RECALL, 0x700d1, 0x0000, 0x0000, 0x0000, 0xffff, "NumpadMemoryRecall", nullptr) +KEY_ENTRY(NUMPAD_MEMORY_CLEAR, 0x700d2, 0x0000, 0x0000, 0x0000, 0xffff, "NumpadMemoryClear", nullptr) +KEY_ENTRY(NUMPAD_MEMORY_ADD, 0x700d3, 0x0000, 0x0000, 0x0000, 0xffff, "NumpadMemoryAdd", nullptr) +KEY_ENTRY(NUMPAD_MEMORY_SUBTRACT, 0x700d4, 0x0000, 0x0000, 0x0000, 0xffff, "NumpadMemorySubtract", nullptr) +KEY_ENTRY(NUMPAD_SIGN_CHANGE, 0x700d7, 0x0076, 0x007e, 0x0000, 0xffff, "NumpadSignChange", nullptr) +KEY_ENTRY(NUMPAD_CLEAR, 0x700d8, 0x0000, 0x0000, 0x0000, 0xffff, "NumpadClear", nullptr) +KEY_ENTRY(NUMPAD_CLEAR_ENTRY, 0x700d9, 0x0000, 0x0000, 0x0000, 0xffff, "NumpadClearEntry", nullptr) +KEY_ENTRY(CONTROL_LEFT, 0x700e0, 0x001d, 0x0025, 0x001d, 0x003b, "LeftControl", ICON_PF_KEY_LEFT_CTRL) +KEY_ENTRY(SHIFT_LEFT, 0x700e1, 0x002a, 0x0032, 0x002a, 0x0038, "LeftShift", ICON_PF_KEY_LEFT_SHIFT) +KEY_ENTRY(ALT_LEFT, 0x700e2, 0x0038, 0x0040, 0x0038, 0x003a, "LeftAlt", ICON_PF_KEY_LEFT_ALT) +KEY_ENTRY(META_LEFT, 0x700e3, 0x007d, 0x0085, 0xe05b, 0x0037, "LeftMeta", ICON_PF_WINDOWS) +KEY_ENTRY(CONTROL_RIGHT, 0x700e4, 0x0061, 0x0069, 0xe01d, 0x003e, "RightControl", ICON_PF_KEY_RIGHT_CTRL) +KEY_ENTRY(SHIFT_RIGHT, 0x700e5, 0x0036, 0x003e, 0x0036, 0x003c, "RightShift", ICON_PF_KEY_RIGHT_SHIFT) +KEY_ENTRY(ALT_RIGHT, 0x700e6, 0x0064, 0x006c, 0xe038, 0x003d, "RightAlt", ICON_PF_KEY_RIGHT_ALT) +KEY_ENTRY(META_RIGHT, 0x700e7, 0x007e, 0x0086, 0xe05c, 0x0036, "RightMeta", ICON_PF_WINDOWS) +KEY_ENTRY(INFO, 0xc0060, 0x0166, 0x016e, 0x0000, 0xffff, "Info", nullptr) +KEY_ENTRY(CLOSED_CAPTION_TOGGLE, 0xc0061, 0x0172, 0x017a, 0x0000, 0xffff, "ClosedCaptionToggle", nullptr) +KEY_ENTRY(BRIGHTNESS_UP, 0xc006f, 0x00e1, 0x00e9, 0x0000, 0xffff, "BrightnessUp", nullptr) +KEY_ENTRY(BRIGHTNESS_DOWN, 0xc0070, 0x00e0, 0x00e8, 0x0000, 0xffff, "BrightnessDown", nullptr) +KEY_ENTRY(BRIGHTNESS_TOGGLE, 0xc0072, 0x01af, 0x01b7, 0x0000, 0xffff, "BrightnessToggle", nullptr) +KEY_ENTRY(BRIGHTNESS_MINIMIUM, 0xc0073, 0x0250, 0x0258, 0x0000, 0xffff, "BrightnessMinimum", nullptr) +KEY_ENTRY(BRIGHTNESS_MAXIMUM, 0xc0074, 0x0251, 0x0259, 0x0000, 0xffff, "BrightnessMaximum", nullptr) +KEY_ENTRY(BRIGHTNESS_AUTO, 0xc0075, 0x00f4, 0x00fc, 0x0000, 0xffff, "BrightnessAuto", nullptr) +KEY_ENTRY(KBD_ILLUM_UP, 0xc0079, 0x00e6, 0x00ee, 0x0000, 0xffff, "IllumUp", nullptr) +KEY_ENTRY(KBD_ILLUM_DOWN, 0xc007a, 0x00e5, 0x00ed, 0x0000, 0xffff, "IllumDown", nullptr) +KEY_ENTRY(MEDIA_LAST, 0xc0083, 0x0195, 0x019d, 0x0000, 0xffff, "MediaLast", nullptr) +KEY_ENTRY(LAUNCH_PHONE, 0xc008c, 0x00a9, 0x00b1, 0x0000, 0xffff, "LaunchPhone", nullptr) +KEY_ENTRY(PROGRAM_GUIDE, 0xc008d, 0x016a, 0x0172, 0x0000, 0xffff, "ProgramGuide", nullptr) +KEY_ENTRY(EXIT, 0xc0094, 0x00ae, 0x00b6, 0x0000, 0xffff, "Exit", nullptr) +KEY_ENTRY(CHANNEL_UP, 0xc009c, 0x019a, 0x01a2, 0x0000, 0xffff, "ChannelUp", nullptr) +KEY_ENTRY(CHANNEL_DOWN, 0xc009d, 0x019b, 0x01a3, 0x0000, 0xffff, "ChannelDown", nullptr) +KEY_ENTRY(MEDIA_PLAY, 0xc00b0, 0x00cf, 0x00d7, 0x0000, 0xffff, "MediaPlay", nullptr) +KEY_ENTRY(MEDIA_PAUSE, 0xc00b1, 0x00c9, 0x00d1, 0x0000, 0xffff, "MediaPause", nullptr) +KEY_ENTRY(MEDIA_RECORD, 0xc00b2, 0x00a7, 0x00af, 0x0000, 0xffff, "MediaRecord", nullptr) +KEY_ENTRY(MEDIA_FAST_FORWARD, 0xc00b3, 0x00d0, 0x00d8, 0x0000, 0xffff, "MediaFastForward", nullptr) +KEY_ENTRY(MEDIA_REWIND, 0xc00b4, 0x00a8, 0x00b0, 0x0000, 0xffff, "MediaRewind", nullptr) +KEY_ENTRY(MEDIA_TRACK_NEXT, 0xc00b5, 0x00a3, 0x00ab, 0xe019, 0xffff, "MediaTrackNext", nullptr) +KEY_ENTRY(MEDIA_TRACK_PREVIOUS, 0xc00b6, 0x00a5, 0x00ad, 0xe010, 0xffff, "MediaTrackPrevious", nullptr) +KEY_ENTRY(MEDIA_STOP, 0xc00b7, 0x00a6, 0x00ae, 0xe024, 0xffff, "MediaStop", nullptr) +KEY_ENTRY(EJECT, 0xc00b8, 0x00a1, 0x00a9, 0xe02c, 0xffff, "Eject", nullptr) +KEY_ENTRY(MEDIA_PLAY_PAUSE, 0xc00cd, 0x00a4, 0x00ac, 0xe022, 0xffff, "MediaPlayPause", nullptr) +KEY_ENTRY(SPEECH_INPUT_TOGGLE, 0xc00cf, 0x0246, 0x024e, 0x0000, 0xffff, "SpeechInputToggle", nullptr) +KEY_ENTRY(BASS_BOOST, 0xc00e5, 0x00d1, 0x00d9, 0x0000, 0xffff, "BassBoost", nullptr) +KEY_ENTRY(MEDIA_SELECT, 0xc0183, 0x00ab, 0x00b3, 0xe06d, 0xffff, "MediaSelect", nullptr) +KEY_ENTRY(LAUNCH_WORD_PROCESSOR, 0xc0184, 0x01a5, 0x01ad, 0x0000, 0xffff, "LaunchWordProcessor", nullptr) +KEY_ENTRY(LAUNCH_SPREADSHEET, 0xc0186, 0x01a7, 0x01af, 0x0000, 0xffff, "LaunchSpreadsheet", nullptr) +KEY_ENTRY(LAUNCH_MAIL, 0xc018a, 0x009b, 0x00a3, 0xe06c, 0xffff, "LaunchMail", nullptr) +KEY_ENTRY(LAUNCH_CONTACTS, 0xc018d, 0x01ad, 0x01b5, 0x0000, 0xffff, "LaunchContacts", nullptr) +KEY_ENTRY(LAUNCH_CALENDAR, 0xc018e, 0x018d, 0x0195, 0x0000, 0xffff, "LaunchCalendar", nullptr) +KEY_ENTRY(LAUNCH_APP2, 0xc0192, 0x008c, 0x0094, 0xe021, 0xffff, "LaunchApp2", nullptr) +KEY_ENTRY(LAUNCH_APP1, 0xc0194, 0x0090, 0x0098, 0xe06b, 0xffff, "LaunchApp1", nullptr) +KEY_ENTRY(LAUNCH_INTERNET_BROWSER, 0xc0196, 0x0096, 0x009e, 0x0000, 0xffff, "LaunchInternetBrowser", nullptr) +KEY_ENTRY(LOG_OFF, 0xc019c, 0x01b1, 0x01b9, 0x0000, 0xffff, "LogOff", nullptr) +KEY_ENTRY(LOCK_SCREEN, 0xc019e, 0x0098, 0x00a0, 0x0000, 0xffff, "LockScreen", nullptr) +KEY_ENTRY(LAUNCH_CONTROL_PANEL, 0xc019f, 0x0243, 0x024b, 0x0000, 0xffff, "LaunchControlPanel", nullptr) +KEY_ENTRY(SELECT_TASK, 0xc01a2, 0x0244, 0x024c, 0x0000, 0xffff, "SelectTask", nullptr) +KEY_ENTRY(LAUNCH_DOCUMENTS, 0xc01a7, 0x00eb, 0x00f3, 0x0000, 0xffff, "LaunchDocuments", nullptr) +KEY_ENTRY(SPELL_CHECK, 0xc01ab, 0x01b0, 0x01b8, 0x0000, 0xffff, "SpellCheck", nullptr) +KEY_ENTRY(LAUNCH_KEYBOARD_LAYOUT, 0xc01ae, 0x0176, 0x017e, 0x0000, 0xffff, "LaunchKeyboardLayout", nullptr) +KEY_ENTRY(LAUNCH_SCREEN_SAVER, 0xc01b1, 0x0245, 0x024d, 0x0000, 0xffff, "LaunchScreenSaver", nullptr) +KEY_ENTRY(LAUNCH_AUDIO_BROWSER, 0xc01b7, 0x0188, 0x0190, 0x0000, 0xffff, "LaunchAudioBrowser", nullptr) +KEY_ENTRY(LAUNCH_ASSISTANT, 0xc01cb, 0x0247, 0x024f, 0x0000, 0xffff, "LaunchAssistant", nullptr) +KEY_ENTRY(NEW, 0xc0201, 0x00b5, 0x00bd, 0x0000, 0xffff, "New", nullptr) +KEY_ENTRY(CLOSE, 0xc0203, 0x00ce, 0x00d6, 0x0000, 0xffff, "Close", nullptr) +KEY_ENTRY(SAVE, 0xc0207, 0x00ea, 0x00f2, 0x0000, 0xffff, "Save", nullptr) +KEY_ENTRY(PRINT, 0xc0208, 0x00d2, 0x00da, 0x0000, 0xffff, "Print", nullptr) +KEY_ENTRY(BROWSER_SEARCH, 0xc0221, 0x00d9, 0x00e1, 0xe065, 0xffff, "BrowserSearch", nullptr) +KEY_ENTRY(BROWSER_HOME, 0xc0223, 0x00ac, 0x00b4, 0xe032, 0xffff, "BrowserHome", nullptr) +KEY_ENTRY(BROWSER_BACK, 0xc0224, 0x009e, 0x00a6, 0xe06a, 0xffff, "BrowserBack", nullptr) +KEY_ENTRY(BROWSER_FORWARD, 0xc0225, 0x009f, 0x00a7, 0xe069, 0xffff, "BrowserForward", nullptr) +KEY_ENTRY(BROWSER_STOP, 0xc0226, 0x0080, 0x0088, 0xe068, 0xffff, "BrowserStop", nullptr) +KEY_ENTRY(BROWSER_REFRESH, 0xc0227, 0x00ad, 0x00b5, 0xe067, 0xffff, "BrowserRefresh", nullptr) +KEY_ENTRY(BROWSER_FAVORITES, 0xc022a, 0x009c, 0x00a4, 0xe066, 0xffff, "BrowserFavorites", nullptr) +KEY_ENTRY(ZOOM_IN, 0xc022d, 0x01a2, 0x01aa, 0x0000, 0xffff, "ZoomIn", nullptr) +KEY_ENTRY(ZOOM_OUT, 0xc022e, 0x01a3, 0x01ab, 0x0000, 0xffff, "ZoomOut", nullptr) +KEY_ENTRY(ZOOM_TOGGLE, 0xc0232, 0x0174, 0x017c, 0x0000, 0xffff, "ZoomToggle", nullptr) +KEY_ENTRY(REDO, 0xc0279, 0x00b6, 0x00be, 0x0000, 0xffff, "Redo", nullptr) +KEY_ENTRY(MAIL_REPLY, 0xc0289, 0x00e8, 0x00f0, 0x0000, 0xffff, "MailReply", nullptr) +KEY_ENTRY(MAIL_FORWARD, 0xc028b, 0x00e9, 0x00f1, 0x0000, 0xffff, "MailForward", nullptr) +KEY_ENTRY(MAIL_SEND, 0xc028c, 0x00e7, 0x00ef, 0x0000, 0xffff, "MailSend", nullptr) +KEY_ENTRY(KEYBOARD_LAYOUT_SELECT, 0xc029d, 0x0248, 0x0250, 0x0000, 0xffff, "KeyboardLayoutSelect", nullptr) +KEY_ENTRY(SHOW_ALL_WINDOWS, 0xc029f, 0x0078, 0x0080, 0x0000, 0xffff, "ShowAllWindows", nullptr) diff --git a/src/duckstation-mini/CMakeLists.txt b/src/duckstation-mini/CMakeLists.txt index ffc9272ab..63a8d159b 100644 --- a/src/duckstation-mini/CMakeLists.txt +++ b/src/duckstation-mini/CMakeLists.txt @@ -1,6 +1,5 @@ add_executable(duckstation-mini mini_host.cpp - sdl_key_names.h ) target_link_libraries(duckstation-mini PRIVATE core util common imgui scmversion SDL3::SDL3) diff --git a/src/duckstation-mini/duckstation-mini.vcxproj b/src/duckstation-mini/duckstation-mini.vcxproj index 33f1c4657..591855c15 100644 --- a/src/duckstation-mini/duckstation-mini.vcxproj +++ b/src/duckstation-mini/duckstation-mini.vcxproj @@ -3,7 +3,6 @@ - diff --git a/src/duckstation-mini/duckstation-mini.vcxproj.filters b/src/duckstation-mini/duckstation-mini.vcxproj.filters index b9e8cb727..bf40cc28a 100644 --- a/src/duckstation-mini/duckstation-mini.vcxproj.filters +++ b/src/duckstation-mini/duckstation-mini.vcxproj.filters @@ -2,7 +2,6 @@ - diff --git a/src/duckstation-mini/mini_host.cpp b/src/duckstation-mini/mini_host.cpp index d8d4f798c..400081188 100644 --- a/src/duckstation-mini/mini_host.cpp +++ b/src/duckstation-mini/mini_host.cpp @@ -1,8 +1,6 @@ // SPDX-FileCopyrightText: 2019-2025 Connor McLaughlin // SPDX-License-Identifier: CC-BY-NC-ND-4.0 -#include "sdl_key_names.h" - #include "scmversion/scmversion.h" #include "core/achievements.h" @@ -831,10 +829,13 @@ void MiniHost::ProcessSDLEvent(const SDL_Event* ev) case SDL_EVENT_KEY_DOWN: case SDL_EVENT_KEY_UP: { - Host::RunOnCPUThread([key_code = static_cast(ev->key.key), pressed = (ev->type == SDL_EVENT_KEY_DOWN)]() { - InputManager::InvokeEvents(InputManager::MakeHostKeyboardKey(key_code), pressed ? 1.0f : 0.0f, - GenericInputBinding::Unknown); - }); + if (const std::optional key = InputManager::ConvertHostNativeKeyCodeToKeyCode(ev->key.raw)) + { + Host::RunOnCPUThread([key_code = key.value(), pressed = (ev->type == SDL_EVENT_KEY_DOWN)]() { + InputManager::InvokeEvents(InputManager::MakeHostKeyboardKey(key_code), pressed ? 1.0f : 0.0f, + GenericInputBinding::Unknown); + }); + } } break; @@ -1439,22 +1440,6 @@ std::string Host::FormatNumber(NumberFormatType type, double value) return fmt::format("{}", value); } -std::optional InputManager::ConvertHostKeyboardStringToCode(std::string_view str) -{ - return SDLKeyNames::GetKeyCodeForName(str); -} - -std::optional InputManager::ConvertHostKeyboardCodeToString(u32 code) -{ - const char* converted = SDLKeyNames::GetKeyName(code); - return converted ? std::optional(converted) : std::nullopt; -} - -const char* InputManager::ConvertHostKeyboardCodeToIcon(u32 code) -{ - return nullptr; -} - bool Host::ConfirmMessage(std::string_view title, std::string_view message) { const SmallString title_copy(title); diff --git a/src/duckstation-mini/sdl_key_names.h b/src/duckstation-mini/sdl_key_names.h deleted file mode 100644 index a55dd2462..000000000 --- a/src/duckstation-mini/sdl_key_names.h +++ /dev/null @@ -1,265 +0,0 @@ -// SPDX-FileCopyrightText: 2019-2024 Connor McLaughlin -// SPDX-License-Identifier: CC-BY-NC-ND-4.0 - -#pragma once - -#include "common/types.h" - -#include -#include -#include -#include - -#include "SDL3/SDL.h" - -namespace SDLKeyNames { - -inline const std::map s_sdl_key_names = { - {SDLK_RETURN, "Return"}, - {SDLK_ESCAPE, "Escape"}, - {SDLK_BACKSPACE, "Backspace"}, - {SDLK_TAB, "Tab"}, - {SDLK_SPACE, "Space"}, - {SDLK_EXCLAIM, "Exclam"}, - {SDLK_DBLAPOSTROPHE, "QuoteDbl"}, - {SDLK_HASH, "Hash"}, - {SDLK_PERCENT, "Percent"}, - {SDLK_DOLLAR, "Dollar"}, - {SDLK_AMPERSAND, "Ampersand"}, - {SDLK_APOSTROPHE, "Apostrophe"}, - {SDLK_LEFTPAREN, "ParenLeft"}, - {SDLK_RIGHTPAREN, "ParenRight"}, - {SDLK_ASTERISK, "Asterisk"}, - {SDLK_PLUS, "PLus"}, - {SDLK_COMMA, "Comma"}, - {SDLK_MINUS, "Minus"}, - {SDLK_PERIOD, "Period"}, - {SDLK_SLASH, "Slash"}, - {SDLK_0, "0"}, - {SDLK_1, "1"}, - {SDLK_2, "2"}, - {SDLK_3, "3"}, - {SDLK_4, "4"}, - {SDLK_5, "5"}, - {SDLK_6, "6"}, - {SDLK_7, "7"}, - {SDLK_8, "8"}, - {SDLK_9, "9"}, - {SDLK_COLON, "Colon"}, - {SDLK_SEMICOLON, "Semcolon"}, - {SDLK_LESS, "Less"}, - {SDLK_EQUALS, "Equal"}, - {SDLK_GREATER, "Greater"}, - {SDLK_QUESTION, "Question"}, - {SDLK_AT, "AT"}, - {SDLK_LEFTBRACKET, "BracketLeft"}, - {SDLK_BACKSLASH, "Backslash"}, - {SDLK_RIGHTBRACKET, "BracketRight"}, - {SDLK_CARET, "Caret"}, - {SDLK_UNDERSCORE, "Underscore"}, - {SDLK_GRAVE, "Backquote"}, - {SDLK_A, "A"}, - {SDLK_B, "B"}, - {SDLK_C, "C"}, - {SDLK_D, "D"}, - {SDLK_E, "E"}, - {SDLK_F, "F"}, - {SDLK_G, "G"}, - {SDLK_H, "H"}, - {SDLK_I, "I"}, - {SDLK_J, "J"}, - {SDLK_K, "K"}, - {SDLK_L, "L"}, - {SDLK_M, "M"}, - {SDLK_N, "N"}, - {SDLK_O, "O"}, - {SDLK_P, "P"}, - {SDLK_Q, "Q"}, - {SDLK_R, "R"}, - {SDLK_S, "S"}, - {SDLK_T, "T"}, - {SDLK_U, "U"}, - {SDLK_V, "V"}, - {SDLK_W, "W"}, - {SDLK_X, "X"}, - {SDLK_Y, "Y"}, - {SDLK_Z, "Z"}, - {SDLK_CAPSLOCK, "CapsLock"}, - {SDLK_F1, "F1"}, - {SDLK_F2, "F2"}, - {SDLK_F3, "F3"}, - {SDLK_F4, "F4"}, - {SDLK_F5, "F5"}, - {SDLK_F6, "F6"}, - {SDLK_F7, "F7"}, - {SDLK_F8, "F8"}, - {SDLK_F9, "F9"}, - {SDLK_F10, "F10"}, - {SDLK_F11, "F11"}, - {SDLK_F12, "F12"}, - {SDLK_PRINTSCREEN, "Print"}, - {SDLK_SCROLLLOCK, "ScrollLock"}, - {SDLK_PAUSE, "Pause"}, - {SDLK_INSERT, "Insert"}, - {SDLK_HOME, "Home"}, - {SDLK_PAGEUP, "PageUp"}, - {SDLK_DELETE, "Delete"}, - {SDLK_END, "End"}, - {SDLK_PAGEDOWN, "PageDown"}, - {SDLK_RIGHT, "Right"}, - {SDLK_LEFT, "Left"}, - {SDLK_DOWN, "Down"}, - {SDLK_UP, "Up"}, - {SDLK_NUMLOCKCLEAR, "NumLock"}, - {SDLK_KP_DIVIDE, "Keypad+Divide"}, - {SDLK_KP_MULTIPLY, "Keypad+Multiply"}, - {SDLK_KP_MINUS, "Keypad+Minus"}, - {SDLK_KP_PLUS, "Keypad+Plus"}, - {SDLK_KP_ENTER, "Keypad+Return"}, - {SDLK_KP_1, "Keypad+1"}, - {SDLK_KP_2, "Keypad+2"}, - {SDLK_KP_3, "Keypad+3"}, - {SDLK_KP_4, "Keypad+4"}, - {SDLK_KP_5, "Keypad+5"}, - {SDLK_KP_6, "Keypad+6"}, - {SDLK_KP_7, "Keypad+7"}, - {SDLK_KP_8, "Keypad+8"}, - {SDLK_KP_9, "Keypad+9"}, - {SDLK_KP_0, "Keypad+0"}, - {SDLK_KP_PERIOD, "Keypad+Period"}, - {SDLK_APPLICATION, "Application"}, - {SDLK_POWER, "Power"}, - {SDLK_KP_EQUALS, "Keypad+Equal"}, - {SDLK_F13, "F13"}, - {SDLK_F14, "F14"}, - {SDLK_F15, "F15"}, - {SDLK_F16, "F16"}, - {SDLK_F17, "F17"}, - {SDLK_F18, "F18"}, - {SDLK_F19, "F19"}, - {SDLK_F20, "F20"}, - {SDLK_F21, "F21"}, - {SDLK_F22, "F22"}, - {SDLK_F23, "F23"}, - {SDLK_F24, "F24"}, - {SDLK_EXECUTE, "Execute"}, - {SDLK_HELP, "Help"}, - {SDLK_MENU, "Menu"}, - {SDLK_SELECT, "Select"}, - {SDLK_STOP, "Stop"}, - {SDLK_AGAIN, "Again"}, - {SDLK_UNDO, "Undo"}, - {SDLK_CUT, "Cut"}, - {SDLK_COPY, "Copy"}, - {SDLK_PASTE, "Paste"}, - {SDLK_FIND, "Find"}, - {SDLK_MUTE, "Mute"}, - {SDLK_VOLUMEUP, "VolumeUp"}, - {SDLK_VOLUMEDOWN, "VolumeDown"}, - {SDLK_KP_COMMA, "Keypad+Comma"}, - {SDLK_KP_EQUALSAS400, "Keypad+EqualAS400"}, - {SDLK_ALTERASE, "AltErase"}, - {SDLK_SYSREQ, "SysReq"}, - {SDLK_CANCEL, "Cancel"}, - {SDLK_CLEAR, "Clear"}, - {SDLK_PRIOR, "Prior"}, - {SDLK_RETURN2, "Return2"}, - {SDLK_SEPARATOR, "Separator"}, - {SDLK_OUT, "Out"}, - {SDLK_OPER, "Oper"}, - {SDLK_CLEARAGAIN, "ClearAgain"}, - {SDLK_CRSEL, "CrSel"}, - {SDLK_EXSEL, "ExSel"}, - {SDLK_KP_00, "Keypad+00"}, - {SDLK_KP_000, "Keypad+000"}, - {SDLK_THOUSANDSSEPARATOR, "ThousandsSeparator"}, - {SDLK_DECIMALSEPARATOR, "DecimalSeparator"}, - {SDLK_CURRENCYUNIT, "CurrencyUnit"}, - {SDLK_CURRENCYSUBUNIT, "CurrencySubunit"}, - {SDLK_KP_LEFTPAREN, "Keypad+ParenLeft"}, - {SDLK_KP_RIGHTPAREN, "Keypad+ParenRight"}, - {SDLK_KP_LEFTBRACE, "Keypad+LeftBrace"}, - {SDLK_KP_RIGHTBRACE, "Keypad+RightBrace"}, - {SDLK_KP_TAB, "Keypad+Tab"}, - {SDLK_KP_BACKSPACE, "Keypad+Backspace"}, - {SDLK_KP_A, "Keypad+A"}, - {SDLK_KP_B, "Keypad+B"}, - {SDLK_KP_C, "Keypad+C"}, - {SDLK_KP_D, "Keypad+D"}, - {SDLK_KP_E, "Keypad+E"}, - {SDLK_KP_F, "Keypad+F"}, - {SDLK_KP_XOR, "Keypad+XOR"}, - {SDLK_KP_POWER, "Keypad+Power"}, - {SDLK_KP_PERCENT, "Keypad+Percent"}, - {SDLK_KP_LESS, "Keypad+Less"}, - {SDLK_KP_GREATER, "Keypad+Greater"}, - {SDLK_KP_AMPERSAND, "Keypad+Ampersand"}, - {SDLK_KP_DBLAMPERSAND, "Keypad+AmpersandDbl"}, - {SDLK_KP_VERTICALBAR, "Keypad+Bar"}, - {SDLK_KP_DBLVERTICALBAR, "Keypad+BarDbl"}, - {SDLK_KP_COLON, "Keypad+Colon"}, - {SDLK_KP_HASH, "Keypad+Hash"}, - {SDLK_KP_SPACE, "Keypad+Space"}, - {SDLK_KP_AT, "Keypad+At"}, - {SDLK_KP_EXCLAM, "Keypad+Exclam"}, - {SDLK_KP_MEMSTORE, "Keypad+MemStore"}, - {SDLK_KP_MEMRECALL, "Keypad+MemRecall"}, - {SDLK_KP_MEMCLEAR, "Keypad+MemClear"}, - {SDLK_KP_MEMADD, "Keypad+MemAdd"}, - {SDLK_KP_MEMSUBTRACT, "Keypad+MemSubtract"}, - {SDLK_KP_MEMMULTIPLY, "Keypad+MemMultiply"}, - {SDLK_KP_MEMDIVIDE, "Keypad+MemDivide"}, - {SDLK_KP_PLUSMINUS, "Keypad+PlusMinus"}, - {SDLK_KP_CLEAR, "Keypad+Clear"}, - {SDLK_KP_CLEARENTRY, "Keypad+ClearEntry"}, - {SDLK_KP_BINARY, "Keypad+Binary"}, - {SDLK_KP_OCTAL, "Keypad+Octal"}, - {SDLK_KP_DECIMAL, "Keypad+Decimal"}, - {SDLK_KP_HEXADECIMAL, "Keypad+Hexadecimal"}, - {SDLK_LCTRL, "LeftControl"}, - {SDLK_LSHIFT, "LeftShift"}, - {SDLK_LALT, "LeftAlt"}, - {SDLK_LGUI, "Super_L"}, - {SDLK_RCTRL, "RightCtrl"}, - {SDLK_RSHIFT, "RightShift"}, - {SDLK_RALT, "RightAlt"}, - {SDLK_RGUI, "RightSuper"}, - {SDLK_MODE, "Mode"}, - {SDLK_MEDIA_NEXT_TRACK, "MediaNext"}, - {SDLK_MEDIA_PREVIOUS_TRACK, "MediaPrevious"}, - {SDLK_MEDIA_STOP, "MediaStop"}, - {SDLK_MEDIA_PLAY, "MediaPlay"}, - {SDLK_MEDIA_PLAY_PAUSE, "MediaPlayPause"}, - {SDLK_MEDIA_SELECT, "MediaSelect"}, - {SDLK_MEDIA_REWIND, "MediaRewind"}, - {SDLK_MEDIA_FAST_FORWARD, "MediaFastForward"}, - {SDLK_MUTE, "VolumeMute"}, - {SDLK_AC_SEARCH, "Search"}, - {SDLK_AC_HOME, "Home"}, - {SDLK_AC_BACK, "Back"}, - {SDLK_AC_FORWARD, "Forward"}, - {SDLK_AC_STOP, "Stop"}, - {SDLK_AC_REFRESH, "Refresh"}, - {SDLK_AC_BOOKMARKS, "Bookmarks"}, - {SDLK_MEDIA_EJECT, "Eject"}, - {SDLK_SLEEP, "Sleep"}, -}; - -inline const char* GetKeyName(u32 key) -{ - const auto it = s_sdl_key_names.find(key); - return it == s_sdl_key_names.end() ? nullptr : it->second; -} - -inline std::optional GetKeyCodeForName(const std::string_view key_name) -{ - for (const auto& it : s_sdl_key_names) - { - if (key_name == it.second) - return it.first; - } - - return std::nullopt; -} - -} // namespace SDLKeyNames diff --git a/src/duckstation-qt/CMakeLists.txt b/src/duckstation-qt/CMakeLists.txt index 94d797aa9..d7a936366 100644 --- a/src/duckstation-qt/CMakeLists.txt +++ b/src/duckstation-qt/CMakeLists.txt @@ -131,7 +131,6 @@ set(SRCS postprocessingoverlayconfigwidget.ui qthost.cpp qthost.h - qtkeycodes.cpp qtprogresscallback.cpp qtprogresscallback.h qtthemes.cpp diff --git a/src/duckstation-qt/displaywidget.cpp b/src/duckstation-qt/displaywidget.cpp index 4e1ab06fd..773b552f4 100644 --- a/src/duckstation-qt/displaywidget.cpp +++ b/src/duckstation-qt/displaywidget.cpp @@ -242,10 +242,10 @@ bool DisplayWidget::event(QEvent* event) // but I can't think of a better way of handling it, and there doesn't appear to be // any window flag which changes this behavior that I can see. - const u32 key = QtUtils::KeyEventToCode(key_event); const Qt::KeyboardModifiers modifiers = key_event->modifiers(); const bool pressed = (key_event->type() == QEvent::KeyPress); - const auto it = std::find(m_keys_pressed_with_modifiers.begin(), m_keys_pressed_with_modifiers.end(), key); + const auto it = + std::find(m_keys_pressed_with_modifiers.begin(), m_keys_pressed_with_modifiers.end(), key_event->key()); if (it != m_keys_pressed_with_modifiers.end()) { if (pressed) @@ -255,10 +255,12 @@ bool DisplayWidget::event(QEvent* event) } else if (modifiers != Qt::NoModifier && modifiers != Qt::KeypadModifier && pressed) { - m_keys_pressed_with_modifiers.push_back(key); + m_keys_pressed_with_modifiers.push_back(key_event->key()); } - emit windowKeyEvent(key, pressed); + if (const std::optional key = QtUtils::KeyEventToCode(key_event)) + emit windowKeyEvent(key.value(), pressed); + return true; } diff --git a/src/duckstation-qt/displaywidget.h b/src/duckstation-qt/displaywidget.h index ac49fcbae..1bf32cbb3 100644 --- a/src/duckstation-qt/displaywidget.h +++ b/src/duckstation-qt/displaywidget.h @@ -65,7 +65,7 @@ private: bool m_cursor_hidden = false; bool m_destroying = false; - std::vector m_keys_pressed_with_modifiers; + std::vector m_keys_pressed_with_modifiers; u32 m_last_window_width = 0; u32 m_last_window_height = 0; diff --git a/src/duckstation-qt/duckstation-qt.vcxproj b/src/duckstation-qt/duckstation-qt.vcxproj index d4e4198f6..34eac411b 100644 --- a/src/duckstation-qt/duckstation-qt.vcxproj +++ b/src/duckstation-qt/duckstation-qt.vcxproj @@ -45,7 +45,6 @@ - diff --git a/src/duckstation-qt/duckstation-qt.vcxproj.filters b/src/duckstation-qt/duckstation-qt.vcxproj.filters index 4fed6d7fb..e3875c175 100644 --- a/src/duckstation-qt/duckstation-qt.vcxproj.filters +++ b/src/duckstation-qt/duckstation-qt.vcxproj.filters @@ -28,7 +28,6 @@ - diff --git a/src/duckstation-qt/inputbindingdialog.cpp b/src/duckstation-qt/inputbindingdialog.cpp index 3785d775f..e8042f687 100644 --- a/src/duckstation-qt/inputbindingdialog.cpp +++ b/src/duckstation-qt/inputbindingdialog.cpp @@ -86,7 +86,8 @@ bool InputBindingDialog::eventFilter(QObject* watched, QEvent* event) else if (event_type == QEvent::KeyPress) { const QKeyEvent* key_event = static_cast(event); - m_new_bindings.push_back(InputManager::MakeHostKeyboardKey(QtUtils::KeyEventToCode(key_event))); + if (const std::optional key = QtUtils::KeyEventToCode(key_event)) + m_new_bindings.push_back(InputManager::MakeHostKeyboardKey(key.value())); return true; } else if (event_type == QEvent::MouseButtonPress || event_type == QEvent::MouseButtonDblClick) diff --git a/src/duckstation-qt/inputbindingwidgets.cpp b/src/duckstation-qt/inputbindingwidgets.cpp index 94d2f1015..deb021b7d 100644 --- a/src/duckstation-qt/inputbindingwidgets.cpp +++ b/src/duckstation-qt/inputbindingwidgets.cpp @@ -111,7 +111,8 @@ bool InputBindingWidget::eventFilter(QObject* watched, QEvent* event) else if (event_type == QEvent::KeyPress) { const QKeyEvent* key_event = static_cast(event); - m_new_bindings.push_back(InputManager::MakeHostKeyboardKey(QtUtils::KeyEventToCode(key_event))); + if (const std::optional key = QtUtils::KeyEventToCode(key_event)) + m_new_bindings.push_back(InputManager::MakeHostKeyboardKey(key.value())); return true; } else if ((event_type == QEvent::MouseButtonPress || event_type == QEvent::MouseButtonDblClick) && diff --git a/src/duckstation-qt/qtkeycodes.cpp b/src/duckstation-qt/qtkeycodes.cpp deleted file mode 100644 index aae81e6aa..000000000 --- a/src/duckstation-qt/qtkeycodes.cpp +++ /dev/null @@ -1,538 +0,0 @@ -// SPDX-FileCopyrightText: 2019-2024 Connor McLaughlin -// SPDX-License-Identifier: CC-BY-NC-ND-4.0 - -#include "qtutils.h" - -#include "common/string_util.h" - -#include "IconsPromptFont.h" - -#include "fmt/format.h" -#include "util/input_manager.h" - -#include - -struct KeyCodeName -{ - int code; - const char* name; - const char* icon_name; -}; - -static constexpr KeyCodeName s_qt_key_names[] = {{Qt::Key_Escape, "Escape", ICON_PF_ESC}, - {Qt::Key_Tab, "Tab", ICON_PF_TAB}, - {Qt::Key_Backtab, "Backtab", nullptr}, - {Qt::Key_Backspace, "Backspace", ICON_PF_BACKSPACE}, - {Qt::Key_Return, "Return", ICON_PF_ENTER}, - {Qt::Key_Enter, "Enter", ICON_PF_ENTER}, - {Qt::Key_Insert, "Insert", ICON_PF_INSERT}, - {Qt::Key_Delete, "Delete", ICON_PF_DELETE}, - {Qt::Key_Pause, "Pause", ICON_PF_PAUSE}, - {Qt::Key_Print, "Print", ICON_PF_PRTSC}, - {Qt::Key_SysReq, "SysReq", ICON_PF_PAUSE}, - {Qt::Key_Clear, "Clear", nullptr}, - {Qt::Key_Home, "Home", ICON_PF_HOME}, - {Qt::Key_End, "End", ICON_PF_END}, - {Qt::Key_Left, "Left", ICON_PF_ARROW_LEFT}, - {Qt::Key_Up, "Up", ICON_PF_ARROW_UP}, - {Qt::Key_Right, "Right", ICON_PF_ARROW_RIGHT}, - {Qt::Key_Down, "Down", ICON_PF_ARROW_DOWN}, - {Qt::Key_PageUp, "PageUp", ICON_PF_PAGE_UP}, - {Qt::Key_PageDown, "PageDown", ICON_PF_PAGE_DOWN}, - {Qt::Key_Shift, "Shift", ICON_PF_SHIFT}, - {Qt::Key_Control, "Control", ICON_PF_CTRL}, - {Qt::Key_Meta, "Meta", ICON_PF_SUPER}, - {Qt::Key_Alt, "Alt", ICON_PF_ALT}, - {Qt::Key_CapsLock, "CapsLock", ICON_PF_CAPS}, - {Qt::Key_NumLock, "NumLock", ICON_PF_NUMLOCK}, - {Qt::Key_ScrollLock, "ScrollLock", ICON_PF_SCRLK}, - {Qt::Key_F1, "F1", ICON_PF_F1}, - {Qt::Key_F2, "F2", ICON_PF_F2}, - {Qt::Key_F3, "F3", ICON_PF_F3}, - {Qt::Key_F4, "F4", ICON_PF_F4}, - {Qt::Key_F5, "F5", ICON_PF_F5}, - {Qt::Key_F6, "F6", ICON_PF_F6}, - {Qt::Key_F7, "F7", ICON_PF_F7}, - {Qt::Key_F8, "F8", ICON_PF_F8}, - {Qt::Key_F9, "F9", ICON_PF_F9}, - {Qt::Key_F10, "F10", ICON_PF_F10}, - {Qt::Key_F11, "F11", ICON_PF_F11}, - {Qt::Key_F12, "F12", ICON_PF_F12}, - {Qt::Key_F13, "F13", nullptr}, - {Qt::Key_F14, "F14", nullptr}, - {Qt::Key_F15, "F15", nullptr}, - {Qt::Key_F16, "F16", nullptr}, - {Qt::Key_F17, "F17", nullptr}, - {Qt::Key_F18, "F18", nullptr}, - {Qt::Key_F19, "F19", nullptr}, - {Qt::Key_F20, "F20", nullptr}, - {Qt::Key_F21, "F21", nullptr}, - {Qt::Key_F22, "F22", nullptr}, - {Qt::Key_F23, "F23", nullptr}, - {Qt::Key_F24, "F24", nullptr}, - {Qt::Key_F25, "F25", nullptr}, - {Qt::Key_F26, "F26", nullptr}, - {Qt::Key_F27, "F27", nullptr}, - {Qt::Key_F28, "F28", nullptr}, - {Qt::Key_F29, "F29", nullptr}, - {Qt::Key_F30, "F30", nullptr}, - {Qt::Key_F31, "F31", nullptr}, - {Qt::Key_F32, "F32", nullptr}, - {Qt::Key_F33, "F33", nullptr}, - {Qt::Key_F34, "F34", nullptr}, - {Qt::Key_F35, "F35", nullptr}, - {Qt::Key_Super_L, "Super_L", nullptr}, - {Qt::Key_Super_R, "Super_R", nullptr}, - {Qt::Key_Menu, "Menu", nullptr}, - {Qt::Key_Hyper_L, "Hyper_L", nullptr}, - {Qt::Key_Hyper_R, "Hyper_R", nullptr}, - {Qt::Key_Help, "Help", nullptr}, - {Qt::Key_Direction_L, "Direction_L", nullptr}, - {Qt::Key_Direction_R, "Direction_R", nullptr}, - {Qt::Key_Space, "Space", ICON_PF_SPACE}, - {Qt::Key_Any, "Any", nullptr}, - {Qt::Key_Exclam, "Exclam", nullptr}, - {Qt::Key_QuoteDbl, "QuoteDbl", nullptr}, - {Qt::Key_NumberSign, "NumberSign", nullptr}, - {Qt::Key_Dollar, "Dollar", nullptr}, - {Qt::Key_Percent, "Percent", nullptr}, - {Qt::Key_Ampersand, "Ampersand", nullptr}, - {Qt::Key_Apostrophe, "Apostrophe", ICON_PF_KEY_APOSTROPHE}, - {Qt::Key_ParenLeft, "ParenLeft", nullptr}, - {Qt::Key_ParenRight, "ParenRight", nullptr}, - {Qt::Key_Asterisk, "Asterisk", nullptr}, - {Qt::Key_Plus, "Plus", nullptr}, - {Qt::Key_Comma, "Comma", ICON_PF_KEY_COMMA}, - {Qt::Key_Minus, "Minus", ICON_PF_KEY_DASH}, - {Qt::Key_Period, "Period", ICON_PF_KEY_PERIOD}, - {Qt::Key_Slash, "Slash", ICON_PF_KEY_SLASH}, - {Qt::Key_0, "0", ICON_PF_0}, - {Qt::Key_1, "1", ICON_PF_1}, - {Qt::Key_2, "2", ICON_PF_2}, - {Qt::Key_3, "3", ICON_PF_3}, - {Qt::Key_4, "4", ICON_PF_4}, - {Qt::Key_5, "5", ICON_PF_5}, - {Qt::Key_6, "6", ICON_PF_6}, - {Qt::Key_7, "7", ICON_PF_7}, - {Qt::Key_8, "8", ICON_PF_8}, - {Qt::Key_9, "9", ICON_PF_9}, - {Qt::Key_Colon, "Colon", nullptr}, - {Qt::Key_Semicolon, "Semicolon", ICON_PF_KEY_SEMICOLON}, - {Qt::Key_Less, "Less", nullptr}, - {Qt::Key_Equal, "Equal", ICON_PF_KEY_EQUAL}, - {Qt::Key_Greater, "Greater", nullptr}, - {Qt::Key_Question, "Question", nullptr}, - {Qt::Key_At, "At", nullptr}, - {Qt::Key_A, "A", ICON_PF_KEY_A}, - {Qt::Key_B, "B", ICON_PF_KEY_B}, - {Qt::Key_C, "C", ICON_PF_KEY_C}, - {Qt::Key_D, "D", ICON_PF_KEY_D}, - {Qt::Key_E, "E", ICON_PF_KEY_E}, - {Qt::Key_F, "F", ICON_PF_KEY_F}, - {Qt::Key_G, "G", ICON_PF_KEY_G}, - {Qt::Key_H, "H", ICON_PF_KEY_H}, - {Qt::Key_I, "I", ICON_PF_KEY_I}, - {Qt::Key_J, "J", ICON_PF_KEY_J}, - {Qt::Key_K, "K", ICON_PF_KEY_K}, - {Qt::Key_L, "L", ICON_PF_KEY_L}, - {Qt::Key_M, "M", ICON_PF_KEY_M}, - {Qt::Key_N, "N", ICON_PF_KEY_N}, - {Qt::Key_O, "O", ICON_PF_KEY_O}, - {Qt::Key_P, "P", ICON_PF_KEY_P}, - {Qt::Key_Q, "Q", ICON_PF_KEY_Q}, - {Qt::Key_R, "R", ICON_PF_KEY_R}, - {Qt::Key_S, "S", ICON_PF_KEY_S}, - {Qt::Key_T, "T", ICON_PF_KEY_T}, - {Qt::Key_U, "U", ICON_PF_KEY_U}, - {Qt::Key_V, "V", ICON_PF_KEY_V}, - {Qt::Key_W, "W", ICON_PF_KEY_W}, - {Qt::Key_X, "X", ICON_PF_KEY_X}, - {Qt::Key_Y, "Y", ICON_PF_KEY_Y}, - {Qt::Key_Z, "Z", ICON_PF_KEY_Z}, - {Qt::Key_BracketLeft, "BracketLeft", ICON_PF_KEY_OPEN_BRACKET}, - {Qt::Key_Backslash, "Backslash", ICON_PF_KEY_BACKSLASH}, - {Qt::Key_BracketRight, "BracketRight", ICON_PF_KEY_CLOSE_BRACKET}, - {Qt::Key_AsciiCircum, "AsciiCircum", nullptr}, - {Qt::Key_Underscore, "Underscore", nullptr}, - {Qt::Key_QuoteLeft, "QuoteLeft", ICON_PF_KEY_TILDE}, - {Qt::Key_BraceLeft, "BraceLeft", nullptr}, - {Qt::Key_Bar, "Bar", nullptr}, - {Qt::Key_BraceRight, "BraceRight", nullptr}, - {Qt::Key_AsciiTilde, "AsciiTilde", nullptr}, - {Qt::Key_nobreakspace, "nobreakspace", nullptr}, - {Qt::Key_exclamdown, "exclamdown", nullptr}, - {Qt::Key_cent, "cent", nullptr}, - {Qt::Key_sterling, "sterling", nullptr}, - {Qt::Key_currency, "currency", nullptr}, - {Qt::Key_yen, "yen", nullptr}, - {Qt::Key_brokenbar, "brokenbar", nullptr}, - {Qt::Key_section, "section", nullptr}, - {Qt::Key_diaeresis, "diaeresis", nullptr}, - {Qt::Key_copyright, "copyright", nullptr}, - {Qt::Key_ordfeminine, "ordfeminine", nullptr}, - {Qt::Key_guillemotleft, "guillemotleft", nullptr}, - {Qt::Key_notsign, "notsign", nullptr}, - {Qt::Key_hyphen, "hyphen", nullptr}, - {Qt::Key_registered, "registered", nullptr}, - {Qt::Key_macron, "macron", nullptr}, - {Qt::Key_degree, "degree", nullptr}, - {Qt::Key_plusminus, "plusminus", nullptr}, - {Qt::Key_twosuperior, "twosuperior", nullptr}, - {Qt::Key_threesuperior, "threesuperior", nullptr}, - {Qt::Key_acute, "acute", nullptr}, - {Qt::Key_micro, "micro", nullptr}, - {Qt::Key_paragraph, "paragraph", nullptr}, - {Qt::Key_periodcentered, "periodcentered", nullptr}, - {Qt::Key_cedilla, "cedilla", nullptr}, - {Qt::Key_onesuperior, "onesuperior", nullptr}, - {Qt::Key_masculine, "masculine", nullptr}, - {Qt::Key_guillemotright, "guillemotright", nullptr}, - {Qt::Key_onequarter, "onequarter", nullptr}, - {Qt::Key_onehalf, "onehalf", nullptr}, - {Qt::Key_threequarters, "threequarters", nullptr}, - {Qt::Key_questiondown, "questiondown", nullptr}, - {Qt::Key_Agrave, "Agrave", nullptr}, - {Qt::Key_Aacute, "Aacute", nullptr}, - {Qt::Key_Acircumflex, "Acircumflex", nullptr}, - {Qt::Key_Atilde, "Atilde", nullptr}, - {Qt::Key_Adiaeresis, "Adiaeresis", nullptr}, - {Qt::Key_Aring, "Aring", nullptr}, - {Qt::Key_AE, "AE", nullptr}, - {Qt::Key_Ccedilla, "Ccedilla", nullptr}, - {Qt::Key_Egrave, "Egrave", nullptr}, - {Qt::Key_Eacute, "Eacute", nullptr}, - {Qt::Key_Ecircumflex, "Ecircumflex", nullptr}, - {Qt::Key_Ediaeresis, "Ediaeresis", nullptr}, - {Qt::Key_Igrave, "Igrave", nullptr}, - {Qt::Key_Iacute, "Iacute", nullptr}, - {Qt::Key_Icircumflex, "Icircumflex", nullptr}, - {Qt::Key_Idiaeresis, "Idiaeresis", nullptr}, - {Qt::Key_ETH, "ETH", nullptr}, - {Qt::Key_Ntilde, "Ntilde", nullptr}, - {Qt::Key_Ograve, "Ograve", nullptr}, - {Qt::Key_Oacute, "Oacute", nullptr}, - {Qt::Key_Ocircumflex, "Ocircumflex", nullptr}, - {Qt::Key_Otilde, "Otilde", nullptr}, - {Qt::Key_Odiaeresis, "Odiaeresis", nullptr}, - {Qt::Key_multiply, "multiply", nullptr}, - {Qt::Key_Ooblique, "Ooblique", nullptr}, - {Qt::Key_Ugrave, "Ugrave", nullptr}, - {Qt::Key_Uacute, "Uacute", nullptr}, - {Qt::Key_Ucircumflex, "Ucircumflex", nullptr}, - {Qt::Key_Udiaeresis, "Udiaeresis", nullptr}, - {Qt::Key_Yacute, "Yacute", nullptr}, - {Qt::Key_THORN, "THORN", nullptr}, - {Qt::Key_ssharp, "ssharp", nullptr}, - {Qt::Key_division, "division", nullptr}, - {Qt::Key_ydiaeresis, "ydiaeresis", nullptr}, - {Qt::Key_AltGr, "AltGr", nullptr}, - {Qt::Key_Multi_key, "Multi_key", nullptr}, - {Qt::Key_Codeinput, "Codeinput", nullptr}, - {Qt::Key_SingleCandidate, "SingleCandidate", nullptr}, - {Qt::Key_MultipleCandidate, "MultipleCandidate", nullptr}, - {Qt::Key_PreviousCandidate, "PreviousCandidate", nullptr}, - {Qt::Key_Mode_switch, "Mode_switch", nullptr}, - {Qt::Key_Kanji, "Kanji", nullptr}, - {Qt::Key_Muhenkan, "Muhenkan", nullptr}, - {Qt::Key_Henkan, "Henkan", nullptr}, - {Qt::Key_Romaji, "Romaji", nullptr}, - {Qt::Key_Hiragana, "Hiragana", nullptr}, - {Qt::Key_Katakana, "Katakana", nullptr}, - {Qt::Key_Hiragana_Katakana, "Hiragana_Katakana", nullptr}, - {Qt::Key_Zenkaku, "Zenkaku", nullptr}, - {Qt::Key_Hankaku, "Hankaku", nullptr}, - {Qt::Key_Zenkaku_Hankaku, "Zenkaku_Hankaku", nullptr}, - {Qt::Key_Touroku, "Touroku", nullptr}, - {Qt::Key_Massyo, "Massyo", nullptr}, - {Qt::Key_Kana_Lock, "Kana_Lock", nullptr}, - {Qt::Key_Kana_Shift, "Kana_Shift", nullptr}, - {Qt::Key_Eisu_Shift, "Eisu_Shift", nullptr}, - {Qt::Key_Eisu_toggle, "Eisu_toggle", nullptr}, - {Qt::Key_Hangul, "Hangul", nullptr}, - {Qt::Key_Hangul_Start, "Hangul_Start", nullptr}, - {Qt::Key_Hangul_End, "Hangul_End", nullptr}, - {Qt::Key_Hangul_Hanja, "Hangul_Hanja", nullptr}, - {Qt::Key_Hangul_Jamo, "Hangul_Jamo", nullptr}, - {Qt::Key_Hangul_Romaja, "Hangul_Romaja", nullptr}, - {Qt::Key_Hangul_Jeonja, "Hangul_Jeonja", nullptr}, - {Qt::Key_Hangul_Banja, "Hangul_Banja", nullptr}, - {Qt::Key_Hangul_PreHanja, "Hangul_PreHanja", nullptr}, - {Qt::Key_Hangul_PostHanja, "Hangul_PostHanja", nullptr}, - {Qt::Key_Hangul_Special, "Hangul_Special", nullptr}, - {Qt::Key_Dead_Grave, "Dead_Grave", nullptr}, - {Qt::Key_Dead_Acute, "Dead_Acute", nullptr}, - {Qt::Key_Dead_Circumflex, "Dead_Circumflex", nullptr}, - {Qt::Key_Dead_Tilde, "Dead_Tilde", nullptr}, - {Qt::Key_Dead_Macron, "Dead_Macron", nullptr}, - {Qt::Key_Dead_Breve, "Dead_Breve", nullptr}, - {Qt::Key_Dead_Abovedot, "Dead_Abovedot", nullptr}, - {Qt::Key_Dead_Diaeresis, "Dead_Diaeresis", nullptr}, - {Qt::Key_Dead_Abovering, "Dead_Abovering", nullptr}, - {Qt::Key_Dead_Doubleacute, "Dead_Doubleacute", nullptr}, - {Qt::Key_Dead_Caron, "Dead_Caron", nullptr}, - {Qt::Key_Dead_Cedilla, "Dead_Cedilla", nullptr}, - {Qt::Key_Dead_Ogonek, "Dead_Ogonek", nullptr}, - {Qt::Key_Dead_Iota, "Dead_Iota", nullptr}, - {Qt::Key_Dead_Voiced_Sound, "Dead_Voiced_Sound", nullptr}, - {Qt::Key_Dead_Semivoiced_Sound, "Dead_Semivoiced_Sound", nullptr}, - {Qt::Key_Dead_Belowdot, "Dead_Belowdot", nullptr}, - {Qt::Key_Dead_Hook, "Dead_Hook", nullptr}, - {Qt::Key_Dead_Horn, "Dead_Horn", nullptr}, - {Qt::Key_Back, "Back", nullptr}, - {Qt::Key_Forward, "Forward", nullptr}, - {Qt::Key_Stop, "Stop", nullptr}, - {Qt::Key_Refresh, "Refresh", nullptr}, - {Qt::Key_VolumeDown, "VolumeDown", nullptr}, - {Qt::Key_VolumeMute, "VolumeMute", nullptr}, - {Qt::Key_VolumeUp, "VolumeUp", nullptr}, - {Qt::Key_BassBoost, "BassBoost", nullptr}, - {Qt::Key_BassUp, "BassUp", nullptr}, - {Qt::Key_BassDown, "BassDown", nullptr}, - {Qt::Key_TrebleUp, "TrebleUp", nullptr}, - {Qt::Key_TrebleDown, "TrebleDown", nullptr}, - {Qt::Key_MediaPlay, "MediaPlay", nullptr}, - {Qt::Key_MediaStop, "MediaStop", nullptr}, - {Qt::Key_MediaPrevious, "MediaPrevious", nullptr}, - {Qt::Key_MediaNext, "MediaNext", nullptr}, - {Qt::Key_MediaRecord, "MediaRecord", nullptr}, - {Qt::Key_MediaPause, "MediaPause", nullptr}, - {Qt::Key_MediaTogglePlayPause, "MediaTogglePlayPause", nullptr}, - {Qt::Key_HomePage, "HomePage", nullptr}, - {Qt::Key_Favorites, "Favorites", nullptr}, - {Qt::Key_Search, "Search", nullptr}, - {Qt::Key_Standby, "Standby", nullptr}, - {Qt::Key_OpenUrl, "OpenUrl", nullptr}, - {Qt::Key_LaunchMail, "LaunchMail", nullptr}, - {Qt::Key_LaunchMedia, "LaunchMedia", nullptr}, - {Qt::Key_Launch0, "Launch0", nullptr}, - {Qt::Key_Launch1, "Launch1", nullptr}, - {Qt::Key_Launch2, "Launch2", nullptr}, - {Qt::Key_Launch3, "Launch3", nullptr}, - {Qt::Key_Launch4, "Launch4", nullptr}, - {Qt::Key_Launch5, "Launch5", nullptr}, - {Qt::Key_Launch6, "Launch6", nullptr}, - {Qt::Key_Launch7, "Launch7", nullptr}, - {Qt::Key_Launch8, "Launch8", nullptr}, - {Qt::Key_Launch9, "Launch9", nullptr}, - {Qt::Key_LaunchA, "LaunchA", nullptr}, - {Qt::Key_LaunchB, "LaunchB", nullptr}, - {Qt::Key_LaunchC, "LaunchC", nullptr}, - {Qt::Key_LaunchD, "LaunchD", nullptr}, - {Qt::Key_LaunchE, "LaunchE", nullptr}, - {Qt::Key_LaunchF, "LaunchF", nullptr}, - {Qt::Key_MonBrightnessUp, "MonBrightnessUp", nullptr}, - {Qt::Key_MonBrightnessDown, "MonBrightnessDown", nullptr}, - {Qt::Key_KeyboardLightOnOff, "KeyboardLightOnOff", nullptr}, - {Qt::Key_KeyboardBrightnessUp, "KeyboardBrightnessUp", nullptr}, - {Qt::Key_KeyboardBrightnessDown, "KeyboardBrightnessDown", nullptr}, - {Qt::Key_PowerOff, "PowerOff", nullptr}, - {Qt::Key_WakeUp, "WakeUp", nullptr}, - {Qt::Key_Eject, "Eject", nullptr}, - {Qt::Key_ScreenSaver, "ScreenSaver", nullptr}, - {Qt::Key_WWW, "WWW", nullptr}, - {Qt::Key_Memo, "Memo", nullptr}, - {Qt::Key_LightBulb, "LightBulb", nullptr}, - {Qt::Key_Shop, "Shop", nullptr}, - {Qt::Key_History, "History", nullptr}, - {Qt::Key_AddFavorite, "AddFavorite", nullptr}, - {Qt::Key_HotLinks, "HotLinks", nullptr}, - {Qt::Key_BrightnessAdjust, "BrightnessAdjust", nullptr}, - {Qt::Key_Finance, "Finance", nullptr}, - {Qt::Key_Community, "Community", nullptr}, - {Qt::Key_AudioRewind, "AudioRewind", nullptr}, - {Qt::Key_BackForward, "BackForward", nullptr}, - {Qt::Key_ApplicationLeft, "ApplicationLeft", nullptr}, - {Qt::Key_ApplicationRight, "ApplicationRight", nullptr}, - {Qt::Key_Book, "Book", nullptr}, - {Qt::Key_CD, "CD", nullptr}, - {Qt::Key_Calculator, "Calculator", nullptr}, - {Qt::Key_ToDoList, "ToDoList", nullptr}, - {Qt::Key_ClearGrab, "ClearGrab", nullptr}, - {Qt::Key_Close, "Close", nullptr}, - {Qt::Key_Copy, "Copy", nullptr}, - {Qt::Key_Cut, "Cut", nullptr}, - {Qt::Key_Display, "Display", nullptr}, - {Qt::Key_DOS, "DOS", nullptr}, - {Qt::Key_Documents, "Documents", nullptr}, - {Qt::Key_Excel, "Excel", nullptr}, - {Qt::Key_Explorer, "Explorer", nullptr}, - {Qt::Key_Game, "Game", nullptr}, - {Qt::Key_Go, "Go", nullptr}, - {Qt::Key_iTouch, "iTouch", nullptr}, - {Qt::Key_LogOff, "LogOff", nullptr}, - {Qt::Key_Market, "Market", nullptr}, - {Qt::Key_Meeting, "Meeting", nullptr}, - {Qt::Key_MenuKB, "MenuKB", nullptr}, - {Qt::Key_MenuPB, "MenuPB", nullptr}, - {Qt::Key_MySites, "MySites", nullptr}, - {Qt::Key_News, "News", nullptr}, - {Qt::Key_OfficeHome, "OfficeHome", nullptr}, - {Qt::Key_Option, "Option", nullptr}, - {Qt::Key_Paste, "Paste", nullptr}, - {Qt::Key_Phone, "Phone", nullptr}, - {Qt::Key_Calendar, "Calendar", nullptr}, - {Qt::Key_Reply, "Reply", nullptr}, - {Qt::Key_Reload, "Reload", nullptr}, - {Qt::Key_RotateWindows, "RotateWindows", nullptr}, - {Qt::Key_RotationPB, "RotationPB", nullptr}, - {Qt::Key_RotationKB, "RotationKB", nullptr}, - {Qt::Key_Save, "Save", nullptr}, - {Qt::Key_Send, "Send", nullptr}, - {Qt::Key_Spell, "Spell", nullptr}, - {Qt::Key_SplitScreen, "SplitScreen", nullptr}, - {Qt::Key_Support, "Support", nullptr}, - {Qt::Key_TaskPane, "TaskPane", nullptr}, - {Qt::Key_Terminal, "Terminal", nullptr}, - {Qt::Key_Tools, "Tools", nullptr}, - {Qt::Key_Travel, "Travel", nullptr}, - {Qt::Key_Video, "Video", nullptr}, - {Qt::Key_Word, "Word", nullptr}, - {Qt::Key_Xfer, "Xfer", nullptr}, - {Qt::Key_ZoomIn, "ZoomIn", nullptr}, - {Qt::Key_ZoomOut, "ZoomOut", nullptr}, - {Qt::Key_Away, "Away", nullptr}, - {Qt::Key_Messenger, "Messenger", nullptr}, - {Qt::Key_WebCam, "WebCam", nullptr}, - {Qt::Key_MailForward, "MailForward", nullptr}, - {Qt::Key_Pictures, "Pictures", nullptr}, - {Qt::Key_Music, "Music", nullptr}, - {Qt::Key_Battery, "Battery", nullptr}, - {Qt::Key_Bluetooth, "Bluetooth", nullptr}, - {Qt::Key_WLAN, "WLAN", nullptr}, - {Qt::Key_UWB, "UWB", nullptr}, - {Qt::Key_AudioForward, "AudioForward", nullptr}, - {Qt::Key_AudioRepeat, "AudioRepeat", nullptr}, - {Qt::Key_AudioRandomPlay, "AudioRandomPlay", nullptr}, - {Qt::Key_Subtitle, "Subtitle", nullptr}, - {Qt::Key_AudioCycleTrack, "AudioCycleTrack", nullptr}, - {Qt::Key_Time, "Time", nullptr}, - {Qt::Key_Hibernate, "Hibernate", nullptr}, - {Qt::Key_View, "View", nullptr}, - {Qt::Key_TopMenu, "TopMenu", nullptr}, - {Qt::Key_PowerDown, "PowerDown", nullptr}, - {Qt::Key_Suspend, "Suspend", nullptr}, - {Qt::Key_ContrastAdjust, "ContrastAdjust", nullptr}, - {Qt::Key_LaunchG, "LaunchG", nullptr}, - {Qt::Key_LaunchH, "LaunchH", nullptr}, - {Qt::Key_TouchpadToggle, "TouchpadToggle", nullptr}, - {Qt::Key_TouchpadOn, "TouchpadOn", nullptr}, - {Qt::Key_TouchpadOff, "TouchpadOff", nullptr}, - {Qt::Key_MicMute, "MicMute", nullptr}, - {Qt::Key_Red, "Red", nullptr}, - {Qt::Key_Green, "Green", nullptr}, - {Qt::Key_Yellow, "Yellow", nullptr}, - {Qt::Key_Blue, "Blue", nullptr}, - {Qt::Key_ChannelUp, "ChannelUp", nullptr}, - {Qt::Key_ChannelDown, "ChannelDown", nullptr}, - {Qt::Key_Guide, "Guide", nullptr}, - {Qt::Key_Info, "Info", nullptr}, - {Qt::Key_Settings, "Settings", nullptr}, - {Qt::Key_MicVolumeUp, "MicVolumeUp", nullptr}, - {Qt::Key_MicVolumeDown, "MicVolumeDown", nullptr}, - {Qt::Key_New, "New", nullptr}, - {Qt::Key_Open, "Open", nullptr}, - {Qt::Key_Find, "Find", nullptr}, - {Qt::Key_Undo, "Undo", nullptr}, - {Qt::Key_Redo, "Redo", nullptr}, - {Qt::Key_MediaLast, "MediaLast", nullptr}, - {Qt::Key_Select, "Select", nullptr}, - {Qt::Key_Yes, "Yes", nullptr}, - {Qt::Key_No, "No", nullptr}, - {Qt::Key_Cancel, "Cancel", nullptr}, - {Qt::Key_Printer, "Printer", nullptr}, - {Qt::Key_Execute, "Execute", nullptr}, - {Qt::Key_Sleep, "Sleep", nullptr}, - {Qt::Key_Play, "Play", nullptr}, - {Qt::Key_Zoom, "Zoom", nullptr}, - {Qt::Key_Exit, "Exit", nullptr}, - {Qt::Key_Context1, "Context1", nullptr}, - {Qt::Key_Context2, "Context2", nullptr}, - {Qt::Key_Context3, "Context3", nullptr}, - {Qt::Key_Context4, "Context4", nullptr}, - {Qt::Key_Call, "Call", nullptr}, - {Qt::Key_Hangup, "Hangup", nullptr}, - {Qt::Key_Flip, "Flip", nullptr}, - {Qt::Key_ToggleCallHangup, "ToggleCallHangup", nullptr}, - {Qt::Key_VoiceDial, "VoiceDial", nullptr}, - {Qt::Key_LastNumberRedial, "LastNumberRedial", nullptr}, - {Qt::Key_Camera, "Camera", nullptr}, - {Qt::Key_CameraFocus, "CameraFocus", nullptr}}; - -std::optional InputManager::ConvertHostKeyboardStringToCode(std::string_view str) -{ - std::string_view compare_name = str; - u32 modifier_bits = 0; - if (compare_name.starts_with("Numpad")) - { - compare_name = compare_name.substr(6); - modifier_bits |= Qt::KeypadModifier; - } - - for (const KeyCodeName& name : s_qt_key_names) - { - if (compare_name == name.name) - return static_cast(name.code) | modifier_bits; - } - - return std::nullopt; -} - -std::optional InputManager::ConvertHostKeyboardCodeToString(u32 code) -{ - std::optional ret; - - const u32 modifier_bits = (code & Qt::KeyboardModifierMask); - const u32 masked_code = (code & ~Qt::KeyboardModifierMask); - - for (const KeyCodeName& name : s_qt_key_names) - { - if (static_cast(masked_code) == name.code) - { - if (modifier_bits & Qt::KeypadModifier) - ret = fmt::format("Numpad{}", name.name); - else - ret = std::string(name.name); - - break; - } - } - - return ret; -} - -const char* InputManager::ConvertHostKeyboardCodeToIcon(u32 code) -{ - if (code & Qt::KeyboardModifierMask) - return nullptr; - - const u32 masked_code = (code & ~Qt::KeyboardModifierMask); - for (const KeyCodeName& name : s_qt_key_names) - { - if (static_cast(masked_code) == name.code) - return name.icon_name; - } - - return nullptr; -} - -u32 QtUtils::KeyEventToCode(const QKeyEvent* ev) -{ - int key = ev->key(); - Qt::KeyboardModifiers modifiers = ev->modifiers(); - -#ifdef __APPLE__ - // On macOS, Qt applies the Keypad modifier regardless of whether the arrow keys, or numpad was pressed. - // The only way to differentiate between the keypad and the arrow keys is by the text. - // Hopefully some keyboard layouts don't change the numpad positioning... - if (modifiers & Qt::KeypadModifier && key >= Qt::Key_Insert && key <= Qt::Key_PageDown) - { - if (ev->text().isEmpty()) - { - // Drop the modifier, because it's probably not actually a numpad push. - modifiers &= ~Qt::KeypadModifier; - } - } -#endif - - return static_cast(key) | (static_cast(modifiers) & static_cast(Qt::KeypadModifier)); -} diff --git a/src/duckstation-qt/qtutils.cpp b/src/duckstation-qt/qtutils.cpp index bef57d458..bbf4b5f29 100644 --- a/src/duckstation-qt/qtutils.cpp +++ b/src/duckstation-qt/qtutils.cpp @@ -8,6 +8,7 @@ #include "core/system.h" #include "util/gpu_device.h" +#include "util/input_manager.h" #include "common/error.h" #include "common/log.h" @@ -35,12 +36,12 @@ #include #include -#if !defined(_WIN32) && !defined(APPLE) -#include -#endif - -#ifdef _WIN32 +#if defined(_WIN32) #include "common/windows_headers.h" +#elif defined(__APPLE__) +#include "common/thirdparty/usb_key_code_data.h" +#else +#include #endif LOG_CHANNEL(Host); @@ -571,3 +572,58 @@ bool QtUtils::TryMigrateWindowGeometry(SettingsInterface* si, std::string_view w Host::CommitBaseSettingChanges(); return true; } + +std::optional QtUtils::KeyEventToCode(const QKeyEvent* ev) +{ + u32 scancode = ev->nativeScanCode(); + +#if defined(_WIN32) + // According to https://github.com/nyanpasu64/qkeycode/blob/master/src/qkeycode/qkeycode.cpp#L151, + // we need to convert the bit flag here. + if (scancode & 0x100) + scancode = (scancode - 0x100) | 0xe000; + +#elif defined(__APPLE__) +#if 0 + // On macOS, Qt applies the Keypad modifier regardless of whether the arrow keys, or numpad was pressed. + // The only way to differentiate between the keypad and the arrow keys is by the text. + // Hopefully some keyboard layouts don't change the numpad positioning... + Qt::KeyboardModifiers modifiers = ev->modifiers(); + if (modifiers & Qt::KeypadModifier && key >= Qt::Key_Insert && key <= Qt::Key_PageDown) + { + if (ev->text().isEmpty()) + { + // Drop the modifier, because it's probably not actually a numpad push. + modifiers &= ~Qt::KeypadModifier; + } + } +#endif + + // Stored in virtual key not scancode. + if (scancode == 0) + scancode = ev->nativeVirtualKey(); + + // Undo Qt swapping of control/meta. + // It also can't differentiate between left and right control/meta keys... + const int qt_key = ev->key(); + switch (qt_key) + { + case Qt::Key_Shift: + return static_cast(USBKeyCode::ShiftLeft); + case Qt::Key_Meta: + return static_cast(USBKeyCode::ControlLeft); + case Qt::Key_Control: + return static_cast(USBKeyCode::MetaLeft); + case Qt::Key_Alt: + return static_cast(USBKeyCode::AltLeft); + case Qt::Key_CapsLock: + return static_cast(USBKeyCode::CapsLock); + default: + break; + } +#else + +#endif + + return InputManager::ConvertHostNativeKeyCodeToKeyCode(scancode); +} diff --git a/src/duckstation-qt/qtutils.h b/src/duckstation-qt/qtutils.h index 4b63fb0db..5580685f4 100644 --- a/src/duckstation-qt/qtutils.h +++ b/src/duckstation-qt/qtutils.h @@ -77,8 +77,7 @@ void SetColumnWidthsForTableView(QTableView* view, const std::initializer_list& widths); /// Returns a key id for a key event, including any modifiers that we need (e.g. Keypad). -/// NOTE: Defined in QtKeyCodes.cpp, not QtUtils.cpp. -u32 KeyEventToCode(const QKeyEvent* ev); +std::optional KeyEventToCode(const QKeyEvent* ev); /// Opens a URL with the default handler. void OpenURL(QWidget* parent, const QUrl& qurl); diff --git a/src/duckstation-regtest/regtest_host.cpp b/src/duckstation-regtest/regtest_host.cpp index 4e42cfec8..314c29107 100644 --- a/src/duckstation-regtest/regtest_host.cpp +++ b/src/duckstation-regtest/regtest_host.cpp @@ -690,21 +690,6 @@ void Host::OpenHostFileSelectorAsync(std::string_view title, bool select_directo callback(std::string()); } -std::optional InputManager::ConvertHostKeyboardStringToCode(std::string_view str) -{ - return std::nullopt; -} - -std::optional InputManager::ConvertHostKeyboardCodeToString(u32 code) -{ - return std::nullopt; -} - -const char* InputManager::ConvertHostKeyboardCodeToIcon(u32 code) -{ - return nullptr; -} - void Host::AddFixedInputBindings(const SettingsInterface& si) { // noop diff --git a/src/util/input_manager.cpp b/src/util/input_manager.cpp index a43a501aa..9c045c606 100644 --- a/src/util/input_manager.cpp +++ b/src/util/input_manager.cpp @@ -107,6 +107,14 @@ struct PointerAxisState float last_value; }; +struct KeyCodeData +{ + u32 usb_code; + u32 native_code; + const char* name; + const char* icon_name; +}; + } // namespace // ------------------------------------------------------------------------ @@ -144,6 +152,8 @@ static void UpdateMacroButtons(); static void UpdateInputSourceState(const SettingsInterface& si, std::unique_lock& settings_lock, InputSourceType type, std::unique_ptr (*factory_function)()); +static const KeyCodeData* FindKeyCodeData(u32 usb_code); + // ------------------------------------------------------------------------ // Tracking host mouse movement and turning into relative events // 4 axes: pointer left/right, wheel vertical/horizontal. Last/Next/Normalized. @@ -208,6 +218,20 @@ struct ALIGN_TO_CACHE_LINE State static State s_state; +static constexpr const std::array s_key_code_data = { +#if defined(_WIN32) +#define KEY_ENTRY(ename, usb, evdev, xkb, win, mac, name, icon_name) KeyCodeData{usb, win, name, icon_name}, +#elif defined(__APPLE__) +#define KEY_ENTRY(ename, usb, evdev, xkb, win, mac, name, icon_name) KeyCodeData{usb, mac, name, icon_name}, +#elif defined(__ANDROID__) +#define KEY_ENTRY(ename, usb, evdev, xkb, win, mac, name, icon_name) KeyCodeData{usb, evdev, name, icon_name}, +#else +#define KEY_ENTRY(ename, usb, evdev, xkb, win, mac, name, icon_name) KeyCodeData{usb, xkb, name, icon_name}, +#endif +#include "common/thirdparty/usb_key_code_data.inl" +#undef KEY_ENTRY +}; + } // namespace InputManager // ------------------------------------------------------------------------ @@ -617,6 +641,52 @@ InputBindingKey InputManager::MakeSensorAxisKey(InputSubclass sensor, u32 axis) return key; } +std::optional InputManager::ConvertHostKeyboardStringToCode(std::string_view str) +{ + for (const KeyCodeData& name : s_key_code_data) + { + if (str == name.name) + return name.usb_code; + } + + return std::nullopt; +} + +std::optional InputManager::ConvertHostKeyboardCodeToString(u32 code) +{ + std::optional ret; + + const KeyCodeData* key_data = FindKeyCodeData(code); + if (key_data) + ret.emplace(key_data->name); + + return ret; +} + +const InputManager::KeyCodeData* InputManager::FindKeyCodeData(u32 usb_code) +{ + const auto iter = std::lower_bound(s_key_code_data.begin(), s_key_code_data.end(), usb_code, + [](const auto& it, const auto& value) { return (it.usb_code < value); }); + return (iter != s_key_code_data.end() && iter->usb_code == usb_code) ? &(*iter) : nullptr; +} + +const char* InputManager::ConvertHostKeyboardCodeToIcon(u32 code) +{ + const KeyCodeData* key_data = FindKeyCodeData(code); + return key_data ? key_data->icon_name : nullptr; +} + +std::optional InputManager::ConvertHostNativeKeyCodeToKeyCode(u32 native_code) +{ + for (const KeyCodeData& name : s_key_code_data) + { + if (native_code == name.native_code) + return name.usb_code; + } + + return std::nullopt; +} + // ------------------------------------------------------------------------ // Bind Encoders // ------------------------------------------------------------------------ @@ -2141,10 +2211,10 @@ InputManager::VibrationMotorList InputManager::EnumerateVibrationMotors(std::opt static void GetKeyboardGenericBindingMapping(std::vector>* mapping) { - mapping->emplace_back(GenericInputBinding::DPadUp, "Keyboard/Up"); - mapping->emplace_back(GenericInputBinding::DPadRight, "Keyboard/Right"); - mapping->emplace_back(GenericInputBinding::DPadDown, "Keyboard/Down"); - mapping->emplace_back(GenericInputBinding::DPadLeft, "Keyboard/Left"); + mapping->emplace_back(GenericInputBinding::DPadUp, "Keyboard/UpArrow"); + mapping->emplace_back(GenericInputBinding::DPadRight, "Keyboard/RightArrow"); + mapping->emplace_back(GenericInputBinding::DPadDown, "Keyboard/DownArrow"); + mapping->emplace_back(GenericInputBinding::DPadLeft, "Keyboard/LeftArrow"); mapping->emplace_back(GenericInputBinding::LeftStickUp, "Keyboard/W"); mapping->emplace_back(GenericInputBinding::LeftStickRight, "Keyboard/D"); mapping->emplace_back(GenericInputBinding::LeftStickDown, "Keyboard/S"); @@ -2153,7 +2223,7 @@ static void GetKeyboardGenericBindingMapping(std::vectoremplace_back(GenericInputBinding::RightStickRight, "Keyboard/H"); mapping->emplace_back(GenericInputBinding::RightStickDown, "Keyboard/G"); mapping->emplace_back(GenericInputBinding::RightStickLeft, "Keyboard/F"); - mapping->emplace_back(GenericInputBinding::Start, "Keyboard/Return"); + mapping->emplace_back(GenericInputBinding::Start, "Keyboard/Enter"); mapping->emplace_back(GenericInputBinding::Select, "Keyboard/Backspace"); mapping->emplace_back(GenericInputBinding::Triangle, "Keyboard/I"); mapping->emplace_back(GenericInputBinding::Circle, "Keyboard/L"); diff --git a/src/util/input_manager.h b/src/util/input_manager.h index ab149c06a..365786e1f 100644 --- a/src/util/input_manager.h +++ b/src/util/input_manager.h @@ -237,6 +237,9 @@ std::optional ConvertHostKeyboardCodeToString(u32 code); /// Converts a key code from an identifier to an icon which can be drawn. const char* ConvertHostKeyboardCodeToIcon(u32 code); +/// Converts a native host key code to a USB key code. +std::optional ConvertHostNativeKeyCodeToKeyCode(u32 native_code); + /// Creates a key for a host-specific key code. InputBindingKey MakeHostKeyboardKey(u32 key_code);