InputManager: Use scancodes for key mapping

pull/3553/head
Stenzek 3 months ago
parent 08901c0638
commit c33131d153
No known key found for this signature in database

@ -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

@ -44,6 +44,7 @@
<ClInclude Include="thirdparty\aes.h" />
<ClInclude Include="thirdparty\SmallVector.h" />
<ClInclude Include="thirdparty\StackWalker.h" />
<ClInclude Include="thirdparty\usb_key_code_data.h" />
<ClInclude Include="threading.h" />
<ClInclude Include="task_queue.h" />
<ClInclude Include="timer.h" />
@ -101,6 +102,9 @@
<Project>{8be398e6-b882-4248-9065-fecc8728e038}</Project>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<None Include="thirdparty\usb_key_code_data.inl" />
</ItemGroup>
<ImportGroup Label="ExtensionTargets">
<Import Project="$(VCTargetsPath)\BuildCustomizations\marmasm.targets" />
<Import Project="$(VCTargetsPath)\BuildCustomizations\masm.targets" />

@ -54,6 +54,9 @@
<ClInclude Include="thirdparty\aes.h" />
<ClInclude Include="task_queue.h" />
<ClInclude Include="xorshift_prng.h" />
<ClInclude Include="thirdparty\usb_key_code_data.h">
<Filter>thirdparty</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="small_string.cpp" />
@ -104,4 +107,9 @@
<ItemGroup>
<MARMASM Include="fastjmp_arm.asm" />
</ItemGroup>
<ItemGroup>
<None Include="thirdparty\usb_key_code_data.inl">
<Filter>thirdparty</Filter>
</None>
</ItemGroup>
</Project>

@ -0,0 +1,236 @@
#pragma once
#include <cstdint>
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,
};

@ -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)

@ -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)

@ -3,7 +3,6 @@
<Import Project="..\..\dep\msvc\vsprops\Configurations.props" />
<ItemGroup>
<ClInclude Include="resource.h" />
<ClInclude Include="sdl_key_names.h" />
</ItemGroup>
<ItemGroup>
<Manifest Include="duckstation-mini.manifest" />

@ -2,7 +2,6 @@
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ClInclude Include="resource.h" />
<ClInclude Include="sdl_key_names.h" />
</ItemGroup>
<ItemGroup>
<Manifest Include="duckstation-mini.manifest" />

