From 198656eb207692b4b69c31c6e01a4de47153a0a9 Mon Sep 17 00:00:00 2001 From: zoltanvb <101990835+zoltanvb@users.noreply.github.com> Date: Sun, 12 May 2024 02:06:54 +0200 Subject: [PATCH] Add support for multimedia keys (#16502) Extended RETROK_ values with 18 new items, commonly found on "multimedia" keyboards. Mapping added for SDL, X11, Wayland, dinput, winraw keymaps. Keyboard tester function of Remote Retropad extended to cover new keys. One fix in Android mapping for #12986 --- .../libretro-net-retropad/net_retropad_core.c | 2 +- cores/libretro-net-retropad/remotepad.h | 12 +- input/include/xfree86_keycodes.h | 20 +++ input/input_defines.h | 2 +- input/input_keymaps.c | 127 +++++++++++++++++- libretro-common/include/libretro.h | 19 +++ menu/menu_driver.c | 22 ++- 7 files changed, 193 insertions(+), 11 deletions(-) diff --git a/cores/libretro-net-retropad/net_retropad_core.c b/cores/libretro-net-retropad/net_retropad_core.c index b28d3cd357..f86ea8eb83 100644 --- a/cores/libretro-net-retropad/net_retropad_core.c +++ b/cores/libretro-net-retropad/net_retropad_core.c @@ -505,7 +505,7 @@ static void NETRETROPAD_CORE_PREFIX(update_keyboard_cb)(bool down, unsigned keyc (keycode >= 123 && keycode < 127) || (keycode == 272) || (keycode >= 294 && keycode < 297) || - (keycode >= 309 && keycode < 323)) + (keycode >= 309 && keycode < RETROK_LAST)) { snprintf(buf, sizeof(buf), "Key pressed: %d",keycode); message.msg = buf; diff --git a/cores/libretro-net-retropad/remotepad.h b/cores/libretro-net-retropad/remotepad.h index ea443f20a1..963a860743 100644 --- a/cores/libretro-net-retropad/remotepad.h +++ b/cores/libretro-net-retropad/remotepad.h @@ -440,10 +440,10 @@ static uint8_t keyboard_body[] = /* 134 */ 2, 0, 255, /* 135 */ 2, 0, 255, /* 136 */ 2, 0, 255, - /* 137 */ 1, 255, - /* 138 */ 1, 255, - /* 139 */ 1, 255, - /* 140 */ 1, 255, + /* 137 */ 2, 0, 255, + /* 138 */ 2, 0, 255, + /* 139 */ 2, 0, 255, + /* 140 */ 2, 0, 255, /* 141 */ 1, 255, }; @@ -587,8 +587,8 @@ static uint16_t keyboard_buttons[] = /* 135 */ 41, 1, 126, 10, 2, 272, 10, 2, 294, 10, 2, 295, 10, 2, 296, 10, 2, 309, 10, 2, 310, 10, 2, 311, 10, 2, 312, 10, 2, 313, 10, 2, 315, 10, 2, 316, 10, 2, 317, 10, 2, 318, 10, 2, 319, 10, 2, 320, 10, 2, 321, 10, 2, 322, 10, 2, 314, 10, 2, 0, 10, 16, /* 136 */ 1, 255, /* 137 */ 1, 255, - /* 138 */ 1, 255, - /* 139 */ 1, 255, + /* 138 */ 37, 1, 324, 10, 2, 325, 10, 2, 326, 10, 2, 327, 10, 2, 328, 10, 2, 329, 10, 2, 330, 10, 2, 331, 10, 2, 332, 10, 2, 333, 10, 2, 334, 10, 2, 335, 10, 2, 336, 10, 2, 337, 10, 2, 338, 10, 2, 339, 10, 2, 340, 10, 2, 341, 10, 40, + /* 139 */ 37, 1, 324, 10, 2, 325, 10, 2, 326, 10, 2, 327, 10, 2, 328, 10, 2, 329, 10, 2, 330, 10, 2, 331, 10, 2, 332, 10, 2, 333, 10, 2, 334, 10, 2, 335, 10, 2, 336, 10, 2, 337, 10, 2, 338, 10, 2, 339, 10, 2, 340, 10, 2, 341, 10, 40, /* 140 */ 1, 255, /* 141 */ 1, 255, }; diff --git a/input/include/xfree86_keycodes.h b/input/include/xfree86_keycodes.h index 69f2bd002c..d8d0f389a7 100644 --- a/input/include/xfree86_keycodes.h +++ b/input/include/xfree86_keycodes.h @@ -167,6 +167,26 @@ enum xfvk_key XFVK_FK23 = 201, XFVK_FK24 = 202, + /* Multimedia keys */ + XFVK_MUTE = 121, + XFVK_VOUP = 122, + XFVK_VODN = 123, + XFVK_BSTP = 136, + XFVK_APP1 = 156, + XFVK_APP2 = 157, + XFVK_MAIL = 163, + XFVK_FAVO = 164, + XFVK_BBAC = 166, + XFVK_BFWD = 167, + XFVK_CDNX = 171, + XFVK_PLAY = 172, + XFVK_CDPR = 173, + XFVK_CDST = 174, + XVFK_HOMP = 180, + XFVK_REFR = 181, + XFVK_BSEA = 225, + XFVK_MDIA = 234, + XFVK_LAST, XFVK_DUMMY = 255 }; diff --git a/input/input_defines.h b/input/input_defines.h index 9bdf90cdda..44cf2c8284 100644 --- a/input/input_defines.h +++ b/input/input_defines.h @@ -26,7 +26,7 @@ #define MAX_INPUT_DEVICES 16 -#define RARCH_MAX_KEYS 137 +#define RARCH_MAX_KEYS 155 #define RARCH_FIRST_CUSTOM_BIND 16 #define RARCH_FIRST_LIGHTGUN_BIND RARCH_ANALOG_BIND_LIST_END diff --git a/input/input_keymaps.c b/input/input_keymaps.c index 758de553c6..0a6e8a9ef0 100644 --- a/input/input_keymaps.c +++ b/input/input_keymaps.c @@ -79,7 +79,7 @@ #ifdef __APPLE__ #include "drivers_keyboard/keyboard_event_apple.h" #endif - +/* TODO: ensure that for UI display, menu_driver.c key_descriptors are shown instead of this */ const struct input_key_map input_config_key_map[] = { { "left", RETROK_LEFT }, { "right", RETROK_RIGHT }, @@ -203,6 +203,25 @@ const struct input_key_map input_config_key_map[] = { { "clear", RETROK_CLEAR }, { "oem102", RETROK_OEM_102 }, + { "back", RETROK_BROWSER_BACK }, + { "forward", RETROK_BROWSER_FORWARD }, + { "refresh", RETROK_BROWSER_REFRESH }, + { "bstop", RETROK_BROWSER_STOP }, + { "search", RETROK_BROWSER_SEARCH }, + { "favorites", RETROK_BROWSER_FAVORITES }, + { "homepage", RETROK_BROWSER_HOME }, + { "mute", RETROK_VOLUME_MUTE }, + { "volumedown", RETROK_VOLUME_DOWN }, + { "volumeup", RETROK_VOLUME_UP }, + { "next", RETROK_MEDIA_NEXT }, + { "prev", RETROK_MEDIA_PREV }, + { "stop", RETROK_MEDIA_STOP }, + { "play", RETROK_MEDIA_PLAY_PAUSE }, + { "email", RETROK_LAUNCH_MAIL }, + { "media", RETROK_LAUNCH_MEDIA }, + { "app1", RETROK_LAUNCH_APP1 }, + { "app2", RETROK_LAUNCH_APP2 }, + { "nul", RETROK_UNKNOWN }, { NULL, RETROK_UNKNOWN }, }; @@ -778,6 +797,27 @@ const struct rarch_key_map rarch_key_map_sdl[] = { #endif { SDLK_UNDO, RETROK_UNDO }, +#ifdef HAVE_SDL2 + { SDLK_AUDIONEXT, RETROK_MEDIA_NEXT }, + { SDLK_AUDIOPREV, RETROK_MEDIA_PREV }, + { SDLK_AUDIOSTOP, RETROK_MEDIA_STOP }, + { SDLK_AUDIOPLAY, RETROK_MEDIA_PLAY_PAUSE }, + { SDLK_AUDIOMUTE, RETROK_VOLUME_MUTE }, + { SDLK_MEDIASELECT, RETROK_LAUNCH_MEDIA }, + { SDLK_MAIL, RETROK_LAUNCH_MAIL }, + { SDLK_CALCULATOR, RETROK_LAUNCH_APP2 }, + { SDLK_COMPUTER, RETROK_LAUNCH_APP1 }, + { SDLK_AC_SEARCH, RETROK_BROWSER_SEARCH }, + { SDLK_AC_HOME, RETROK_BROWSER_HOME }, + { SDLK_AC_BACK, RETROK_BROWSER_BACK }, + { SDLK_AC_FORWARD, RETROK_BROWSER_FORWARD }, + { SDLK_AC_STOP, RETROK_BROWSER_STOP }, + { SDLK_AC_REFRESH, RETROK_BROWSER_REFRESH }, + { SDLK_AC_BOOKMARKS, RETROK_BROWSER_FAVORITES }, + { SDLK_VOLUMEUP, RETROK_VOLUME_UP }, + { SDLK_VOLUMEDOWN, RETROK_VOLUME_DOWN }, +#endif + { 0, RETROK_UNKNOWN }, }; #endif @@ -891,6 +931,30 @@ const struct rarch_key_map rarch_key_map_dinput[] = { { DIK_CAPSLOCK, RETROK_CAPSLOCK }, { DIK_NUMLOCK, RETROK_NUMLOCK }, { DIK_OEM_102, RETROK_OEM_102 }, +/* dinput.h included to MXE seems to carry only the alternate name circumflex */ +#ifdef DIK_PREVTRACK + { DIK_PREVTRACK, RETROK_MEDIA_PREV }, +#else + { DIK_CIRCUMFLEX, RETROK_MEDIA_PREV }, +#endif + { DIK_NEXTTRACK, RETROK_MEDIA_NEXT }, + { DIK_MUTE, RETROK_VOLUME_MUTE }, + { DIK_CALCULATOR, RETROK_LAUNCH_APP2 }, + { DIK_PLAYPAUSE, RETROK_MEDIA_PLAY_PAUSE }, + { DIK_MEDIASTOP, RETROK_MEDIA_STOP }, + { DIK_VOLUMEDOWN, RETROK_VOLUME_DOWN }, + { DIK_VOLUMEUP, RETROK_VOLUME_UP }, + { DIK_WEBHOME, RETROK_BROWSER_HOME }, + { DIK_WEBSEARCH, RETROK_BROWSER_SEARCH }, + { DIK_WEBFAVORITES, RETROK_BROWSER_FAVORITES }, + { DIK_WEBREFRESH, RETROK_BROWSER_REFRESH }, + { DIK_WEBSTOP, RETROK_BROWSER_STOP }, + { DIK_WEBFORWARD, RETROK_BROWSER_FORWARD }, + { DIK_WEBBACK, RETROK_BROWSER_BACK }, + { DIK_MYCOMPUTER, RETROK_LAUNCH_APP1 }, + { DIK_MAIL, RETROK_LAUNCH_MAIL }, + { DIK_MEDIASELECT, RETROK_LAUNCH_MEDIA }, + { 0, RETROK_UNKNOWN }, }; #endif @@ -1125,6 +1189,25 @@ const struct rarch_key_map rarch_key_map_x11[] = { { XFVK_KP0, RETROK_KP0 }, { XFVK_KPDL, RETROK_KP_PERIOD }, { XFVK_KPEQ, RETROK_KP_EQUALS }, + + { XFVK_MUTE, RETROK_VOLUME_MUTE }, + { XFVK_VOUP, RETROK_VOLUME_UP }, + { XFVK_VODN, RETROK_VOLUME_DOWN }, + { XFVK_APP1, RETROK_LAUNCH_APP1 }, + { XFVK_APP2, RETROK_LAUNCH_APP2 }, + { XFVK_MAIL, RETROK_LAUNCH_MAIL }, + { XFVK_FAVO, RETROK_BROWSER_FAVORITES }, + { XFVK_BBAC, RETROK_BROWSER_BACK }, + { XFVK_BFWD, RETROK_BROWSER_FORWARD }, + { XFVK_CDNX, RETROK_MEDIA_NEXT }, + { XFVK_PLAY, RETROK_MEDIA_PLAY_PAUSE }, + { XFVK_CDPR, RETROK_MEDIA_PREV }, + { XFVK_CDST, RETROK_MEDIA_STOP }, + { XVFK_HOMP, RETROK_BROWSER_HOME }, + { XFVK_REFR, RETROK_BROWSER_REFRESH }, + { XFVK_BSTP, RETROK_BROWSER_STOP }, + { XFVK_BSEA, RETROK_BROWSER_SEARCH }, + { XFVK_MDIA, RETROK_LAUNCH_MEDIA }, { 0, RETROK_UNKNOWN }, }; @@ -1279,6 +1362,28 @@ const struct rarch_key_map rarch_key_map_linux[] = { #endif { KEY_UNDO, RETROK_UNDO }, { KEY_102ND, RETROK_OEM_102 }, + +#ifndef ANDROID + { KEY_MUTE, RETROK_VOLUME_MUTE }, + { KEY_VOLUMEDOWN, RETROK_VOLUME_DOWN }, + { KEY_VOLUMEUP, RETROK_VOLUME_UP }, + { KEY_STOP, RETROK_BROWSER_STOP }, + { KEY_PROG1, RETROK_LAUNCH_APP1 }, + { KEY_PROG2, RETROK_LAUNCH_APP2 }, + { KEY_MAIL, RETROK_LAUNCH_MAIL }, + { KEY_BOOKMARKS, RETROK_BROWSER_FAVORITES }, + { KEY_BACK, RETROK_BROWSER_BACK }, + { KEY_FORWARD, RETROK_BROWSER_FORWARD }, + { KEY_NEXTSONG, RETROK_MEDIA_NEXT }, + { KEY_PLAYPAUSE, RETROK_MEDIA_PLAY_PAUSE }, + { KEY_PREVIOUSSONG, RETROK_MEDIA_PREV }, + { KEY_STOPCD, RETROK_MEDIA_STOP }, + { KEY_HOMEPAGE, RETROK_BROWSER_HOME }, + { KEY_REFRESH, RETROK_BROWSER_REFRESH }, + { KEY_SEARCH, RETROK_BROWSER_SEARCH }, + { KEY_MEDIA, RETROK_LAUNCH_MEDIA }, +#endif + { 0, RETROK_UNKNOWN }, }; #endif @@ -1343,7 +1448,7 @@ const struct rarch_key_map rarch_key_map_android[] = { { AKEYCODE_X, RETROK_x }, { AKEYCODE_Y, RETROK_y }, { AKEYCODE_Z, RETROK_z }, - { AKEYCODE_DEL, RETROK_DELETE }, + { AKEYCODE_FORWARD_DEL, RETROK_DELETE }, { AKEYCODE_NUMPAD_0, RETROK_KP0 }, { AKEYCODE_NUMPAD_1, RETROK_KP1 }, { AKEYCODE_NUMPAD_2, RETROK_KP2 }, @@ -1952,6 +2057,24 @@ const struct rarch_key_map rarch_key_map_winraw[] = { { SC_SLASH, RETROK_SLASH }, { SC_APOSTROPHE, RETROK_QUOTE }, { SC_ANGLEBRACKET, RETROK_OEM_102 }, + { SC_BROWSER_SEARCH, RETROK_BROWSER_SEARCH }, + { SC_BROWSER_FAVORITES, RETROK_BROWSER_FAVORITES }, + { SC_BROWSER_REFRESH, RETROK_BROWSER_REFRESH }, + { SC_BROWSER_STOP, RETROK_BROWSER_STOP }, + { SC_BROWSER_FORWARD, RETROK_BROWSER_FORWARD }, + { SC_BROWSER_BACK, RETROK_BROWSER_BACK }, + { SC_LAUNCH_EMAIL, RETROK_LAUNCH_MAIL }, + { SC_LAUNCH_MEDIA, RETROK_LAUNCH_MEDIA }, + { SC_MEDIA_PREV, RETROK_MEDIA_PREV }, + { SC_MEDIA_NEXT, RETROK_MEDIA_NEXT }, + { SC_VOLUME_MUTE, RETROK_VOLUME_MUTE }, + { SC_LAUNCH_APP1, RETROK_LAUNCH_APP1 }, + { SC_LAUNCH_APP2, RETROK_LAUNCH_APP2 }, + { SC_MEDIA_PLAY, RETROK_MEDIA_PLAY_PAUSE }, + { SC_MEDIA_STOP, RETROK_MEDIA_STOP }, + { SC_VOLUME_DOWN, RETROK_VOLUME_DOWN }, + { SC_VOLUME_UP, RETROK_VOLUME_UP }, + { SC_BROWSER_HOME, RETROK_BROWSER_HOME }, { 0, RETROK_UNKNOWN } }; #endif diff --git a/libretro-common/include/libretro.h b/libretro-common/include/libretro.h index 8d9c379186..187cb318a0 100644 --- a/libretro-common/include/libretro.h +++ b/libretro-common/include/libretro.h @@ -666,6 +666,25 @@ enum retro_key RETROK_UNDO = 322, RETROK_OEM_102 = 323, + RETROK_BROWSER_BACK = 324, + RETROK_BROWSER_FORWARD = 325, + RETROK_BROWSER_REFRESH = 326, + RETROK_BROWSER_STOP = 327, + RETROK_BROWSER_SEARCH = 328, + RETROK_BROWSER_FAVORITES = 329, + RETROK_BROWSER_HOME = 330, + RETROK_VOLUME_MUTE = 331, + RETROK_VOLUME_DOWN = 332, + RETROK_VOLUME_UP = 333, + RETROK_MEDIA_NEXT = 334, + RETROK_MEDIA_PREV = 335, + RETROK_MEDIA_STOP = 336, + RETROK_MEDIA_PLAY_PAUSE = 337, + RETROK_LAUNCH_MAIL = 338, + RETROK_LAUNCH_MEDIA = 339, + RETROK_LAUNCH_APP1 = 340, + RETROK_LAUNCH_APP2 = 341, + RETROK_LAST, RETROK_DUMMY = INT_MAX /* Ensure sizeof(enum) == sizeof(int) */ diff --git a/menu/menu_driver.c b/menu/menu_driver.c index 3b24d7684d..569bfe757f 100644 --- a/menu/menu_driver.c +++ b/menu/menu_driver.c @@ -236,7 +236,27 @@ struct key_desc key_descriptors[RARCH_MAX_KEYS] = {RETROK_POWER, "Power"}, {RETROK_EURO, {-30, -126, -84, 0}}, /* "�" */ {RETROK_UNDO, "Undo"}, - {RETROK_OEM_102, "OEM-102"} + {RETROK_OEM_102, "OEM-102"}, + + {RETROK_BROWSER_BACK, "Back"}, + {RETROK_BROWSER_FORWARD, "Forward"}, + {RETROK_BROWSER_REFRESH, "Refresh"}, + {RETROK_BROWSER_STOP, "Stop"}, + {RETROK_BROWSER_SEARCH, "Search"}, + {RETROK_BROWSER_FAVORITES, "Favorites"}, + {RETROK_BROWSER_HOME, "Home Page"}, + {RETROK_VOLUME_MUTE, "Mute"}, + {RETROK_VOLUME_DOWN, "Volume Up"}, + {RETROK_VOLUME_UP, "Volume Down"}, + {RETROK_MEDIA_NEXT, "Next Track"}, + {RETROK_MEDIA_PREV, "Previous Track"}, + {RETROK_MEDIA_STOP, "Media Stop"}, + {RETROK_MEDIA_PLAY_PAUSE, "Media Play"}, + {RETROK_LAUNCH_MAIL, "Launch Email"}, + {RETROK_LAUNCH_MEDIA, "Launch Media"}, + {RETROK_LAUNCH_APP1, "Launch App1"}, + {RETROK_LAUNCH_APP2, "Launch App2"} + }; static void *null_menu_init(void **userdata, bool video_is_threaded)