FullscreenUI: Use PromptFont for keyboard/controller icons

This commit is contained in:
Stenzek 2023-12-11 01:28:55 +10:00 committed by Connor McLaughlin
parent 5413765a23
commit af1a4ab07a
34 changed files with 1637 additions and 856 deletions

328
3rdparty/include/IconsPromptFont.h vendored Normal file
View File

@ -0,0 +1,328 @@
#pragma once
#define ICON_PF_EXCHANGE "\xE2\x86\x94"
#define ICON_PF_REVERSE "\xE2\x86\x95"
#define ICON_PF_LEFT_TRIGGER_LT "\xE2\x86\x96"
#define ICON_PF_RIGHT_TRIGGER_RT "\xE2\x86\x97"
#define ICON_PF_LEFT_SHOULDER_LB "\xE2\x86\x98"
#define ICON_PF_RIGHT_SHOULDER_RB "\xE2\x86\x99"
#define ICON_PF_LEFT_TRIGGER_ZL "\xE2\x86\x9A"
#define ICON_PF_RIGHT_TRIGGER_ZR "\xE2\x86\x9B"
#define ICON_PF_LEFT_SHOULDER_L "\xE2\x86\x9C"
#define ICON_PF_RIGHT_SHOULDER_R "\xE2\x86\x9D"
#define ICON_PF_DPAD_LEFT "\xE2\x86\x9E"
#define ICON_PF_DPAD_UP "\xE2\x86\x9F"
#define ICON_PF_DPAD_RIGHT "\xE2\x86\xA0"
#define ICON_PF_DPAD_DOWN "\xE2\x86\xA1"
#define ICON_PF_DPAD_LEFT_RIGHT "\xE2\x86\xA2"
#define ICON_PF_DPAD_UP_DOWN "\xE2\x86\xA3"
#define ICON_PF_BUTTON_LEFT_X "\xE2\x86\xA4"
#define ICON_PF_BUTTON_UP_Y "\xE2\x86\xA5"
#define ICON_PF_BUTTON_RIGHT_B "\xE2\x86\xA6"
#define ICON_PF_BUTTON_DOWN_A "\xE2\x86\xA7"
#define ICON_PF_LEFT_ANALOG_CLOCKWISE "\xE2\x86\xA9"
#define ICON_PF_LEFT_ANALOG_COUNTER "\xE2\x86\xAA"
#define ICON_PF_RIGHT_ANALOG_CLOCKWISE "\xE2\x86\xAB"
#define ICON_PF_RIGHT_ANALOG_COUNTER "\xE2\x86\xAC"
#define ICON_PF_BOTH_ANALOG_CLOCKWISE "\xE2\x86\xAD"
#define ICON_PF_BOTH_ANALOG_COUNTER "\xE2\x86\xAE"
#define ICON_PF_LEFT_SHOULDER_L1 "\xE2\x86\xB0"
#define ICON_PF_RIGHT_SHOULDER_R1 "\xE2\x86\xB1"
#define ICON_PF_LEFT_TRIGGER_L2 "\xE2\x86\xB2"
#define ICON_PF_RIGHT_TRIGGER_R2 "\xE2\x86\xB3"
#define ICON_PF_DPAD_LEFT_DOWN "\xE2\x86\xB4"
#define ICON_PF_DPAD_UP_RIGHT "\xE2\x86\xB5"
#define ICON_PF_ANALOG_CLOCKWISE "\xE2\x86\xB6"
#define ICON_PF_ANALOG_COUNTER "\xE2\x86\xB7"
#define ICON_PF_BOTH_ANALOG_CLICK "\xE2\x86\xB9"
#define ICON_PF_LEFT_ANALOG_CLICK "\xE2\x86\xBA"
#define ICON_PF_RIGHT_ANALOG_CLICK "\xE2\x86\xBB"
#define ICON_PF_LEFT_ANALOG_LEFT "\xE2\x86\xBC"
#define ICON_PF_RIGHT_ANALOG_LEFT "\xE2\x86\xBD"
#define ICON_PF_LEFT_ANALOG_UP "\xE2\x86\xBE"
#define ICON_PF_RIGHT_ANALOG_UP "\xE2\x86\xBF"
#define ICON_PF_LEFT_ANALOG_RIGHT "\xE2\x87\x80"
#define ICON_PF_RIGHT_ANALOG_RIGHT "\xE2\x87\x81"
#define ICON_PF_LEFT_ANALOG_DOWN "\xE2\x87\x82"
#define ICON_PF_RIGHT_ANALOG_DOWN "\xE2\x87\x83"
#define ICON_PF_LEFT_ANALOG_LEFT_RIGHT "\xE2\x87\x84"
#define ICON_PF_LEFT_ANALOG_UP_DOWN "\xE2\x87\x85"
#define ICON_PF_RIGHT_ANALOG_LEFT_RIGHT "\xE2\x87\x86"
#define ICON_PF_ANALOG_LEFT "\xE2\x87\x87"
#define ICON_PF_ANALOG_UP "\xE2\x87\x88"
#define ICON_PF_ANALOG_RIGHT "\xE2\x87\x89"
#define ICON_PF_ANALOG_DOWN "\xE2\x87\x8A"
#define ICON_PF_LEFT_ANALOG "\xE2\x87\x8B"
#define ICON_PF_RIGHT_ANALOG "\xE2\x87\x8C"
#define ICON_PF_DPAD "\xE2\x87\x8E"
#define ICON_PF_BUTTON_X "\xE2\x87\x90"
#define ICON_PF_BUTTON_Y "\xE2\x87\x91"
#define ICON_PF_BUTTON_B "\xE2\x87\x92"
#define ICON_PF_BUTTON_A "\xE2\x87\x93"
#define ICON_PF_ANALOG_LEFT_RIGHT "\xE2\x87\x94"
#define ICON_PF_ANALOG_UP_DOWN "\xE2\x87\x95"
#define ICON_PF_ANALOG_UP_LEFT "\xE2\x87\x96"
#define ICON_PF_ANALOG_UP_RIGHT "\xE2\x87\x97"
#define ICON_PF_ANALOG_DOWN_RIGHT "\xE2\x87\x98"
#define ICON_PF_ANALOG_DOWN_LEFT "\xE2\x87\x99"
#define ICON_PF_LEFT_ANALOG_TOUCH "\xE2\x87\x9A"
#define ICON_PF_RIGHT_ANALOG_TOUCH "\xE2\x87\x9B"
#define ICON_PF_LEFT_TRIGGER_PULL "\xE2\x87\x9C"
#define ICON_PF_RIGHT_TRIGGER_PULL "\xE2\x87\x9D"
#define ICON_PF_DPAD_RIGHT_DOWN "\xE2\x87\x9E"
#define ICON_PF_DPAD_LEFT_UP "\xE2\x87\x9F"
#define ICON_PF_BUTTON_SQUARE "\xE2\x87\xA0"
#define ICON_PF_BUTTON_TRIANGLE "\xE2\x87\xA1"
#define ICON_PF_BUTTON_CIRCLE "\xE2\x87\xA2"
#define ICON_PF_BUTTON_CROSS "\xE2\x87\xA3"
#define ICON_PF_STEAM_MENU "\xE2\x87\xA4"
#define ICON_PF_OPTIONS_MENU "\xE2\x87\xA5"
#define ICON_PF_DUALSHOCK_SHARE "\xE2\x87\xA6"
#define ICON_PF_DUALSHOCK_TOUCHPAD "\xE2\x87\xA7"
#define ICON_PF_DUALSHOCK_OPTIONS "\xE2\x87\xA8"
#define ICON_PF_GAMECUBE_Z "\xE2\x87\xA9"
#define ICON_PF_BACK_TRIGGER_Z "\xE2\x87\xAA"
#define ICON_PF_BUTTON_C "\xE2\x87\xAB"
#define ICON_PF_BUTTON_Z "\xE2\x87\xAC"
#define ICON_PF_BUTTON_ALT_1 "\xE2\x87\xAD"
#define ICON_PF_BUTTON_ALT_2 "\xE2\x87\xAE"
#define ICON_PF_LEFT_ANALOG_ANY "\xE2\x87\xB1"
#define ICON_PF_RIGHT_ANALOG_ANY "\xE2\x87\xB2"
#define ICON_PF_ANALOG_ANY "\xE2\x87\xB3"
#define ICON_PF_RIGHT_ANALOG_UP_DOWN "\xE2\x87\xB5"
#define ICON_PF_SELECT_SHARE "\xE2\x87\xB7"
#define ICON_PF_START "\xE2\x87\xB8"
#define ICON_PF_HOME_MENU "\xE2\x87\xB9"
#define ICON_PF_SHARE_CAPTURE "\xE2\x87\xBA"
#define ICON_PF_BURGER_MENU "\xE2\x87\xBB"
#define ICON_PF_MINUS "\xE2\x87\xBD"
#define ICON_PF_PLUS "\xE2\x87\xBE"
#define ICON_PF_JOYCON_DPAD_LEFT "\xE2\x87\xBF"
#define ICON_PF_JOYCON_DPAD_UP "\xE2\x88\x80"
#define ICON_PF_JOYCON_DPAD_RIGHT "\xE2\x88\x81"
#define ICON_PF_JOYCON_DPAD_DOWN "\xE2\x88\x82"
#define ICON_PF_JOYCON_SL "\xE2\x88\x83"
#define ICON_PF_JOYCON_SR "\xE2\x88\x84"
#define ICON_PF_LENOVO_LEGION_QUICK_SETTINGS "\xE2\x88\x85"
#define ICON_PF_DUALSENSE_SHARE "\xE2\x88\x86"
#define ICON_PF_DUALSENSE_TOUCHPAD "\xE2\x88\x87"
#define ICON_PF_DUALSENSE_OPTIONS "\xE2\x88\x88"
#define ICON_PF_AYANEO_LC "\xE2\x88\x89"
#define ICON_PF_AYANEO_RC "\xE2\x88\x8A"
#define ICON_PF_AYANEO_WAVE "\xE2\x88\x8B"
#define ICON_PF_AYN_HOME "\xE2\x88\x8C"
#define ICON_PF_AYN_LCC "\xE2\x88\x8D"
#define ICON_PF_GPD_C1 "\xE2\x88\x8E"
#define ICON_PF_GPD_C2 "\xE2\x88\x8F"
#define ICON_PF_ONEXPLAYER_KEYBOARD "\xE2\x88\x90"
#define ICON_PF_ONEXPLAYER_TURBO "\xE2\x88\x91"
#define ICON_PF_ROG_ALLY_M1 "\xE2\x88\x92"
#define ICON_PF_ROG_ALLY_M2 "\xE2\x88\x93"
#define ICON_PF_LEFT_TRACKPAD_ANY "\xE2\x89\xA4"
#define ICON_PF_RIGHT_TRACKPAD_ANY "\xE2\x89\xA5"
#define ICON_PF_LEFT_TRACKPAD_CLICK "\xE2\x89\xA6"
#define ICON_PF_RIGHT_TRACKPAD_CLICK "\xE2\x89\xA7"
#define ICON_PF_LEFT_TRACKPAD_TOUCH "\xE2\x89\xA8"
#define ICON_PF_RIGHT_TRACKPAD_TOUCH "\xE2\x89\xA9"
#define ICON_PF_LEFT_TRACKPAD_LEFT "\xE2\x89\xAE"
#define ICON_PF_RIGHT_TRACKPAD_LEFT "\xE2\x89\xAF"
#define ICON_PF_LEFT_TRACKPAD_UP "\xE2\x89\xB0"
#define ICON_PF_RIGHT_TRACKPAD_UP "\xE2\x89\xB1"
#define ICON_PF_LEFT_TRACKPAD_RIGHT "\xE2\x89\xB2"
#define ICON_PF_RIGHT_TRACKPAD_RIGHT "\xE2\x89\xB3"
#define ICON_PF_LEFT_TRACKPAD_DOWN "\xE2\x89\xB4"
#define ICON_PF_RIGHT_TRACKPAD_DOWN "\xE2\x89\xB5"
#define ICON_PF_STEAMDECK_L4 "\xE2\x89\xB6"
#define ICON_PF_STEAMDECK_R4 "\xE2\x89\xB7"
#define ICON_PF_STEAMDECK_L5 "\xE2\x89\xB8"
#define ICON_PF_STEAMDECK_R5 "\xE2\x89\xB9"
#define ICON_PF_XBOX_DPAD_LEFT "\xE2\x89\xBA"
#define ICON_PF_XBOX_DPAD_UP "\xE2\x89\xBB"
#define ICON_PF_XBOX_DPAD_RIGHT "\xE2\x89\xBC"
#define ICON_PF_XBOX_DPAD_DOWN "\xE2\x89\xBD"
#define ICON_PF_XBOX_DPAD_LEFT_RIGHT "\xE2\x89\xBE"
#define ICON_PF_XBOX_DPAD_UP_DOWN "\xE2\x89\xBF"
#define ICON_PF_XBOX_DPAD_LEFT_UP "\xE2\x8A\x80"
#define ICON_PF_XBOX_DPAD_RIGHT_UP "\xE2\x8A\x81"
#define ICON_PF_XBOX_DPAD_LEFT_DOWN "\xE2\x8A\x82"
#define ICON_PF_XBOX_DPAD_RIGHT_DOWN "\xE2\x8A\x83"
#define ICON_PF_XBOX_DPAD "\xE2\x8A\x84"
#define ICON_PF_PIN "\xE2\x8C\x96"
#define ICON_PF_TABS "\xE2\x8F\x8D"
#define ICON_PF_BACK "\xE2\x8F\x8E"
#define ICON_PF_HOME_SCREEN "\xE2\x8F\x8F"
#define ICON_PF_HORIZONTAL_DOTS "\xE2\x8F\x90"
#define ICON_PF_VERTICAL_DOTS "\xE2\x8F\x91"
#define ICON_PF_HAMBURGER_MENU "\xE2\x8F\x92"
#define ICON_PF_ARROW_LEFT "\xE2\x8F\xB4"
#define ICON_PF_ARROW_UP "\xE2\x8F\xB5"
#define ICON_PF_ARROW_RIGHT "\xE2\x8F\xB6"
#define ICON_PF_ARROW_DOWN "\xE2\x8F\xB7"
#define ICON_PF_WASD "\xE2\x90\xA3"
#define ICON_PF_ARROW_KEYS "\xE2\x90\xA4"
#define ICON_PF_IJKL "\xE2\x90\xA5"
#define ICON_PF_FN "\xE2\x90\xA6"
#define ICON_PF_CTRL "\xE2\x90\xA7"
#define ICON_PF_ALT "\xE2\x90\xA8"
#define ICON_PF_SHIFT "\xE2\x90\xA9"
#define ICON_PF_SUPER "\xE2\x90\xAA"
#define ICON_PF_TAB "\xE2\x90\xAB"
#define ICON_PF_CAPS "\xE2\x90\xAC"
#define ICON_PF_BACKSPACE "\xE2\x90\xAD"
#define ICON_PF_ENTER "\xE2\x90\xAE"
#define ICON_PF_ESC "\xE2\x90\xAF"
#define ICON_PF_PRTSC "\xE2\x90\xB0"
#define ICON_PF_SCRLK "\xE2\x90\xB1"
#define ICON_PF_PAUSE "\xE2\x90\xB2"
#define ICON_PF_NUMLOCK "\xE2\x90\xB3"
#define ICON_PF_INSERT "\xE2\x90\xB4"
#define ICON_PF_HOME "\xE2\x90\xB5"
#define ICON_PF_PAGE_UP "\xE2\x90\xB6"
#define ICON_PF_DELETE "\xE2\x90\xB7"
#define ICON_PF_END "\xE2\x90\xB8"
#define ICON_PF_PAGE_DOWN "\xE2\x90\xB9"
#define ICON_PF_SPACE "\xE2\x90\xBA"
#define ICON_PF_GAMEPAD "\xE2\x90\xBC"
#define ICON_PF_KEYBOARD "\xE2\x90\xBD"
#define ICON_PF_MOUSE "\xE2\x90\xBE"
#define ICON_PF_MOUSE_AND_KEYBOARD "\xE2\x90\xBF"
#define ICON_PF_F1 "\xE2\x91\xA0"
#define ICON_PF_F2 "\xE2\x91\xA1"
#define ICON_PF_F3 "\xE2\x91\xA2"
#define ICON_PF_F4 "\xE2\x91\xA3"
#define ICON_PF_F5 "\xE2\x91\xA4"
#define ICON_PF_F6 "\xE2\x91\xA5"
#define ICON_PF_F7 "\xE2\x91\xA6"
#define ICON_PF_F8 "\xE2\x91\xA7"
#define ICON_PF_F9 "\xE2\x91\xA8"
#define ICON_PF_F10 "\xE2\x91\xA9"
#define ICON_PF_F11 "\xE2\x91\xAA"
#define ICON_PF_F12 "\xE2\x91\xAB"
#define ICON_PF_EMPTY_KEYCAP "\xE2\x92\x8F"
#define ICON_PF_1 "\xE2\x93\xB5"
#define ICON_PF_2 "\xE2\x93\xB6"
#define ICON_PF_3 "\xE2\x93\xB7"
#define ICON_PF_4 "\xE2\x93\xB8"
#define ICON_PF_5 "\xE2\x93\xB9"
#define ICON_PF_6 "\xE2\x93\xBA"
#define ICON_PF_7 "\xE2\x93\xBB"
#define ICON_PF_8 "\xE2\x93\xBC"
#define ICON_PF_9 "\xE2\x93\xBD"
#define ICON_PF_0 "\xE2\x93\xBF"
#define ICON_PF_STAR "\xE2\x98\x85"
#define ICON_PF_SKULL "\xE2\x98\xA0"
#define ICON_PF_FROWN "\xE2\x98\xB9"
#define ICON_PF_SMILE "\xE2\x98\xBA"
#define ICON_PF_EMPTY_HEART "\xE2\x99\xA1"
#define ICON_PF_HEART "\xE2\x99\xA5"
#define ICON_PF_D4 "\xE2\x99\xB3"
#define ICON_PF_D6 "\xE2\x99\xB4"
#define ICON_PF_D8 "\xE2\x99\xB5"
#define ICON_PF_D10 "\xE2\x99\xB6"
#define ICON_PF_D12 "\xE2\x99\xB7"
#define ICON_PF_D20 "\xE2\x99\xB8"
#define ICON_PF_D6_1 "\xE2\x9A\x80"
#define ICON_PF_D6_2 "\xE2\x9A\x81"
#define ICON_PF_D6_3 "\xE2\x9A\x82"
#define ICON_PF_D6_4 "\xE2\x9A\x83"
#define ICON_PF_D6_5 "\xE2\x9A\x84"
#define ICON_PF_D6_6 "\xE2\x9A\x85"
#define ICON_PF_FLAG "\xE2\x9A\x91"
#define ICON_PF_GEARS_OPTIONS_SETTINGS "\xE2\x9A\x99"
#define ICON_PF_CROSS "\xE2\x9C\x97"
#define ICON_PF_QUESTION "\xE2\x9D\x93"
#define ICON_PF_EXCLAMATION "\xE2\x9D\x97"
#define ICON_PF_MOUSE_BUTTON_1 "\xE2\x9E\x8A"
#define ICON_PF_MOUSE_BUTTON_2 "\xE2\x9E\x8B"
#define ICON_PF_MOUSE_BUTTON_3 "\xE2\x9E\x8C"
#define ICON_PF_MOUSE_BUTTON_4 "\xE2\x9E\x8D"
#define ICON_PF_MOUSE_BUTTON_5 "\xE2\x9E\x8E"
#define ICON_PF_MOUSE_BUTTON_6 "\xE2\x9E\x8F"
#define ICON_PF_MOUSE_BUTTON_7 "\xE2\x9E\x90"
#define ICON_PF_MOUSE_BUTTON_8 "\xE2\x9E\x91"
#define ICON_PF_SCROLL_UP "\xE2\x9F\xB0"
#define ICON_PF_SCROLL_DOWN "\xE2\x9F\xB1"
#define ICON_PF_LEFT_CLICK "\xE2\x9F\xB5"
#define ICON_PF_RIGHT_CLICK "\xE2\x9F\xB6"
#define ICON_PF_MIDDLE_CLICK "\xE2\x9F\xB7"
#define ICON_PF_MOUSE_LEFT_RIGHT "\xE2\x9F\xBA"
#define ICON_PF_MOUSE_UP_DOWN "\xE2\x9F\xBB"
#define ICON_PF_MOUSE_ANY "\xE2\x9F\xBC"
#define ICON_PF_BOX_CRATE "\xE2\xAC\x9B"
#define ICON_PF_PLAYSTATION "\xEE\x80\x80"
#define ICON_PF_XBOX "\xEE\x80\x81"
#define ICON_PF_NINTENDO_SWITCH "\xEE\x80\x82"
#define ICON_PF_AYANEO "\xEE\x80\x83"
#define ICON_PF_LENOVO_LEGION "\xEE\x80\x84"
#define ICON_PF_ROG_ALLY_ARMOURY "\xEE\x80\x85"
#define ICON_PF_ROG_ALLOY_COMMAND "\xEE\x80\x86"
#define ICON_PF_APPLE_MAC "\xEE\x80\x87"
#define ICON_PF_WINDOWS "\xEE\x80\x88"
#define ICON_PF_LINUX "\xEE\x80\x89"
#define ICON_PF_BSD "\xEE\x80\x8A"
#define ICON_PF_KEY_0 "\xEF\xBC\x90"
#define ICON_PF_KEY_1 "\xEF\xBC\x91"
#define ICON_PF_KEY_2 "\xEF\xBC\x92"
#define ICON_PF_KEY_3 "\xEF\xBC\x93"
#define ICON_PF_KEY_4 "\xEF\xBC\x94"
#define ICON_PF_KEY_5 "\xEF\xBC\x95"
#define ICON_PF_KEY_6 "\xEF\xBC\x96"
#define ICON_PF_KEY_7 "\xEF\xBC\x97"
#define ICON_PF_KEY_8 "\xEF\xBC\x98"
#define ICON_PF_KEY_9 "\xEF\xBC\x99"
#define ICON_PF_KEY_A "\xEF\xBC\xA1"
#define ICON_PF_KEY_B "\xEF\xBC\xA2"
#define ICON_PF_KEY_C "\xEF\xBC\xA3"
#define ICON_PF_KEY_D "\xEF\xBC\xA4"
#define ICON_PF_KEY_E "\xEF\xBC\xA5"
#define ICON_PF_KEY_F "\xEF\xBC\xA6"
#define ICON_PF_KEY_G "\xEF\xBC\xA7"
#define ICON_PF_KEY_H "\xEF\xBC\xA8"
#define ICON_PF_KEY_I "\xEF\xBC\xA9"
#define ICON_PF_KEY_J "\xEF\xBC\xAA"
#define ICON_PF_KEY_K "\xEF\xBC\xAB"
#define ICON_PF_KEY_L "\xEF\xBC\xAC"
#define ICON_PF_KEY_M "\xEF\xBC\xAD"
#define ICON_PF_KEY_N "\xEF\xBC\xAE"
#define ICON_PF_KEY_O "\xEF\xBC\xAF"
#define ICON_PF_KEY_P "\xEF\xBC\xB0"
#define ICON_PF_KEY_Q "\xEF\xBC\xB1"
#define ICON_PF_KEY_R "\xEF\xBC\xB2"
#define ICON_PF_KEY_S "\xEF\xBC\xB3"
#define ICON_PF_KEY_T "\xEF\xBC\xB4"
#define ICON_PF_KEY_U "\xEF\xBC\xB5"
#define ICON_PF_KEY_V "\xEF\xBC\xB6"
#define ICON_PF_KEY_W "\xEF\xBC\xB7"
#define ICON_PF_KEY_X "\xEF\xBC\xB8"
#define ICON_PF_KEY_Y "\xEF\xBC\xB9"
#define ICON_PF_KEY_Z "\xEF\xBC\xBA"
#define ICON_PF_HEADPHONES "\xF0\x9F\x8E\xA7"
#define ICON_PF_MUSIC "\xF0\x9F\x8E\xB6"
#define ICON_PF_FISH "\xF0\x9F\x90\x9F"
#define ICON_PF_DANCE_PAD "\xF0\x9F\x92\x83"
#define ICON_PF_LAPTOP "\xF0\x9F\x92\xBB"
#define ICON_PF_DISKETTE "\xF0\x9F\x92\xBE"
#define ICON_PF_WRITE "\xF0\x9F\x93\x9D"
#define ICON_PF_PHONE "\xF0\x9F\x93\xB1"
#define ICON_PF_CAMERA "\xF0\x9F\x93\xB7"
#define ICON_PF_SPEAKER "\xF0\x9F\x94\x88"
#define ICON_PF_LIGHT_GUN "\xF0\x9F\x94\xAB"
#define ICON_PF_SFX_SOUND_EFFECT_NOISE "\xF0\x9F\x95\xAC"
#define ICON_PF_STEERING_WHEEL "\xF0\x9F\x95\xB8"
#define ICON_PF_FIGHT_STICK_JOYSTICK "\xF0\x9F\x95\xB9"
#define ICON_PF_VR_HEADSET "\xF0\x9F\x95\xBB"
#define ICON_PF_VR_CONTROLLER "\xF0\x9F\x95\xBC"
#define ICON_PF_FLIGHT_STICK "\xF0\x9F\x95\xBD"
#define ICON_PF_CPU_PROCESSOR "\xF0\x9F\x96\xA5"
#define ICON_PF_WEB_INTERNET_LINK "\xF0\x9F\x96\xA7"
#define ICON_PF_GPU_GRAPHICS_CARD "\xF0\x9F\x96\xA8"
#define ICON_PF_RAM_MEMORY "\xF0\x9F\x96\xAA"
#define ICON_PF_USB_STICK "\xF0\x9F\x96\xAB"
#define ICON_PF_DATABASE "\xF0\x9F\x96\xAC"
#define ICON_PF_HARD_DISK_DRIVE "\xF0\x9F\x96\xB4"
#define ICON_PF_SCREEN_VIDEO "\xF0\x9F\x96\xB5"
#define ICON_PF_TEXT_ENTRY_EDIT "\xF0\x9F\x96\xB9"
#define ICON_PF_SPEAKING_VOICE "\xF0\x9F\x97\xA3"
#define ICON_PF_LANGUAGE "\xF0\x9F\x97\xA9"
#define ICON_PF_EXIT_QUIT_LEAVE "\xF0\x9F\x9A\xAA"
#define ICON_PF_INFORMATION "\xF0\x9F\x9B\x88"
#define ICON_PF_SHOPPING_CART "\xF0\x9F\x9B\x92"

View File

@ -0,0 +1,91 @@
This Font Software is licensed under the SIL Open Font License,
Version 1.1. This license is copied below, and is also available
with a FAQ at <http: //scripts.sil.org/OFL>
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

Binary file not shown.

View File

@ -393,6 +393,11 @@ std::optional<std::string> InputManager::ConvertHostKeyboardCodeToString(u32 cod
return std::nullopt; return std::nullopt;
} }
const char* InputManager::ConvertHostKeyboardCodeToIcon(u32 code)
{
return nullptr;
}
BEGIN_HOTKEY_LIST(g_host_hotkeys) BEGIN_HOTKEY_LIST(g_host_hotkeys)
END_HOTKEY_LIST() END_HOTKEY_LIST()

View File