@ -1,8 +1,6 @@
// SPDX-FileCopyrightText: 2019-2025 Connor McLaughlin <stenzek@gmail.com>
// SPDX-License-Identifier: CC-BY-NC-ND-4.0
#include "sdl_key_names.h"
#include "scmversion/scmversion.h"
#include "core/achievements.h"
@ -831,11 +829,14 @@ void MiniHost::ProcessSDLEvent(const SDL_Event* ev)
case SDL_EVENT_KEY_DOWN:
case SDL_EVENT_KEY_UP:
{
Host::RunOnCPUThread([key_code = static_cast<u32>(ev->key.key), pressed = (ev->type == SDL_EVENT_KEY_DOWN)]() {
if (const std::optional<u32> 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;
case SDL_EVENT_TEXT_INPUT:
@ -1439,22 +1440,6 @@ std::string Host::FormatNumber(NumberFormatType type, double value)
return fmt::format("{}", value);
}
std::optional<u32> InputManager::ConvertHostKeyboardStringToCode(std::string_view str)
{
return SDLKeyNames::GetKeyCodeForName(str);
}
std::optional<std::string> InputManager::ConvertHostKeyboardCodeToString(u32 code)
{
const char* converted = SDLKeyNames::GetKeyName(code);
return converted ? std::optional<std::string>(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);

@ -1,265 +0,0 @@
// SPDX-FileCopyrightText: 2019-2024 Connor McLaughlin <stenzek@gmail.com>
// SPDX-License-Identifier: CC-BY-NC-ND-4.0
#pragma once
#include "common/types.h"
#include <cstring>
#include <map>
#include <optional>
#include <string_view>
#include "SDL3/SDL.h"
namespace SDLKeyNames {
inline const std::map<int, const char*> 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<u32> 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

@ -131,7 +131,6 @@ set(SRCS
postprocessingoverlayconfigwidget.ui
qthost.cpp
qthost.h
qtkeycodes.cpp
qtprogresscallback.cpp
qtprogresscallback.h
qtthemes.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<u32> key = QtUtils::KeyEventToCode(key_event))
emit windowKeyEvent(key.value(), pressed);
return true;
}

@ -65,7 +65,7 @@ private:
bool m_cursor_hidden = false;
bool m_destroying = false;
std::vector<u32> m_keys_pressed_with_modifiers;
std::vector<int> m_keys_pressed_with_modifiers;
u32 m_last_window_width = 0;
u32 m_last_window_height = 0;

@ -45,7 +45,6 @@
<ClCompile Include="postprocessingsettingswidget.cpp" />
<ClCompile Include="qtthemes.cpp" />
<ClCompile Include="qthost.cpp" />
<ClCompile Include="qtkeycodes.cpp" />
<ClCompile Include="qtprogresscallback.cpp" />
<ClCompile Include="qtutils.cpp" />
<ClCompile Include="selectdiscdialog.cpp" />

@ -28,7 +28,6 @@
<ClCompile Include="emulationsettingswidget.cpp" />
<ClCompile Include="achievementsettingswidget.cpp" />
<ClCompile Include="achievementlogindialog.cpp" />
<ClCompile Include="qtkeycodes.cpp" />
<ClCompile Include="controllerglobalsettingswidget.cpp" />
<ClCompile Include="controllersettingswindow.cpp" />
<ClCompile Include="controllerbindingwidgets.cpp" />

@ -86,7 +86,8 @@ bool InputBindingDialog::eventFilter(QObject* watched, QEvent* event)
else if (event_type == QEvent::KeyPress)
{
const QKeyEvent* key_event = static_cast<const QKeyEvent*>(event);
m_new_bindings.push_back(InputManager::MakeHostKeyboardKey(QtUtils::KeyEventToCode(key_event)));
if (const std::optional<u32> 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)

@ -111,7 +111,8 @@ bool InputBindingWidget::eventFilter(QObject* watched, QEvent* event)
else if (event_type == QEvent::KeyPress)
{
const QKeyEvent* key_event = static_cast<const QKeyEvent*>(event);
m_new_bindings.push_back(InputManager::MakeHostKeyboardKey(QtUtils::KeyEventToCode(key_event)));
if (const std::optional<u32> 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) &&

@ -1,538 +0,0 @@
// SPDX-FileCopyrightText: 2019-2024 Connor McLaughlin <stenzek@gmail.com>
// 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 <QtGui/QKeyEvent>
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<u32> 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<u32>(name.code) | modifier_bits;
}
return std::nullopt;
}
std::optional<std::string> InputManager::ConvertHostKeyboardCodeToString(u32 code)
{
std::optional<std::string> 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<int>(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<int>(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<u32>(key) | (static_cast<u32>(modifiers) & static_cast<u32>(Qt::KeypadModifier));
}

@ -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 <cstring>
#include <map>
#if !defined(_WIN32) && !defined(APPLE)
#include <qpa/qplatformnativeinterface.h>
#endif
#ifdef _WIN32
#if defined(_WIN32)
#include "common/windows_headers.h"
#elif defined(__APPLE__)
#include "common/thirdparty/usb_key_code_data.h"
#else
#include <qpa/qplatformnativeinterface.h>
#endif
LOG_CHANNEL(Host);
@ -571,3 +572,58 @@ bool QtUtils::TryMigrateWindowGeometry(SettingsInterface* si, std::string_view w
Host::CommitBaseSettingChanges();
return true;
}
std::optional<u32> 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<u32>(USBKeyCode::ShiftLeft);
case Qt::Key_Meta:
return static_cast<u32>(USBKeyCode::ControlLeft);
case Qt::Key_Control:
return static_cast<u32>(USBKeyCode::MetaLeft);
case Qt::Key_Alt:
return static_cast<u32>(USBKeyCode::AltLeft);
case Qt::Key_CapsLock:
return static_cast<u32>(USBKeyCode::CapsLock);
default:
break;
}
#else
#endif
return InputManager::ConvertHostNativeKeyCodeToKeyCode(scancode);
}

@ -77,8 +77,7 @@ void SetColumnWidthsForTableView(QTableView* view, const std::initializer_list<i
void SetColumnWidthsForTreeView(QTreeView* view, const std::initializer_list<int>& 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<u32> KeyEventToCode(const QKeyEvent* ev);
/// Opens a URL with the default handler.
void OpenURL(QWidget* parent, const QUrl& qurl);

@ -690,21 +690,6 @@ void Host::OpenHostFileSelectorAsync(std::string_view title, bool select_directo
callback(std::string());
}
std::optional<u32> InputManager::ConvertHostKeyboardStringToCode(std::string_view str)
{
return std::nullopt;
}
std::optional<std::string> InputManager::ConvertHostKeyboardCodeToString(u32 code)
{
return std::nullopt;
}
const char* InputManager::ConvertHostKeyboardCodeToIcon(u32 code)
{
return nullptr;
}
void Host::AddFixedInputBindings(const SettingsInterface& si)
{
// noop

@ -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<std::mutex>& settings_lock,
InputSourceType type, std::unique_ptr<InputSource> (*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<u32> 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<std::string> InputManager::ConvertHostKeyboardCodeToString(u32 code)
{
std::optional<std::string> 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<u32> 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<std::pair<GenericInputBinding, std::string>>* 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::vector<std::pair<GenericInputB
mapping->emplace_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");

@ -237,6 +237,9 @@ std::optional<std::string> 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<u32> ConvertHostNativeKeyCodeToKeyCode(u32 native_code);
/// Creates a key for a host-specific key code.
InputBindingKey MakeHostKeyboardKey(u32 key_code);

Loading…
Cancel
Save