@ -1,5 +1,5 @@
/* PCSX2 - PS2 Emulator for PCs /* PCSX2 - PS2 Emulator for PCs
* Copyright (C) 2002-2022 PCSX2 Dev Team * Copyright (C) 2002-2023 PCSX2 Dev Team
* *
* PCSX2 is free software: you can redistribute it and/or modify it under the terms * PCSX2 is free software: you can redistribute it and/or modify it under the terms
* of the GNU Lesser General Public License as published by the Free Software Found- * of the GNU Lesser General Public License as published by the Free Software Found-
@ -21,457 +21,460 @@
#include "common/StringUtil.h" #include "common/StringUtil.h"
#include "IconsPromptFont.h"
#include <QtGui/QKeyEvent> #include <QtGui/QKeyEvent>
struct KeyCodeName struct KeyCodeName
{ {
int code; int code;
const char* name; const char* name;
const char* icon_name;
}; };
static constexpr KeyCodeName s_qt_key_names[] = { static constexpr const KeyCodeName s_qt_key_names[] = {
{Qt::Key_Escape, "Escape"}, {Qt::Key_Escape, "Escape", ICON_PF_ESC},
{Qt::Key_Tab, "Tab"}, {Qt::Key_Tab, "Tab", ICON_PF_TAB},
{Qt::Key_Backtab, "Backtab"}, {Qt::Key_Backtab, "Backtab", nullptr},
{Qt::Key_Backspace, "Backspace"}, {Qt::Key_Backspace, "Backspace", ICON_PF_BACKSPACE},
{Qt::Key_Return, "Return"}, {Qt::Key_Return, "Return", ICON_PF_ENTER},
{Qt::Key_Enter, "Enter"}, {Qt::Key_Enter, "Enter", ICON_PF_ENTER},
{Qt::Key_Insert, "Insert"}, {Qt::Key_Insert, "Insert", ICON_PF_INSERT},
{Qt::Key_Delete, "Delete"}, {Qt::Key_Delete, "Delete", ICON_PF_DELETE},
{Qt::Key_Pause, "Pause"}, {Qt::Key_Pause, "Pause", ICON_PF_PAUSE},
{Qt::Key_Print, "Print"}, {Qt::Key_Print, "Print", ICON_PF_PRTSC},
{Qt::Key_SysReq, "SysReq"}, {Qt::Key_SysReq, "SysReq", ICON_PF_PAUSE},
{Qt::Key_Clear, "Clear"}, {Qt::Key_Clear, "Clear", nullptr},
{Qt::Key_Home, "Home"}, {Qt::Key_Home, "Home", ICON_PF_HOME},
{Qt::Key_End, "End"}, {Qt::Key_End, "End", ICON_PF_END},
{Qt::Key_Left, "Left"}, {Qt::Key_Left, "Left", ICON_PF_ARROW_LEFT},
{Qt::Key_Up, "Up"}, {Qt::Key_Up, "Up", ICON_PF_ARROW_UP},
{Qt::Key_Right, "Right"}, {Qt::Key_Right, "Right", ICON_PF_ARROW_RIGHT},
{Qt::Key_Down, "Down"}, {Qt::Key_Down, "Down", ICON_PF_ARROW_DOWN},
{Qt::Key_PageUp, "PageUp"}, {Qt::Key_PageUp, "PageUp", ICON_PF_PAGE_UP},
{Qt::Key_PageDown, "PageDown"}, {Qt::Key_PageDown, "PageDown", ICON_PF_PAGE_DOWN},
{Qt::Key_Shift, "Shift"}, {Qt::Key_Shift, "Shift", ICON_PF_SHIFT},
{Qt::Key_Control, "Control"}, {Qt::Key_Control, "Control", ICON_PF_CTRL},
{Qt::Key_Meta, "Meta"}, {Qt::Key_Meta, "Meta", ICON_PF_SUPER},
{Qt::Key_Alt, "Alt"}, {Qt::Key_Alt, "Alt", ICON_PF_ALT},
{Qt::Key_CapsLock, "CapsLock"}, {Qt::Key_CapsLock, "CapsLock", ICON_PF_CAPS},
{Qt::Key_NumLock, "NumLock"}, {Qt::Key_NumLock, "NumLock", ICON_PF_NUMLOCK},
{Qt::Key_ScrollLock, "ScrollLock"}, {Qt::Key_ScrollLock, "ScrollLock", ICON_PF_SCRLK},
{Qt::Key_F1, "F1"}, {Qt::Key_F1, "F1", ICON_PF_F1},
{Qt::Key_F2, "F2"}, {Qt::Key_F2, "F2", ICON_PF_F2},
{Qt::Key_F3, "F3"}, {Qt::Key_F3, "F3", ICON_PF_F3},
{Qt::Key_F4, "F4"}, {Qt::Key_F4, "F4", ICON_PF_F4},
{Qt::Key_F5, "F5"}, {Qt::Key_F5, "F5", ICON_PF_F5},
{Qt::Key_F6, "F6"}, {Qt::Key_F6, "F6", ICON_PF_F6},
{Qt::Key_F7, "F7"}, {Qt::Key_F7, "F7", ICON_PF_F7},
{Qt::Key_F8, "F8"}, {Qt::Key_F8, "F8", ICON_PF_F8},
{Qt::Key_F9, "F9"}, {Qt::Key_F9, "F9", ICON_PF_F9},
{Qt::Key_F10, "F10"}, {Qt::Key_F10, "F10", ICON_PF_F10},
{Qt::Key_F11, "F11"}, {Qt::Key_F11, "F11", ICON_PF_F11},
{Qt::Key_F12, "F12"}, {Qt::Key_F12, "F12", ICON_PF_F12},
{Qt::Key_F13, "F13"}, {Qt::Key_F13, "F13", nullptr},
{Qt::Key_F14, "F14"}, {Qt::Key_F14, "F14", nullptr},
{Qt::Key_F15, "F15"}, {Qt::Key_F15, "F15", nullptr},
{Qt::Key_F16, "F16"}, {Qt::Key_F16, "F16", nullptr},
{Qt::Key_F17, "F17"}, {Qt::Key_F17, "F17", nullptr},
{Qt::Key_F18, "F18"}, {Qt::Key_F18, "F18", nullptr},
{Qt::Key_F19, "F19"}, {Qt::Key_F19, "F19", nullptr},
{Qt::Key_F20, "F20"}, {Qt::Key_F20, "F20", nullptr},
{Qt::Key_F21, "F21"}, {Qt::Key_F21, "F21", nullptr},
{Qt::Key_F22, "F22"}, {Qt::Key_F22, "F22", nullptr},
{Qt::Key_F23, "F23"}, {Qt::Key_F23, "F23", nullptr},
{Qt::Key_F24, "F24"}, {Qt::Key_F24, "F24", nullptr},
{Qt::Key_F25, "F25"}, {Qt::Key_F25, "F25", nullptr},
{Qt::Key_F26, "F26"}, {Qt::Key_F26, "F26", nullptr},
{Qt::Key_F27, "F27"}, {Qt::Key_F27, "F27", nullptr},
{Qt::Key_F28, "F28"}, {Qt::Key_F28, "F28", nullptr},
{Qt::Key_F29, "F29"}, {Qt::Key_F29, "F29", nullptr},
{Qt::Key_F30, "F30"}, {Qt::Key_F30, "F30", nullptr},
{Qt::Key_F31, "F31"}, {Qt::Key_F31, "F31", nullptr},
{Qt::Key_F32, "F32"}, {Qt::Key_F32, "F32", nullptr},
{Qt::Key_F33, "F33"}, {Qt::Key_F33, "F33", nullptr},
{Qt::Key_F34, "F34"}, {Qt::Key_F34, "F34", nullptr},
{Qt::Key_F35, "F35"}, {Qt::Key_F35, "F35", nullptr},
{Qt::Key_Super_L, "Super_L"}, {Qt::Key_Super_L, "Super_L", nullptr},
{Qt::Key_Super_R, "Super_R"}, {Qt::Key_Super_R, "Super_R", nullptr},
{Qt::Key_Menu, "Menu"}, {Qt::Key_Menu, "Menu", nullptr},
{Qt::Key_Hyper_L, "Hyper_L"}, {Qt::Key_Hyper_L, "Hyper_L", nullptr},
{Qt::Key_Hyper_R, "Hyper_R"}, {Qt::Key_Hyper_R, "Hyper_R", nullptr},
{Qt::Key_Help, "Help"}, {Qt::Key_Help, "Help", nullptr},
{Qt::Key_Direction_L, "Direction_L"}, {Qt::Key_Direction_L, "Direction_L", nullptr},
{Qt::Key_Direction_R, "Direction_R"}, {Qt::Key_Direction_R, "Direction_R", nullptr},
{Qt::Key_Space, "Space"}, {Qt::Key_Space, "Space", ICON_PF_SPACE},
{Qt::Key_Any, "Any"}, {Qt::Key_Any, "Any", nullptr},
{Qt::Key_Exclam, "Exclam"}, {Qt::Key_Exclam, "Exclam", nullptr},
{Qt::Key_QuoteDbl, "QuoteDbl"}, {Qt::Key_QuoteDbl, "QuoteDbl", nullptr},
{Qt::Key_NumberSign, "NumberSign"}, {Qt::Key_NumberSign, "NumberSign", nullptr},
{Qt::Key_Dollar, "Dollar"}, {Qt::Key_Dollar, "Dollar", nullptr},
{Qt::Key_Percent, "Percent"}, {Qt::Key_Percent, "Percent", nullptr},
{Qt::Key_Ampersand, "Ampersand"}, {Qt::Key_Ampersand, "Ampersand", nullptr},
{Qt::Key_Apostrophe, "Apostrophe"}, {Qt::Key_Apostrophe, "Apostrophe", nullptr},
{Qt::Key_ParenLeft, "ParenLeft"}, {Qt::Key_ParenLeft, "ParenLeft", nullptr},
{Qt::Key_ParenRight, "ParenRight"}, {Qt::Key_ParenRight, "ParenRight", nullptr},
{Qt::Key_Asterisk, "Asterisk"}, {Qt::Key_Asterisk, "Asterisk", nullptr},
{Qt::Key_Plus, "Plus"}, {Qt::Key_Plus, "Plus", nullptr},
{Qt::Key_Comma, "Comma"}, {Qt::Key_Comma, "Comma", nullptr},
{Qt::Key_Minus, "Minus"}, {Qt::Key_Minus, "Minus", nullptr},
{Qt::Key_Period, "Period"}, {Qt::Key_Period, "Period", nullptr},
{Qt::Key_Slash, "Slash"}, {Qt::Key_Slash, "Slash", nullptr},
{Qt::Key_0, "0"}, {Qt::Key_0, "0", ICON_PF_0},
{Qt::Key_1, "1"}, {Qt::Key_1, "1", ICON_PF_1},
{Qt::Key_2, "2"}, {Qt::Key_2, "2", ICON_PF_2},
{Qt::Key_3, "3"}, {Qt::Key_3, "3", ICON_PF_3},
{Qt::Key_4, "4"}, {Qt::Key_4, "4", ICON_PF_4},
{Qt::Key_5, "5"}, {Qt::Key_5, "5", ICON_PF_5},
{Qt::Key_6, "6"}, {Qt::Key_6, "6", ICON_PF_6},
{Qt::Key_7, "7"}, {Qt::Key_7, "7", ICON_PF_7},
{Qt::Key_8, "8"}, {Qt::Key_8, "8", ICON_PF_8},
{Qt::Key_9, "9"}, {Qt::Key_9, "9", ICON_PF_9},
{Qt::Key_Colon, "Colon"}, {Qt::Key_Colon, "Colon", nullptr},
{Qt::Key_Semicolon, "Semicolon"}, {Qt::Key_Semicolon, "Semicolon", nullptr},
{Qt::Key_Less, "Less"}, {Qt::Key_Less, "Less", nullptr},
{Qt::Key_Equal, "Equal"}, {Qt::Key_Equal, "Equal", nullptr},
{Qt::Key_Greater, "Greater"}, {Qt::Key_Greater, "Greater", nullptr},
{Qt::Key_Question, "Question"}, {Qt::Key_Question, "Question", nullptr},
{Qt::Key_At, "At"}, {Qt::Key_At, "At", nullptr},
{Qt::Key_A, "A"}, {Qt::Key_A, "A", ICON_PF_KEY_A},
{Qt::Key_B, "B"}, {Qt::Key_B, "B", ICON_PF_KEY_B},
{Qt::Key_C, "C"}, {Qt::Key_C, "C", ICON_PF_KEY_C},
{Qt::Key_D, "D"}, {Qt::Key_D, "D", ICON_PF_KEY_D},
{Qt::Key_E, "E"}, {Qt::Key_E, "E", ICON_PF_KEY_E},
{Qt::Key_F, "F"}, {Qt::Key_F, "F", ICON_PF_KEY_F},
{Qt::Key_G, "G"}, {Qt::Key_G, "G", ICON_PF_KEY_G},
{Qt::Key_H, "H"}, {Qt::Key_H, "H", ICON_PF_KEY_H},
{Qt::Key_I, "I"}, {Qt::Key_I, "I", ICON_PF_KEY_I},
{Qt::Key_J, "J"}, {Qt::Key_J, "J", ICON_PF_KEY_J},
{Qt::Key_K, "K"}, {Qt::Key_K, "K", ICON_PF_KEY_K},
{Qt::Key_L, "L"}, {Qt::Key_L, "L", ICON_PF_KEY_L},
{Qt::Key_M, "M"}, {Qt::Key_M, "M", ICON_PF_KEY_M},
{Qt::Key_N, "N"}, {Qt::Key_N, "N", ICON_PF_KEY_N},
{Qt::Key_O, "O"}, {Qt::Key_O, "O", ICON_PF_KEY_O},
{Qt::Key_P, "P"}, {Qt::Key_P, "P", ICON_PF_KEY_P},
{Qt::Key_Q, "Q"}, {Qt::Key_Q, "Q", ICON_PF_KEY_Q},
{Qt::Key_R, "R"}, {Qt::Key_R, "R", ICON_PF_KEY_R},
{Qt::Key_S, "S"}, {Qt::Key_S, "S", ICON_PF_KEY_S},
{Qt::Key_T, "T"}, {Qt::Key_T, "T", ICON_PF_KEY_T},
{Qt::Key_U, "U"}, {Qt::Key_U, "U", ICON_PF_KEY_U},
{Qt::Key_V, "V"}, {Qt::Key_V, "V", ICON_PF_KEY_V},
{Qt::Key_W, "W"}, {Qt::Key_W, "W", ICON_PF_KEY_W},
{Qt::Key_X, "X"}, {Qt::Key_X, "X", ICON_PF_KEY_X},
{Qt::Key_Y, "Y"}, {Qt::Key_Y, "Y", ICON_PF_KEY_Y},
{Qt::Key_Z, "Z"}, {Qt::Key_Z, "Z", ICON_PF_KEY_Z},
{Qt::Key_BracketLeft, "BracketLeft"}, {Qt::Key_BracketLeft, "BracketLeft", nullptr},
{Qt::Key_Backslash, "Backslash"}, {Qt::Key_Backslash, "Backslash", nullptr},
{Qt::Key_BracketRight, "BracketRight"}, {Qt::Key_BracketRight, "BracketRight", nullptr},
{Qt::Key_AsciiCircum, "AsciiCircum"}, {Qt::Key_AsciiCircum, "AsciiCircum", nullptr},
{Qt::Key_Underscore, "Underscore"}, {Qt::Key_Underscore, "Underscore", nullptr},
{Qt::Key_QuoteLeft, "QuoteLeft"}, {Qt::Key_QuoteLeft, "QuoteLeft", nullptr},
{Qt::Key_BraceLeft, "BraceLeft"}, {Qt::Key_BraceLeft, "BraceLeft", nullptr},
{Qt::Key_Bar, "Bar"}, {Qt::Key_Bar, "Bar", nullptr},
{Qt::Key_BraceRight, "BraceRight"}, {Qt::Key_BraceRight, "BraceRight", nullptr},
{Qt::Key_AsciiTilde, "AsciiTilde"}, {Qt::Key_AsciiTilde, "AsciiTilde", nullptr},
{Qt::Key_nobreakspace, "nobreakspace"}, {Qt::Key_nobreakspace, "nobreakspace", nullptr},
{Qt::Key_exclamdown, "exclamdown"}, {Qt::Key_exclamdown, "exclamdown", nullptr},
{Qt::Key_cent, "cent"}, {Qt::Key_cent, "cent", nullptr},
{Qt::Key_sterling, "sterling"}, {Qt::Key_sterling, "sterling", nullptr},
{Qt::Key_currency, "currency"}, {Qt::Key_currency, "currency", nullptr},
{Qt::Key_yen, "yen"}, {Qt::Key_yen, "yen", nullptr},
{Qt::Key_brokenbar, "brokenbar"}, {Qt::Key_brokenbar, "brokenbar", nullptr},
{Qt::Key_section, "section"}, {Qt::Key_section, "section", nullptr},
{Qt::Key_diaeresis, "diaeresis"}, {Qt::Key_diaeresis, "diaeresis", nullptr},
{Qt::Key_copyright, "copyright"}, {Qt::Key_copyright, "copyright", nullptr},
{Qt::Key_ordfeminine, "ordfeminine"}, {Qt::Key_ordfeminine, "ordfeminine", nullptr},
{Qt::Key_guillemotleft, "guillemotleft"}, {Qt::Key_guillemotleft, "guillemotleft", nullptr},
{Qt::Key_notsign, "notsign"}, {Qt::Key_notsign, "notsign", nullptr},
{Qt::Key_hyphen, "hyphen"}, {Qt::Key_hyphen, "hyphen", nullptr},
{Qt::Key_registered, "registered"}, {Qt::Key_registered, "registered", nullptr},
{Qt::Key_macron, "macron"}, {Qt::Key_macron, "macron", nullptr},
{Qt::Key_degree, "degree"}, {Qt::Key_degree, "degree", nullptr},
{Qt::Key_plusminus, "plusminus"}, {Qt::Key_plusminus, "plusminus", nullptr},
{Qt::Key_twosuperior, "twosuperior"}, {Qt::Key_twosuperior, "twosuperior", nullptr},
{Qt::Key_threesuperior, "threesuperior"}, {Qt::Key_threesuperior, "threesuperior", nullptr},
{Qt::Key_acute, "acute"}, {Qt::Key_acute, "acute", nullptr},
{Qt::Key_mu, "mu"}, {Qt::Key_mu, "mu", nullptr},
{Qt::Key_paragraph, "paragraph"}, {Qt::Key_paragraph, "paragraph", nullptr},
{Qt::Key_periodcentered, "periodcentered"}, {Qt::Key_periodcentered, "periodcentered", nullptr},
{Qt::Key_cedilla, "cedilla"}, {Qt::Key_cedilla, "cedilla", nullptr},
{Qt::Key_onesuperior, "onesuperior"}, {Qt::Key_onesuperior, "onesuperior", nullptr},
{Qt::Key_masculine, "masculine"}, {Qt::Key_masculine, "masculine", nullptr},
{Qt::Key_guillemotright, "guillemotright"}, {Qt::Key_guillemotright, "guillemotright", nullptr},
{Qt::Key_onequarter, "onequarter"}, {Qt::Key_onequarter, "onequarter", nullptr},
{Qt::Key_onehalf, "onehalf"}, {Qt::Key_onehalf, "onehalf", nullptr},
{Qt::Key_threequarters, "threequarters"}, {Qt::Key_threequarters, "threequarters", nullptr},
{Qt::Key_questiondown, "questiondown"}, {Qt::Key_questiondown, "questiondown", nullptr},
{Qt::Key_Agrave, "Agrave"}, {Qt::Key_Agrave, "Agrave", nullptr},
{Qt::Key_Aacute, "Aacute"}, {Qt::Key_Aacute, "Aacute", nullptr},
{Qt::Key_Acircumflex, "Acircumflex"}, {Qt::Key_Acircumflex, "Acircumflex", nullptr},
{Qt::Key_Atilde, "Atilde"}, {Qt::Key_Atilde, "Atilde", nullptr},
{Qt::Key_Adiaeresis, "Adiaeresis"}, {Qt::Key_Adiaeresis, "Adiaeresis", nullptr},
{Qt::Key_Aring, "Aring"}, {Qt::Key_Aring, "Aring", nullptr},
{Qt::Key_AE, "AE"}, {Qt::Key_AE, "AE", nullptr},
{Qt::Key_Ccedilla, "Ccedilla"}, {Qt::Key_Ccedilla, "Ccedilla", nullptr},
{Qt::Key_Egrave, "Egrave"}, {Qt::Key_Egrave, "Egrave", nullptr},
{Qt::Key_Eacute, "Eacute"}, {Qt::Key_Eacute, "Eacute", nullptr},
{Qt::Key_Ecircumflex, "Ecircumflex"}, {Qt::Key_Ecircumflex, "Ecircumflex", nullptr},
{Qt::Key_Ediaeresis, "Ediaeresis"}, {Qt::Key_Ediaeresis, "Ediaeresis", nullptr},
{Qt::Key_Igrave, "Igrave"}, {Qt::Key_Igrave, "Igrave", nullptr},
{Qt::Key_Iacute, "Iacute"}, {Qt::Key_Iacute, "Iacute", nullptr},
{Qt::Key_Icircumflex, "Icircumflex"}, {Qt::Key_Icircumflex, "Icircumflex", nullptr},
{Qt::Key_Idiaeresis, "Idiaeresis"}, {Qt::Key_Idiaeresis, "Idiaeresis", nullptr},
{Qt::Key_ETH, "ETH"}, {Qt::Key_ETH, "ETH", nullptr},
{Qt::Key_Ntilde, "Ntilde"}, {Qt::Key_Ntilde, "Ntilde", nullptr},
{Qt::Key_Ograve, "Ograve"}, {Qt::Key_Ograve, "Ograve", nullptr},
{Qt::Key_Oacute, "Oacute"}, {Qt::Key_Oacute, "Oacute", nullptr},
{Qt::Key_Ocircumflex, "Ocircumflex"}, {Qt::Key_Ocircumflex, "Ocircumflex", nullptr},
{Qt::Key_Otilde, "Otilde"}, {Qt::Key_Otilde, "Otilde", nullptr},
{Qt::Key_Odiaeresis, "Odiaeresis"}, {Qt::Key_Odiaeresis, "Odiaeresis", nullptr},
{Qt::Key_multiply, "multiply"}, {Qt::Key_multiply, "multiply", nullptr},
{Qt::Key_Ooblique, "Ooblique"}, {Qt::Key_Ooblique, "Ooblique", nullptr},
{Qt::Key_Ugrave, "Ugrave"}, {Qt::Key_Ugrave, "Ugrave", nullptr},
{Qt::Key_Uacute, "Uacute"}, {Qt::Key_Uacute, "Uacute", nullptr},
{Qt::Key_Ucircumflex, "Ucircumflex"}, {Qt::Key_Ucircumflex, "Ucircumflex", nullptr},
{Qt::Key_Udiaeresis, "Udiaeresis"}, {Qt::Key_Udiaeresis, "Udiaeresis", nullptr},
{Qt::Key_Yacute, "Yacute"}, {Qt::Key_Yacute, "Yacute", nullptr},
{Qt::Key_THORN, "THORN"}, {Qt::Key_THORN, "THORN", nullptr},
{Qt::Key_ssharp, "ssharp"}, {Qt::Key_ssharp, "ssharp", nullptr},
{Qt::Key_division, "division"}, {Qt::Key_division, "division", nullptr},
{Qt::Key_ydiaeresis, "ydiaeresis"}, {Qt::Key_ydiaeresis, "ydiaeresis", nullptr},
{Qt::Key_AltGr, "AltGr"}, {Qt::Key_AltGr, "AltGr", nullptr},
{Qt::Key_Multi_key, "Multi_key"}, {Qt::Key_Multi_key, "Multi_key", nullptr},
{Qt::Key_Codeinput, "Codeinput"}, {Qt::Key_Codeinput, "Codeinput", nullptr},
{Qt::Key_SingleCandidate, "SingleCandidate"}, {Qt::Key_SingleCandidate, "SingleCandidate", nullptr},
{Qt::Key_MultipleCandidate, "MultipleCandidate"}, {Qt::Key_MultipleCandidate, "MultipleCandidate", nullptr},
{Qt::Key_PreviousCandidate, "PreviousCandidate"}, {Qt::Key_PreviousCandidate, "PreviousCandidate", nullptr},
{Qt::Key_Mode_switch, "Mode_switch"}, {Qt::Key_Mode_switch, "Mode_switch", nullptr},
{Qt::Key_Kanji, "Kanji"}, {Qt::Key_Kanji, "Kanji", nullptr},
{Qt::Key_Muhenkan, "Muhenkan"}, {Qt::Key_Muhenkan, "Muhenkan", nullptr},
{Qt::Key_Henkan, "Henkan"}, {Qt::Key_Henkan, "Henkan", nullptr},
{Qt::Key_Romaji, "Romaji"}, {Qt::Key_Romaji, "Romaji", nullptr},
{Qt::Key_Hiragana, "Hiragana"}, {Qt::Key_Hiragana, "Hiragana", nullptr},
{Qt::Key_Katakana, "Katakana"}, {Qt::Key_Katakana, "Katakana", nullptr},
{Qt::Key_Hiragana_Katakana, "Hiragana_Katakana"}, {Qt::Key_Hiragana_Katakana, "Hiragana_Katakana", nullptr},
{Qt::Key_Zenkaku, "Zenkaku"}, {Qt::Key_Zenkaku, "Zenkaku", nullptr},
{Qt::Key_Hankaku, "Hankaku"}, {Qt::Key_Hankaku, "Hankaku", nullptr},
{Qt::Key_Zenkaku_Hankaku, "Zenkaku_Hankaku"}, {Qt::Key_Zenkaku_Hankaku, "Zenkaku_Hankaku", nullptr},
{Qt::Key_Touroku, "Touroku"}, {Qt::Key_Touroku, "Touroku", nullptr},
{Qt::Key_Massyo, "Massyo"}, {Qt::Key_Massyo, "Massyo", nullptr},
{Qt::Key_Kana_Lock, "Kana_Lock"}, {Qt::Key_Kana_Lock, "Kana_Lock", nullptr},
{Qt::Key_Kana_Shift, "Kana_Shift"}, {Qt::Key_Kana_Shift, "Kana_Shift", nullptr},
{Qt::Key_Eisu_Shift, "Eisu_Shift"}, {Qt::Key_Eisu_Shift, "Eisu_Shift", nullptr},
{Qt::Key_Eisu_toggle, "Eisu_toggle"}, {Qt::Key_Eisu_toggle, "Eisu_toggle", nullptr},
{Qt::Key_Hangul, "Hangul"}, {Qt::Key_Hangul, "Hangul", nullptr},
{Qt::Key_Hangul_Start, "Hangul_Start"}, {Qt::Key_Hangul_Start, "Hangul_Start", nullptr},
{Qt::Key_Hangul_End, "Hangul_End"}, {Qt::Key_Hangul_End, "Hangul_End", nullptr},
{Qt::Key_Hangul_Hanja, "Hangul_Hanja"}, {Qt::Key_Hangul_Hanja, "Hangul_Hanja", nullptr},
{Qt::Key_Hangul_Jamo, "Hangul_Jamo"}, {Qt::Key_Hangul_Jamo, "Hangul_Jamo", nullptr},
{Qt::Key_Hangul_Romaja, "Hangul_Romaja"}, {Qt::Key_Hangul_Romaja, "Hangul_Romaja", nullptr},
{Qt::Key_Hangul_Jeonja, "Hangul_Jeonja"}, {Qt::Key_Hangul_Jeonja, "Hangul_Jeonja", nullptr},
{Qt::Key_Hangul_Banja, "Hangul_Banja"}, {Qt::Key_Hangul_Banja, "Hangul_Banja", nullptr},
{Qt::Key_Hangul_PreHanja, "Hangul_PreHanja"}, {Qt::Key_Hangul_PreHanja, "Hangul_PreHanja", nullptr},
{Qt::Key_Hangul_PostHanja, "Hangul_PostHanja"}, {Qt::Key_Hangul_PostHanja, "Hangul_PostHanja", nullptr},
{Qt::Key_Hangul_Special, "Hangul_Special"}, {Qt::Key_Hangul_Special, "Hangul_Special", nullptr},
{Qt::Key_Dead_Grave, "Dead_Grave"}, {Qt::Key_Dead_Grave, "Dead_Grave", nullptr},
{Qt::Key_Dead_Acute, "Dead_Acute"}, {Qt::Key_Dead_Acute, "Dead_Acute", nullptr},
{Qt::Key_Dead_Circumflex, "Dead_Circumflex"}, {Qt::Key_Dead_Circumflex, "Dead_Circumflex", nullptr},
{Qt::Key_Dead_Tilde, "Dead_Tilde"}, {Qt::Key_Dead_Tilde, "Dead_Tilde", nullptr},
{Qt::Key_Dead_Macron, "Dead_Macron"}, {Qt::Key_Dead_Macron, "Dead_Macron", nullptr},
{Qt::Key_Dead_Breve, "Dead_Breve"}, {Qt::Key_Dead_Breve, "Dead_Breve", nullptr},
{Qt::Key_Dead_Abovedot, "Dead_Abovedot"}, {Qt::Key_Dead_Abovedot, "Dead_Abovedot", nullptr},
{Qt::Key_Dead_Diaeresis, "Dead_Diaeresis"}, {Qt::Key_Dead_Diaeresis, "Dead_Diaeresis", nullptr},
{Qt::Key_Dead_Abovering, "Dead_Abovering"}, {Qt::Key_Dead_Abovering, "Dead_Abovering", nullptr},
{Qt::Key_Dead_Doubleacute, "Dead_Doubleacute"}, {Qt::Key_Dead_Doubleacute, "Dead_Doubleacute", nullptr},
{Qt::Key_Dead_Caron, "Dead_Caron"}, {Qt::Key_Dead_Caron, "Dead_Caron", nullptr},
{Qt::Key_Dead_Cedilla, "Dead_Cedilla"}, {Qt::Key_Dead_Cedilla, "Dead_Cedilla", nullptr},
{Qt::Key_Dead_Ogonek, "Dead_Ogonek"}, {Qt::Key_Dead_Ogonek, "Dead_Ogonek", nullptr},
{Qt::Key_Dead_Iota, "Dead_Iota"}, {Qt::Key_Dead_Iota, "Dead_Iota", nullptr},
{Qt::Key_Dead_Voiced_Sound, "Dead_Voiced_Sound"}, {Qt::Key_Dead_Voiced_Sound, "Dead_Voiced_Sound", nullptr},
{Qt::Key_Dead_Semivoiced_Sound, "Dead_Semivoiced_Sound"}, {Qt::Key_Dead_Semivoiced_Sound, "Dead_Semivoiced_Sound", nullptr},
{Qt::Key_Dead_Belowdot, "Dead_Belowdot"}, {Qt::Key_Dead_Belowdot, "Dead_Belowdot", nullptr},
{Qt::Key_Dead_Hook, "Dead_Hook"}, {Qt::Key_Dead_Hook, "Dead_Hook", nullptr},
{Qt::Key_Dead_Horn, "Dead_Horn"}, {Qt::Key_Dead_Horn, "Dead_Horn", nullptr},
{Qt::Key_Back, "Back"}, {Qt::Key_Back, "Back", nullptr},
{Qt::Key_Forward, "Forward"}, {Qt::Key_Forward, "Forward", nullptr},
{Qt::Key_Stop, "Stop"}, {Qt::Key_Stop, "Stop", nullptr},
{Qt::Key_Refresh, "Refresh"}, {Qt::Key_Refresh, "Refresh", nullptr},
{Qt::Key_VolumeDown, "VolumeDown"}, {Qt::Key_VolumeDown, "VolumeDown", nullptr},
{Qt::Key_VolumeMute, "VolumeMute"}, {Qt::Key_VolumeMute, "VolumeMute", nullptr},
{Qt::Key_VolumeUp, "VolumeUp"}, {Qt::Key_VolumeUp, "VolumeUp", nullptr},
{Qt::Key_BassBoost, "BassBoost"}, {Qt::Key_BassBoost, "BassBoost", nullptr},
{Qt::Key_BassUp, "BassUp"}, {Qt::Key_BassUp, "BassUp", nullptr},
{Qt::Key_BassDown, "BassDown"}, {Qt::Key_BassDown, "BassDown", nullptr},
{Qt::Key_TrebleUp, "TrebleUp"}, {Qt::Key_TrebleUp, "TrebleUp", nullptr},
{Qt::Key_TrebleDown, "TrebleDown"}, {Qt::Key_TrebleDown, "TrebleDown", nullptr},
{Qt::Key_MediaPlay, "MediaPlay"}, {Qt::Key_MediaPlay, "MediaPlay", nullptr},
{Qt::Key_MediaStop, "MediaStop"}, {Qt::Key_MediaStop, "MediaStop", nullptr},
{Qt::Key_MediaPrevious, "MediaPrevious"}, {Qt::Key_MediaPrevious, "MediaPrevious", nullptr},
{Qt::Key_MediaNext, "MediaNext"}, {Qt::Key_MediaNext, "MediaNext", nullptr},
{Qt::Key_MediaRecord, "MediaRecord"}, {Qt::Key_MediaRecord, "MediaRecord", nullptr},
{Qt::Key_MediaPause, "MediaPause"}, {Qt::Key_MediaPause, "MediaPause", nullptr},
{Qt::Key_MediaTogglePlayPause, "MediaTogglePlayPause"}, {Qt::Key_MediaTogglePlayPause, "MediaTogglePlayPause", nullptr},
{Qt::Key_HomePage, "HomePage"}, {Qt::Key_HomePage, "HomePage", nullptr},
{Qt::Key_Favorites, "Favorites"}, {Qt::Key_Favorites, "Favorites", nullptr},
{Qt::Key_Search, "Search"}, {Qt::Key_Search, "Search", nullptr},
{Qt::Key_Standby, "Standby"}, {Qt::Key_Standby, "Standby", nullptr},
{Qt::Key_OpenUrl, "OpenUrl"}, {Qt::Key_OpenUrl, "OpenUrl", nullptr},
{Qt::Key_LaunchMail, "LaunchMail"}, {Qt::Key_LaunchMail, "LaunchMail", nullptr},
{Qt::Key_LaunchMedia, "LaunchMedia"}, {Qt::Key_LaunchMedia, "LaunchMedia", nullptr},
{Qt::Key_Launch0, "Launch0"}, {Qt::Key_Launch0, "Launch0", nullptr},
{Qt::Key_Launch1, "Launch1"}, {Qt::Key_Launch1, "Launch1", nullptr},
{Qt::Key_Launch2, "Launch2"}, {Qt::Key_Launch2, "Launch2", nullptr},
{Qt::Key_Launch3, "Launch3"}, {Qt::Key_Launch3, "Launch3", nullptr},
{Qt::Key_Launch4, "Launch4"}, {Qt::Key_Launch4, "Launch4", nullptr},
{Qt::Key_Launch5, "Launch5"}, {Qt::Key_Launch5, "Launch5", nullptr},
{Qt::Key_Launch6, "Launch6"}, {Qt::Key_Launch6, "Launch6", nullptr},
{Qt::Key_Launch7, "Launch7"}, {Qt::Key_Launch7, "Launch7", nullptr},
{Qt::Key_Launch8, "Launch8"}, {Qt::Key_Launch8, "Launch8", nullptr},
{Qt::Key_Launch9, "Launch9"}, {Qt::Key_Launch9, "Launch9", nullptr},
{Qt::Key_LaunchA, "LaunchA"}, {Qt::Key_LaunchA, "LaunchA", nullptr},
{Qt::Key_LaunchB, "LaunchB"}, {Qt::Key_LaunchB, "LaunchB", nullptr},
{Qt::Key_LaunchC, "LaunchC"}, {Qt::Key_LaunchC, "LaunchC", nullptr},
{Qt::Key_LaunchD, "LaunchD"}, {Qt::Key_LaunchD, "LaunchD", nullptr},
{Qt::Key_LaunchE, "LaunchE"}, {Qt::Key_LaunchE, "LaunchE", nullptr},
{Qt::Key_LaunchF, "LaunchF"}, {Qt::Key_LaunchF, "LaunchF", nullptr},
{Qt::Key_MonBrightnessUp, "MonBrightnessUp"}, {Qt::Key_MonBrightnessUp, "MonBrightnessUp", nullptr},
{Qt::Key_MonBrightnessDown, "MonBrightnessDown"}, {Qt::Key_MonBrightnessDown, "MonBrightnessDown", nullptr},
{Qt::Key_KeyboardLightOnOff, "KeyboardLightOnOff"}, {Qt::Key_KeyboardLightOnOff, "KeyboardLightOnOff", nullptr},
{Qt::Key_KeyboardBrightnessUp, "KeyboardBrightnessUp"}, {Qt::Key_KeyboardBrightnessUp, "KeyboardBrightnessUp", nullptr},
{Qt::Key_KeyboardBrightnessDown, "KeyboardBrightnessDown"}, {Qt::Key_KeyboardBrightnessDown, "KeyboardBrightnessDown", nullptr},
{Qt::Key_PowerOff, "PowerOff"}, {Qt::Key_PowerOff, "PowerOff", nullptr},
{Qt::Key_WakeUp, "WakeUp"}, {Qt::Key_WakeUp, "WakeUp", nullptr},
{Qt::Key_Eject, "Eject"}, {Qt::Key_Eject, "Eject", nullptr},
{Qt::Key_ScreenSaver, "ScreenSaver"}, {Qt::Key_ScreenSaver, "ScreenSaver", nullptr},
{Qt::Key_WWW, "WWW"}, {Qt::Key_WWW, "WWW", nullptr},
{Qt::Key_Memo, "Memo"}, {Qt::Key_Memo, "Memo", nullptr},
{Qt::Key_LightBulb, "LightBulb"}, {Qt::Key_LightBulb, "LightBulb", nullptr},
{Qt::Key_Shop, "Shop"}, {Qt::Key_Shop, "Shop", nullptr},
{Qt::Key_History, "History"}, {Qt::Key_History, "History", nullptr},
{Qt::Key_AddFavorite, "AddFavorite"}, {Qt::Key_AddFavorite, "AddFavorite", nullptr},
{Qt::Key_HotLinks, "HotLinks"}, {Qt::Key_HotLinks, "HotLinks", nullptr},
{Qt::Key_BrightnessAdjust, "BrightnessAdjust"}, {Qt::Key_BrightnessAdjust, "BrightnessAdjust", nullptr},
{Qt::Key_Finance, "Finance"}, {Qt::Key_Finance, "Finance", nullptr},
{Qt::Key_Community, "Community"}, {Qt::Key_Community, "Community", nullptr},
{Qt::Key_AudioRewind, "AudioRewind"}, {Qt::Key_AudioRewind, "AudioRewind", nullptr},
{Qt::Key_BackForward, "BackForward"}, {Qt::Key_BackForward, "BackForward", nullptr},
{Qt::Key_ApplicationLeft, "ApplicationLeft"}, {Qt::Key_ApplicationLeft, "ApplicationLeft", nullptr},
{Qt::Key_ApplicationRight, "ApplicationRight"}, {Qt::Key_ApplicationRight, "ApplicationRight", nullptr},
{Qt::Key_Book, "Book"}, {Qt::Key_Book, "Book", nullptr},
{Qt::Key_CD, "CD"}, {Qt::Key_CD, "CD", nullptr},
{Qt::Key_Calculator, "Calculator"}, {Qt::Key_Calculator, "Calculator", nullptr},
{Qt::Key_ToDoList, "ToDoList"}, {Qt::Key_ToDoList, "ToDoList", nullptr},
{Qt::Key_ClearGrab, "ClearGrab"}, {Qt::Key_ClearGrab, "ClearGrab", nullptr},
{Qt::Key_Close, "Close"}, {Qt::Key_Close, "Close", nullptr},
{Qt::Key_Copy, "Copy"}, {Qt::Key_Copy, "Copy", nullptr},
{Qt::Key_Cut, "Cut"}, {Qt::Key_Cut, "Cut", nullptr},
{Qt::Key_Display, "Display"}, {Qt::Key_Display, "Display", nullptr},
{Qt::Key_DOS, "DOS"}, {Qt::Key_DOS, "DOS", nullptr},
{Qt::Key_Documents, "Documents"}, {Qt::Key_Documents, "Documents", nullptr},
{Qt::Key_Excel, "Excel"}, {Qt::Key_Excel, "Excel", nullptr},
{Qt::Key_Explorer, "Explorer"}, {Qt::Key_Explorer, "Explorer", nullptr},
{Qt::Key_Game, "Game"}, {Qt::Key_Game, "Game", nullptr},
{Qt::Key_Go, "Go"}, {Qt::Key_Go, "Go", nullptr},
{Qt::Key_iTouch, "iTouch"}, {Qt::Key_iTouch, "iTouch", nullptr},
{Qt::Key_LogOff, "LogOff"}, {Qt::Key_LogOff, "LogOff", nullptr},
{Qt::Key_Market, "Market"}, {Qt::Key_Market, "Market", nullptr},
{Qt::Key_Meeting, "Meeting"}, {Qt::Key_Meeting, "Meeting", nullptr},
{Qt::Key_MenuKB, "MenuKB"}, {Qt::Key_MenuKB, "MenuKB", nullptr},
{Qt::Key_MenuPB, "MenuPB"}, {Qt::Key_MenuPB, "MenuPB", nullptr},
{Qt::Key_MySites, "MySites"}, {Qt::Key_MySites, "MySites", nullptr},
{Qt::Key_News, "News"}, {Qt::Key_News, "News", nullptr},
{Qt::Key_OfficeHome, "OfficeHome"}, {Qt::Key_OfficeHome, "OfficeHome", nullptr},
{Qt::Key_Option, "Option"}, {Qt::Key_Option, "Option", nullptr},
{Qt::Key_Paste, "Paste"}, {Qt::Key_Paste, "Paste", nullptr},
{Qt::Key_Phone, "Phone"}, {Qt::Key_Phone, "Phone", nullptr},
{Qt::Key_Calendar, "Calendar"}, {Qt::Key_Calendar, "Calendar", nullptr},
{Qt::Key_Reply, "Reply"}, {Qt::Key_Reply, "Reply", nullptr},
{Qt::Key_Reload, "Reload"}, {Qt::Key_Reload, "Reload", nullptr},
{Qt::Key_RotateWindows, "RotateWindows"}, {Qt::Key_RotateWindows, "RotateWindows", nullptr},
{Qt::Key_RotationPB, "RotationPB"}, {Qt::Key_RotationPB, "RotationPB", nullptr},
{Qt::Key_RotationKB, "RotationKB"}, {Qt::Key_RotationKB, "RotationKB", nullptr},
{Qt::Key_Save, "Save"}, {Qt::Key_Save, "Save", nullptr},
{Qt::Key_Send, "Send"}, {Qt::Key_Send, "Send", nullptr},
{Qt::Key_Spell, "Spell"}, {Qt::Key_Spell, "Spell", nullptr},
{Qt::Key_SplitScreen, "SplitScreen"}, {Qt::Key_SplitScreen, "SplitScreen", nullptr},
{Qt::Key_Support, "Support"}, {Qt::Key_Support, "Support", nullptr},
{Qt::Key_TaskPane, "TaskPane"}, {Qt::Key_TaskPane, "TaskPane", nullptr},
{Qt::Key_Terminal, "Terminal"}, {Qt::Key_Terminal, "Terminal", nullptr},
{Qt::Key_Tools, "Tools"}, {Qt::Key_Tools, "Tools", nullptr},
{Qt::Key_Travel, "Travel"}, {Qt::Key_Travel, "Travel", nullptr},
{Qt::Key_Video, "Video"}, {Qt::Key_Video, "Video", nullptr},
{Qt::Key_Word, "Word"}, {Qt::Key_Word, "Word", nullptr},
{Qt::Key_Xfer, "Xfer"}, {Qt::Key_Xfer, "Xfer", nullptr},
{Qt::Key_ZoomIn, "ZoomIn"}, {Qt::Key_ZoomIn, "ZoomIn", nullptr},
{Qt::Key_ZoomOut, "ZoomOut"}, {Qt::Key_ZoomOut, "ZoomOut", nullptr},
{Qt::Key_Away, "Away"}, {Qt::Key_Away, "Away", nullptr},
{Qt::Key_Messenger, "Messenger"}, {Qt::Key_Messenger, "Messenger", nullptr},
{Qt::Key_WebCam, "WebCam"}, {Qt::Key_WebCam, "WebCam", nullptr},
{Qt::Key_MailForward, "MailForward"}, {Qt::Key_MailForward, "MailForward", nullptr},
{Qt::Key_Pictures, "Pictures"}, {Qt::Key_Pictures, "Pictures", nullptr},
{Qt::Key_Music, "Music"}, {Qt::Key_Music, "Music", nullptr},
{Qt::Key_Battery, "Battery"}, {Qt::Key_Battery, "Battery", nullptr},
{Qt::Key_Bluetooth, "Bluetooth"}, {Qt::Key_Bluetooth, "Bluetooth", nullptr},
{Qt::Key_WLAN, "WLAN"}, {Qt::Key_WLAN, "WLAN", nullptr},
{Qt::Key_UWB, "UWB"}, {Qt::Key_UWB, "UWB", nullptr},
{Qt::Key_AudioForward, "AudioForward"}, {Qt::Key_AudioForward, "AudioForward", nullptr},
{Qt::Key_AudioRepeat, "AudioRepeat"}, {Qt::Key_AudioRepeat, "AudioRepeat", nullptr},
{Qt::Key_AudioRandomPlay, "AudioRandomPlay"}, {Qt::Key_AudioRandomPlay, "AudioRandomPlay", nullptr},
{Qt::Key_Subtitle, "Subtitle"}, {Qt::Key_Subtitle, "Subtitle", nullptr},
{Qt::Key_AudioCycleTrack, "AudioCycleTrack"}, {Qt::Key_AudioCycleTrack, "AudioCycleTrack", nullptr},
{Qt::Key_Time, "Time"}, {Qt::Key_Time, "Time", nullptr},
{Qt::Key_Hibernate, "Hibernate"}, {Qt::Key_Hibernate, "Hibernate", nullptr},
{Qt::Key_View, "View"}, {Qt::Key_View, "View", nullptr},
{Qt::Key_TopMenu, "TopMenu"}, {Qt::Key_TopMenu, "TopMenu", nullptr},
{Qt::Key_PowerDown, "PowerDown"}, {Qt::Key_PowerDown, "PowerDown", nullptr},
{Qt::Key_Suspend, "Suspend"}, {Qt::Key_Suspend, "Suspend", nullptr},
{Qt::Key_ContrastAdjust, "ContrastAdjust"}, {Qt::Key_ContrastAdjust, "ContrastAdjust", nullptr},
{Qt::Key_LaunchG, "LaunchG"}, {Qt::Key_LaunchG, "LaunchG", nullptr},
{Qt::Key_LaunchH, "LaunchH"}, {Qt::Key_LaunchH, "LaunchH", nullptr},
{Qt::Key_TouchpadToggle, "TouchpadToggle"}, {Qt::Key_TouchpadToggle, "TouchpadToggle", nullptr},
{Qt::Key_TouchpadOn, "TouchpadOn"}, {Qt::Key_TouchpadOn, "TouchpadOn", nullptr},
{Qt::Key_TouchpadOff, "TouchpadOff"}, {Qt::Key_TouchpadOff, "TouchpadOff", nullptr},
{Qt::Key_MicMute, "MicMute"}, {Qt::Key_MicMute, "MicMute", nullptr},
{Qt::Key_Red, "Red"}, {Qt::Key_Red, "Red", nullptr},
{Qt::Key_Green, "Green"}, {Qt::Key_Green, "Green", nullptr},
{Qt::Key_Yellow, "Yellow"}, {Qt::Key_Yellow, "Yellow", nullptr},
{Qt::Key_Blue, "Blue"}, {Qt::Key_Blue, "Blue", nullptr},
{Qt::Key_ChannelUp, "ChannelUp"}, {Qt::Key_ChannelUp, "ChannelUp", nullptr},
{Qt::Key_ChannelDown, "ChannelDown"}, {Qt::Key_ChannelDown, "ChannelDown", nullptr},
{Qt::Key_Guide, "Guide"}, {Qt::Key_Guide, "Guide", nullptr},
{Qt::Key_Info, "Info"}, {Qt::Key_Info, "Info", nullptr},
{Qt::Key_Settings, "Settings"}, {Qt::Key_Settings, "Settings", nullptr},
{Qt::Key_MicVolumeUp, "MicVolumeUp"}, {Qt::Key_MicVolumeUp, "MicVolumeUp", nullptr},
{Qt::Key_MicVolumeDown, "MicVolumeDown"}, {Qt::Key_MicVolumeDown, "MicVolumeDown", nullptr},
{Qt::Key_New, "New"}, {Qt::Key_New, "New", nullptr},
{Qt::Key_Open, "Open"}, {Qt::Key_Open, "Open", nullptr},
{Qt::Key_Find, "Find"}, {Qt::Key_Find, "Find", nullptr},
{Qt::Key_Undo, "Undo"}, {Qt::Key_Undo, "Undo", nullptr},
{Qt::Key_Redo, "Redo"}, {Qt::Key_Redo, "Redo", nullptr},
{Qt::Key_MediaLast, "MediaLast"}, {Qt::Key_MediaLast, "MediaLast", nullptr},
{Qt::Key_Select, "Select"}, {Qt::Key_Select, "Select", nullptr},
{Qt::Key_Yes, "Yes"}, {Qt::Key_Yes, "Yes", nullptr},
{Qt::Key_No, "No"}, {Qt::Key_No, "No", nullptr},
{Qt::Key_Cancel, "Cancel"}, {Qt::Key_Cancel, "Cancel", nullptr},
{Qt::Key_Printer, "Printer"}, {Qt::Key_Printer, "Printer", nullptr},
{Qt::Key_Execute, "Execute"}, {Qt::Key_Execute, "Execute", nullptr},
{Qt::Key_Sleep, "Sleep"}, {Qt::Key_Sleep, "Sleep", nullptr},
{Qt::Key_Play, "Play"}, {Qt::Key_Play, "Play", nullptr},
{Qt::Key_Zoom, "Zoom"}, {Qt::Key_Zoom, "Zoom", nullptr},
{Qt::Key_Exit, "Exit"}, {Qt::Key_Exit, "Exit", nullptr},
{Qt::Key_Context1, "Context1"}, {Qt::Key_Context1, "Context1", nullptr},
{Qt::Key_Context2, "Context2"}, {Qt::Key_Context2, "Context2", nullptr},
{Qt::Key_Context3, "Context3"}, {Qt::Key_Context3, "Context3", nullptr},
{Qt::Key_Context4, "Context4"}, {Qt::Key_Context4, "Context4", nullptr},
{Qt::Key_Call, "Call"}, {Qt::Key_Call, "Call", nullptr},
{Qt::Key_Hangup, "Hangup"}, {Qt::Key_Hangup, "Hangup", nullptr},
{Qt::Key_Flip, "Flip"}, {Qt::Key_Flip, "Flip", nullptr},
{Qt::Key_ToggleCallHangup, "ToggleCallHangup"}, {Qt::Key_ToggleCallHangup, "ToggleCallHangup", nullptr},
{Qt::Key_VoiceDial, "VoiceDial"}, {Qt::Key_VoiceDial, "VoiceDial", nullptr},
{Qt::Key_LastNumberRedial, "LastNumberRedial"}, {Qt::Key_LastNumberRedial, "LastNumberRedial", nullptr},
{Qt::Key_Camera, "Camera"}, {Qt::Key_Camera, "Camera", nullptr},
{Qt::Key_CameraFocus, "CameraFocus"}}; {Qt::Key_CameraFocus, "CameraFocus", nullptr}};
std::optional<u32> InputManager::ConvertHostKeyboardStringToCode(const std::string_view& str) std::optional<u32> InputManager::ConvertHostKeyboardStringToCode(const std::string_view& str)
{ {
std::string compare_name(str); std::string_view compare_name = str;
u32 modifier_bits = 0; u32 modifier_bits = 0;
if (StringUtil::StartsWith(compare_name, "Numpad")) if (StringUtil::StartsWith(compare_name, "Numpad"))
{ {
@ -511,6 +514,21 @@ std::optional<std::string> InputManager::ConvertHostKeyboardCodeToString(u32 cod
return ret; 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) u32 QtUtils::KeyEventToCode(const QKeyEvent* ev)
{ {
int key = ev->key(); int key = ev->key();

View File

@ -97,6 +97,7 @@ struct InputBindingInfo
const char* name; const char* name;
const char* display_name; const char* display_name;
const char* icon_name;
Type bind_type; Type bind_type;
u16 bind_index; u16 bind_index;
GenericInputBinding generic_mapping; GenericInputBinding generic_mapping;

View File

@ -58,6 +58,7 @@
#include "common/Console.h" #include "common/Console.h"
#include "common/FileSystem.h" #include "common/FileSystem.h"
#include "common/Path.h" #include "common/Path.h"
#include "common/SmallString.h"
#include "common/StringUtil.h" #include "common/StringUtil.h"
#include "fmt/format.h" #include "fmt/format.h"
@ -619,7 +620,7 @@ void GSgetInternalResolution(int* width, int* height)
*height = res.y; *height = res.y;
} }
void GSgetStats(std::string& info) void GSgetStats(SmallStringBase& info)
{ {
GSPerfMon& pm = g_perfmon; GSPerfMon& pm = g_perfmon;
const char* api_name = GSDevice::RenderAPIToString(g_gs_device->GetRenderAPI()); const char* api_name = GSDevice::RenderAPIToString(g_gs_device->GetRenderAPI());
@ -627,7 +628,7 @@ void GSgetStats(std::string& info)
{ {
const double fps = GetVerticalFrequency(); const double fps = GetVerticalFrequency();
const double fillrate = pm.Get(GSPerfMon::Fillrate); const double fillrate = pm.Get(GSPerfMon::Fillrate);
fmt::format_to(std::back_inserter(info), "{} SW | {} S | {} P | {} D | {:.2f} U | {:.2f} D | {:.2f} mpps", info.fmt("{} SW | {} S | {} P | {} D | {:.2f} U | {:.2f} D | {:.2f} mpps",
api_name, api_name,
(int)pm.Get(GSPerfMon::SyncPoint), (int)pm.Get(GSPerfMon::SyncPoint),
(int)pm.Get(GSPerfMon::Prim), (int)pm.Get(GSPerfMon::Prim),
@ -642,7 +643,7 @@ void GSgetStats(std::string& info)
} }
else else
{ {
fmt::format_to(std::back_inserter(info), "{} HW | {} P | {} D | {} DC | {} B | {} RP | {} RB | {} TC | {} TU", info.fmt("{} HW | {} P | {} D | {} DC | {} B | {} RP | {} RB | {} TC | {} TU",
api_name, api_name,
(int)pm.Get(GSPerfMon::Prim), (int)pm.Get(GSPerfMon::Prim),
(int)pm.Get(GSPerfMon::Draw), (int)pm.Get(GSPerfMon::Draw),
@ -655,7 +656,7 @@ void GSgetStats(std::string& info)
} }
} }
void GSgetMemoryStats(std::string& info) void GSgetMemoryStats(SmallStringBase& info)
{ {
if (!g_texture_cache) if (!g_texture_cache)
return; return;

View File

@ -64,6 +64,7 @@ enum class GSDisplayAlignment
extern Pcsx2Config::GSOptions GSConfig; extern Pcsx2Config::GSOptions GSConfig;
class HostDisplay; class HostDisplay;
class SmallStringBase;
// Returns the ID for the specified function, otherwise -1. // Returns the ID for the specified function, otherwise -1.
s16 GSLookupGetSkipCountFunctionId(const std::string_view& name); s16 GSLookupGetSkipCountFunctionId(const std::string_view& name);
@ -107,8 +108,8 @@ void GSGetAdaptersAndFullscreenModes(
GSRendererType renderer, std::vector<std::string>* adapters, std::vector<std::string>* fullscreen_modes); GSRendererType renderer, std::vector<std::string>* adapters, std::vector<std::string>* fullscreen_modes);
GSVideoMode GSgetDisplayMode(); GSVideoMode GSgetDisplayMode();
void GSgetInternalResolution(int* width, int* height); void GSgetInternalResolution(int* width, int* height);
void GSgetStats(std::string& info); void GSgetStats(SmallStringBase& info);
void GSgetMemoryStats(std::string& info); void GSgetMemoryStats(SmallStringBase& info);
void GSgetTitleStats(std::string& info); void GSgetTitleStats(std::string& info);
/// Converts window position to normalized display coordinates (0..1). A value less than 0 or greater than 1 is /// Converts window position to normalized display coordinates (0..1). A value less than 0 or greater than 1 is

View File

@ -378,8 +378,7 @@ namespace FullscreenUI
static void BeginInputBinding(SettingsInterface* bsi, InputBindingInfo::Type type, const std::string_view& section, static void BeginInputBinding(SettingsInterface* bsi, InputBindingInfo::Type type, const std::string_view& section,
const std::string_view& key, const std::string_view& display_name); const std::string_view& key, const std::string_view& display_name);
static void DrawInputBindingWindow(); static void DrawInputBindingWindow();
static void DrawInputBindingButton(SettingsInterface* bsi, InputBindingInfo::Type type, const char* section, const char* name, static void DrawInputBindingButton(SettingsInterface* bsi, InputBindingInfo::Type type, const char* section, const char* name, const char* display_name, const char* icon_name, bool show_type = true);
const char* display_name, bool show_type = true);
static void ClearInputBindingVariables(); static void ClearInputBindingVariables();
static void StartAutomaticBinding(u32 port); static void StartAutomaticBinding(u32 port);
static void DrawSettingInfoSetting(SettingsInterface* bsi, const char* section, const char* key, const SettingInfo& si, static void DrawSettingInfoSetting(SettingsInterface* bsi, const char* section, const char* key, const SettingInfo& si,
@ -1155,53 +1154,87 @@ s32 FullscreenUI::GetEffectiveIntSetting(SettingsInterface* bsi, const char* sec
} }
void FullscreenUI::DrawInputBindingButton( void FullscreenUI::DrawInputBindingButton(
SettingsInterface* bsi, InputBindingInfo::Type type, const char* section, const char* name, const char* display_name, bool show_type) SettingsInterface* bsi, InputBindingInfo::Type type, const char* section, const char* name, const char* display_name, const char* icon_name, bool show_type)
{ {
std::string title(fmt::format("{}/{}", section, name)); TinyString title;
title.fmt("{}/{}", section, name);
std::string value = bsi->GetStringValue(section, name);
const bool oneline = (std::count_if(value.begin(), value.end(), [](char ch) { return (ch == '&'); }) <= 1);
ImRect bb; ImRect bb;
bool visible, hovered, clicked; bool visible, hovered, clicked;
clicked = MenuButtonFrame(title.c_str(), true, ImGuiFullscreen::LAYOUT_MENU_BUTTON_HEIGHT, &visible, &hovered, &bb.Min, &bb.Max); clicked = MenuButtonFrame(title, true,
oneline ? ImGuiFullscreen::LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY :
ImGuiFullscreen::LAYOUT_MENU_BUTTON_HEIGHT,
&visible, &hovered, &bb.Min, &bb.Max);
if (!visible) if (!visible)
return; return;
const float midpoint = bb.Min.y + g_large_font->FontSize + LayoutScale(4.0f); if (oneline)
const ImRect title_bb(bb.Min, ImVec2(bb.Max.x, midpoint)); InputManager::PrettifyInputBinding(value);
const ImRect summary_bb(ImVec2(bb.Min.x, midpoint), bb.Max);
if (show_type) if (show_type)
{ {
switch (type) if (icon_name)
{ {
case InputBindingInfo::Type::Button: title.fmt("{} {}", icon_name, display_name);
title = fmt::format(ICON_FA_DOT_CIRCLE " {}", display_name); }
break; else
case InputBindingInfo::Type::Axis: {
case InputBindingInfo::Type::HalfAxis: switch (type)
title = fmt::format(ICON_FA_BULLSEYE " {}", display_name); {
break; case InputBindingInfo::Type::Button:
case InputBindingInfo::Type::Motor: title.fmt(ICON_FA_DOT_CIRCLE " {}", display_name);
title = fmt::format(ICON_FA_BELL " {}", display_name); break;
break; case InputBindingInfo::Type::Axis:
case InputBindingInfo::Type::Macro: case InputBindingInfo::Type::HalfAxis:
title = fmt::format(ICON_FA_PIZZA_SLICE " {}", display_name); title.fmt(ICON_FA_BULLSEYE " {}", display_name);
break; break;
default: case InputBindingInfo::Type::Motor:
title = display_name; title.fmt(ICON_FA_BELL " {}", display_name);
break; break;
case InputBindingInfo::Type::Macro:
title.fmt(ICON_FA_PIZZA_SLICE " {}", display_name);
break;
default:
title = display_name;
break;
}
} }
} }
ImGui::PushFont(g_large_font); const float midpoint = bb.Min.y + g_large_font->FontSize + LayoutScale(4.0f);
ImGui::RenderTextClipped(
title_bb.Min, title_bb.Max, show_type ? title.c_str() : display_name, nullptr, nullptr, ImVec2(0.0f, 0.0f), &title_bb);
ImGui::PopFont();
const std::string value(bsi->GetStringValue(section, name)); if (oneline)
ImGui::PushFont(g_medium_font); {
ImGui::RenderTextClipped(summary_bb.Min, summary_bb.Max, value.empty() ? FSUI_CSTR("No Binding") : value.c_str(), nullptr, nullptr, ImGui::PushFont(g_large_font);
ImVec2(0.0f, 0.0f), &summary_bb);
ImGui::PopFont(); const ImVec2 value_size(ImGui::CalcTextSize(value.empty() ? FSUI_CSTR("-") : value.c_str(), nullptr));
const float text_end = bb.Max.x - value_size.x;
const ImRect title_bb(bb.Min, ImVec2(text_end, midpoint));
ImGui::RenderTextClipped(title_bb.Min, title_bb.Max, show_type ? title.c_str() : display_name, nullptr, nullptr,
ImVec2(0.0f, 0.0f), &title_bb);
ImGui::RenderTextClipped(bb.Min, bb.Max, value.empty() ? FSUI_CSTR("-") : value.c_str(), nullptr, &value_size,
ImVec2(1.0f, 0.5f), &bb);
ImGui::PopFont();
}
else
{
const ImRect title_bb(bb.Min, ImVec2(bb.Max.x, midpoint));
const ImRect summary_bb(ImVec2(bb.Min.x, midpoint), bb.Max);
ImGui::PushFont(g_large_font);
ImGui::RenderTextClipped(title_bb.Min, title_bb.Max, show_type ? title.c_str() : display_name, nullptr, nullptr,
ImVec2(0.0f, 0.0f), &title_bb);
ImGui::PopFont();
ImGui::PushFont(g_medium_font);
ImGui::RenderTextClipped(summary_bb.Min, summary_bb.Max, value.empty() ? FSUI_CSTR("No Binding") : value.c_str(),
nullptr, nullptr, ImVec2(0.0f, 0.0f), &summary_bb);
ImGui::PopFont();
}
if (clicked) if (clicked)
{ {
@ -4023,7 +4056,7 @@ void FullscreenUI::DrawControllerSettingsPage()
StartAutomaticBinding(global_slot); StartAutomaticBinding(global_slot);
for (const InputBindingInfo& bi : ci->bindings) for (const InputBindingInfo& bi : ci->bindings)
DrawInputBindingButton(bsi, bi.bind_type, section, bi.name, Host::TranslateToCString("Pad", bi.display_name), true); DrawInputBindingButton(bsi, bi.bind_type, section, bi.name, Host::TranslateToCString("Pad", bi.display_name), bi.icon_name, true);
if (mtap_enabled[mtap_port]) if (mtap_enabled[mtap_port])
{ {
@ -4047,11 +4080,28 @@ void FullscreenUI::DrawControllerSettingsPage()
continue; continue;
DrawInputBindingButton( DrawInputBindingButton(
bsi, InputBindingInfo::Type::Macro, section, TinyString::from_fmt("Macro{}", macro_index + 1), "Trigger"); bsi, InputBindingInfo::Type::Macro, section, TinyString::from_fmt("Macro{}", macro_index + 1), "Trigger", nullptr);
std::string binds_string(bsi->GetStringValue(section, fmt::format("Macro{}Binds", macro_index + 1).c_str())); std::string binds_string(bsi->GetStringValue(section, fmt::format("Macro{}Binds", macro_index + 1).c_str()));
if (MenuButton(FSUI_ICONSTR(ICON_FA_KEYBOARD, "Buttons"), TinyString pretty_binds_string;
binds_string.empty() ? FSUI_CSTR("No Buttons Selected") : binds_string.c_str())) if (!binds_string.empty())
{
for (const std::string_view& bind : StringUtil::SplitString(binds_string, '&', true))
{
const char* dispname = nullptr;
for (const InputBindingInfo& bi : ci->bindings)
{
if (bind == bi.name)
{
dispname = bi.icon_name ? bi.icon_name : Host::TranslateToCString("Pad", bi.display_name);
break;
}
}
pretty_binds_string.append_fmt("{}{}", pretty_binds_string.empty() ? "" : " ", dispname);
}
}
if (MenuButtonWithValue(FSUI_ICONSTR(ICON_FA_KEYBOARD, "Buttons"), nullptr, pretty_binds_string.empty() ? FSUI_CSTR("-") : pretty_binds_string.c_str(), true,
LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY))
{ {
std::vector<std::string_view> buttons_split(StringUtil::SplitString(binds_string, '&', true)); std::vector<std::string_view> buttons_split(StringUtil::SplitString(binds_string, '&', true));
ImGuiFullscreen::ChoiceDialogOptions options; ImGuiFullscreen::ChoiceDialogOptions options;
@ -4114,12 +4164,12 @@ void FullscreenUI::DrawControllerSettingsPage()
} }
const TinyString freq_key = TinyString::from_fmt("Macro{}Frequency", macro_index + 1); const TinyString freq_key = TinyString::from_fmt("Macro{}Frequency", macro_index + 1);
const TinyString freq_label = TinyString::from_fmt(FSUI_FSTR("Macro {} Frequency"), macro_index + 1); const TinyString freq_label = TinyString::from_fmt(ICON_FA_CLOCK " {}##macro_{}_frequency", FSUI_VSTR("Frequency"), macro_index + 1);
s32 frequency = bsi->GetIntValue(section, freq_key.c_str(), 0); s32 frequency = bsi->GetIntValue(section, freq_key.c_str(), 0);
const SmallString freq_summary = const SmallString freq_summary =
((frequency == 0) ? TinyString(FSUI_VSTR("Macro will not auto-toggle.")) : ((frequency == 0) ? TinyString(FSUI_VSTR("Disabled")) :
TinyString::from_fmt(FSUI_FSTR("Macro will toggle every {} frames."), frequency)); TinyString::from_fmt(FSUI_FSTR("{} Frames"), frequency));
if (MenuButton(FSUI_ICONSTR(ICON_FA_LIGHTBULB, "Frequency"), freq_summary.c_str())) if (MenuButtonWithValue(freq_label, FSUI_CSTR("Determines the frequency at which the macro will toggle the buttons on and off (aka auto fire)."), freq_summary, true))
ImGui::OpenPopup(freq_label.c_str()); ImGui::OpenPopup(freq_label.c_str());
const std::string pressure_key(fmt::format("Macro{}Pressure", macro_index + 1)); const std::string pressure_key(fmt::format("Macro{}Pressure", macro_index + 1));
@ -4264,7 +4314,7 @@ void FullscreenUI::DrawControllerSettingsPage()
for (const InputBindingInfo& bi : bindings) for (const InputBindingInfo& bi : bindings)
{ {
DrawInputBindingButton(bsi, bi.bind_type, section.c_str(), USB::GetConfigSubKey(type, bi.name).c_str(), DrawInputBindingButton(bsi, bi.bind_type, section.c_str(), USB::GetConfigSubKey(type, bi.name).c_str(),
Host::TranslateToCString("USB", bi.display_name)); Host::TranslateToCString("USB", bi.display_name), bi.icon_name);
} }
} }
@ -4299,7 +4349,7 @@ void FullscreenUI::DrawHotkeySettingsPage()
} }
DrawInputBindingButton( DrawInputBindingButton(
bsi, InputBindingInfo::Type::Button, "Hotkeys", hotkey->name, Host::TranslateToCString("Hotkeys", hotkey->display_name), false); bsi, InputBindingInfo::Type::Button, "Hotkeys", hotkey->name, Host::TranslateToCString("Hotkeys", hotkey->display_name), nullptr, false);
} }
EndMenuButtons(); EndMenuButtons();
@ -5512,7 +5562,7 @@ void FullscreenUI::DrawGameListWindow()
default: default:
break; break;
} }
if (VMManager::GetState() != VMState::Shutdown) if (VMManager::GetState() != VMState::Shutdown)
{ {
// Dummy window to prevent interacting with the game list while loading. // Dummy window to prevent interacting with the game list while loading.
@ -6133,9 +6183,9 @@ void FullscreenUI::DrawAboutWindow()
if (ImGui::BeginPopupModal(FSUI_CSTR("About PCSX2"), &s_about_window_open, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize)) if (ImGui::BeginPopupModal(FSUI_CSTR("About PCSX2"), &s_about_window_open, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize))
{ {
ImGui::TextWrapped("%s", FSUI_CSTR( ImGui::TextWrapped("%s", FSUI_CSTR(
"PCSX2 is a free and open-source PlayStation 2 (PS2) emulator. Its purpose is to emulate the PS2's hardware, using a " "PCSX2 is a free and open-source PlayStation 2 (PS2) emulator. Its purpose is to emulate the PS2's hardware, using a "
"combination of MIPS CPU Interpreters, Recompilers and a Virtual Machine which manages hardware states and PS2 system memory. " "combination of MIPS CPU Interpreters, Recompilers and a Virtual Machine which manages hardware states and PS2 system memory. "
"This allows you to play PS2 games on your PC, with many additional features and benefits.")); "This allows you to play PS2 games on your PC, with many additional features and benefits."));
ImGui::NewLine(); ImGui::NewLine();
@ -6428,6 +6478,7 @@ TRANSLATE_NOOP("FullscreenUI", "Start the console without any disc inserted.");
TRANSLATE_NOOP("FullscreenUI", "Start a game from a disc in your PC's DVD drive."); TRANSLATE_NOOP("FullscreenUI", "Start a game from a disc in your PC's DVD drive.");
TRANSLATE_NOOP("FullscreenUI", "Change settings for the emulator."); TRANSLATE_NOOP("FullscreenUI", "Change settings for the emulator.");
TRANSLATE_NOOP("FullscreenUI", "Exits the program."); TRANSLATE_NOOP("FullscreenUI", "Exits the program.");
TRANSLATE_NOOP("FullscreenUI", "-");
TRANSLATE_NOOP("FullscreenUI", "No Binding"); TRANSLATE_NOOP("FullscreenUI", "No Binding");
TRANSLATE_NOOP("FullscreenUI", "Setting %s binding %s."); TRANSLATE_NOOP("FullscreenUI", "Setting %s binding %s.");
TRANSLATE_NOOP("FullscreenUI", "Push a controller button or axis now."); TRANSLATE_NOOP("FullscreenUI", "Push a controller button or axis now.");
@ -6710,7 +6761,7 @@ TRANSLATE_NOOP("FullscreenUI", "The XInput source provides support for XBox 360/
TRANSLATE_NOOP("FullscreenUI", "Multitap"); TRANSLATE_NOOP("FullscreenUI", "Multitap");
TRANSLATE_NOOP("FullscreenUI", "Enables an additional three controller slots. Not supported in all games."); TRANSLATE_NOOP("FullscreenUI", "Enables an additional three controller slots. Not supported in all games.");
TRANSLATE_NOOP("FullscreenUI", "Attempts to map the selected port to a chosen controller."); TRANSLATE_NOOP("FullscreenUI", "Attempts to map the selected port to a chosen controller.");
TRANSLATE_NOOP("FullscreenUI", "No Buttons Selected"); TRANSLATE_NOOP("FullscreenUI", "Determines the frequency at which the macro will toggle the buttons on and off (aka auto fire).");
TRANSLATE_NOOP("FullscreenUI", "Determines how much pressure is simulated when macro is active."); TRANSLATE_NOOP("FullscreenUI", "Determines how much pressure is simulated when macro is active.");
TRANSLATE_NOOP("FullscreenUI", "Determines the pressure required to activate the macro."); TRANSLATE_NOOP("FullscreenUI", "Determines the pressure required to activate the macro.");
TRANSLATE_NOOP("FullscreenUI", "Toggle every %d frames"); TRANSLATE_NOOP("FullscreenUI", "Toggle every %d frames");
@ -6866,8 +6917,7 @@ TRANSLATE_NOOP("FullscreenUI", "Input profile '{}' saved.");
TRANSLATE_NOOP("FullscreenUI", "Failed to save input profile '{}'."); TRANSLATE_NOOP("FullscreenUI", "Failed to save input profile '{}'.");
TRANSLATE_NOOP("FullscreenUI", "Port {} Controller Type"); TRANSLATE_NOOP("FullscreenUI", "Port {} Controller Type");
TRANSLATE_NOOP("FullscreenUI", "Select Macro {} Binds"); TRANSLATE_NOOP("FullscreenUI", "Select Macro {} Binds");
TRANSLATE_NOOP("FullscreenUI", "Macro {} Frequency"); TRANSLATE_NOOP("FullscreenUI", "{} Frames");
TRANSLATE_NOOP("FullscreenUI", "Macro will toggle every {} frames.");
TRANSLATE_NOOP("FullscreenUI", "Port {} Device"); TRANSLATE_NOOP("FullscreenUI", "Port {} Device");
TRANSLATE_NOOP("FullscreenUI", "Port {} Subtype"); TRANSLATE_NOOP("FullscreenUI", "Port {} Subtype");
TRANSLATE_NOOP("FullscreenUI", "{} unlabelled patch codes will automatically activate."); TRANSLATE_NOOP("FullscreenUI", "{} unlabelled patch codes will automatically activate.");
@ -7091,6 +7141,7 @@ TRANSLATE_NOOP("FullscreenUI", "CRC");
TRANSLATE_NOOP("FullscreenUI", "Time Played"); TRANSLATE_NOOP("FullscreenUI", "Time Played");
TRANSLATE_NOOP("FullscreenUI", "Last Played"); TRANSLATE_NOOP("FullscreenUI", "Last Played");
TRANSLATE_NOOP("FullscreenUI", "Size"); TRANSLATE_NOOP("FullscreenUI", "Size");
TRANSLATE_NOOP("FullscreenUI", "Frequency");
TRANSLATE_NOOP("FullscreenUI", "Select Disc Image"); TRANSLATE_NOOP("FullscreenUI", "Select Disc Image");
TRANSLATE_NOOP("FullscreenUI", "Select Disc Drive"); TRANSLATE_NOOP("FullscreenUI", "Select Disc Drive");
TRANSLATE_NOOP("FullscreenUI", "Start File"); TRANSLATE_NOOP("FullscreenUI", "Start File");
@ -7165,7 +7216,6 @@ TRANSLATE_NOOP("FullscreenUI", "Controller Port {}{} Macros");
TRANSLATE_NOOP("FullscreenUI", "Controller Port {} Macros"); TRANSLATE_NOOP("FullscreenUI", "Controller Port {} Macros");
TRANSLATE_NOOP("FullscreenUI", "Macro Button {}"); TRANSLATE_NOOP("FullscreenUI", "Macro Button {}");
TRANSLATE_NOOP("FullscreenUI", "Buttons"); TRANSLATE_NOOP("FullscreenUI", "Buttons");
TRANSLATE_NOOP("FullscreenUI", "Frequency");
TRANSLATE_NOOP("FullscreenUI", "Pressure"); TRANSLATE_NOOP("FullscreenUI", "Pressure");
TRANSLATE_NOOP("FullscreenUI", "Deadzone"); TRANSLATE_NOOP("FullscreenUI", "Deadzone");
TRANSLATE_NOOP("FullscreenUI", "Controller Port {}{} Settings"); TRANSLATE_NOOP("FullscreenUI", "Controller Port {}{} Settings");

View File

@ -55,7 +55,6 @@ namespace ImGuiFullscreen
static void DrawBackgroundProgressDialogs(ImVec2& position, float spacing); static void DrawBackgroundProgressDialogs(ImVec2& position, float spacing);
static void DrawNotifications(ImVec2& position, float spacing); static void DrawNotifications(ImVec2& position, float spacing);
static void DrawToast(); static void DrawToast();
static void GetMenuButtonFrameBounds(float height, ImVec2* pos, ImVec2* size);
static bool MenuButtonFrame(const char* str_id, bool enabled, float height, bool* visible, bool* hovered, ImRect* bb, static bool MenuButtonFrame(const char* str_id, bool enabled, float height, bool* visible, bool* hovered, ImRect* bb,
ImGuiButtonFlags flags = 0, float hover_alpha = 1.0f); ImGuiButtonFlags flags = 0, float hover_alpha = 1.0f);
static void PopulateFileSelectorItems(); static void PopulateFileSelectorItems();

View File

@ -154,6 +154,7 @@ namespace ImGuiFullscreen
void BeginMenuButtons(u32 num_items = 0, float y_align = 0.0f, float x_padding = LAYOUT_MENU_BUTTON_X_PADDING, void BeginMenuButtons(u32 num_items = 0, float y_align = 0.0f, float x_padding = LAYOUT_MENU_BUTTON_X_PADDING,
float y_padding = LAYOUT_MENU_BUTTON_Y_PADDING, float item_height = LAYOUT_MENU_BUTTON_HEIGHT); float y_padding = LAYOUT_MENU_BUTTON_Y_PADDING, float item_height = LAYOUT_MENU_BUTTON_HEIGHT);
void EndMenuButtons(); void EndMenuButtons();
void GetMenuButtonFrameBounds(float height, ImVec2* pos, ImVec2* size);
bool MenuButtonFrame(const char* str_id, bool enabled, float height, bool* visible, bool* hovered, ImVec2* min, ImVec2* max, bool MenuButtonFrame(const char* str_id, bool enabled, float height, bool* visible, bool* hovered, ImVec2* min, ImVec2* max,
ImGuiButtonFlags flags = 0, float hover_alpha = 1.0f); ImGuiButtonFlags flags = 0, float hover_alpha = 1.0f);
void MenuHeading(const char* title, bool draw_line = true); void MenuHeading(const char* title, bool draw_line = true);

View File

@ -90,7 +90,8 @@ static ImFont* s_large_font;
static std::vector<u8> s_standard_font_data; static std::vector<u8> s_standard_font_data;
static std::vector<u8> s_fixed_font_data; static std::vector<u8> s_fixed_font_data;
static std::vector<u8> s_icon_font_data; static std::vector<u8> s_icon_fa_font_data;
static std::vector<u8> s_icon_pf_font_data;
static float s_window_width; static float s_window_width;
static float s_window_height; static float s_window_height;
@ -425,14 +426,24 @@ bool ImGuiManager::LoadFontData()
s_fixed_font_data = std::move(font_data.value()); s_fixed_font_data = std::move(font_data.value());
} }
if (s_icon_font_data.empty()) if (s_icon_fa_font_data.empty())
{ {
std::optional<std::vector<u8>> font_data = std::optional<std::vector<u8>> font_data =
FileSystem::ReadBinaryFile(Path::Combine(EmuFolders::Resources, "fonts" FS_OSPATH_SEPARATOR_STR "fa-solid-900.ttf").c_str()); FileSystem::ReadBinaryFile(Path::Combine(EmuFolders::Resources, "fonts" FS_OSPATH_SEPARATOR_STR "fa-solid-900.ttf").c_str());
if (!font_data.has_value()) if (!font_data.has_value())
return false; return false;
s_icon_font_data = std::move(font_data.value()); s_icon_fa_font_data = std::move(font_data.value());
}
if (s_icon_pf_font_data.empty())
{
std::optional<std::vector<u8>> font_data =
FileSystem::ReadBinaryFile(Path::Combine(EmuFolders::Resources, "fonts" FS_OSPATH_SEPARATOR_STR "promptfont.otf").c_str());
if (!font_data.has_value())
return false;
s_icon_pf_font_data = std::move(font_data.value());
} }
return true; return true;
@ -442,7 +453,8 @@ void ImGuiManager::UnloadFontData()
{ {
std::vector<u8>().swap(s_standard_font_data); std::vector<u8>().swap(s_standard_font_data);
std::vector<u8>().swap(s_fixed_font_data); std::vector<u8>().swap(s_fixed_font_data);
std::vector<u8>().swap(s_icon_font_data); std::vector<u8>().swap(s_icon_fa_font_data);
std::vector<u8>().swap(s_icon_pf_font_data);
} }
ImFont* ImGuiManager::AddTextFont(float size) ImFont* ImGuiManager::AddTextFont(float size)
@ -486,17 +498,40 @@ bool ImGuiManager::AddIconFonts(float size)
{ {
// clang-format off // clang-format off
static constexpr ImWchar range_fa[] = { 0xf002,0xf002,0xf005,0xf005,0xf007,0xf007,0xf00c,0xf00e,0xf011,0xf011,0xf013,0xf013,0xf017,0xf017,0xf019,0xf019,0xf01c,0xf01c,0xf021,0xf021,0xf023,0xf023,0xf025,0xf025,0xf027,0xf028,0xf02e,0xf02e,0xf030,0xf030,0xf03a,0xf03a,0xf03d,0xf03d,0xf04a,0xf04c,0xf04e,0xf04e,0xf050,0xf050,0xf052,0xf052,0xf059,0xf059,0xf05e,0xf05e,0xf063,0xf063,0xf065,0xf065,0xf067,0xf067,0xf06a,0xf06a,0xf071,0xf071,0xf077,0xf078,0xf07b,0xf07c,0xf084,0xf085,0xf091,0xf091,0xf0ac,0xf0ad,0xf0b0,0xf0b0,0xf0c5,0xf0c5,0xf0c7,0xf0c9,0xf0cb,0xf0cb,0xf0d0,0xf0d0,0xf0dc,0xf0dc,0xf0e2,0xf0e2,0xf0eb,0xf0eb,0xf0f1,0xf0f1,0xf0f3,0xf0f3,0xf0fe,0xf0fe,0xf110,0xf110,0xf119,0xf119,0xf11b,0xf11c,0xf121,0xf121,0xf133,0xf133,0xf140,0xf140,0xf144,0xf144,0xf14a,0xf14a,0xf15b,0xf15b,0xf15d,0xf15d,0xf188,0xf188,0xf191,0xf192,0xf1c9,0xf1c9,0xf1dd,0xf1de,0xf1e6,0xf1e6,0xf1ea,0xf1eb,0xf1f8,0xf1f8,0xf1fc,0xf1fc,0xf242,0xf242,0xf245,0xf245,0xf26c,0xf26c,0xf279,0xf279,0xf2d0,0xf2d0,0xf2db,0xf2db,0xf2f2,0xf2f2,0xf2f5,0xf2f5,0xf302,0xf302,0xf3c1,0xf3c1,0xf3fd,0xf3fd,0xf410,0xf410,0xf466,0xf466,0xf500,0xf500,0xf517,0xf517,0xf51f,0xf51f,0xf543,0xf543,0xf545,0xf545,0xf547,0xf548,0xf552,0xf552,0xf5a2,0xf5a2,0xf5e7,0xf5e7,0xf65d,0xf65e,0xf6a9,0xf6a9,0xf756,0xf756,0xf7c2,0xf7c2,0xf807,0xf807,0xf815,0xf815,0xf818,0xf818,0xf84c,0xf84c,0xf8cc,0xf8cc,0xf8d9,0xf8d9,0x0,0x0 }; static constexpr ImWchar range_fa[] = { 0xf002,0xf002,0xf005,0xf005,0xf007,0xf007,0xf00c,0xf00e,0xf011,0xf011,0xf013,0xf013,0xf017,0xf017,0xf019,0xf019,0xf01c,0xf01c,0xf021,0xf021,0xf023,0xf023,0xf025,0xf025,0xf027,0xf028,0xf02e,0xf02e,0xf030,0xf030,0xf03a,0xf03a,0xf03d,0xf03d,0xf04a,0xf04c,0xf04e,0xf04e,0xf050,0xf050,0xf052,0xf052,0xf059,0xf059,0xf05e,0xf05e,0xf063,0xf063,0xf065,0xf065,0xf067,0xf067,0xf06a,0xf06a,0xf071,0xf071,0xf077,0xf078,0xf07b,0xf07c,0xf084,0xf085,0xf091,0xf091,0xf0ac,0xf0ad,0xf0b0,0xf0b0,0xf0c5,0xf0c5,0xf0c7,0xf0c9,0xf0cb,0xf0cb,0xf0d0,0xf0d0,0xf0dc,0xf0dc,0xf0e2,0xf0e2,0xf0eb,0xf0eb,0xf0f1,0xf0f1,0xf0f3,0xf0f3,0xf0fe,0xf0fe,0xf110,0xf110,0xf119,0xf119,0xf11b,0xf11c,0xf121,0xf121,0xf133,0xf133,0xf140,0xf140,0xf144,0xf144,0xf14a,0xf14a,0xf15b,0xf15b,0xf15d,0xf15d,0xf188,0xf188,0xf191,0xf192,0xf1c9,0xf1c9,0xf1dd,0xf1de,0xf1e6,0xf1e6,0xf1ea,0xf1eb,0xf1f8,0xf1f8,0xf1fc,0xf1fc,0xf242,0xf242,0xf245,0xf245,0xf26c,0xf26c,0xf279,0xf279,0xf2d0,0xf2d0,0xf2db,0xf2db,0xf2f2,0xf2f2,0xf2f5,0xf2f5,0xf302,0xf302,0xf3c1,0xf3c1,0xf3fd,0xf3fd,0xf410,0xf410,0xf466,0xf466,0xf500,0xf500,0xf517,0xf517,0xf51f,0xf51f,0xf543,0xf543,0xf545,0xf545,0xf547,0xf548,0xf552,0xf552,0xf5a2,0xf5a2,0xf5e7,0xf5e7,0xf65d,0xf65e,0xf6a9,0xf6a9,0xf756,0xf756,0xf7c2,0xf7c2,0xf807,0xf807,0xf815,0xf815,0xf818,0xf818,0xf84c,0xf84c,0xf8cc,0xf8cc,0xf8d9,0xf8d9,0x0,0x0 };
static constexpr ImWchar range_pf[] = { 0x2198,0x2199,0x219e,0x21a1,0x21b0,0x21b3,0x21ba,0x21c3,0x21d0,0x21d4,0x21dc,0x21dd,0x21e0,0x21e3,0x21f3,0x21f3,0x21f7,0x21f8,0x21fa,0x21fb,0x227a,0x227d,0x23f4,0x23f7,0x2427,0x243a,0x243c,0x243c,0x2460,0x246b,0x24f5,0x24fd,0x24ff,0x24ff,0x278a,0x278e,0xe001,0xe001,0xff21,0xff3a,0x0,0x0 };
// clang-format on // clang-format on
ImFontConfig cfg; {
cfg.MergeMode = true; ImFontConfig cfg;
cfg.PixelSnapH = true; cfg.MergeMode = true;
cfg.GlyphMinAdvanceX = size; cfg.PixelSnapH = true;
cfg.GlyphMaxAdvanceX = size; cfg.GlyphMinAdvanceX = size;
cfg.FontDataOwnedByAtlas = false; cfg.GlyphMaxAdvanceX = size;
cfg.FontDataOwnedByAtlas = false;
return (ImGui::GetIO().Fonts->AddFontFromMemoryTTF( if (!ImGui::GetIO().Fonts->AddFontFromMemoryTTF(
s_icon_font_data.data(), static_cast<int>(s_icon_font_data.size()), size * 0.75f, &cfg, range_fa) != nullptr); s_icon_fa_font_data.data(), static_cast<int>(s_icon_fa_font_data.size()), size * 0.75f, &cfg, range_fa))
{
return false;
}
}
{
ImFontConfig cfg;
cfg.MergeMode = true;
cfg.PixelSnapH = true;
cfg.GlyphMinAdvanceX = size;
cfg.GlyphMaxAdvanceX = size;
cfg.FontDataOwnedByAtlas = false;
if (!ImGui::GetIO().Fonts->AddFontFromMemoryTTF(
s_icon_pf_font_data.data(), static_cast<int>(s_icon_pf_font_data.size()), size * 1.2f, &cfg, range_pf))
{
return false;
}
}
return true;
} }
bool ImGuiManager::AddImGuiFonts(bool fullscreen_fonts) bool ImGuiManager::AddImGuiFonts(bool fullscreen_fonts)

View File

@ -53,7 +53,7 @@
namespace ImGuiManager namespace ImGuiManager
{ {
static void FormatProcessorStat(std::string& text, double usage, double time); static void FormatProcessorStat(SmallStringBase& text, double usage, double time);
static void DrawPerformanceOverlay(float& position_y); static void DrawPerformanceOverlay(float& position_y);
static void DrawSettingsOverlay(); static void DrawSettingsOverlay();
static void DrawInputsOverlay(); static void DrawInputsOverlay();
@ -86,15 +86,15 @@ static std::tuple<float, float> GetMinMax(std::span<const float> values)
return std::tie(min, max); return std::tie(min, max);
} }
void ImGuiManager::FormatProcessorStat(std::string& text, double usage, double time) void ImGuiManager::FormatProcessorStat(SmallStringBase& text, double usage, double time)
{ {
// Some values, such as GPU (and even CPU to some extent) can be out of phase with the wall clock, // Some values, such as GPU (and even CPU to some extent) can be out of phase with the wall clock,
// which the processor time is divided by to get a utilization percentage. Let's clamp it at 100%, // which the processor time is divided by to get a utilization percentage. Let's clamp it at 100%,
// so that people don't get confused, and remove the decimal places when it's there while we're at it. // so that people don't get confused, and remove the decimal places when it's there while we're at it.
if (usage >= 99.95) if (usage >= 99.95)
fmt::format_to(std::back_inserter(text), "100% ({:.2f}ms)", time); text.append_fmt("100% ({:.2f}ms)", time);
else else
fmt::format_to(std::back_inserter(text), "{:.1f}% ({:.2f}ms)", usage, time); text.append_fmt("{:.1f}% ({:.2f}ms)", usage, time);
} }
void ImGuiManager::DrawPerformanceOverlay(float& position_y) void ImGuiManager::DrawPerformanceOverlay(float& position_y)
@ -108,11 +108,9 @@ void ImGuiManager::DrawPerformanceOverlay(float& position_y)
ImFont* const standard_font = ImGuiManager::GetStandardFont(); ImFont* const standard_font = ImGuiManager::GetStandardFont();
ImDrawList* dl = ImGui::GetBackgroundDrawList(); ImDrawList* dl = ImGui::GetBackgroundDrawList();
std::string text; SmallString text;
ImVec2 text_size; ImVec2 text_size;
text.reserve(128);
#define DRAW_LINE(font, text, color) \ #define DRAW_LINE(font, text, color) \
do \ do \
{ \ { \
@ -136,31 +134,31 @@ void ImGuiManager::DrawPerformanceOverlay(float& position_y)
switch (PerformanceMetrics::GetInternalFPSMethod()) switch (PerformanceMetrics::GetInternalFPSMethod())
{ {
case PerformanceMetrics::InternalFPSMethod::GSPrivilegedRegister: case PerformanceMetrics::InternalFPSMethod::GSPrivilegedRegister:
fmt::format_to(std::back_inserter(text), "G: {:.2f} [P] | V: {:.2f}", PerformanceMetrics::GetInternalFPS(), text.append_fmt("G: {:.2f} [P] | V: {:.2f}", PerformanceMetrics::GetInternalFPS(),
PerformanceMetrics::GetFPS()); PerformanceMetrics::GetFPS());
break; break;
case PerformanceMetrics::InternalFPSMethod::DISPFBBlit: case PerformanceMetrics::InternalFPSMethod::DISPFBBlit:
fmt::format_to(std::back_inserter(text), "G: {:.2f} [B] | V: {:.2f}", PerformanceMetrics::GetInternalFPS(), text.append_fmt("G: {:.2f} [B] | V: {:.2f}", PerformanceMetrics::GetInternalFPS(),
PerformanceMetrics::GetFPS()); PerformanceMetrics::GetFPS());
break; break;
case PerformanceMetrics::InternalFPSMethod::None: case PerformanceMetrics::InternalFPSMethod::None:
default: default:
fmt::format_to(std::back_inserter(text), "V: {:.2f}", PerformanceMetrics::GetFPS()); text.append_fmt("V: {:.2f}", PerformanceMetrics::GetFPS());
break; break;
} }
first = false; first = false;
} }
if (GSConfig.OsdShowSpeed) if (GSConfig.OsdShowSpeed)
{ {
fmt::format_to(std::back_inserter(text), "{}{}%", first ? "" : " | ", static_cast<u32>(std::round(speed))); text.append_fmt("{}{}%", first ? "" : " | ", static_cast<u32>(std::round(speed)));
const float target_speed = VMManager::GetTargetSpeed(); const float target_speed = VMManager::GetTargetSpeed();
if (target_speed == 0.0f) if (target_speed == 0.0f)
text += " (Max)"; text.append(" (Max)");
else else
fmt::format_to(std::back_inserter(text), " ({:.0f}%)", target_speed * 100.0f); text.append_fmt(" ({:.0f}%)", target_speed * 100.0f);
} }
if (!text.empty()) if (!text.empty())
{ {
@ -193,20 +191,20 @@ void ImGuiManager::DrawPerformanceOverlay(float& position_y)
GSgetInternalResolution(&width, &height); GSgetInternalResolution(&width, &height);
text.clear(); text.clear();
fmt::format_to(std::back_inserter(text), "{}x{} {} {}", width, height, ReportVideoMode(), ReportInterlaceMode()); text.append_fmt("{}x{} {} {}", width, height, ReportVideoMode(), ReportInterlaceMode());
DRAW_LINE(fixed_font, text.c_str(), IM_COL32(255, 255, 255, 255)); DRAW_LINE(fixed_font, text.c_str(), IM_COL32(255, 255, 255, 255));
} }
if (GSConfig.OsdShowCPU) if (GSConfig.OsdShowCPU)
{ {
text.clear(); text.clear();
fmt::format_to(std::back_inserter(text), "{:.2f}ms | {:.2f}ms | {:.2f}ms", PerformanceMetrics::GetMinimumFrameTime(), text.append_fmt("{:.2f}ms | {:.2f}ms | {:.2f}ms", PerformanceMetrics::GetMinimumFrameTime(),
PerformanceMetrics::GetAverageFrameTime(), PerformanceMetrics::GetMaximumFrameTime()); PerformanceMetrics::GetAverageFrameTime(), PerformanceMetrics::GetMaximumFrameTime());
DRAW_LINE(fixed_font, text.c_str(), IM_COL32(255, 255, 255, 255)); DRAW_LINE(fixed_font, text.c_str(), IM_COL32(255, 255, 255, 255));
text.clear(); text.clear();
if (EmuConfig.Speedhacks.EECycleRate != 0 || EmuConfig.Speedhacks.EECycleSkip != 0) if (EmuConfig.Speedhacks.EECycleRate != 0 || EmuConfig.Speedhacks.EECycleSkip != 0)
fmt::format_to(std::back_inserter(text), "EE[{}/{}]: ", EmuConfig.Speedhacks.EECycleRate, EmuConfig.Speedhacks.EECycleSkip); text.append_fmt("EE[{}/{}]: ", EmuConfig.Speedhacks.EECycleRate, EmuConfig.Speedhacks.EECycleSkip);
else else
text = "EE: "; text = "EE: ";
FormatProcessorStat(text, PerformanceMetrics::GetCPUThreadUsage(), PerformanceMetrics::GetCPUThreadAverageTime()); FormatProcessorStat(text, PerformanceMetrics::GetCPUThreadUsage(), PerformanceMetrics::GetCPUThreadAverageTime());
@ -220,7 +218,7 @@ void ImGuiManager::DrawPerformanceOverlay(float& position_y)
for (u32 i = 0; i < gs_sw_threads; i++) for (u32 i = 0; i < gs_sw_threads; i++)
{ {
text.clear(); text.clear();
fmt::format_to(std::back_inserter(text), "SW-{}: ", i); text.append_fmt("SW-{}: ", i);
FormatProcessorStat(text, PerformanceMetrics::GetGSSWThreadUsage(i), PerformanceMetrics::GetGSSWThreadAverageTime(i)); FormatProcessorStat(text, PerformanceMetrics::GetGSSWThreadUsage(i), PerformanceMetrics::GetGSSWThreadAverageTime(i));
DRAW_LINE(fixed_font, text.c_str(), IM_COL32(255, 255, 255, 255)); DRAW_LINE(fixed_font, text.c_str(), IM_COL32(255, 255, 255, 255));
} }
@ -297,7 +295,7 @@ void ImGuiManager::DrawPerformanceOverlay(float& position_y)
const ImVec2 wpos(ImGui::GetCurrentWindow()->Pos); const ImVec2 wpos(ImGui::GetCurrentWindow()->Pos);
text.clear(); text.clear();
fmt::format_to(std::back_inserter(text), "{:.1f} ms", max); text.append_fmt("{:.1f} ms", max);
text_size = fixed_font->CalcTextSizeA(fixed_font->FontSize, FLT_MAX, 0.0f, text.c_str(), text.c_str() + text.length()); text_size = fixed_font->CalcTextSizeA(fixed_font->FontSize, FLT_MAX, 0.0f, text.c_str(), text.c_str() + text.length());
win_dl->AddText(ImVec2(wpos.x + history_size.x - text_size.x - spacing + shadow_offset, wpos.y + shadow_offset), win_dl->AddText(ImVec2(wpos.x + history_size.x - text_size.x - spacing + shadow_offset, wpos.y + shadow_offset),
IM_COL32(0, 0, 0, 100), text.c_str(), text.c_str() + text.length()); IM_COL32(0, 0, 0, 100), text.c_str(), text.c_str() + text.length());
@ -305,7 +303,7 @@ void ImGuiManager::DrawPerformanceOverlay(float& position_y)
text.c_str() + text.length()); text.c_str() + text.length());
text.clear(); text.clear();
fmt::format_to(std::back_inserter(text), "{:.1f} ms", min); text.append_fmt("{:.1f} ms", min);
text_size = fixed_font->CalcTextSizeA(fixed_font->FontSize, FLT_MAX, 0.0f, text.c_str(), text.c_str() + text.length()); text_size = fixed_font->CalcTextSizeA(fixed_font->FontSize, FLT_MAX, 0.0f, text.c_str(), text.c_str() + text.length());
win_dl->AddText(ImVec2(wpos.x + history_size.x - text_size.x - spacing + shadow_offset, win_dl->AddText(ImVec2(wpos.x + history_size.x - text_size.x - spacing + shadow_offset,
wpos.y + history_size.y - fixed_font->FontSize + shadow_offset), wpos.y + history_size.y - fixed_font->FontSize + shadow_offset),
@ -470,7 +468,7 @@ void ImGuiManager::DrawInputsOverlay()
const float shadow_offset = 1.0f * scale; const float shadow_offset = 1.0f * scale;
const float margin = 10.0f * scale; const float margin = 10.0f * scale;
const float spacing = 5.0f * scale; const float spacing = 5.0f * scale;
ImFont* font = ImGuiManager::GetFixedFont(); ImFont* font = ImGuiManager::GetStandardFont();
static constexpr u32 text_color = IM_COL32(0xff, 0xff, 0xff, 255); static constexpr u32 text_color = IM_COL32(0xff, 0xff, 0xff, 255);
static constexpr u32 shadow_color = IM_COL32(0x00, 0x00, 0x00, 100); static constexpr u32 shadow_color = IM_COL32(0x00, 0x00, 0x00, 100);
@ -497,8 +495,7 @@ void ImGuiManager::DrawInputsOverlay()
const ImVec4 clip_rect(current_x, current_y, display_size.x - margin, display_size.y - margin); const ImVec4 clip_rect(current_x, current_y, display_size.x - margin, display_size.y - margin);
std::string text; SmallString text;
text.reserve(256);
for (u32 slot = 0; slot < Pad::NUM_CONTROLLER_PORTS; slot++) for (u32 slot = 0; slot < Pad::NUM_CONTROLLER_PORTS; slot++)
{ {
@ -507,10 +504,12 @@ void ImGuiManager::DrawInputsOverlay()
if (ctype == Pad::ControllerType::NotConnected) if (ctype == Pad::ControllerType::NotConnected)
continue; continue;
text.clear();
fmt::format_to(std::back_inserter(text), "P{} |", slot + 1u);
const Pad::ControllerInfo& cinfo = pad->GetInfo(); const Pad::ControllerInfo& cinfo = pad->GetInfo();
if (cinfo.icon_name)
text.fmt("{} {}", cinfo.icon_name, slot + 1u);
else
text.fmt("{} |", slot + 1u);
for (u32 bind = 0; bind < static_cast<u32>(cinfo.bindings.size()); bind++) for (u32 bind = 0; bind < static_cast<u32>(cinfo.bindings.size()); bind++)
{ {
const InputBindingInfo& bi = cinfo.bindings[bind]; const InputBindingInfo& bi = cinfo.bindings[bind];
@ -522,9 +521,9 @@ void ImGuiManager::DrawInputsOverlay()
// axes are always shown // axes are always shown
const float value = static_cast<float>(pad->GetRawInput(bind)) * (1.0f / 255.0f); const float value = static_cast<float>(pad->GetRawInput(bind)) * (1.0f / 255.0f);
if (value >= (254.0f / 255.0f)) if (value >= (254.0f / 255.0f))
fmt::format_to(std::back_inserter(text), " {}", bi.name); text.append_fmt(" {}", bi.icon_name ? bi.icon_name : bi.name);
else if (value > (1.0f / 255.0f)) else if (value > (1.0f / 255.0f))
fmt::format_to(std::back_inserter(text), " {}: {:.2f}", bi.name, value); text.append_fmt(" {}: {:.2f}", bi.icon_name ? bi.icon_name : bi.name, value);
} }
break; break;
@ -533,7 +532,7 @@ void ImGuiManager::DrawInputsOverlay()
// buttons only shown when active // buttons only shown when active
const float value = static_cast<float>(pad->GetRawInput(bind)) * (1.0f / 255.0f); const float value = static_cast<float>(pad->GetRawInput(bind)) * (1.0f / 255.0f);
if (value >= 0.5f) if (value >= 0.5f)
fmt::format_to(std::back_inserter(text), " {}", bi.name); text.append_fmt(" {}", bi.icon_name ? bi.icon_name : bi.name);
} }
break; break;
@ -562,8 +561,7 @@ void ImGuiManager::DrawInputsOverlay()
if (bindings.empty()) if (bindings.empty())
continue; continue;
text.clear(); text.fmt("USB{} |", port + 1u);
fmt::format_to(std::back_inserter(text), "USB{} |", port + 1u);
for (const InputBindingInfo& bi : bindings) for (const InputBindingInfo& bi : bindings)
{ {
@ -575,9 +573,9 @@ void ImGuiManager::DrawInputsOverlay()
// axes are always shown // axes are always shown
const float value = static_cast<float>(USB::GetDeviceBindValue(port, bi.bind_index)); const float value = static_cast<float>(USB::GetDeviceBindValue(port, bi.bind_index));
if (value >= (254.0f / 255.0f)) if (value >= (254.0f / 255.0f))
fmt::format_to(std::back_inserter(text), " {}", bi.name); text.append_fmt(" {}", bi.icon_name ? bi.icon_name : bi.name);
else if (value > (1.0f / 255.0f)) else if (value > (1.0f / 255.0f))
fmt::format_to(std::back_inserter(text), " {}: {:.2f}", bi.name, value); text.append_fmt(" {}: {:.2f}", bi.icon_name ? bi.icon_name : bi.name, value);
} }
break; break;
@ -586,7 +584,7 @@ void ImGuiManager::DrawInputsOverlay()
// buttons only shown when active // buttons only shown when active
const float value = static_cast<float>(USB::GetDeviceBindValue(port, bi.bind_index)); const float value = static_cast<float>(USB::GetDeviceBindValue(port, bi.bind_index));
if (value >= 0.5f) if (value >= 0.5f)
fmt::format_to(std::back_inserter(text), " {}", bi.name); text.append_fmt(" {}", bi.icon_name ? bi.icon_name : bi.name);
} }
break; break;

View File

@ -397,32 +397,38 @@ std::optional<InputBindingKey> DInputSource::ParseKeyString(const std::string_vi
return std::nullopt; return std::nullopt;
} }
std::string DInputSource::ConvertKeyToString(InputBindingKey key) TinyString DInputSource::ConvertKeyToString(InputBindingKey key)
{ {
std::string ret; TinyString ret;
if (key.source_type == InputSourceType::DInput) if (key.source_type == InputSourceType::DInput)
{ {
if (key.source_subtype == InputSubclass::ControllerAxis) if (key.source_subtype == InputSubclass::ControllerAxis)
{ {
const char* modifier = (key.modifier == InputModifier::FullAxis ? "Full" : (key.modifier == InputModifier::Negate ? "-" : "+")); const char* modifier = (key.modifier == InputModifier::FullAxis ? "Full" : (key.modifier == InputModifier::Negate ? "-" : "+"));
ret = fmt::format("DInput-{}/{}Axis{}{}", u32(key.source_index), modifier, u32(key.data), (key.invert && !m_ignore_inversion) ? "~" : ""); ret.fmt("DInput-{}/{}Axis{}{}", u32(key.source_index), modifier, u32(key.data), (key.invert && !m_ignore_inversion) ? "~" : "");
} }
else if (key.source_subtype == InputSubclass::ControllerButton && key.data >= MAX_NUM_BUTTONS) else if (key.source_subtype == InputSubclass::ControllerButton && key.data >= MAX_NUM_BUTTONS)
{ {
const u32 hat_num = (key.data - MAX_NUM_BUTTONS) / NUM_HAT_DIRECTIONS; const u32 hat_num = (key.data - MAX_NUM_BUTTONS) / NUM_HAT_DIRECTIONS;
const u32 hat_dir = (key.data - MAX_NUM_BUTTONS) % NUM_HAT_DIRECTIONS; const u32 hat_dir = (key.data - MAX_NUM_BUTTONS) % NUM_HAT_DIRECTIONS;
ret = fmt::format("DInput-{}/Hat{}{}", u32(key.source_index), hat_num, s_hat_directions[hat_dir]); ret.fmt("DInput-{}/Hat{}{}", u32(key.source_index), hat_num, s_hat_directions[hat_dir]);
} }
else if (key.source_subtype == InputSubclass::ControllerButton) else if (key.source_subtype == InputSubclass::ControllerButton)
{ {
ret = fmt::format("DInput-{}/Button{}", u32(key.source_index), u32(key.data)); ret.fmt("DInput-{}/Button{}", u32(key.source_index), u32(key.data));
} }
} }
return ret; return ret;
} }
TinyString DInputSource::ConvertKeyToIcon(InputBindingKey key)
{
return {};
}
void DInputSource::CheckForStateChanges(size_t index, const DIJOYSTATE2& new_state) void DInputSource::CheckForStateChanges(size_t index, const DIJOYSTATE2& new_state)
{ {
ControllerData& cd = m_controllers[index]; ControllerData& cd = m_controllers[index];

View File

@ -60,7 +60,8 @@ public:
void UpdateMotorState(InputBindingKey large_key, InputBindingKey small_key, float large_intensity, float small_intensity) override; void UpdateMotorState(InputBindingKey large_key, InputBindingKey small_key, float large_intensity, float small_intensity) override;
std::optional<InputBindingKey> ParseKeyString(const std::string_view& device, const std::string_view& binding) override; std::optional<InputBindingKey> ParseKeyString(const std::string_view& device, const std::string_view& binding) override;
std::string ConvertKeyToString(InputBindingKey key) override; TinyString ConvertKeyToString(InputBindingKey key) override;
TinyString ConvertKeyToIcon(InputBindingKey key) override;
private: private:
struct ControllerData struct ControllerData

View File

@ -27,6 +27,8 @@
#include "common/StringUtil.h" #include "common/StringUtil.h"
#include "common/Timer.h" #include "common/Timer.h"
#include "IconsPromptFont.h"
#include "fmt/core.h" #include "fmt/core.h"
#include <array> #include <array>
@ -104,6 +106,7 @@ namespace InputManager
static std::vector<std::string_view> SplitChord(const std::string_view& binding); static std::vector<std::string_view> SplitChord(const std::string_view& binding);
static bool SplitBinding(const std::string_view& binding, std::string_view* source, std::string_view* sub_binding); static bool SplitBinding(const std::string_view& binding, std::string_view* source, std::string_view* sub_binding);
static void PrettifyInputBindingPart(const std::string_view binding, SmallString& ret, bool& changed);
static void AddBinding(const std::string_view& binding, const InputEventHandler& handler); static void AddBinding(const std::string_view& binding, const InputEventHandler& handler);
static void AddBindings(const std::vector<std::string>& bindings, const InputEventHandler& handler); static void AddBindings(const std::vector<std::string>& bindings, const InputEventHandler& handler);
static bool ParseBindingAndGetSource(const std::string_view& binding, InputBindingKey* key, InputSource** source); static bool ParseBindingAndGetSource(const std::string_view& binding, InputBindingKey* key, InputSource** source);
@ -325,7 +328,7 @@ std::string InputManager::ConvertInputBindingKeyToString(InputBindingInfo::Type
} }
else if (key.source_type < InputSourceType::Count && s_input_sources[static_cast<u32>(key.source_type)]) else if (key.source_type < InputSourceType::Count && s_input_sources[static_cast<u32>(key.source_type)])
{ {
return s_input_sources[static_cast<u32>(key.source_type)]->ConvertKeyToString(key); return std::string(s_input_sources[static_cast<u32>(key.source_type)]->ConvertKeyToString(key));
} }
} }
@ -358,6 +361,117 @@ std::string InputManager::ConvertInputBindingKeysToString(InputBindingInfo::Type
return ss.str(); return ss.str();
} }
bool InputManager::PrettifyInputBinding(std::string& binding)
{
if (binding.empty())
return false;
const std::string_view binding_view(binding);
SmallString ret;
bool changed = false;
std::string_view::size_type last = 0;
std::string_view::size_type next;
while ((next = binding_view.find('&', last)) != std::string_view::npos)
{
if (last != next)
{
const std::string_view part = StringUtil::StripWhitespace(binding_view.substr(last, next - last));
if (!part.empty())
{
if (!ret.empty())
ret.append(" + ");
PrettifyInputBindingPart(part, ret, changed);
}
}
last = next + 1;
}
if (last < (binding_view.size() - 1))
{
const std::string_view part = StringUtil::StripWhitespace(binding_view.substr(last));
if (!part.empty())
{
if (!ret.empty())
ret.append(" + ");
PrettifyInputBindingPart(part, ret, changed);
}
}
if (changed)
binding = ret.view();
return changed;
}
void InputManager::PrettifyInputBindingPart(const std::string_view binding, SmallString& ret, bool& changed)
{
std::string_view source, sub_binding;
if (!SplitBinding(binding, &source, &sub_binding))
return;
// lameee, string matching
if (StringUtil::StartsWith(source, "Keyboard"))
{
std::optional<InputBindingKey> key = ParseHostKeyboardKey(source, sub_binding);
const char* icon = key.has_value() ? ConvertHostKeyboardCodeToIcon(key->data) : nullptr;
if (icon)
{
ret.append(icon);
changed = true;
return;
}
}
else if (StringUtil::StartsWith(source, "Pointer"))
{
const std::optional<InputBindingKey> key = ParsePointerKey(source, sub_binding);
if (key.has_value())
{
if (key->source_subtype == InputSubclass::PointerButton)
{
static constexpr const char* button_icons[] = {
ICON_PF_MOUSE_BUTTON_1,
ICON_PF_MOUSE_BUTTON_2,
ICON_PF_MOUSE_BUTTON_3,
ICON_PF_MOUSE_BUTTON_4,
ICON_PF_MOUSE_BUTTON_5,
};
if (key->data < std::size(button_icons))
{
ret.append(button_icons[key->data]);
changed = true;
return;
}
}
}
}
else
{
for (u32 i = FIRST_EXTERNAL_INPUT_SOURCE; i < LAST_EXTERNAL_INPUT_SOURCE; i++)
{
if (s_input_sources[i])
{
std::optional<InputBindingKey> key = s_input_sources[i]->ParseKeyString(source, sub_binding);
if (key.has_value())
{
const TinyString icon = s_input_sources[i]->ConvertKeyToIcon(key.value());
if (!icon.empty())
{
ret.append(icon);
changed = true;
return;
}
break;
}
}
}
}
ret.append(binding);
}
void InputManager::AddBinding(const std::string_view& binding, const InputEventHandler& handler) void InputManager::AddBinding(const std::string_view& binding, const InputEventHandler& handler)
{ {
std::shared_ptr<InputBinding> ibinding; std::shared_ptr<InputBinding> ibinding;

View File

@ -196,6 +196,9 @@ namespace InputManager
/// Converts a key code from an identifier to a human-readable string. /// Converts a key code from an identifier to a human-readable string.
std::optional<std::string> ConvertHostKeyboardCodeToString(u32 code); 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);
/// Creates a key for a host-specific key code. /// Creates a key for a host-specific key code.
InputBindingKey MakeHostKeyboardKey(u32 key_code); InputBindingKey MakeHostKeyboardKey(u32 key_code);
@ -215,6 +218,9 @@ namespace InputManager
/// Converts a chord of binding keys to a string. /// Converts a chord of binding keys to a string.
std::string ConvertInputBindingKeysToString(InputBindingInfo::Type binding_type, const InputBindingKey* keys, size_t num_keys); std::string ConvertInputBindingKeysToString(InputBindingInfo::Type binding_type, const InputBindingKey* keys, size_t num_keys);
/// Represents a binding with icon fonts, if available.
bool PrettifyInputBinding(std::string& binding);
/// Returns a list of all hotkeys. /// Returns a list of all hotkeys.
std::vector<const HotkeyInfo*> GetHotkeyList(); std::vector<const HotkeyInfo*> GetHotkeyList();

View File

@ -21,6 +21,7 @@
#include <vector> #include <vector>
#include "common/Pcsx2Defs.h" #include "common/Pcsx2Defs.h"
#include "common/SmallString.h"
#include "Input/InputManager.h" #include "Input/InputManager.h"
class SettingsInterface; class SettingsInterface;
@ -39,7 +40,8 @@ public:
virtual void PollEvents() = 0; virtual void PollEvents() = 0;
virtual std::optional<InputBindingKey> ParseKeyString(const std::string_view& device, const std::string_view& binding) = 0; virtual std::optional<InputBindingKey> ParseKeyString(const std::string_view& device, const std::string_view& binding) = 0;
virtual std::string ConvertKeyToString(InputBindingKey key) = 0; virtual TinyString ConvertKeyToString(InputBindingKey key) = 0;
virtual TinyString ConvertKeyToIcon(InputBindingKey key) = 0;
/// Enumerates available devices. Returns a pair of the prefix (e.g. SDL-0) and the device name. /// Enumerates available devices. Returns a pair of the prefix (e.g. SDL-0) and the device name.
virtual std::vector<std::pair<std::string, std::string>> EnumerateDevices() = 0; virtual std::vector<std::pair<std::string, std::string>> EnumerateDevices() = 0;

View File

@ -26,6 +26,8 @@
#include "common/Path.h" #include "common/Path.h"
#include "common/StringUtil.h" #include "common/StringUtil.h"
#include "IconsPromptFont.h"
#include <bit> #include <bit>
#include <cmath> #include <cmath>
@ -39,6 +41,14 @@ static constexpr const char* s_sdl_axis_names[] = {
"LeftTrigger", // SDL_CONTROLLER_AXIS_TRIGGERLEFT "LeftTrigger", // SDL_CONTROLLER_AXIS_TRIGGERLEFT
"RightTrigger", // SDL_CONTROLLER_AXIS_TRIGGERRIGHT "RightTrigger", // SDL_CONTROLLER_AXIS_TRIGGERRIGHT
}; };
static constexpr const char* s_sdl_axis_icons[][2] = {
{ICON_PF_LEFT_ANALOG_LEFT, ICON_PF_LEFT_ANALOG_RIGHT}, // SDL_CONTROLLER_AXIS_LEFTX
{ICON_PF_LEFT_ANALOG_UP, ICON_PF_LEFT_ANALOG_DOWN}, // SDL_CONTROLLER_AXIS_LEFTY
{ICON_PF_RIGHT_ANALOG_LEFT, ICON_PF_RIGHT_ANALOG_RIGHT}, // SDL_CONTROLLER_AXIS_RIGHTX
{ICON_PF_RIGHT_ANALOG_UP, ICON_PF_RIGHT_ANALOG_DOWN}, // SDL_CONTROLLER_AXIS_RIGHTY
{nullptr, ICON_PF_LEFT_TRIGGER_PULL}, // SDL_CONTROLLER_AXIS_TRIGGERLEFT
{nullptr, ICON_PF_RIGHT_TRIGGER_PULL}, // SDL_CONTROLLER_AXIS_TRIGGERRIGHT
};
static constexpr const GenericInputBinding s_sdl_generic_binding_axis_mapping[][2] = { static constexpr const GenericInputBinding s_sdl_generic_binding_axis_mapping[][2] = {
{GenericInputBinding::LeftStickLeft, GenericInputBinding::LeftStickRight}, // SDL_CONTROLLER_AXIS_LEFTX {GenericInputBinding::LeftStickLeft, GenericInputBinding::LeftStickRight}, // SDL_CONTROLLER_AXIS_LEFTX
{GenericInputBinding::LeftStickUp, GenericInputBinding::LeftStickDown}, // SDL_CONTROLLER_AXIS_LEFTY {GenericInputBinding::LeftStickUp, GenericInputBinding::LeftStickDown}, // SDL_CONTROLLER_AXIS_LEFTY
@ -71,6 +81,23 @@ static constexpr const char* s_sdl_button_names[] = {
"Paddle4", // SDL_CONTROLLER_BUTTON_PADDLE4 "Paddle4", // SDL_CONTROLLER_BUTTON_PADDLE4
"Touchpad", // SDL_CONTROLLER_BUTTON_TOUCHPAD "Touchpad", // SDL_CONTROLLER_BUTTON_TOUCHPAD
}; };
static constexpr const char* s_sdl_button_icons[] = {
ICON_PF_BUTTON_A, // SDL_CONTROLLER_BUTTON_A
ICON_PF_BUTTON_B, // SDL_CONTROLLER_BUTTON_B
ICON_PF_BUTTON_X, // SDL_CONTROLLER_BUTTON_X
ICON_PF_BUTTON_Y, // SDL_CONTROLLER_BUTTON_Y
ICON_PF_SHARE_CAPTURE, // SDL_CONTROLLER_BUTTON_BACK
ICON_PF_XBOX, // SDL_CONTROLLER_BUTTON_GUIDE
ICON_PF_BURGER_MENU, // SDL_CONTROLLER_BUTTON_START
ICON_PF_LEFT_ANALOG_CLICK, // SDL_CONTROLLER_BUTTON_LEFTSTICK
ICON_PF_RIGHT_ANALOG_CLICK, // SDL_CONTROLLER_BUTTON_RIGHTSTICK
ICON_PF_LEFT_SHOULDER_LB, // SDL_CONTROLLER_BUTTON_LEFTSHOULDER
ICON_PF_RIGHT_SHOULDER_RB, // SDL_CONTROLLER_BUTTON_RIGHTSHOULDER
ICON_PF_XBOX_DPAD_UP, // SDL_CONTROLLER_BUTTON_DPAD_UP
ICON_PF_XBOX_DPAD_DOWN, // SDL_CONTROLLER_BUTTON_DPAD_DOWN
ICON_PF_XBOX_DPAD_LEFT, // SDL_CONTROLLER_BUTTON_DPAD_LEFT
ICON_PF_XBOX_DPAD_RIGHT, // SDL_CONTROLLER_BUTTON_DPAD_RIGHT
};
static constexpr const GenericInputBinding s_sdl_generic_binding_button_mapping[] = { static constexpr const GenericInputBinding s_sdl_generic_binding_button_mapping[] = {
GenericInputBinding::Cross, // SDL_CONTROLLER_BUTTON_A GenericInputBinding::Cross, // SDL_CONTROLLER_BUTTON_A
GenericInputBinding::Circle, // SDL_CONTROLLER_BUTTON_B GenericInputBinding::Circle, // SDL_CONTROLLER_BUTTON_B
@ -168,38 +195,38 @@ void SDLInputSource::LoadSettings(SettingsInterface& si)
m_controller_raw_mode = si.GetBoolValue("InputSources", "SDLRawInput", false); m_controller_raw_mode = si.GetBoolValue("InputSources", "SDLRawInput", false);
m_sdl_hints = si.GetKeyValueList("SDLHints"); m_sdl_hints = si.GetKeyValueList("SDLHints");
for (u32 i = 0; i < MAX_LED_COLORS; i++) for (u32 i = 0; i < MAX_LED_COLORS; i++)
{ {
const u32 color = GetRGBForPlayerId(si, i); const u32 color = GetRGBForPlayerId(si, i);
if (m_led_colors[i] == color) if (m_led_colors[i] == color)
continue; continue;
m_led_colors[i] = color; m_led_colors[i] = color;
const auto it = GetControllerDataForPlayerId(i); const auto it = GetControllerDataForPlayerId(i);
if (it == m_controllers.end() || !it->game_controller || !SDL_GameControllerHasLED(it->game_controller)) if (it == m_controllers.end() || !it->game_controller || !SDL_GameControllerHasLED(it->game_controller))
continue; continue;
SetControllerRGBLED(it->game_controller, color); SetControllerRGBLED(it->game_controller, color);
} }
} }
u32 SDLInputSource::GetRGBForPlayerId(SettingsInterface& si, u32 player_id) u32 SDLInputSource::GetRGBForPlayerId(SettingsInterface& si, u32 player_id)
{ {
return ParseRGBForPlayerId( return ParseRGBForPlayerId(
si.GetStringValue("SDLExtra", fmt::format("Player{}LED", player_id).c_str(), s_sdl_default_led_colors[player_id]), si.GetStringValue("SDLExtra", fmt::format("Player{}LED", player_id).c_str(), s_sdl_default_led_colors[player_id]),
player_id); player_id);
} }
u32 SDLInputSource::ParseRGBForPlayerId(const std::string_view& str, u32 player_id) u32 SDLInputSource::ParseRGBForPlayerId(const std::string_view& str, u32 player_id)
{ {
if (player_id >= MAX_LED_COLORS) if (player_id >= MAX_LED_COLORS)
return 0; return 0;
const u32 default_color = StringUtil::FromChars<u32>(s_sdl_default_led_colors[player_id], 16).value_or(0); const u32 default_color = StringUtil::FromChars<u32>(s_sdl_default_led_colors[player_id], 16).value_or(0);
const u32 color = StringUtil::FromChars<u32>(str, 16).value_or(default_color); const u32 color = StringUtil::FromChars<u32>(str, 16).value_or(default_color);
return color; return color;
} }
void SDLInputSource::SetHints() void SDLInputSource::SetHints()
@ -420,9 +447,9 @@ std::optional<InputBindingKey> SDLInputSource::ParseKeyString(const std::string_
return std::nullopt; return std::nullopt;
} }
std::string SDLInputSource::ConvertKeyToString(InputBindingKey key) TinyString SDLInputSource::ConvertKeyToString(InputBindingKey key)
{ {
std::string ret; TinyString ret;
if (key.source_type == InputSourceType::SDL) if (key.source_type == InputSourceType::SDL)
{ {
@ -430,30 +457,54 @@ std::string SDLInputSource::ConvertKeyToString(InputBindingKey key)
{ {
const char* modifier = (key.modifier == InputModifier::FullAxis ? "Full" : (key.modifier == InputModifier::Negate ? "-" : "+")); const char* modifier = (key.modifier == InputModifier::FullAxis ? "Full" : (key.modifier == InputModifier::Negate ? "-" : "+"));
if (key.data < std::size(s_sdl_axis_names)) if (key.data < std::size(s_sdl_axis_names))
ret = StringUtil::StdStringFromFormat("SDL-%u/%s%s", key.source_index, modifier, s_sdl_axis_names[key.data]); ret.fmt("SDL-{}/{}{}", static_cast<u32>(key.source_index), modifier, s_sdl_axis_names[key.data]);
else else
ret = StringUtil::StdStringFromFormat("SDL-%u/%sAxis%u%s", key.source_index, modifier, key.data, key.invert ? "~" : ""); ret.fmt("SDL-{}/{}Axis{}{}", static_cast<u32>(key.source_index), modifier, key.data, key.invert ? "~" : "");
} }
else if (key.source_subtype == InputSubclass::ControllerButton) else if (key.source_subtype == InputSubclass::ControllerButton)
{ {
if (key.data < std::size(s_sdl_button_names)) if (key.data < std::size(s_sdl_button_names))
ret = StringUtil::StdStringFromFormat("SDL-%u/%s", key.source_index, s_sdl_button_names[key.data]); ret.fmt("SDL-{}/{}", static_cast<u32>(key.source_index), s_sdl_button_names[key.data]);
else else
ret = StringUtil::StdStringFromFormat("SDL-%u/Button%u", key.source_index, key.data); ret.fmt("SDL-{}/Button{}", static_cast<u32>(key.source_index), key.data);
} }
else if (key.source_subtype == InputSubclass::ControllerHat) else if (key.source_subtype == InputSubclass::ControllerHat)
{ {
const u32 hat_index = key.data / static_cast<u32>(std::size(s_sdl_hat_direction_names)); const u32 hat_index = key.data / static_cast<u32>(std::size(s_sdl_hat_direction_names));
const u32 hat_direction = key.data % static_cast<u32>(std::size(s_sdl_hat_direction_names)); const u32 hat_direction = key.data % static_cast<u32>(std::size(s_sdl_hat_direction_names));
ret = StringUtil::StdStringFromFormat("SDL-%u/Hat%u%s", key.source_index, hat_index, s_sdl_hat_direction_names[hat_direction]); ret.fmt("SDL-{}/Hat{}{}", static_cast<u32>(key.source_index), hat_index, s_sdl_hat_direction_names[hat_direction]);
} }
else if (key.source_subtype == InputSubclass::ControllerMotor) else if (key.source_subtype == InputSubclass::ControllerMotor)
{ {
ret = StringUtil::StdStringFromFormat("SDL-%u/%sMotor", key.source_index, key.data ? "Large" : "Small"); ret.fmt("SDL-{}/{}Motor", static_cast<u32>(key.source_index), key.data ? "Large" : "Small");
} }
else if (key.source_subtype == InputSubclass::ControllerHaptic) else if (key.source_subtype == InputSubclass::ControllerHaptic)
{ {
ret = StringUtil::StdStringFromFormat("SDL-%u/Haptic", key.source_index); ret.fmt("SDL-{}/Haptic", static_cast<u32>(key.source_index));
}
}
return ret;
}
TinyString SDLInputSource::ConvertKeyToIcon(InputBindingKey key)
{
TinyString ret;
if (key.source_type == InputSourceType::SDL)
{
if (key.source_subtype == InputSubclass::ControllerAxis)
{
if (key.data < std::size(s_sdl_axis_icons) && key.modifier != InputModifier::FullAxis)
{
ret.fmt("SDL-{} {}", static_cast<u32>(key.source_index),
s_sdl_axis_icons[key.data][key.modifier == InputModifier::None]);
}
}
else if (key.source_subtype == InputSubclass::ControllerButton)
{
if (key.data < std::size(s_sdl_button_icons))
ret.fmt("SDL-{} {}", static_cast<u32>(key.source_index), s_sdl_button_icons[key.data]);
} }
} }

View File

@ -44,7 +44,8 @@ public:
void UpdateMotorState(InputBindingKey large_key, InputBindingKey small_key, float large_intensity, float small_intensity) override; void UpdateMotorState(InputBindingKey large_key, InputBindingKey small_key, float large_intensity, float small_intensity) override;
std::optional<InputBindingKey> ParseKeyString(const std::string_view& device, const std::string_view& binding) override; std::optional<InputBindingKey> ParseKeyString(const std::string_view& device, const std::string_view& binding) override;
std::string ConvertKeyToString(InputBindingKey key) override; TinyString ConvertKeyToString(InputBindingKey key) override;
TinyString ConvertKeyToIcon(InputBindingKey key) override;
bool ProcessSDLEvent(const SDL_Event* event); bool ProcessSDLEvent(const SDL_Event* event);

View File

@ -1,5 +1,5 @@
/* PCSX2 - PS2 Emulator for PCs /* PCSX2 - PS2 Emulator for PCs
* Copyright (C) 2002-2022 PCSX2 Dev Team * Copyright (C) 2002-2023 PCSX2 Dev Team
* *
* PCSX2 is free software: you can redistribute it and/or modify it under the terms * PCSX2 is free software: you can redistribute it and/or modify it under the terms
* of the GNU Lesser General Public License as published by the Free Software Found- * of the GNU Lesser General Public License as published by the Free Software Found-
@ -14,14 +14,19 @@
*/ */
#include "PrecompiledHeader.h" #include "PrecompiledHeader.h"
#include "Input/XInputSource.h" #include "Input/XInputSource.h"
#include "Input/InputManager.h" #include "Input/InputManager.h"
#include "common/Assertions.h" #include "common/Assertions.h"
#include "common/StringUtil.h" #include "common/StringUtil.h"
#include "common/Console.h" #include "common/Console.h"
#include "IconsPromptFont.h"
#include <cmath> #include <cmath>
const char* XInputSource::s_axis_names[XInputSource::NUM_AXES] = { static const char* s_axis_names[XInputSource::NUM_AXES] = {
"LeftX", // AXIS_LEFTX "LeftX", // AXIS_LEFTX
"LeftY", // AXIS_LEFTY "LeftY", // AXIS_LEFTY
"RightX", // AXIS_RIGHTX "RightX", // AXIS_RIGHTX
@ -29,6 +34,14 @@ const char* XInputSource::s_axis_names[XInputSource::NUM_AXES] = {
"LeftTrigger", // AXIS_TRIGGERLEFT "LeftTrigger", // AXIS_TRIGGERLEFT
"RightTrigger", // AXIS_TRIGGERRIGHT "RightTrigger", // AXIS_TRIGGERRIGHT
}; };
static constexpr const char* s_axis_icons[][2] = {
{ICON_PF_LEFT_ANALOG_LEFT, ICON_PF_LEFT_ANALOG_RIGHT}, // AXIS_LEFTX
{ICON_PF_LEFT_ANALOG_UP, ICON_PF_LEFT_ANALOG_DOWN}, // AXIS_LEFTY
{ICON_PF_RIGHT_ANALOG_LEFT, ICON_PF_RIGHT_ANALOG_RIGHT}, // AXIS_RIGHTX
{ICON_PF_RIGHT_ANALOG_UP, ICON_PF_RIGHT_ANALOG_DOWN}, // AXIS_RIGHTY
{nullptr, ICON_PF_LEFT_TRIGGER_PULL}, // AXIS_TRIGGERLEFT
{nullptr, ICON_PF_RIGHT_TRIGGER_PULL}, // AXIS_TRIGGERRIGHT
};
static const GenericInputBinding s_xinput_generic_binding_axis_mapping[][2] = { static const GenericInputBinding s_xinput_generic_binding_axis_mapping[][2] = {
{GenericInputBinding::LeftStickLeft, GenericInputBinding::LeftStickRight}, // AXIS_LEFTX {GenericInputBinding::LeftStickLeft, GenericInputBinding::LeftStickRight}, // AXIS_LEFTX
{GenericInputBinding::LeftStickUp, GenericInputBinding::LeftStickDown}, // AXIS_LEFTY {GenericInputBinding::LeftStickUp, GenericInputBinding::LeftStickDown}, // AXIS_LEFTY
@ -38,7 +51,7 @@ static const GenericInputBinding s_xinput_generic_binding_axis_mapping[][2] = {
{GenericInputBinding::Unknown, GenericInputBinding::R2}, // AXIS_TRIGGERRIGHT {GenericInputBinding::Unknown, GenericInputBinding::R2}, // AXIS_TRIGGERRIGHT
}; };
const char* XInputSource::s_button_names[XInputSource::NUM_BUTTONS] = { static const char* s_button_names[XInputSource::NUM_BUTTONS] = {
"DPadUp", // XINPUT_GAMEPAD_DPAD_UP "DPadUp", // XINPUT_GAMEPAD_DPAD_UP
"DPadDown", // XINPUT_GAMEPAD_DPAD_DOWN "DPadDown", // XINPUT_GAMEPAD_DPAD_DOWN
"DPadLeft", // XINPUT_GAMEPAD_DPAD_LEFT "DPadLeft", // XINPUT_GAMEPAD_DPAD_LEFT
@ -55,12 +68,29 @@ const char* XInputSource::s_button_names[XInputSource::NUM_BUTTONS] = {
"Y", // XINPUT_GAMEPAD_Y "Y", // XINPUT_GAMEPAD_Y
"Guide", // XINPUT_GAMEPAD_GUIDE "Guide", // XINPUT_GAMEPAD_GUIDE
}; };
const u16 XInputSource::s_button_masks[XInputSource::NUM_BUTTONS] = { static const u16 s_button_masks[XInputSource::NUM_BUTTONS] = {
XINPUT_GAMEPAD_DPAD_UP, XINPUT_GAMEPAD_DPAD_DOWN, XINPUT_GAMEPAD_DPAD_LEFT, XINPUT_GAMEPAD_DPAD_RIGHT, XINPUT_GAMEPAD_START, XINPUT_GAMEPAD_DPAD_UP, XINPUT_GAMEPAD_DPAD_DOWN, XINPUT_GAMEPAD_DPAD_LEFT, XINPUT_GAMEPAD_DPAD_RIGHT, XINPUT_GAMEPAD_START,
XINPUT_GAMEPAD_BACK, XINPUT_GAMEPAD_LEFT_THUMB, XINPUT_GAMEPAD_RIGHT_THUMB, XINPUT_GAMEPAD_LEFT_SHOULDER, XINPUT_GAMEPAD_RIGHT_SHOULDER, XINPUT_GAMEPAD_BACK, XINPUT_GAMEPAD_LEFT_THUMB, XINPUT_GAMEPAD_RIGHT_THUMB, XINPUT_GAMEPAD_LEFT_SHOULDER, XINPUT_GAMEPAD_RIGHT_SHOULDER,
XINPUT_GAMEPAD_A, XINPUT_GAMEPAD_B, XINPUT_GAMEPAD_X, XINPUT_GAMEPAD_Y, XINPUT_GAMEPAD_A, XINPUT_GAMEPAD_B, XINPUT_GAMEPAD_X, XINPUT_GAMEPAD_Y,
0x400, // XINPUT_GAMEPAD_GUIDE 0x400, // XINPUT_GAMEPAD_GUIDE
}; };
static constexpr const char* s_button_icons[] = {
ICON_PF_XBOX_DPAD_UP, // XINPUT_GAMEPAD_DPAD_UP
ICON_PF_XBOX_DPAD_DOWN, // XINPUT_GAMEPAD_DPAD_DOWN
ICON_PF_XBOX_DPAD_LEFT, // XINPUT_GAMEPAD_DPAD_LEFT
ICON_PF_XBOX_DPAD_RIGHT, // XINPUT_GAMEPAD_DPAD_RIGHT
ICON_PF_BURGER_MENU, // XINPUT_GAMEPAD_START
ICON_PF_SHARE_CAPTURE, // XINPUT_GAMEPAD_BACK
ICON_PF_LEFT_ANALOG_CLICK, // XINPUT_GAMEPAD_LEFT_THUMB
ICON_PF_RIGHT_ANALOG_CLICK, // XINPUT_GAMEPAD_RIGHT_THUMB
ICON_PF_LEFT_SHOULDER_LB, // XINPUT_GAMEPAD_LEFT_SHOULDER
ICON_PF_RIGHT_SHOULDER_RB, // XINPUT_GAMEPAD_RIGHT_SHOULDER
ICON_PF_BUTTON_A, // XINPUT_GAMEPAD_A
ICON_PF_BUTTON_B, // XINPUT_GAMEPAD_B
ICON_PF_BUTTON_X, // XINPUT_GAMEPAD_X
ICON_PF_BUTTON_Y, // XINPUT_GAMEPAD_Y
ICON_PF_XBOX, // XINPUT_GAMEPAD_GUIDE
};
static const GenericInputBinding s_xinput_generic_binding_button_mapping[] = { static const GenericInputBinding s_xinput_generic_binding_button_mapping[] = {
GenericInputBinding::DPadUp, // XINPUT_GAMEPAD_DPAD_UP GenericInputBinding::DPadUp, // XINPUT_GAMEPAD_DPAD_UP
GenericInputBinding::DPadDown, // XINPUT_GAMEPAD_DPAD_DOWN GenericInputBinding::DPadDown, // XINPUT_GAMEPAD_DPAD_DOWN
@ -299,24 +329,48 @@ std::optional<InputBindingKey> XInputSource::ParseKeyString(const std::string_vi
return std::nullopt; return std::nullopt;
} }
std::string XInputSource::ConvertKeyToString(InputBindingKey key) TinyString XInputSource::ConvertKeyToString(InputBindingKey key)
{ {
std::string ret; TinyString ret;
if (key.source_type == InputSourceType::XInput) if (key.source_type == InputSourceType::XInput)
{ {
if (key.source_subtype == InputSubclass::ControllerAxis && key.data < std::size(s_axis_names)) if (key.source_subtype == InputSubclass::ControllerAxis && key.data < std::size(s_axis_names))
{ {
const char modifier = key.modifier == InputModifier::Negate ? '-' : '+'; const char modifier = key.modifier == InputModifier::Negate ? '-' : '+';
ret = StringUtil::StdStringFromFormat("XInput-%u/%c%s", key.source_index, modifier, s_axis_names[key.data]); ret.fmt("XInput-{}/{}{}", static_cast<u32>(key.source_index), modifier, s_axis_names[key.data]);
} }
else if (key.source_subtype == InputSubclass::ControllerButton && key.data < std::size(s_button_names)) else if (key.source_subtype == InputSubclass::ControllerButton && key.data < std::size(s_button_names))
{ {
ret = StringUtil::StdStringFromFormat("XInput-%u/%s", key.source_index, s_button_names[key.data]); ret.fmt("XInput-{}/{}", static_cast<u32>(key.source_index), s_button_names[key.data]);
} }
else if (key.source_subtype == InputSubclass::ControllerMotor) else if (key.source_subtype == InputSubclass::ControllerMotor)
{ {
ret = StringUtil::StdStringFromFormat("XInput-%u/%sMotor", key.source_index, key.data ? "Large" : "Small"); ret.fmt("XInput-{}/{}Motor", static_cast<u32>(key.source_index), key.data ? "Large" : "Small");
}
}
return ret;
}
TinyString XInputSource::ConvertKeyToIcon(InputBindingKey key)
{
TinyString ret;
if (key.source_type == InputSourceType::SDL)
{
if (key.source_subtype == InputSubclass::ControllerAxis)
{
if (key.data < std::size(s_axis_icons) && key.modifier != InputModifier::FullAxis)
{
ret.fmt("XInput-{} {}", static_cast<u32>(key.source_index),
s_axis_icons[key.data][key.modifier == InputModifier::None]);
}
}
else if (key.source_subtype == InputSubclass::ControllerButton)
{
if (key.data < std::size(s_button_icons))
ret.fmt("XInput-{} {}", static_cast<u32>(key.source_index), s_button_icons[key.data]);
} }
} }

View File

@ -1,5 +1,5 @@
/* PCSX2 - PS2 Emulator for PCs /* PCSX2 - PS2 Emulator for PCs
* Copyright (C) 2002-2023 PCSX2 Dev Team * Copyright (C) 2002-2023 PCSX2 Dev Team
* *
* PCSX2 is free software: you can redistribute it and/or modify it under the terms * PCSX2 is free software: you can redistribute it and/or modify it under the terms
* of the GNU Lesser General Public License as published by the Free Software Found- * of the GNU Lesser General Public License as published by the Free Software Found-
@ -63,25 +63,6 @@ class SettingsInterface;
class XInputSource final : public InputSource class XInputSource final : public InputSource
{ {
public: public:
XInputSource();
~XInputSource();
bool Initialize(SettingsInterface& si, std::unique_lock<std::mutex>& settings_lock) override;
void UpdateSettings(SettingsInterface& si, std::unique_lock<std::mutex>& settings_lock) override;
bool ReloadDevices() override;
void Shutdown() override;
void PollEvents() override;
std::vector<std::pair<std::string, std::string>> EnumerateDevices() override;
std::vector<InputBindingKey> EnumerateMotors() override;
bool GetGenericBindingMapping(const std::string_view& device, InputManager::GenericInputBindingMapping* mapping) override;
void UpdateMotorState(InputBindingKey key, float intensity) override;
void UpdateMotorState(InputBindingKey large_key, InputBindingKey small_key, float large_intensity, float small_intensity) override;
std::optional<InputBindingKey> ParseKeyString(const std::string_view& device, const std::string_view& binding) override;
std::string ConvertKeyToString(InputBindingKey key) override;
private:
enum : u32 enum : u32
{ {
NUM_CONTROLLERS = XUSER_MAX_COUNT, // 4 NUM_CONTROLLERS = XUSER_MAX_COUNT, // 4
@ -99,6 +80,26 @@ private:
NUM_AXES, NUM_AXES,
}; };
XInputSource();
~XInputSource();
bool Initialize(SettingsInterface& si, std::unique_lock<std::mutex>& settings_lock) override;
void UpdateSettings(SettingsInterface& si, std::unique_lock<std::mutex>& settings_lock) override;
bool ReloadDevices() override;
void Shutdown() override;
void PollEvents() override;
std::vector<std::pair<std::string, std::string>> EnumerateDevices() override;
std::vector<InputBindingKey> EnumerateMotors() override;
bool GetGenericBindingMapping(const std::string_view& device, InputManager::GenericInputBindingMapping* mapping) override;
void UpdateMotorState(InputBindingKey key, float intensity) override;
void UpdateMotorState(InputBindingKey large_key, InputBindingKey small_key, float large_intensity, float small_intensity) override;
std::optional<InputBindingKey> ParseKeyString(const std::string_view& device, const std::string_view& binding) override;
TinyString ConvertKeyToString(InputBindingKey key) override;
TinyString ConvertKeyToIcon(InputBindingKey key) override;
private:
struct ControllerData struct ControllerData
{ {
union union
@ -126,8 +127,4 @@ private:
DWORD(WINAPI* m_xinput_set_state)(DWORD, XINPUT_VIBRATION*); DWORD(WINAPI* m_xinput_set_state)(DWORD, XINPUT_VIBRATION*);
DWORD(WINAPI* m_xinput_get_capabilities)(DWORD, DWORD, XINPUT_CAPABILITIES*); DWORD(WINAPI* m_xinput_get_capabilities)(DWORD, DWORD, XINPUT_CAPABILITIES*);
DWORD(WINAPI* m_xinput_get_extended)(DWORD, SCP_EXTN*); DWORD(WINAPI* m_xinput_get_extended)(DWORD, SCP_EXTN*);
static const char* s_axis_names[NUM_AXES];
static const char* s_button_names[NUM_BUTTONS];
static const u16 s_button_masks[NUM_BUTTONS];
}; };

View File

@ -24,36 +24,38 @@
#include "Input/InputManager.h" #include "Input/InputManager.h"
#include "Host.h" #include "Host.h"
#include "IconsPromptFont.h"
static const InputBindingInfo s_bindings[] = { static const InputBindingInfo s_bindings[] = {
// clang-format off // clang-format off
{"Up", TRANSLATE_NOOP("Pad", "D-Pad Up"), InputBindingInfo::Type::Button, PadDualshock2::Inputs::PAD_UP, GenericInputBinding::DPadUp}, {"Up", TRANSLATE_NOOP("Pad", "D-Pad Up"), ICON_PF_DPAD_UP, InputBindingInfo::Type::Button, PadDualshock2::Inputs::PAD_UP, GenericInputBinding::DPadUp},
{"Right", TRANSLATE_NOOP("Pad", "D-Pad Right"), InputBindingInfo::Type::Button, PadDualshock2::Inputs::PAD_RIGHT, GenericInputBinding::DPadRight}, {"Right", TRANSLATE_NOOP("Pad", "D-Pad Right"), ICON_PF_DPAD_RIGHT, InputBindingInfo::Type::Button, PadDualshock2::Inputs::PAD_RIGHT, GenericInputBinding::DPadRight},
{"Down", TRANSLATE_NOOP("Pad", "D-Pad Down"), InputBindingInfo::Type::Button, PadDualshock2::Inputs::PAD_DOWN, GenericInputBinding::DPadDown}, {"Down", TRANSLATE_NOOP("Pad", "D-Pad Down"), ICON_PF_DPAD_DOWN, InputBindingInfo::Type::Button, PadDualshock2::Inputs::PAD_DOWN, GenericInputBinding::DPadDown},
{"Left", TRANSLATE_NOOP("Pad", "D-Pad Left"), InputBindingInfo::Type::Button, PadDualshock2::Inputs::PAD_LEFT, GenericInputBinding::DPadLeft}, {"Left", TRANSLATE_NOOP("Pad", "D-Pad Left"), ICON_PF_DPAD_LEFT, InputBindingInfo::Type::Button, PadDualshock2::Inputs::PAD_LEFT, GenericInputBinding::DPadLeft},
{"Triangle", TRANSLATE_NOOP("Pad", "Triangle"), InputBindingInfo::Type::Button, PadDualshock2::Inputs::PAD_TRIANGLE, GenericInputBinding::Triangle}, {"Triangle", TRANSLATE_NOOP("Pad", "Triangle"), ICON_PF_BUTTON_TRIANGLE, InputBindingInfo::Type::Button, PadDualshock2::Inputs::PAD_TRIANGLE, GenericInputBinding::Triangle},
{"Circle", TRANSLATE_NOOP("Pad", "Circle"), InputBindingInfo::Type::Button, PadDualshock2::Inputs::PAD_CIRCLE, GenericInputBinding::Circle}, {"Circle", TRANSLATE_NOOP("Pad", "Circle"), ICON_PF_BUTTON_CIRCLE, InputBindingInfo::Type::Button, PadDualshock2::Inputs::PAD_CIRCLE, GenericInputBinding::Circle},
{"Cross", TRANSLATE_NOOP("Pad", "Cross"), InputBindingInfo::Type::Button, PadDualshock2::Inputs::PAD_CROSS, GenericInputBinding::Cross}, {"Cross", TRANSLATE_NOOP("Pad", "Cross"), ICON_PF_BUTTON_CROSS, InputBindingInfo::Type::Button, PadDualshock2::Inputs::PAD_CROSS, GenericInputBinding::Cross},
{"Square", TRANSLATE_NOOP("Pad", "Square"), InputBindingInfo::Type::Button, PadDualshock2::Inputs::PAD_SQUARE, GenericInputBinding::Square}, {"Square", TRANSLATE_NOOP("Pad", "Square"), ICON_PF_BUTTON_SQUARE, InputBindingInfo::Type::Button, PadDualshock2::Inputs::PAD_SQUARE, GenericInputBinding::Square},
{"Select", TRANSLATE_NOOP("Pad", "Select"), InputBindingInfo::Type::Button, PadDualshock2::Inputs::PAD_SELECT, GenericInputBinding::Select}, {"Select", TRANSLATE_NOOP("Pad", "Select"), ICON_PF_SELECT_SHARE, InputBindingInfo::Type::Button, PadDualshock2::Inputs::PAD_SELECT, GenericInputBinding::Select},
{"Start", TRANSLATE_NOOP("Pad", "Start"), InputBindingInfo::Type::Button, PadDualshock2::Inputs::PAD_START, GenericInputBinding::Start}, {"Start", TRANSLATE_NOOP("Pad", "Start"), ICON_PF_START, InputBindingInfo::Type::Button, PadDualshock2::Inputs::PAD_START, GenericInputBinding::Start},
{"L1", TRANSLATE_NOOP("Pad", "L1 (Left Bumper)"), InputBindingInfo::Type::Button, PadDualshock2::Inputs::PAD_L1, GenericInputBinding::L1}, {"L1", TRANSLATE_NOOP("Pad", "L1 (Left Bumper)"), ICON_PF_LEFT_SHOULDER_L1, InputBindingInfo::Type::Button, PadDualshock2::Inputs::PAD_L1, GenericInputBinding::L1},
{"L2", TRANSLATE_NOOP("Pad", "L2 (Left Trigger)"), InputBindingInfo::Type::HalfAxis, PadDualshock2::Inputs::PAD_L2, GenericInputBinding::L2}, {"L2", TRANSLATE_NOOP("Pad", "L2 (Left Trigger)"), ICON_PF_LEFT_TRIGGER_L2, InputBindingInfo::Type::HalfAxis, PadDualshock2::Inputs::PAD_L2, GenericInputBinding::L2},
{"R1", TRANSLATE_NOOP("Pad", "R1 (Right Bumper)"), InputBindingInfo::Type::Button, PadDualshock2::Inputs::PAD_R1, GenericInputBinding::R1}, {"R1", TRANSLATE_NOOP("Pad", "R1 (Right Bumper)"), ICON_PF_RIGHT_SHOULDER_R1, InputBindingInfo::Type::Button, PadDualshock2::Inputs::PAD_R1, GenericInputBinding::R1},
{"R2", TRANSLATE_NOOP("Pad", "R2 (Right Trigger)"), InputBindingInfo::Type::HalfAxis, PadDualshock2::Inputs::PAD_R2, GenericInputBinding::R2}, {"R2", TRANSLATE_NOOP("Pad", "R2 (Right Trigger)"), ICON_PF_RIGHT_TRIGGER_R2, InputBindingInfo::Type::HalfAxis, PadDualshock2::Inputs::PAD_R2, GenericInputBinding::R2},
{"L3", TRANSLATE_NOOP("Pad", "L3 (Left Stick Button)"), InputBindingInfo::Type::Button, PadDualshock2::Inputs::PAD_L3, GenericInputBinding::L3}, {"L3", TRANSLATE_NOOP("Pad", "L3 (Left Stick Button)"), ICON_PF_LEFT_ANALOG_CLICK, InputBindingInfo::Type::Button, PadDualshock2::Inputs::PAD_L3, GenericInputBinding::L3},
{"R3", TRANSLATE_NOOP("Pad", "R3 (Right Stick Button)"), InputBindingInfo::Type::Button, PadDualshock2::Inputs::PAD_R3, GenericInputBinding::R3}, {"R3", TRANSLATE_NOOP("Pad", "R3 (Right Stick Button)"), ICON_PF_RIGHT_ANALOG_CLICK, InputBindingInfo::Type::Button, PadDualshock2::Inputs::PAD_R3, GenericInputBinding::R3},
{"Analog", TRANSLATE_NOOP("Pad", "Analog Toggle"), InputBindingInfo::Type::Button, PadDualshock2::Inputs::PAD_ANALOG, GenericInputBinding::System}, {"Analog", TRANSLATE_NOOP("Pad", "Analog Toggle"), ICON_PF_ANALOG_LEFT_RIGHT, InputBindingInfo::Type::Button, PadDualshock2::Inputs::PAD_ANALOG, GenericInputBinding::System},
{"Pressure", TRANSLATE_NOOP("Pad", "Apply Pressure"), InputBindingInfo::Type::Button, PadDualshock2::Inputs::PAD_PRESSURE, GenericInputBinding::Unknown}, {"Pressure", TRANSLATE_NOOP("Pad", "Apply Pressure"), ICON_PF_ANALOG_ANY, InputBindingInfo::Type::Button, PadDualshock2::Inputs::PAD_PRESSURE, GenericInputBinding::Unknown},
{"LUp", TRANSLATE_NOOP("Pad", "Left Stick Up"), InputBindingInfo::Type::HalfAxis, PadDualshock2::Inputs::PAD_L_UP, GenericInputBinding::LeftStickUp}, {"LUp", TRANSLATE_NOOP("Pad", "Left Stick Up"), ICON_PF_LEFT_ANALOG_UP, InputBindingInfo::Type::HalfAxis, PadDualshock2::Inputs::PAD_L_UP, GenericInputBinding::LeftStickUp},
{"LRight", TRANSLATE_NOOP("Pad", "Left Stick Right"), InputBindingInfo::Type::HalfAxis, PadDualshock2::Inputs::PAD_L_RIGHT, GenericInputBinding::LeftStickRight}, {"LRight", TRANSLATE_NOOP("Pad", "Left Stick Right"), ICON_PF_LEFT_ANALOG_RIGHT, InputBindingInfo::Type::HalfAxis, PadDualshock2::Inputs::PAD_L_RIGHT, GenericInputBinding::LeftStickRight},
{"LDown", TRANSLATE_NOOP("Pad", "Left Stick Down"), InputBindingInfo::Type::HalfAxis, PadDualshock2::Inputs::PAD_L_DOWN, GenericInputBinding::LeftStickDown}, {"LDown", TRANSLATE_NOOP("Pad", "Left Stick Down"), ICON_PF_LEFT_ANALOG_DOWN, InputBindingInfo::Type::HalfAxis, PadDualshock2::Inputs::PAD_L_DOWN, GenericInputBinding::LeftStickDown},
{"LLeft", TRANSLATE_NOOP("Pad", "Left Stick Left"), InputBindingInfo::Type::HalfAxis, PadDualshock2::Inputs::PAD_L_LEFT, GenericInputBinding::LeftStickLeft}, {"LLeft", TRANSLATE_NOOP("Pad", "Left Stick Left"), ICON_PF_LEFT_ANALOG_LEFT, InputBindingInfo::Type::HalfAxis, PadDualshock2::Inputs::PAD_L_LEFT, GenericInputBinding::LeftStickLeft},
{"RUp", TRANSLATE_NOOP("Pad", "Right Stick Up"), InputBindingInfo::Type::HalfAxis, PadDualshock2::Inputs::PAD_R_UP, GenericInputBinding::RightStickUp}, {"RUp", TRANSLATE_NOOP("Pad", "Right Stick Up"), ICON_PF_RIGHT_ANALOG_UP, InputBindingInfo::Type::HalfAxis, PadDualshock2::Inputs::PAD_R_UP, GenericInputBinding::RightStickUp},
{"RRight", TRANSLATE_NOOP("Pad", "Right Stick Right"), InputBindingInfo::Type::HalfAxis, PadDualshock2::Inputs::PAD_R_RIGHT, GenericInputBinding::RightStickRight}, {"RRight", TRANSLATE_NOOP("Pad", "Right Stick Right"), ICON_PF_RIGHT_ANALOG_RIGHT, InputBindingInfo::Type::HalfAxis, PadDualshock2::Inputs::PAD_R_RIGHT, GenericInputBinding::RightStickRight},
{"RDown", TRANSLATE_NOOP("Pad", "Right Stick Down"), InputBindingInfo::Type::HalfAxis, PadDualshock2::Inputs::PAD_R_DOWN, GenericInputBinding::RightStickDown}, {"RDown", TRANSLATE_NOOP("Pad", "Right Stick Down"), ICON_PF_RIGHT_ANALOG_RIGHT, InputBindingInfo::Type::HalfAxis, PadDualshock2::Inputs::PAD_R_DOWN, GenericInputBinding::RightStickDown},
{"RLeft", TRANSLATE_NOOP("Pad", "Right Stick Left"), InputBindingInfo::Type::HalfAxis, PadDualshock2::Inputs::PAD_R_LEFT, GenericInputBinding::RightStickLeft}, {"RLeft", TRANSLATE_NOOP("Pad", "Right Stick Left"), ICON_PF_RIGHT_ANALOG_LEFT, InputBindingInfo::Type::HalfAxis, PadDualshock2::Inputs::PAD_R_LEFT, GenericInputBinding::RightStickLeft},
{"LargeMotor", TRANSLATE_NOOP("Pad", "Large (Low Frequency) Motor"), InputBindingInfo::Type::Motor, 0, GenericInputBinding::LargeMotor}, {"LargeMotor", TRANSLATE_NOOP("Pad", "Large (Low Frequency) Motor"), nullptr, InputBindingInfo::Type::Motor, 0, GenericInputBinding::LargeMotor},
{"SmallMotor", TRANSLATE_NOOP("Pad", "Small (High Frequency) Motor"), InputBindingInfo::Type::Motor, 0, GenericInputBinding::SmallMotor}, {"SmallMotor", TRANSLATE_NOOP("Pad", "Small (High Frequency) Motor"), nullptr, InputBindingInfo::Type::Motor, 0, GenericInputBinding::SmallMotor},
// clang-format on // clang-format on
}; };
@ -93,7 +95,7 @@ static const SettingInfo s_settings[] = {
}; };
const Pad::ControllerInfo PadDualshock2::ControllerInfo = {Pad::ControllerType::DualShock2, "DualShock2", const Pad::ControllerInfo PadDualshock2::ControllerInfo = {Pad::ControllerType::DualShock2, "DualShock2",
TRANSLATE_NOOP("Pad", "DualShock 2"), s_bindings, s_settings, Pad::VibrationCapabilities::LargeSmallMotors}; TRANSLATE_NOOP("Pad", "DualShock 2"), ICON_PF_GAMEPAD, s_bindings, s_settings, Pad::VibrationCapabilities::LargeSmallMotors};
void PadDualshock2::ConfigLog() void PadDualshock2::ConfigLog()
{ {

View File

@ -25,17 +25,17 @@
// would do what actions, if you played Guitar Hero on a PS2 with a DS2 instead of a controller. // would do what actions, if you played Guitar Hero on a PS2 with a DS2 instead of a controller.
static const InputBindingInfo s_bindings[] = { static const InputBindingInfo s_bindings[] = {
// clang-format off // clang-format off
{"Up", TRANSLATE_NOOP("Pad", "Strum Up"), InputBindingInfo::Type::Button, PadGuitar::Inputs::STRUM_UP, GenericInputBinding::DPadUp}, {"Up", TRANSLATE_NOOP("Pad", "Strum Up"), nullptr, InputBindingInfo::Type::Button, PadGuitar::Inputs::STRUM_UP, GenericInputBinding::DPadUp},
{"Down", TRANSLATE_NOOP("Pad", "Strum Down"), InputBindingInfo::Type::Button, PadGuitar::Inputs::STRUM_DOWN, GenericInputBinding::DPadDown}, {"Down", TRANSLATE_NOOP("Pad", "Strum Down"), nullptr, InputBindingInfo::Type::Button, PadGuitar::Inputs::STRUM_DOWN, GenericInputBinding::DPadDown},
{"Select", TRANSLATE_NOOP("Pad", "Select"), InputBindingInfo::Type::Button, PadGuitar::Inputs::SELECT, GenericInputBinding::Select}, {"Select", TRANSLATE_NOOP("Pad", "Select"), nullptr, InputBindingInfo::Type::Button, PadGuitar::Inputs::SELECT, GenericInputBinding::Select},
{"Start", TRANSLATE_NOOP("Pad", "Start"), InputBindingInfo::Type::Button, PadGuitar::Inputs::START, GenericInputBinding::Start}, {"Start", TRANSLATE_NOOP("Pad", "Start"), nullptr, InputBindingInfo::Type::Button, PadGuitar::Inputs::START, GenericInputBinding::Start},
{"Green", TRANSLATE_NOOP("Pad", "Green Fret"), InputBindingInfo::Type::Button, PadGuitar::Inputs::GREEN, GenericInputBinding::R2}, {"Green", TRANSLATE_NOOP("Pad", "Green Fret"), nullptr, InputBindingInfo::Type::Button, PadGuitar::Inputs::GREEN, GenericInputBinding::R2},
{"Red", TRANSLATE_NOOP("Pad", "Red Fret"), InputBindingInfo::Type::Button, PadGuitar::Inputs::RED, GenericInputBinding::Circle}, {"Red", TRANSLATE_NOOP("Pad", "Red Fret"), nullptr, InputBindingInfo::Type::Button, PadGuitar::Inputs::RED, GenericInputBinding::Circle},
{"Yellow", TRANSLATE_NOOP("Pad", "Yellow Fret"), InputBindingInfo::Type::Button, PadGuitar::Inputs::YELLOW, GenericInputBinding::Triangle}, {"Yellow", TRANSLATE_NOOP("Pad", "Yellow Fret"), nullptr, InputBindingInfo::Type::Button, PadGuitar::Inputs::YELLOW, GenericInputBinding::Triangle},
{"Blue", TRANSLATE_NOOP("Pad", "Blue Fret"), InputBindingInfo::Type::Button, PadGuitar::Inputs::BLUE, GenericInputBinding::Cross}, {"Blue", TRANSLATE_NOOP("Pad", "Blue Fret"), nullptr, InputBindingInfo::Type::Button, PadGuitar::Inputs::BLUE, GenericInputBinding::Cross},
{"Orange", TRANSLATE_NOOP("Pad", "Orange Fret"), InputBindingInfo::Type::Button, PadGuitar::Inputs::ORANGE, GenericInputBinding::Square}, {"Orange", TRANSLATE_NOOP("Pad", "Orange Fret"), nullptr, InputBindingInfo::Type::Button, PadGuitar::Inputs::ORANGE, GenericInputBinding::Square},
{"Whammy", TRANSLATE_NOOP("Pad", "Whammy Bar"), InputBindingInfo::Type::HalfAxis, PadGuitar::Inputs::WHAMMY, GenericInputBinding::LeftStickUp}, {"Whammy", TRANSLATE_NOOP("Pad", "Whammy Bar"), nullptr, InputBindingInfo::Type::HalfAxis, PadGuitar::Inputs::WHAMMY, GenericInputBinding::LeftStickUp},
{"Tilt", TRANSLATE_NOOP("Pad", "Tilt Up"), InputBindingInfo::Type::Button, PadGuitar::Inputs::TILT, GenericInputBinding::L2}, {"Tilt", TRANSLATE_NOOP("Pad", "Tilt Up"), nullptr, InputBindingInfo::Type::Button, PadGuitar::Inputs::TILT, GenericInputBinding::L2},
// clang-format on // clang-format on
}; };
@ -49,7 +49,7 @@ static const SettingInfo s_settings[] = {
}; };
const Pad::ControllerInfo PadGuitar::ControllerInfo = {Pad::ControllerType::Guitar, "Guitar", const Pad::ControllerInfo PadGuitar::ControllerInfo = {Pad::ControllerType::Guitar, "Guitar",
TRANSLATE_NOOP("Pad", "Guitar"), s_bindings, s_settings, Pad::VibrationCapabilities::NoVibration}; TRANSLATE_NOOP("Pad", "Guitar"), nullptr, s_bindings, s_settings, Pad::VibrationCapabilities::NoVibration};
void PadGuitar::ConfigLog() void PadGuitar::ConfigLog()
{ {

View File

@ -20,7 +20,7 @@
#include "Host.h" #include "Host.h"
const Pad::ControllerInfo PadNotConnected::ControllerInfo = {Pad::ControllerType::NotConnected, "None", const Pad::ControllerInfo PadNotConnected::ControllerInfo = {Pad::ControllerType::NotConnected, "None",
TRANSLATE_NOOP("Pad", "Not Connected"), {}, {}, Pad::VibrationCapabilities::NoVibration }; TRANSLATE_NOOP("Pad", "Not Connected"), nullptr, {}, {}, Pad::VibrationCapabilities::NoVibration };
PadNotConnected::PadNotConnected(u8 unifiedSlot, size_t ejectTicks) PadNotConnected::PadNotConnected(u8 unifiedSlot, size_t ejectTicks)
: PadBase(unifiedSlot, ejectTicks) : PadBase(unifiedSlot, ejectTicks)

View File

@ -92,6 +92,7 @@ namespace Pad
ControllerType type; ControllerType type;
const char* name; const char* name;
const char* display_name; const char* display_name;
const char* icon_name;
std::span<const InputBindingInfo> bindings; std::span<const InputBindingInfo> bindings;
std::span<const SettingInfo> settings; std::span<const SettingInfo> settings;
VibrationCapabilities vibration_caps; VibrationCapabilities vibration_caps;

View File

@ -951,7 +951,7 @@ namespace usb_hid
std::span<const InputBindingInfo> HIDKbdDevice::Bindings(u32 subtype) const std::span<const InputBindingInfo> HIDKbdDevice::Bindings(u32 subtype) const
{ {
static constexpr const InputBindingInfo info[] = { static constexpr const InputBindingInfo info[] = {
{"Keyboard", TRANSLATE_NOOP("USB", "Keyboard"), InputBindingInfo::Type::Keyboard, 0, GenericInputBinding::Unknown}, {"Keyboard", TRANSLATE_NOOP("USB", "Keyboard"), nullptr, InputBindingInfo::Type::Keyboard, 0, GenericInputBinding::Unknown},
}; };
return info; return info;
} }
@ -1044,10 +1044,10 @@ namespace usb_hid
std::span<const InputBindingInfo> HIDMouseDevice::Bindings(u32 subtype) const std::span<const InputBindingInfo> HIDMouseDevice::Bindings(u32 subtype) const
{ {
static constexpr const InputBindingInfo info[] = { static constexpr const InputBindingInfo info[] = {
{"Pointer", TRANSLATE_NOOP("USB", "Pointer"), InputBindingInfo::Type::Pointer, INPUT_BUTTON__MAX, GenericInputBinding::Unknown}, {"Pointer", TRANSLATE_NOOP("USB", "Pointer"), nullptr, InputBindingInfo::Type::Pointer, INPUT_BUTTON__MAX, GenericInputBinding::Unknown},
{"LeftButton", TRANSLATE_NOOP("USB", "Left Button"), InputBindingInfo::Type::Button, INPUT_BUTTON_LEFT, GenericInputBinding::Unknown}, {"LeftButton", TRANSLATE_NOOP("USB", "Left Button"), nullptr, InputBindingInfo::Type::Button, INPUT_BUTTON_LEFT, GenericInputBinding::Unknown},
{"RightButton", TRANSLATE_NOOP("USB", "Right Button"), InputBindingInfo::Type::Button, INPUT_BUTTON_RIGHT, GenericInputBinding::Unknown}, {"RightButton", TRANSLATE_NOOP("USB", "Right Button"), nullptr, InputBindingInfo::Type::Button, INPUT_BUTTON_RIGHT, GenericInputBinding::Unknown},
{"MiddleButton", TRANSLATE_NOOP("USB", "Middle Button"), InputBindingInfo::Type::Button, INPUT_BUTTON_MIDDLE, GenericInputBinding::Unknown}, {"MiddleButton", TRANSLATE_NOOP("USB", "Middle Button"), nullptr, InputBindingInfo::Type::Button, INPUT_BUTTON_MIDDLE, GenericInputBinding::Unknown},
}; };
return info; return info;
} }

View File

@ -587,25 +587,25 @@ namespace usb_lightgun
{ {
static constexpr const InputBindingInfo bindings[] = { static constexpr const InputBindingInfo bindings[] = {
//{"pointer", "Pointer/Aiming", InputBindingInfo::Type::Pointer, BID_POINTER_X, GenericInputBinding::Unknown}, //{"pointer", "Pointer/Aiming", InputBindingInfo::Type::Pointer, BID_POINTER_X, GenericInputBinding::Unknown},
{"Up", TRANSLATE_NOOP("USB", "D-Pad Up"), InputBindingInfo::Type::Button, BID_DPAD_UP, GenericInputBinding::DPadUp}, {"Up", TRANSLATE_NOOP("USB", "D-Pad Up"), nullptr, InputBindingInfo::Type::Button, BID_DPAD_UP, GenericInputBinding::DPadUp},
{"Down", TRANSLATE_NOOP("USB", "D-Pad Down"), InputBindingInfo::Type::Button, BID_DPAD_DOWN, GenericInputBinding::DPadDown}, {"Down", TRANSLATE_NOOP("USB", "D-Pad Down"), nullptr, InputBindingInfo::Type::Button, BID_DPAD_DOWN, GenericInputBinding::DPadDown},
{"Left", TRANSLATE_NOOP("USB", "D-Pad Left"), InputBindingInfo::Type::Button, BID_DPAD_LEFT, GenericInputBinding::DPadLeft}, {"Left", TRANSLATE_NOOP("USB", "D-Pad Left"), nullptr, InputBindingInfo::Type::Button, BID_DPAD_LEFT, GenericInputBinding::DPadLeft},
{"Right", TRANSLATE_NOOP("USB", "D-Pad Right"), InputBindingInfo::Type::Button, BID_DPAD_RIGHT, {"Right", TRANSLATE_NOOP("USB", "D-Pad Right"), nullptr, InputBindingInfo::Type::Button, BID_DPAD_RIGHT,
GenericInputBinding::DPadRight}, GenericInputBinding::DPadRight},
{"Trigger", TRANSLATE_NOOP("USB", "Trigger"), InputBindingInfo::Type::Button, BID_TRIGGER, GenericInputBinding::R2}, {"Trigger", TRANSLATE_NOOP("USB", "Trigger"), nullptr, InputBindingInfo::Type::Button, BID_TRIGGER, GenericInputBinding::R2},
{"ShootOffscreen", TRANSLATE_NOOP("USB", "Shoot Offscreen"), InputBindingInfo::Type::Button, BID_SHOOT_OFFSCREEN, {"ShootOffscreen", TRANSLATE_NOOP("USB", "Shoot Offscreen"), nullptr, InputBindingInfo::Type::Button, BID_SHOOT_OFFSCREEN,
GenericInputBinding::R1}, GenericInputBinding::R1},
{"Recalibrate", TRANSLATE_NOOP("USB", "Calibration Shot"), InputBindingInfo::Type::Button, BID_RECALIBRATE, {"Recalibrate", TRANSLATE_NOOP("USB", "Calibration Shot"), nullptr, InputBindingInfo::Type::Button, BID_RECALIBRATE,
GenericInputBinding::Unknown}, GenericInputBinding::Unknown},
{"A", TRANSLATE_NOOP("USB", "A"), InputBindingInfo::Type::Button, BID_A, GenericInputBinding::Cross}, {"A", TRANSLATE_NOOP("USB", "A"), nullptr, InputBindingInfo::Type::Button, BID_A, GenericInputBinding::Cross},
{"B", TRANSLATE_NOOP("USB", "B"), InputBindingInfo::Type::Button, BID_B, GenericInputBinding::Circle}, {"B", TRANSLATE_NOOP("USB", "B"), nullptr, InputBindingInfo::Type::Button, BID_B, GenericInputBinding::Circle},
{"C", TRANSLATE_NOOP("USB", "C"), InputBindingInfo::Type::Button, BID_C, GenericInputBinding::Triangle}, {"C", TRANSLATE_NOOP("USB", "C"), nullptr, InputBindingInfo::Type::Button, BID_C, GenericInputBinding::Triangle},
{"Select", TRANSLATE_NOOP("USB", "Select"), InputBindingInfo::Type::Button, BID_SELECT, GenericInputBinding::Select}, {"Select", TRANSLATE_NOOP("USB", "Select"), nullptr, InputBindingInfo::Type::Button, BID_SELECT, GenericInputBinding::Select},
{"Start", TRANSLATE_NOOP("USB", "Start"), InputBindingInfo::Type::Button, BID_START, GenericInputBinding::Start}, {"Start", TRANSLATE_NOOP("USB", "Start"), nullptr, InputBindingInfo::Type::Button, BID_START, GenericInputBinding::Start},
{"RelativeLeft", TRANSLATE_NOOP("USB", "Relative Left"), InputBindingInfo::Type::HalfAxis, BID_RELATIVE_LEFT, GenericInputBinding::Unknown}, {"RelativeLeft", TRANSLATE_NOOP("USB", "Relative Left"), nullptr, InputBindingInfo::Type::HalfAxis, BID_RELATIVE_LEFT, GenericInputBinding::Unknown},
{"RelativeRight", TRANSLATE_NOOP("USB", "Relative Right"), InputBindingInfo::Type::HalfAxis, BID_RELATIVE_RIGHT, GenericInputBinding::Unknown}, {"RelativeRight", TRANSLATE_NOOP("USB", "Relative Right"), nullptr, InputBindingInfo::Type::HalfAxis, BID_RELATIVE_RIGHT, GenericInputBinding::Unknown},
{"RelativeUp", TRANSLATE_NOOP("USB", "Relative Up"), InputBindingInfo::Type::HalfAxis, BID_RELATIVE_UP, GenericInputBinding::Unknown}, {"RelativeUp", TRANSLATE_NOOP("USB", "Relative Up"), nullptr, InputBindingInfo::Type::HalfAxis, BID_RELATIVE_UP, GenericInputBinding::Unknown},
{"RelativeDown", TRANSLATE_NOOP("USB", "Relative Down"), InputBindingInfo::Type::HalfAxis, BID_RELATIVE_DOWN, GenericInputBinding::Unknown}, {"RelativeDown", TRANSLATE_NOOP("USB", "Relative Down"), nullptr, InputBindingInfo::Type::HalfAxis, BID_RELATIVE_DOWN, GenericInputBinding::Unknown},
}; };
return bindings; return bindings;

View File

@ -86,25 +86,25 @@ namespace usb_pad
case WT_GENERIC: case WT_GENERIC:
{ {
static constexpr const InputBindingInfo bindings[] = { static constexpr const InputBindingInfo bindings[] = {
{"SteeringLeft", TRANSLATE_NOOP("USB", "Steering Left"), InputBindingInfo::Type::HalfAxis, CID_STEERING_L, GenericInputBinding::LeftStickLeft}, {"SteeringLeft", TRANSLATE_NOOP("USB", "Steering Left"), nullptr, InputBindingInfo::Type::HalfAxis, CID_STEERING_L, GenericInputBinding::LeftStickLeft},
{"SteeringRight", TRANSLATE_NOOP("USB", "Steering Right"), InputBindingInfo::Type::HalfAxis, CID_STEERING_R, GenericInputBinding::LeftStickRight}, {"SteeringRight", TRANSLATE_NOOP("USB", "Steering Right"), nullptr, InputBindingInfo::Type::HalfAxis, CID_STEERING_R, GenericInputBinding::LeftStickRight},
{"Throttle", TRANSLATE_NOOP("USB", "Throttle"), InputBindingInfo::Type::HalfAxis, CID_THROTTLE, GenericInputBinding::R2}, {"Throttle", TRANSLATE_NOOP("USB", "Throttle"), nullptr, InputBindingInfo::Type::HalfAxis, CID_THROTTLE, GenericInputBinding::R2},
{"Brake", TRANSLATE_NOOP("USB", "Brake"), InputBindingInfo::Type::HalfAxis, CID_BRAKE, GenericInputBinding::L2}, {"Brake", TRANSLATE_NOOP("USB", "Brake"), nullptr, InputBindingInfo::Type::HalfAxis, CID_BRAKE, GenericInputBinding::L2},
{"DPadUp", TRANSLATE_NOOP("USB", "D-Pad Up"), InputBindingInfo::Type::Button, CID_DPAD_UP, GenericInputBinding::DPadUp}, {"DPadUp", TRANSLATE_NOOP("USB", "D-Pad Up"), nullptr, InputBindingInfo::Type::Button, CID_DPAD_UP, GenericInputBinding::DPadUp},
{"DPadDown", TRANSLATE_NOOP("USB", "D-Pad Down"), InputBindingInfo::Type::Button, CID_DPAD_DOWN, GenericInputBinding::DPadDown}, {"DPadDown", TRANSLATE_NOOP("USB", "D-Pad Down"), nullptr, InputBindingInfo::Type::Button, CID_DPAD_DOWN, GenericInputBinding::DPadDown},
{"DPadLeft", TRANSLATE_NOOP("USB", "D-Pad Left"), InputBindingInfo::Type::Button, CID_DPAD_LEFT, GenericInputBinding::DPadLeft}, {"DPadLeft", TRANSLATE_NOOP("USB", "D-Pad Left"), nullptr, InputBindingInfo::Type::Button, CID_DPAD_LEFT, GenericInputBinding::DPadLeft},
{"DPadRight", TRANSLATE_NOOP("USB", "D-Pad Right"), InputBindingInfo::Type::Button, CID_DPAD_RIGHT, GenericInputBinding::DPadRight}, {"DPadRight", TRANSLATE_NOOP("USB", "D-Pad Right"), nullptr, InputBindingInfo::Type::Button, CID_DPAD_RIGHT, GenericInputBinding::DPadRight},
{"Cross", TRANSLATE_NOOP("USB", "Cross"), InputBindingInfo::Type::Button, CID_BUTTON0, GenericInputBinding::Cross}, {"Cross", TRANSLATE_NOOP("USB", "Cross"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON0, GenericInputBinding::Cross},
{"Square", TRANSLATE_NOOP("USB", "Square"), InputBindingInfo::Type::Button, CID_BUTTON1, GenericInputBinding::Square}, {"Square", TRANSLATE_NOOP("USB", "Square"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON1, GenericInputBinding::Square},
{"Circle", TRANSLATE_NOOP("USB", "Circle"), InputBindingInfo::Type::Button, CID_BUTTON2, GenericInputBinding::Circle}, {"Circle", TRANSLATE_NOOP("USB", "Circle"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON2, GenericInputBinding::Circle},
{"Triangle", TRANSLATE_NOOP("USB", "Triangle"), InputBindingInfo::Type::Button, CID_BUTTON3, GenericInputBinding::Triangle}, {"Triangle", TRANSLATE_NOOP("USB", "Triangle"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON3, GenericInputBinding::Triangle},
{"L1", TRANSLATE_NOOP("USB", "L1"), InputBindingInfo::Type::Button, CID_BUTTON5, GenericInputBinding::L1}, {"L1", TRANSLATE_NOOP("USB", "L1"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON5, GenericInputBinding::L1},
{"R1", TRANSLATE_NOOP("USB", "R1"), InputBindingInfo::Type::Button, CID_BUTTON4, GenericInputBinding::R1}, {"R1", TRANSLATE_NOOP("USB", "R1"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON4, GenericInputBinding::R1},
{"L2", TRANSLATE_NOOP("USB", "L2"), InputBindingInfo::Type::Button, CID_BUTTON7, GenericInputBinding::Unknown}, // used L2 for brake {"L2", TRANSLATE_NOOP("USB", "L2"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON7, GenericInputBinding::Unknown}, // used L2 for brake
{"R2", TRANSLATE_NOOP("USB", "R2"), InputBindingInfo::Type::Button, CID_BUTTON6, GenericInputBinding::Unknown}, // used R2 for throttle {"R2", TRANSLATE_NOOP("USB", "R2"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON6, GenericInputBinding::Unknown}, // used R2 for throttle
{"Select", TRANSLATE_NOOP("USB", "Select"), InputBindingInfo::Type::Button, CID_BUTTON8, GenericInputBinding::Select}, {"Select", TRANSLATE_NOOP("USB", "Select"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON8, GenericInputBinding::Select},
{"Start", TRANSLATE_NOOP("USB", "Start"), InputBindingInfo::Type::Button, CID_BUTTON9, GenericInputBinding::Start}, {"Start", TRANSLATE_NOOP("USB", "Start"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON9, GenericInputBinding::Start},
{"FFDevice", TRANSLATE_NOOP("USB", "Force Feedback"), InputBindingInfo::Type::Device, 0, GenericInputBinding::Unknown}, {"FFDevice", TRANSLATE_NOOP("USB", "Force Feedback"), nullptr, InputBindingInfo::Type::Device, 0, GenericInputBinding::Unknown},
}; };
return bindings; return bindings;
@ -114,27 +114,27 @@ namespace usb_pad
case WT_DRIVING_FORCE_PRO_1102: case WT_DRIVING_FORCE_PRO_1102:
{ {
static constexpr const InputBindingInfo bindings[] = { static constexpr const InputBindingInfo bindings[] = {
{"SteeringLeft", TRANSLATE_NOOP("USB", "Steering Left"), InputBindingInfo::Type::HalfAxis, CID_STEERING_L, GenericInputBinding::LeftStickLeft}, {"SteeringLeft", TRANSLATE_NOOP("USB", "Steering Left"), nullptr, InputBindingInfo::Type::HalfAxis, CID_STEERING_L, GenericInputBinding::LeftStickLeft},
{"SteeringRight", TRANSLATE_NOOP("USB", "Steering Right"), InputBindingInfo::Type::HalfAxis, CID_STEERING_R, GenericInputBinding::LeftStickRight}, {"SteeringRight", TRANSLATE_NOOP("USB", "Steering Right"), nullptr, InputBindingInfo::Type::HalfAxis, CID_STEERING_R, GenericInputBinding::LeftStickRight},
{"Throttle", TRANSLATE_NOOP("USB", "Throttle"), InputBindingInfo::Type::HalfAxis, CID_THROTTLE, GenericInputBinding::R2}, {"Throttle", TRANSLATE_NOOP("USB", "Throttle"), nullptr, InputBindingInfo::Type::HalfAxis, CID_THROTTLE, GenericInputBinding::R2},
{"Brake", TRANSLATE_NOOP("USB", "Brake"), InputBindingInfo::Type::HalfAxis, CID_BRAKE, GenericInputBinding::L2}, {"Brake", TRANSLATE_NOOP("USB", "Brake"), nullptr, InputBindingInfo::Type::HalfAxis, CID_BRAKE, GenericInputBinding::L2},
{"DPadUp", TRANSLATE_NOOP("USB", "D-Pad Up"), InputBindingInfo::Type::Button, CID_DPAD_UP, GenericInputBinding::DPadUp}, {"DPadUp", TRANSLATE_NOOP("USB", "D-Pad Up"), nullptr, InputBindingInfo::Type::Button, CID_DPAD_UP, GenericInputBinding::DPadUp},
{"DPadDown", TRANSLATE_NOOP("USB", "D-Pad Down"), InputBindingInfo::Type::Button, CID_DPAD_DOWN, GenericInputBinding::DPadDown}, {"DPadDown", TRANSLATE_NOOP("USB", "D-Pad Down"), nullptr, InputBindingInfo::Type::Button, CID_DPAD_DOWN, GenericInputBinding::DPadDown},
{"DPadLeft", TRANSLATE_NOOP("USB", "D-Pad Left"), InputBindingInfo::Type::Button, CID_DPAD_LEFT, GenericInputBinding::DPadLeft}, {"DPadLeft", TRANSLATE_NOOP("USB", "D-Pad Left"), nullptr, InputBindingInfo::Type::Button, CID_DPAD_LEFT, GenericInputBinding::DPadLeft},
{"DPadRight", TRANSLATE_NOOP("USB", "D-Pad Right"), InputBindingInfo::Type::Button, CID_DPAD_RIGHT, GenericInputBinding::DPadRight}, {"DPadRight", TRANSLATE_NOOP("USB", "D-Pad Right"), nullptr, InputBindingInfo::Type::Button, CID_DPAD_RIGHT, GenericInputBinding::DPadRight},
{"Cross", TRANSLATE_NOOP("USB", "Cross"), InputBindingInfo::Type::Button, CID_BUTTON0, GenericInputBinding::Cross}, {"Cross", TRANSLATE_NOOP("USB", "Cross"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON0, GenericInputBinding::Cross},
{"Square", TRANSLATE_NOOP("USB", "Square"), InputBindingInfo::Type::Button, CID_BUTTON1, GenericInputBinding::Square}, {"Square", TRANSLATE_NOOP("USB", "Square"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON1, GenericInputBinding::Square},
{"Circle", TRANSLATE_NOOP("USB", "Circle"), InputBindingInfo::Type::Button, CID_BUTTON2, GenericInputBinding::Circle}, {"Circle", TRANSLATE_NOOP("USB", "Circle"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON2, GenericInputBinding::Circle},
{"Triangle", TRANSLATE_NOOP("USB", "Triangle"), InputBindingInfo::Type::Button, CID_BUTTON3, GenericInputBinding::Triangle}, {"Triangle", TRANSLATE_NOOP("USB", "Triangle"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON3, GenericInputBinding::Triangle},
{"R1", TRANSLATE_NOOP("USB", "Shift Up / R1"), InputBindingInfo::Type::Button, CID_BUTTON4, GenericInputBinding::R1}, {"R1", TRANSLATE_NOOP("USB", "Shift Up / R1"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON4, GenericInputBinding::R1},
{"L1", TRANSLATE_NOOP("USB", "Shift Down / L1"), InputBindingInfo::Type::Button, CID_BUTTON5, GenericInputBinding::L1}, {"L1", TRANSLATE_NOOP("USB", "Shift Down / L1"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON5, GenericInputBinding::L1},
{"Select", TRANSLATE_NOOP("USB", "Select"), InputBindingInfo::Type::Button, CID_BUTTON8, GenericInputBinding::Select}, {"Select", TRANSLATE_NOOP("USB", "Select"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON8, GenericInputBinding::Select},
{"Start", TRANSLATE_NOOP("USB", "Start"), InputBindingInfo::Type::Button, CID_BUTTON9, GenericInputBinding::Start}, {"Start", TRANSLATE_NOOP("USB", "Start"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON9, GenericInputBinding::Start},
{"L2", TRANSLATE_NOOP("USB", "L2"), InputBindingInfo::Type::Button, CID_BUTTON7, GenericInputBinding::Unknown}, // used L2 for brake {"L2", TRANSLATE_NOOP("USB", "L2"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON7, GenericInputBinding::Unknown}, // used L2 for brake
{"R2", TRANSLATE_NOOP("USB", "R2"), InputBindingInfo::Type::Button, CID_BUTTON6, GenericInputBinding::Unknown}, // used R2 for throttle {"R2", TRANSLATE_NOOP("USB", "R2"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON6, GenericInputBinding::Unknown}, // used R2 for throttle
{"L3", TRANSLATE_NOOP("USB", "L3"), InputBindingInfo::Type::Button, CID_BUTTON11, GenericInputBinding::L3}, {"L3", TRANSLATE_NOOP("USB", "L3"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON11, GenericInputBinding::L3},
{"R3", TRANSLATE_NOOP("USB", "R3"), InputBindingInfo::Type::Button, CID_BUTTON10, GenericInputBinding::R3}, {"R3", TRANSLATE_NOOP("USB", "R3"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON10, GenericInputBinding::R3},
{"FFDevice", "Force Feedback", InputBindingInfo::Type::Device, 0, GenericInputBinding::Unknown}, {"FFDevice", "Force Feedback", nullptr, InputBindingInfo::Type::Device, 0, GenericInputBinding::Unknown},
}; };
return bindings; return bindings;
@ -143,17 +143,17 @@ namespace usb_pad
case WT_GT_FORCE: case WT_GT_FORCE:
{ {
static constexpr const InputBindingInfo bindings[] = { static constexpr const InputBindingInfo bindings[] = {
{"SteeringLeft", TRANSLATE_NOOP("USB", "Steering Left"), InputBindingInfo::Type::HalfAxis, CID_STEERING_L, GenericInputBinding::LeftStickLeft}, {"SteeringLeft", TRANSLATE_NOOP("USB", "Steering Left"), nullptr, InputBindingInfo::Type::HalfAxis, CID_STEERING_L, GenericInputBinding::LeftStickLeft},
{"SteeringRight", TRANSLATE_NOOP("USB", "Steering Right"), InputBindingInfo::Type::HalfAxis, CID_STEERING_R, GenericInputBinding::LeftStickRight}, {"SteeringRight", TRANSLATE_NOOP("USB", "Steering Right"), nullptr, InputBindingInfo::Type::HalfAxis, CID_STEERING_R, GenericInputBinding::LeftStickRight},
{"Throttle", TRANSLATE_NOOP("USB", "Throttle"), InputBindingInfo::Type::HalfAxis, CID_THROTTLE, GenericInputBinding::R2}, {"Throttle", TRANSLATE_NOOP("USB", "Throttle"), nullptr, InputBindingInfo::Type::HalfAxis, CID_THROTTLE, GenericInputBinding::R2},
{"Brake", TRANSLATE_NOOP("USB", "Brake"), InputBindingInfo::Type::HalfAxis, CID_BRAKE, GenericInputBinding::L2}, {"Brake", TRANSLATE_NOOP("USB", "Brake"), nullptr, InputBindingInfo::Type::HalfAxis, CID_BRAKE, GenericInputBinding::L2},
{"MenuUp", TRANSLATE_NOOP("USB", "Menu Up"), InputBindingInfo::Type::Button, CID_BUTTON1, GenericInputBinding::DPadUp}, {"MenuUp", TRANSLATE_NOOP("USB", "Menu Up"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON1, GenericInputBinding::DPadUp},
{"MenuDown", TRANSLATE_NOOP("USB", "Menu Down"), InputBindingInfo::Type::Button, CID_BUTTON0, GenericInputBinding::DPadDown}, {"MenuDown", TRANSLATE_NOOP("USB", "Menu Down"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON0, GenericInputBinding::DPadDown},
{"X", TRANSLATE_NOOP("USB", "X"), InputBindingInfo::Type::Button, CID_BUTTON2, GenericInputBinding::Square}, {"X", TRANSLATE_NOOP("USB", "X"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON2, GenericInputBinding::Square},
{"Y", TRANSLATE_NOOP("USB", "Y"), InputBindingInfo::Type::Button, CID_BUTTON3, GenericInputBinding::Triangle}, {"Y", TRANSLATE_NOOP("USB", "Y"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON3, GenericInputBinding::Triangle},
{"A", TRANSLATE_NOOP("USB", "A"), InputBindingInfo::Type::Button, CID_BUTTON4, GenericInputBinding::Cross}, {"A", TRANSLATE_NOOP("USB", "A"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON4, GenericInputBinding::Cross},
{"B", TRANSLATE_NOOP("USB", "B"), InputBindingInfo::Type::Button, CID_BUTTON5, GenericInputBinding::Circle}, {"B", TRANSLATE_NOOP("USB", "B"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON5, GenericInputBinding::Circle},
{"FFDevice", TRANSLATE_NOOP("USB", "Force Feedback"), InputBindingInfo::Type::Device, 0, GenericInputBinding::Unknown}, {"FFDevice", TRANSLATE_NOOP("USB", "Force Feedback"), nullptr, InputBindingInfo::Type::Device, 0, GenericInputBinding::Unknown},
}; };
return bindings; return bindings;
@ -941,13 +941,13 @@ namespace usb_pad
std::span<const InputBindingInfo> RBDrumKitDevice::Bindings(u32 subtype) const std::span<const InputBindingInfo> RBDrumKitDevice::Bindings(u32 subtype) const
{ {
static constexpr const InputBindingInfo bindings[] = { static constexpr const InputBindingInfo bindings[] = {
{"Blue", TRANSLATE_NOOP("USB", "Blue"), InputBindingInfo::Type::Button, CID_BUTTON0, GenericInputBinding::R1}, {"Blue", TRANSLATE_NOOP("USB", "Blue"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON0, GenericInputBinding::R1},
{"Green", TRANSLATE_NOOP("USB", "Green"), InputBindingInfo::Type::Button, CID_BUTTON1, GenericInputBinding::Triangle}, {"Green", TRANSLATE_NOOP("USB", "Green"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON1, GenericInputBinding::Triangle},
{"Red", TRANSLATE_NOOP("USB", "Red"), InputBindingInfo::Type::Button, CID_BUTTON2, GenericInputBinding::Circle}, {"Red", TRANSLATE_NOOP("USB", "Red"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON2, GenericInputBinding::Circle},
{"Yellow", TRANSLATE_NOOP("USB", "Yellow"), InputBindingInfo::Type::Button, CID_BUTTON3, GenericInputBinding::Square}, {"Yellow", TRANSLATE_NOOP("USB", "Yellow"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON3, GenericInputBinding::Square},
{"Orange", TRANSLATE_NOOP("USB", "Orange"), InputBindingInfo::Type::Button, CID_BUTTON4, GenericInputBinding::Cross}, {"Orange", TRANSLATE_NOOP("USB", "Orange"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON4, GenericInputBinding::Cross},
{"Select", TRANSLATE_NOOP("USB", "Select"), InputBindingInfo::Type::Button, CID_BUTTON8, GenericInputBinding::Select}, {"Select", TRANSLATE_NOOP("USB", "Select"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON8, GenericInputBinding::Select},
{"Start", TRANSLATE_NOOP("USB", "Start"), InputBindingInfo::Type::Button, CID_BUTTON9, GenericInputBinding::Start}, {"Start", TRANSLATE_NOOP("USB", "Start"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON9, GenericInputBinding::Start},
}; };
return bindings; return bindings;
@ -978,29 +978,29 @@ namespace usb_pad
std::span<const InputBindingInfo> BuzzDevice::Bindings(u32 subtype) const std::span<const InputBindingInfo> BuzzDevice::Bindings(u32 subtype) const
{ {
static constexpr const InputBindingInfo bindings[] = { static constexpr const InputBindingInfo bindings[] = {
{"Red1", TRANSLATE_NOOP("USB", "Player 1 Red"), InputBindingInfo::Type::Button, CID_BUTTON0, GenericInputBinding::Circle}, {"Red1", TRANSLATE_NOOP("USB", "Player 1 Red"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON0, GenericInputBinding::Circle},
{"Blue1", TRANSLATE_NOOP("USB", "Player 1 Blue"), InputBindingInfo::Type::Button, CID_BUTTON4, GenericInputBinding::R1}, {"Blue1", TRANSLATE_NOOP("USB", "Player 1 Blue"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON4, GenericInputBinding::R1},
{"Orange1", TRANSLATE_NOOP("USB", "Player 1 Orange"), InputBindingInfo::Type::Button, CID_BUTTON3, GenericInputBinding::Cross}, {"Orange1", TRANSLATE_NOOP("USB", "Player 1 Orange"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON3, GenericInputBinding::Cross},
{"Green1", TRANSLATE_NOOP("USB", "Player 1 Green"), InputBindingInfo::Type::Button, CID_BUTTON2, GenericInputBinding::Triangle}, {"Green1", TRANSLATE_NOOP("USB", "Player 1 Green"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON2, GenericInputBinding::Triangle},
{"Yellow1", TRANSLATE_NOOP("USB", "Player 1 Yellow"), InputBindingInfo::Type::Button, CID_BUTTON1, GenericInputBinding::Square}, {"Yellow1", TRANSLATE_NOOP("USB", "Player 1 Yellow"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON1, GenericInputBinding::Square},
{"Red2", TRANSLATE_NOOP("USB", "Player 2 Red"), InputBindingInfo::Type::Button, CID_BUTTON5, GenericInputBinding::Unknown}, {"Red2", TRANSLATE_NOOP("USB", "Player 2 Red"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON5, GenericInputBinding::Unknown},
{"Blue2", TRANSLATE_NOOP("USB", "Player 2 Blue"), InputBindingInfo::Type::Button, CID_BUTTON9, GenericInputBinding::Unknown}, {"Blue2", TRANSLATE_NOOP("USB", "Player 2 Blue"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON9, GenericInputBinding::Unknown},
{"Orange2", TRANSLATE_NOOP("USB", "Player 2 Orange"), InputBindingInfo::Type::Button, CID_BUTTON8, GenericInputBinding::Unknown}, {"Orange2", TRANSLATE_NOOP("USB", "Player 2 Orange"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON8, GenericInputBinding::Unknown},
{"Green2", TRANSLATE_NOOP("USB", "Player 2 Green"), InputBindingInfo::Type::Button, CID_BUTTON7, GenericInputBinding::Unknown}, {"Green2", TRANSLATE_NOOP("USB", "Player 2 Green"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON7, GenericInputBinding::Unknown},
{"Yellow2", TRANSLATE_NOOP("USB", "Player 2 Yellow"), InputBindingInfo::Type::Button, CID_BUTTON6, GenericInputBinding::Unknown}, {"Yellow2", TRANSLATE_NOOP("USB", "Player 2 Yellow"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON6, GenericInputBinding::Unknown},
{"Red3", TRANSLATE_NOOP("USB", "Player 3 Red"), InputBindingInfo::Type::Button, CID_BUTTON10, GenericInputBinding::Unknown}, {"Red3", TRANSLATE_NOOP("USB", "Player 3 Red"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON10, GenericInputBinding::Unknown},
{"Blue3", TRANSLATE_NOOP("USB", "Player 3 Blue"), InputBindingInfo::Type::Button, CID_BUTTON14, GenericInputBinding::Unknown}, {"Blue3", TRANSLATE_NOOP("USB", "Player 3 Blue"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON14, GenericInputBinding::Unknown},
{"Orange3", TRANSLATE_NOOP("USB", "Player 3 Orange"), InputBindingInfo::Type::Button, CID_BUTTON13, GenericInputBinding::Unknown}, {"Orange3", TRANSLATE_NOOP("USB", "Player 3 Orange"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON13, GenericInputBinding::Unknown},
{"Green3", TRANSLATE_NOOP("USB", "Player 3 Green"), InputBindingInfo::Type::Button, CID_BUTTON12, GenericInputBinding::Unknown}, {"Green3", TRANSLATE_NOOP("USB", "Player 3 Green"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON12, GenericInputBinding::Unknown},
{"Yellow3", TRANSLATE_NOOP("USB", "Player 3 Yellow"), InputBindingInfo::Type::Button, CID_BUTTON11, GenericInputBinding::Unknown}, {"Yellow3", TRANSLATE_NOOP("USB", "Player 3 Yellow"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON11, GenericInputBinding::Unknown},
{"Red4", TRANSLATE_NOOP("USB", "Player 4 Red"), InputBindingInfo::Type::Button, CID_BUTTON15, GenericInputBinding::Unknown}, {"Red4", TRANSLATE_NOOP("USB", "Player 4 Red"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON15, GenericInputBinding::Unknown},
{"Blue4", TRANSLATE_NOOP("USB", "Player 4 Blue"), InputBindingInfo::Type::Button, CID_BUTTON19, GenericInputBinding::Unknown}, {"Blue4", TRANSLATE_NOOP("USB", "Player 4 Blue"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON19, GenericInputBinding::Unknown},
{"Orange4", TRANSLATE_NOOP("USB", "Player 4 Orange"), InputBindingInfo::Type::Button, CID_BUTTON18, GenericInputBinding::Unknown}, {"Orange4", TRANSLATE_NOOP("USB", "Player 4 Orange"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON18, GenericInputBinding::Unknown},
{"Green4", TRANSLATE_NOOP("USB", "Player 4 Green"), InputBindingInfo::Type::Button, CID_BUTTON17, GenericInputBinding::Unknown}, {"Green4", TRANSLATE_NOOP("USB", "Player 4 Green"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON17, GenericInputBinding::Unknown},
{"Yellow4", TRANSLATE_NOOP("USB", "Player 4 Yellow"), InputBindingInfo::Type::Button, CID_BUTTON16, GenericInputBinding::Unknown}, {"Yellow4", TRANSLATE_NOOP("USB", "Player 4 Yellow"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON16, GenericInputBinding::Unknown},
}; };
return bindings; return bindings;
@ -1052,35 +1052,35 @@ namespace usb_pad
std::span<const InputBindingInfo> KeyboardmaniaDevice::Bindings(u32 subtype) const std::span<const InputBindingInfo> KeyboardmaniaDevice::Bindings(u32 subtype) const
{ {
static constexpr const InputBindingInfo bindings[] = { static constexpr const InputBindingInfo bindings[] = {
{"C1", TRANSLATE_NOOP("USB", "C 1"), InputBindingInfo::Type::Button, CID_BUTTON0, GenericInputBinding::Unknown}, {"C1", TRANSLATE_NOOP("USB", "C 1"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON0, GenericInputBinding::Unknown},
{"CSharp1", TRANSLATE_NOOP("USB", "C# 1"), InputBindingInfo::Type::Button, CID_BUTTON1, GenericInputBinding::Unknown}, {"CSharp1", TRANSLATE_NOOP("USB", "C# 1"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON1, GenericInputBinding::Unknown},
{"D1", TRANSLATE_NOOP("USB", "D 1"), InputBindingInfo::Type::Button, CID_BUTTON2, GenericInputBinding::Unknown}, {"D1", TRANSLATE_NOOP("USB", "D 1"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON2, GenericInputBinding::Unknown},
{"DSharp1", TRANSLATE_NOOP("USB", "D# 1"), InputBindingInfo::Type::Button, CID_BUTTON3, GenericInputBinding::Unknown}, {"DSharp1", TRANSLATE_NOOP("USB", "D# 1"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON3, GenericInputBinding::Unknown},
{"E1", TRANSLATE_NOOP("USB", "E 1"), InputBindingInfo::Type::Button, CID_BUTTON4, GenericInputBinding::Unknown}, {"E1", TRANSLATE_NOOP("USB", "E 1"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON4, GenericInputBinding::Unknown},
{"F1", TRANSLATE_NOOP("USB", "F 1"), InputBindingInfo::Type::Button, CID_BUTTON5, GenericInputBinding::Unknown}, {"F1", TRANSLATE_NOOP("USB", "F 1"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON5, GenericInputBinding::Unknown},
{"FSharp1", TRANSLATE_NOOP("USB", "F# 1"), InputBindingInfo::Type::Button, CID_BUTTON6, GenericInputBinding::Unknown}, {"FSharp1", TRANSLATE_NOOP("USB", "F# 1"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON6, GenericInputBinding::Unknown},
{"G1", TRANSLATE_NOOP("USB", "G 1"), InputBindingInfo::Type::Button, CID_BUTTON8, GenericInputBinding::Unknown}, {"G1", TRANSLATE_NOOP("USB", "G 1"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON8, GenericInputBinding::Unknown},
{"GSharp1", TRANSLATE_NOOP("USB", "G# 1"), InputBindingInfo::Type::Button, CID_BUTTON9, GenericInputBinding::Unknown}, {"GSharp1", TRANSLATE_NOOP("USB", "G# 1"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON9, GenericInputBinding::Unknown},
{"A1", TRANSLATE_NOOP("USB", "A 1"), InputBindingInfo::Type::Button, CID_BUTTON10, GenericInputBinding::Unknown}, {"A1", TRANSLATE_NOOP("USB", "A 1"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON10, GenericInputBinding::Unknown},
{"ASharp1", TRANSLATE_NOOP("USB", "A# 1"), InputBindingInfo::Type::Button, CID_BUTTON11, GenericInputBinding::Unknown}, {"ASharp1", TRANSLATE_NOOP("USB", "A# 1"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON11, GenericInputBinding::Unknown},
{"B1", TRANSLATE_NOOP("USB", "B 1"), InputBindingInfo::Type::Button, CID_BUTTON12, GenericInputBinding::Unknown}, {"B1", TRANSLATE_NOOP("USB", "B 1"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON12, GenericInputBinding::Unknown},
{"C2", TRANSLATE_NOOP("USB", "C 2"), InputBindingInfo::Type::Button, CID_BUTTON13, GenericInputBinding::Unknown}, {"C2", TRANSLATE_NOOP("USB", "C 2"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON13, GenericInputBinding::Unknown},
{"CSharp2", TRANSLATE_NOOP("USB", "C# 2"), InputBindingInfo::Type::Button, CID_BUTTON16, GenericInputBinding::Unknown}, {"CSharp2", TRANSLATE_NOOP("USB", "C# 2"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON16, GenericInputBinding::Unknown},
{"D2", TRANSLATE_NOOP("USB", "D 2"), InputBindingInfo::Type::Button, CID_BUTTON17, GenericInputBinding::Unknown}, {"D2", TRANSLATE_NOOP("USB", "D 2"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON17, GenericInputBinding::Unknown},
{"DSharp2", TRANSLATE_NOOP("USB", "D# 2"), InputBindingInfo::Type::Button, CID_BUTTON18, GenericInputBinding::Unknown}, {"DSharp2", TRANSLATE_NOOP("USB", "D# 2"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON18, GenericInputBinding::Unknown},
{"E2", TRANSLATE_NOOP("USB", "E 2"), InputBindingInfo::Type::Button, CID_BUTTON19, GenericInputBinding::Unknown}, {"E2", TRANSLATE_NOOP("USB", "E 2"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON19, GenericInputBinding::Unknown},
{"F2", TRANSLATE_NOOP("USB", "F 2"), InputBindingInfo::Type::Button, CID_BUTTON20, GenericInputBinding::Unknown}, {"F2", TRANSLATE_NOOP("USB", "F 2"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON20, GenericInputBinding::Unknown},
{"FSharp2", TRANSLATE_NOOP("USB", "F# 2"), InputBindingInfo::Type::Button, CID_BUTTON21, GenericInputBinding::Unknown}, {"FSharp2", TRANSLATE_NOOP("USB", "F# 2"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON21, GenericInputBinding::Unknown},
{"G2", TRANSLATE_NOOP("USB", "G 2"), InputBindingInfo::Type::Button, CID_BUTTON24, GenericInputBinding::Unknown}, {"G2", TRANSLATE_NOOP("USB", "G 2"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON24, GenericInputBinding::Unknown},
{"GSharp2", TRANSLATE_NOOP("USB", "G# 2"), InputBindingInfo::Type::Button, CID_BUTTON25, GenericInputBinding::Unknown}, {"GSharp2", TRANSLATE_NOOP("USB", "G# 2"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON25, GenericInputBinding::Unknown},
{"A2", TRANSLATE_NOOP("USB", "A 2"), InputBindingInfo::Type::Button, CID_BUTTON26, GenericInputBinding::Unknown}, {"A2", TRANSLATE_NOOP("USB", "A 2"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON26, GenericInputBinding::Unknown},
{"ASharp2", TRANSLATE_NOOP("USB", "A# 2"), InputBindingInfo::Type::Button, CID_BUTTON27, GenericInputBinding::Unknown}, {"ASharp2", TRANSLATE_NOOP("USB", "A# 2"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON27, GenericInputBinding::Unknown},
{"B2", TRANSLATE_NOOP("USB", "B 2"), InputBindingInfo::Type::Button, CID_BUTTON28, GenericInputBinding::Unknown}, {"B2", TRANSLATE_NOOP("USB", "B 2"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON28, GenericInputBinding::Unknown},
{"Start", TRANSLATE_NOOP("USB", "Start"), InputBindingInfo::Type::Button, CID_BUTTON22, GenericInputBinding::Unknown}, {"Start", TRANSLATE_NOOP("USB", "Start"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON22, GenericInputBinding::Unknown},
{"Select", TRANSLATE_NOOP("USB", "Select"), InputBindingInfo::Type::Button, CID_BUTTON14, GenericInputBinding::Unknown}, {"Select", TRANSLATE_NOOP("USB", "Select"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON14, GenericInputBinding::Unknown},
{"WheelUp", TRANSLATE_NOOP("USB", "Wheel Up"), InputBindingInfo::Type::Button, CID_BUTTON29, GenericInputBinding::Unknown}, {"WheelUp", TRANSLATE_NOOP("USB", "Wheel Up"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON29, GenericInputBinding::Unknown},
{"WheelDown", TRANSLATE_NOOP("USB", "Wheel Down"), InputBindingInfo::Type::Button, CID_BUTTON30, GenericInputBinding::Unknown}, {"WheelDown", TRANSLATE_NOOP("USB", "Wheel Down"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON30, GenericInputBinding::Unknown},
}; };
return bindings; return bindings;

View File

@ -362,24 +362,24 @@ namespace usb_pad
{ {
// TODO: This is likely wrong. Someone who cares can fix it. // TODO: This is likely wrong. Someone who cares can fix it.
static constexpr const InputBindingInfo bindings[] = { static constexpr const InputBindingInfo bindings[] = {
{"StickLeft", TRANSLATE_NOOP("USB", "Stick Left"), InputBindingInfo::Type::HalfAxis, CID_STEERING_L, GenericInputBinding::LeftStickLeft}, {"StickLeft", TRANSLATE_NOOP("USB", "Stick Left"), nullptr, InputBindingInfo::Type::HalfAxis, CID_STEERING_L, GenericInputBinding::LeftStickLeft},
{"StickRight", TRANSLATE_NOOP("USB", "Stick Right"), InputBindingInfo::Type::HalfAxis, CID_STEERING_R, GenericInputBinding::LeftStickRight}, {"StickRight", TRANSLATE_NOOP("USB", "Stick Right"), nullptr, InputBindingInfo::Type::HalfAxis, CID_STEERING_R, GenericInputBinding::LeftStickRight},
{"StickUp", TRANSLATE_NOOP("USB", "Stick Up"), InputBindingInfo::Type::HalfAxis, CID_THROTTLE, GenericInputBinding::LeftStickUp}, {"StickUp", TRANSLATE_NOOP("USB", "Stick Up"), nullptr, InputBindingInfo::Type::HalfAxis, CID_THROTTLE, GenericInputBinding::LeftStickUp},
{"StickDown", TRANSLATE_NOOP("USB", "Stick Down"), InputBindingInfo::Type::HalfAxis, CID_BRAKE, GenericInputBinding::LeftStickDown}, {"StickDown", TRANSLATE_NOOP("USB", "Stick Down"), nullptr, InputBindingInfo::Type::HalfAxis, CID_BRAKE, GenericInputBinding::LeftStickDown},
{"A", TRANSLATE_NOOP("USB", "A"), InputBindingInfo::Type::Button, CID_BUTTON0, GenericInputBinding::Cross}, {"A", TRANSLATE_NOOP("USB", "A"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON0, GenericInputBinding::Cross},
{"B", TRANSLATE_NOOP("USB", "B"), InputBindingInfo::Type::Button, CID_BUTTON1, GenericInputBinding::Circle}, {"B", TRANSLATE_NOOP("USB", "B"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON1, GenericInputBinding::Circle},
{"C", TRANSLATE_NOOP("USB", "C"), InputBindingInfo::Type::Button, CID_BUTTON2, GenericInputBinding::R2}, {"C", TRANSLATE_NOOP("USB", "C"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON2, GenericInputBinding::R2},
{"X", TRANSLATE_NOOP("USB", "X"), InputBindingInfo::Type::Button, CID_BUTTON3, GenericInputBinding::Square}, {"X", TRANSLATE_NOOP("USB", "X"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON3, GenericInputBinding::Square},
{"Y", TRANSLATE_NOOP("USB", "Y"), InputBindingInfo::Type::Button, CID_BUTTON4, GenericInputBinding::Triangle}, {"Y", TRANSLATE_NOOP("USB", "Y"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON4, GenericInputBinding::Triangle},
{"Z", TRANSLATE_NOOP("USB", "Z"), InputBindingInfo::Type::Button, CID_BUTTON5, GenericInputBinding::L2}, {"Z", TRANSLATE_NOOP("USB", "Z"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON5, GenericInputBinding::L2},
{"L", TRANSLATE_NOOP("USB", "L"), InputBindingInfo::Type::Button, CID_BUTTON6, GenericInputBinding::L1}, {"L", TRANSLATE_NOOP("USB", "L"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON6, GenericInputBinding::L1},
{"R", TRANSLATE_NOOP("USB", "R"), InputBindingInfo::Type::Button, CID_BUTTON7, GenericInputBinding::R1}, {"R", TRANSLATE_NOOP("USB", "R"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON7, GenericInputBinding::R1},
{"Select", TRANSLATE_NOOP("USB", "Select"), InputBindingInfo::Type::Button, CID_BUTTON8, GenericInputBinding::Select}, {"Select", TRANSLATE_NOOP("USB", "Select"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON8, GenericInputBinding::Select},
{"Start", TRANSLATE_NOOP("USB", "Start"), InputBindingInfo::Type::Button, CID_BUTTON9, GenericInputBinding::Start}, {"Start", TRANSLATE_NOOP("USB", "Start"), nullptr, InputBindingInfo::Type::Button, CID_BUTTON9, GenericInputBinding::Start},
{"DPadUp", TRANSLATE_NOOP("USB", "D-Pad Up"), InputBindingInfo::Type::Button, CID_DPAD_UP, GenericInputBinding::DPadUp}, {"DPadUp", TRANSLATE_NOOP("USB", "D-Pad Up"), nullptr, InputBindingInfo::Type::Button, CID_DPAD_UP, GenericInputBinding::DPadUp},
{"DPadDown", TRANSLATE_NOOP("USB", "D-Pad Down"), InputBindingInfo::Type::Button, CID_DPAD_DOWN, GenericInputBinding::DPadDown}, {"DPadDown", TRANSLATE_NOOP("USB", "D-Pad Down"), nullptr, InputBindingInfo::Type::Button, CID_DPAD_DOWN, GenericInputBinding::DPadDown},
{"DPadLeft", TRANSLATE_NOOP("USB", "D-Pad Left"), InputBindingInfo::Type::Button, CID_DPAD_LEFT, GenericInputBinding::DPadLeft}, {"DPadLeft", TRANSLATE_NOOP("USB", "D-Pad Left"), nullptr, InputBindingInfo::Type::Button, CID_DPAD_LEFT, GenericInputBinding::DPadLeft},
{"DPadRight", TRANSLATE_NOOP("USB", "D-Pad Right"), InputBindingInfo::Type::Button, CID_DPAD_RIGHT, GenericInputBinding::DPadRight}, {"DPadRight", TRANSLATE_NOOP("USB", "D-Pad Right"), nullptr, InputBindingInfo::Type::Button, CID_DPAD_RIGHT, GenericInputBinding::DPadRight},
}; };
return bindings; return bindings;

View File

@ -444,30 +444,30 @@ namespace usb_pad
std::span<const InputBindingInfo> DJTurntableDevice::Bindings(u32 subtype) const std::span<const InputBindingInfo> DJTurntableDevice::Bindings(u32 subtype) const
{ {
static constexpr const InputBindingInfo bindings[] = { static constexpr const InputBindingInfo bindings[] = {
{"DPadUp", TRANSLATE_NOOP("USB", "D-Pad Up"), InputBindingInfo::Type::Button, CID_DJ_DPAD_UP, GenericInputBinding::DPadUp}, {"DPadUp", TRANSLATE_NOOP("USB", "D-Pad Up"), nullptr, InputBindingInfo::Type::Button, CID_DJ_DPAD_UP, GenericInputBinding::DPadUp},
{"DPadDown", TRANSLATE_NOOP("USB", "D-Pad Down"), InputBindingInfo::Type::Button, CID_DJ_DPAD_DOWN, GenericInputBinding::DPadDown}, {"DPadDown", TRANSLATE_NOOP("USB", "D-Pad Down"), nullptr, InputBindingInfo::Type::Button, CID_DJ_DPAD_DOWN, GenericInputBinding::DPadDown},
{"DPadLeft", TRANSLATE_NOOP("USB", "D-Pad Left"), InputBindingInfo::Type::Button, CID_DJ_DPAD_LEFT, GenericInputBinding::DPadLeft}, {"DPadLeft", TRANSLATE_NOOP("USB", "D-Pad Left"), nullptr, InputBindingInfo::Type::Button, CID_DJ_DPAD_LEFT, GenericInputBinding::DPadLeft},
{"DPadRight", TRANSLATE_NOOP("USB", "D-Pad Right"), InputBindingInfo::Type::Button, CID_DJ_DPAD_RIGHT, GenericInputBinding::DPadRight}, {"DPadRight", TRANSLATE_NOOP("USB", "D-Pad Right"), nullptr, InputBindingInfo::Type::Button, CID_DJ_DPAD_RIGHT, GenericInputBinding::DPadRight},
{"Square", TRANSLATE_NOOP("USB", "Square"), InputBindingInfo::Type::Button, CID_DJ_SQUARE, GenericInputBinding::Unknown}, {"Square", TRANSLATE_NOOP("USB", "Square"), nullptr, InputBindingInfo::Type::Button, CID_DJ_SQUARE, GenericInputBinding::Unknown},
{"Cross", TRANSLATE_NOOP("USB", "Cross"), InputBindingInfo::Type::Button, CID_DJ_CROSS, GenericInputBinding::Unknown}, {"Cross", TRANSLATE_NOOP("USB", "Cross"), nullptr, InputBindingInfo::Type::Button, CID_DJ_CROSS, GenericInputBinding::Unknown},
{"Circle", TRANSLATE_NOOP("USB", "Circle"), InputBindingInfo::Type::Button, CID_DJ_CIRCLE, GenericInputBinding::Unknown}, {"Circle", TRANSLATE_NOOP("USB", "Circle"), nullptr, InputBindingInfo::Type::Button, CID_DJ_CIRCLE, GenericInputBinding::Unknown},
{"Triangle", TRANSLATE_NOOP("USB", "Triangle / Euphoria"), InputBindingInfo::Type::Button, CID_DJ_TRIANGLE, GenericInputBinding::Triangle}, {"Triangle", TRANSLATE_NOOP("USB", "Triangle / Euphoria"), nullptr, InputBindingInfo::Type::Button, CID_DJ_TRIANGLE, GenericInputBinding::Triangle},
{"Select", TRANSLATE_NOOP("USB", "Select"), InputBindingInfo::Type::Button, CID_DJ_SELECT, GenericInputBinding::Select}, {"Select", TRANSLATE_NOOP("USB", "Select"), nullptr, InputBindingInfo::Type::Button, CID_DJ_SELECT, GenericInputBinding::Select},
{"Start", TRANSLATE_NOOP("USB", "Start"), InputBindingInfo::Type::Button, CID_DJ_START, GenericInputBinding::Start}, {"Start", TRANSLATE_NOOP("USB", "Start"), nullptr, InputBindingInfo::Type::Button, CID_DJ_START, GenericInputBinding::Start},
{"CrossFaderLeft", TRANSLATE_NOOP("USB", "Crossfader Left"), InputBindingInfo::Type::HalfAxis, CID_DJ_CROSSFADER_LEFT, GenericInputBinding::RightStickDown}, {"CrossFaderLeft", TRANSLATE_NOOP("USB", "Crossfader Left"), nullptr, InputBindingInfo::Type::HalfAxis, CID_DJ_CROSSFADER_LEFT, GenericInputBinding::RightStickDown},
{"CrossFaderRight", TRANSLATE_NOOP("USB", "Crossfader Right"), InputBindingInfo::Type::HalfAxis, CID_DJ_CROSSFADER_RIGHT, GenericInputBinding::RightStickUp}, {"CrossFaderRight", TRANSLATE_NOOP("USB", "Crossfader Right"), nullptr, InputBindingInfo::Type::HalfAxis, CID_DJ_CROSSFADER_RIGHT, GenericInputBinding::RightStickUp},
{"EffectsKnobLeft", TRANSLATE_NOOP("USB", "Effects Knob Left"), InputBindingInfo::Type::HalfAxis, CID_DJ_EFFECTSKNOB_LEFT, GenericInputBinding::RightStickLeft}, {"EffectsKnobLeft", TRANSLATE_NOOP("USB", "Effects Knob Left"), nullptr, InputBindingInfo::Type::HalfAxis, CID_DJ_EFFECTSKNOB_LEFT, GenericInputBinding::RightStickLeft},
{"EffectsKnobRight", TRANSLATE_NOOP("USB", "Effects Knob Right"), InputBindingInfo::Type::HalfAxis, CID_DJ_EFFECTSKNOB_RIGHT, GenericInputBinding::RightStickRight}, {"EffectsKnobRight", TRANSLATE_NOOP("USB", "Effects Knob Right"), nullptr, InputBindingInfo::Type::HalfAxis, CID_DJ_EFFECTSKNOB_RIGHT, GenericInputBinding::RightStickRight},
{"LeftTurntableCW", TRANSLATE_NOOP("USB", "Left Turntable Clockwise"), InputBindingInfo::Type::HalfAxis, CID_DJ_LEFT_TURNTABLE_CW, GenericInputBinding::LeftStickRight}, {"LeftTurntableCW", TRANSLATE_NOOP("USB", "Left Turntable Clockwise"), nullptr, InputBindingInfo::Type::HalfAxis, CID_DJ_LEFT_TURNTABLE_CW, GenericInputBinding::LeftStickRight},
{"LeftTurntableCCW", TRANSLATE_NOOP("USB", "Left Turntable Counterclockwise"), InputBindingInfo::Type::HalfAxis, CID_DJ_LEFT_TURNTABLE_CCW, GenericInputBinding::LeftStickLeft}, {"LeftTurntableCCW", TRANSLATE_NOOP("USB", "Left Turntable Counterclockwise"), nullptr, InputBindingInfo::Type::HalfAxis, CID_DJ_LEFT_TURNTABLE_CCW, GenericInputBinding::LeftStickLeft},
{"RightTurntableCW", TRANSLATE_NOOP("USB", "Right Turntable Clockwise"), InputBindingInfo::Type::HalfAxis, CID_DJ_RIGHT_TURNTABLE_CW, GenericInputBinding::LeftStickDown}, {"RightTurntableCW", TRANSLATE_NOOP("USB", "Right Turntable Clockwise"), nullptr, InputBindingInfo::Type::HalfAxis, CID_DJ_RIGHT_TURNTABLE_CW, GenericInputBinding::LeftStickDown},
{"RightTurntableCCW", TRANSLATE_NOOP("USB", "Right Turntable Counterclockwise"), InputBindingInfo::Type::HalfAxis, CID_DJ_RIGHT_TURNTABLE_CCW, GenericInputBinding::LeftStickUp}, {"RightTurntableCCW", TRANSLATE_NOOP("USB", "Right Turntable Counterclockwise"), nullptr, InputBindingInfo::Type::HalfAxis, CID_DJ_RIGHT_TURNTABLE_CCW, GenericInputBinding::LeftStickUp},
{"LeftTurntableGreen", TRANSLATE_NOOP("USB", "Left Turntable Green"), InputBindingInfo::Type::Button, CID_DJ_LEFT_GREEN, GenericInputBinding::Unknown}, {"LeftTurntableGreen", TRANSLATE_NOOP("USB", "Left Turntable Green"), nullptr, InputBindingInfo::Type::Button, CID_DJ_LEFT_GREEN, GenericInputBinding::Unknown},
{"LeftTurntableRed", TRANSLATE_NOOP("USB", "Left Turntable Red"), InputBindingInfo::Type::Button, CID_DJ_LEFT_RED, GenericInputBinding::Unknown}, {"LeftTurntableRed", TRANSLATE_NOOP("USB", "Left Turntable Red"), nullptr, InputBindingInfo::Type::Button, CID_DJ_LEFT_RED, GenericInputBinding::Unknown},
{"LeftTurntableBlue", TRANSLATE_NOOP("USB", "Left Turntable Blue"), InputBindingInfo::Type::Button, CID_DJ_LEFT_BLUE, GenericInputBinding::Unknown}, {"LeftTurntableBlue", TRANSLATE_NOOP("USB", "Left Turntable Blue"), nullptr, InputBindingInfo::Type::Button, CID_DJ_LEFT_BLUE, GenericInputBinding::Unknown},
{"RightTurntableGreen", TRANSLATE_NOOP("USB", "Right Turntable Green"), InputBindingInfo::Type::Button, CID_DJ_RIGHT_GREEN, GenericInputBinding::Cross}, {"RightTurntableGreen", TRANSLATE_NOOP("USB", "Right Turntable Green"), nullptr, InputBindingInfo::Type::Button, CID_DJ_RIGHT_GREEN, GenericInputBinding::Cross},
{"RightTurntableRed", TRANSLATE_NOOP("USB", "Right Turntable Red "), InputBindingInfo::Type::Button, CID_DJ_RIGHT_RED, GenericInputBinding::Circle}, {"RightTurntableRed", TRANSLATE_NOOP("USB", "Right Turntable Red "), nullptr, InputBindingInfo::Type::Button, CID_DJ_RIGHT_RED, GenericInputBinding::Circle},
{"RightTurntableBlue", TRANSLATE_NOOP("USB", "Right Turntable Blue"), InputBindingInfo::Type::Button, CID_DJ_RIGHT_BLUE, GenericInputBinding::Square} {"RightTurntableBlue", TRANSLATE_NOOP("USB", "Right Turntable Blue"), nullptr, InputBindingInfo::Type::Button, CID_DJ_RIGHT_BLUE, GenericInputBinding::Square}
}; };

View File

@ -226,5 +226,10 @@ std::optional<std::string> InputManager::ConvertHostKeyboardCodeToString(u32 cod
return std::nullopt; return std::nullopt;
} }
const char* InputManager::ConvertHostKeyboardCodeToIcon(u32 code)
{
return nullptr;
}
BEGIN_HOTKEY_LIST(g_host_hotkeys) BEGIN_HOTKEY_LIST(g_host_hotkeys)
END_HOTKEY_LIST() END_HOTKEY_LIST()

View File

@ -9,7 +9,7 @@ with open(src_file, "r") as f:
full_source = f.read() full_source = f.read()
strings = [] strings = []
for token in ["FSUI_STR", "FSUI_CSTR", "FSUI_FSTR", "FSUI_NSTR", "FSUI_ICONSTR", "FSUI_ICONSTR_S"]: for token in ["FSUI_STR", "FSUI_CSTR", "FSUI_FSTR", "FSUI_NSTR", "FSUI_VSTR", "FSUI_ICONSTR", "FSUI_ICONSTR_S"]:
token_len = len(token) token_len = len(token)
last_pos = 0 last_pos = 0
while True: while True:

View File

@ -24,13 +24,16 @@ import functools
src_dirs = [os.path.join(os.path.dirname(__file__), "..", "pcsx2"), os.path.join(os.path.dirname(__file__), "..", "pcsx2-qt")] src_dirs = [os.path.join(os.path.dirname(__file__), "..", "pcsx2"), os.path.join(os.path.dirname(__file__), "..", "pcsx2-qt")]
fa_file = os.path.join(os.path.dirname(__file__), "..", "3rdparty", "include", "IconsFontAwesome5.h") fa_file = os.path.join(os.path.dirname(__file__), "..", "3rdparty", "include", "IconsFontAwesome5.h")
pf_file = os.path.join(os.path.dirname(__file__), "..", "3rdparty", "include", "IconsPromptFont.h")
dst_file = os.path.join(os.path.dirname(__file__), "..", "pcsx2", "ImGui", "ImGuiManager.cpp") dst_file = os.path.join(os.path.dirname(__file__), "..", "pcsx2", "ImGui", "ImGuiManager.cpp")
all_source_files = list(functools.reduce(lambda prev, src_dir: prev + glob.glob(os.path.join(src_dir, "**", "*.cpp"), recursive=True) + \ all_source_files = list(functools.reduce(lambda prev, src_dir: prev + glob.glob(os.path.join(src_dir, "**", "*.cpp"), recursive=True) + \
glob.glob(os.path.join(src_dir, "**", "*.h"), recursive=True) + \ glob.glob(os.path.join(src_dir, "**", "*.h"), recursive=True) + \
glob.glob(os.path.join(src_dir, "**", "*.inl"), recursive=True), src_dirs, [])) glob.glob(os.path.join(src_dir, "**", "*.inl"), recursive=True), src_dirs, []))
tokens = set() tokens = set()
pf_tokens = set()
for filename in all_source_files: for filename in all_source_files:
data = None data = None
with open(filename, "r") as f: with open(filename, "r") as f:
@ -40,9 +43,10 @@ for filename in all_source_files:
continue continue
tokens = tokens.union(set(re.findall("(ICON_FA_[a-zA-Z0-9_]+)", data))) tokens = tokens.union(set(re.findall("(ICON_FA_[a-zA-Z0-9_]+)", data)))
pf_tokens = pf_tokens.union(set(re.findall("(ICON_PF_[a-zA-Z0-9_]+)", data)))
print("{} tokens found.".format(len(tokens))) print("{}/{} tokens found.".format(len(tokens), len(pf_tokens)))
if len(tokens) == 0: if len(tokens) == 0 and len(pf_tokens) == 0:
sys.exit(0) sys.exit(0)
u8_encodings = {} u8_encodings = {}
@ -52,44 +56,53 @@ with open(fa_file, "r") as f:
if match is None: if match is None:
continue continue
u8_encodings[match[1]] = bytes.fromhex(match[2].replace("\\x", "")) u8_encodings[match[1]] = bytes.fromhex(match[2].replace("\\x", ""))
with open(pf_file, "r") as f:
for line in f.readlines():
match = re.match("#define (ICON_PF_[^ ]+) \"([^\"]+)\"", line)
if match is None:
continue
u8_encodings[match[1]] = bytes.fromhex(match[2].replace("\\x", ""))
out_pattern = "(static constexpr ImWchar range_fa\[\] = \{)[0-9A-Z_a-z, \n]+(\};)" out_pattern = "(static constexpr ImWchar range_fa\[\] = \{)[0-9A-Z_a-z, \n]+(\};)"
out_pf_pattern = "(static constexpr ImWchar range_pf\[\] = \{)[0-9A-Z_a-z, \n]+(\};)"
codepoints = list() def get_pairs(tokens):
for token in tokens: codepoints = list()
u8_bytes = u8_encodings[token] for token in tokens:
u8 = str(u8_bytes, "utf-8") u8_bytes = u8_encodings[token]
u16 = u8.encode("utf-16le") u8 = str(u8_bytes, "utf-8")
if len(u16) > 2: u16 = u8.encode("utf-16le")
raise ValueError("{} too long".format(u8_bytes)) if len(u16) > 2:
raise ValueError("{} {} too long".format(u8_bytes, token))
codepoint = int.from_bytes(u16, byteorder="little", signed=False) codepoint = int.from_bytes(u16, byteorder="little", signed=False)
codepoints.append(codepoint) codepoints.append(codepoint)
codepoints.sort() codepoints.sort()
codepoints.append(0) # null terminator codepoints.append(0) # null terminator
startc = codepoints[0] startc = codepoints[0]
endc = None endc = None
pairs = [startc] pairs = [startc]
for codepoint in codepoints: for codepoint in codepoints:
if endc is not None and (endc + 1) != codepoint: if endc is not None and (endc + 1) != codepoint:
pairs.append(endc) pairs.append(endc)
pairs.append(codepoint) pairs.append(codepoint)
startc = codepoint startc = codepoint
endc = codepoint endc = codepoint
else: else:
endc = codepoint endc = codepoint
pairs.append(endc) pairs.append(endc)
pairs_str = ",".join(map("0x{:x}".format, pairs)) pairs_str = ",".join(list(map("0x{:x}".format, pairs)))
return pairs_str
with open(dst_file, "r") as f: with open(dst_file, "r") as f:
original = f.read() original = f.read()
updated = re.sub(out_pattern, "\\1 " + pairs_str + " \\2", original) updated = re.sub(out_pattern, "\\1 " + get_pairs(tokens) + " \\2", original)
updated = re.sub(out_pf_pattern, "\\1 " + get_pairs(pf_tokens) + " \\2", original)
if original != updated: if original != updated:
with open(dst_file, "w") as f: with open(dst_file, "w") as f:
f.write(updated) f.write(updated)
print("Updated {}".format(dst_file)) print("Updated {}".format(dst_file))
else: else:
print("Skipping updating {}".format(dst_file)) print("Skipping updating {}".format(dst_file))