From ed334cd1ddbedcee0f0c7e9e76fe0e1b003d2115 Mon Sep 17 00:00:00 2001 From: radius Date: Wed, 28 Mar 2018 17:45:05 -0500 Subject: [PATCH 01/35] remap-redux part 2: allow multiple gamepads to work for the keymapper --- Makefile.vita | 3 ++- configuration.h | 1 + input/input_mapper.c | 40 +++++++++++++++++++++++------------ input/input_remapping.c | 5 +++++ menu/cbs/menu_cbs_get_value.c | 11 ++++++++-- menu/menu_displaylist.c | 9 ++++---- menu/menu_driver.h | 2 +- 7 files changed, 49 insertions(+), 22 deletions(-) diff --git a/Makefile.vita b/Makefile.vita index 25d79a673e..5e8f135011 100644 --- a/Makefile.vita +++ b/Makefile.vita @@ -16,7 +16,7 @@ DEFINES := ifeq ($(GRIFFIN_BUILD), 1) OBJ += griffin/griffin.o DEFINES += -DHAVE_GRIFFIN=1 - DEFINES += -DHAVE_NEON -DHAVE_MENU -DHAVE_XMB -DHAVE_MATERIALUI -DHAVE_LIBRETRODB + DEFINES += -DHAVE_NEON -DHAVE_MENU -DHAVE_XMB -DHAVE_MATERIALUI -DHAVE_LIBRETRODB DEFINES -DHAVE_KEYMAPPER DEFINES += -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_RBMP -DHAVE_RTGA -DWANT_ZLIB -DHAVE_CC_RESAMPLER ifeq ($(DEBUG), 1) DEFINES += -DHAVE_NETLOGGER @@ -33,6 +33,7 @@ else HAVE_ZLIB := 1 HAVE_7ZIP := 1 HAVE_VITA2D := 1 + HAVE_KEYMAPPER := 1 HAVE_NETWORKING := 1 HAVE_SOCKET_LEGACY := 1 HAVE_MENU := 1 diff --git a/configuration.h b/configuration.h index b43facf5f6..30eaf38b9c 100644 --- a/configuration.h +++ b/configuration.h @@ -380,6 +380,7 @@ typedef struct settings unsigned input_analog_dpad_mode[MAX_USERS]; unsigned input_keymapper_ids[RARCH_CUSTOM_BIND_LIST_END]; + unsigned input_keymapper_multi_ids[MAX_USERS][RARCH_CUSTOM_BIND_LIST_END]; unsigned input_remap_ids[MAX_USERS][RARCH_CUSTOM_BIND_LIST_END]; diff --git a/input/input_mapper.c b/input/input_mapper.c index 2b58e9b701..1bc5c5c6f2 100644 --- a/input/input_mapper.c +++ b/input/input_mapper.c @@ -47,6 +47,7 @@ #define MAPPER_GET_KEY(state, key) (((state)->keys[(key) / 32] >> ((key) % 32)) & 1) #define MAPPER_SET_KEY(state, key) (state)->keys[(key) / 32] |= 1 << ((key) % 32) +#define MAPPER_UNSET_KEY(state, key) (state)->keys[(key) / 32] |= 0 << ((key) % 32) struct input_mapper { @@ -82,9 +83,10 @@ void input_mapper_free(input_mapper_t *handle) void input_mapper_poll(input_mapper_t *handle) { - int i; + int i, j; settings_t *settings = config_get_ptr(); unsigned device = settings->uints.input_libretro_device[handle->port]; +bool key_event[RARCH_CUSTOM_BIND_LIST_END]; #ifdef HAVE_MENU bool menu_is_alive = menu_driver_is_alive(); #endif @@ -100,23 +102,33 @@ void input_mapper_poll(input_mapper_t *handle) #endif memset(handle->keys, 0, sizeof(handle->keys)); - - for (i = 0; i < RARCH_CUSTOM_BIND_LIST_END; i++) + i = 0; + for (i = 0; i < 8; i++) { - if (i < RETROK_LAST) + for (j = 0; j < RARCH_CUSTOM_BIND_LIST_END; j++) { - if (input_state(handle->port, RETRO_DEVICE_JOYPAD, 0, i)) + if (j < RETROK_LAST) { - MAPPER_SET_KEY (handle, - settings->uints.input_keymapper_ids[i]); - input_keyboard_event(true, - settings->uints.input_keymapper_ids[i], - 0, 0, RETRO_DEVICE_KEYBOARD); + if (input_state(i, RETRO_DEVICE_JOYPAD, 0, j) && settings->uints.input_keymapper_multi_ids[i][j] != RETROK_UNKNOWN) + { + MAPPER_SET_KEY (handle, + settings->uints.input_keymapper_multi_ids[i][j]); + input_keyboard_event(true, + settings->uints.input_keymapper_multi_ids[i][j], + 0, 0, RETRO_DEVICE_KEYBOARD); + key_event[j] = true; + } + else + { + if (key_event[j] == false && + settings->uints.input_keymapper_multi_ids[i][j] != RETROK_UNKNOWN) + { + input_keyboard_event(false, + settings->uints.input_keymapper_multi_ids[i][j], + 0, 0, RETRO_DEVICE_KEYBOARD); + } + } } - else - input_keyboard_event(false, - settings->uints.input_keymapper_ids[i], - 0, 0, RETRO_DEVICE_KEYBOARD); } } } diff --git a/input/input_remapping.c b/input/input_remapping.c index 5830565e09..a72af21937 100644 --- a/input/input_remapping.c +++ b/input/input_remapping.c @@ -98,6 +98,10 @@ bool input_remapping_load_file(void *data, const char *path) else settings->uints.input_keymapper_ids[j] = RETROK_UNKNOWN; } + if (config_get_int(conf, keymapper_ident[j], &key_remap)) + settings->uints.input_keymapper_multi_ids[i][j] = key_remap; + else + settings->uints.input_keymapper_multi_ids[i][j] = RETROK_UNKNOWN; } @@ -205,6 +209,7 @@ bool input_remapping_save_file(const char *path) if (settings->uints.keymapper_port == i && settings->uints.input_keymapper_ids[j] != RETROK_UNKNOWN) config_set_int(conf, keymapper_ident[j], settings->uints.input_keymapper_ids[j]); + } else { diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index a3679e66c0..fdad42fb50 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -631,15 +631,22 @@ static void menu_action_setting_disp_set_label_input_desc_kbd( char *s2, size_t len2) { char desc[PATH_MAX_LENGTH]; - unsigned key_id; + unsigned key_id, id; unsigned remap_id; + unsigned offset = 0; + settings_t *settings = config_get_ptr(); if (!settings) return; + offset = type / ((MENU_SETTINGS_INPUT_DESC_KBD_END - (MENU_SETTINGS_INPUT_DESC_KBD_END - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN))) - 1; + + id = (type / (offset + 1)) - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN; remap_id = - settings->uints.input_keymapper_ids[type - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN]; + settings->uints.input_keymapper_multi_ids[offset][id]; + + RARCH_LOG("o: %d, type: %d, remap_id: %d\n", offset, type, remap_id); for (key_id = 0; key_id < MENU_SETTINGS_INPUT_DESC_KBD_END - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN; key_id++) { diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index c77acb2af6..d83ae6b7cf 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -3280,6 +3280,7 @@ static int menu_displaylist_parse_options_remappings( if (device == RETRO_DEVICE_KEYBOARD) { + for (int i = 0; i < 8; i++) for (retro_id = 0; retro_id < RARCH_FIRST_CUSTOM_BIND; retro_id++) { unsigned user = settings->uints.keymapper_port + 1; @@ -3288,9 +3289,9 @@ static int menu_displaylist_parse_options_remappings( const struct retro_keybind *auto_bind = NULL; const struct retro_keybind *keybind = NULL; - keybind = &input_config_binds[settings->uints.keymapper_port][retro_id]; + keybind = &input_config_binds[i][retro_id]; auto_bind = (const struct retro_keybind*) - input_config_get_bind_auto(settings->uints.keymapper_port, retro_id); + input_config_get_bind_auto(i, retro_id); input_config_get_bind_string(descriptor, keybind, auto_bind, sizeof(descriptor)); @@ -3298,14 +3299,14 @@ static int menu_displaylist_parse_options_remappings( if(!strstr(descriptor, "Auto")) { const struct retro_keybind *keyptr = - &input_config_binds[settings->uints.keymapper_port][retro_id]; + &input_config_binds[i][retro_id]; strlcpy(descriptor, msg_hash_to_str(keyptr->enum_idx), sizeof(descriptor)); } menu_entries_append_enum(info->list, descriptor, "", MSG_UNKNOWN, - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN + retro_id, 0, 0); + (MENU_SETTINGS_INPUT_DESC_KBD_BEGIN + retro_id) * (i + 1), 0, 0); } } } diff --git a/menu/menu_driver.h b/menu/menu_driver.h index b61131a33d..a18bf606b3 100644 --- a/menu/menu_driver.h +++ b/menu/menu_driver.h @@ -208,7 +208,7 @@ enum menu_settings_type MENU_SETTINGS_INPUT_DESC_BEGIN, MENU_SETTINGS_INPUT_DESC_END = MENU_SETTINGS_INPUT_DESC_BEGIN + (MAX_USERS * (RARCH_FIRST_CUSTOM_BIND + 4)), MENU_SETTINGS_INPUT_DESC_KBD_BEGIN, - MENU_SETTINGS_INPUT_DESC_KBD_END = MENU_SETTINGS_INPUT_DESC_KBD_BEGIN + 135, + MENU_SETTINGS_INPUT_DESC_KBD_END = (MENU_SETTINGS_INPUT_DESC_KBD_BEGIN + 135) * MAX_USERS, MENU_SETTINGS_SUBSYSTEM_LOAD, From 2bfb5ec0dfe55fa2c66bbff8b6bba71189ecbb0d Mon Sep 17 00:00:00 2001 From: radius Date: Fri, 30 Mar 2018 11:56:01 -0500 Subject: [PATCH 02/35] remap-redux part 2: fix nits, hookup left/right callbacks --- Makefile.vita | 2 +- configuration.h | 1 - input/input_mapper.c | 2 +- input/input_remapping.c | 18 +----------------- menu/cbs/menu_cbs_left.c | 11 +++++++---- menu/cbs/menu_cbs_right.c | 11 +++++++---- 6 files changed, 17 insertions(+), 28 deletions(-) diff --git a/Makefile.vita b/Makefile.vita index 5e8f135011..efa4646cfb 100644 --- a/Makefile.vita +++ b/Makefile.vita @@ -33,7 +33,7 @@ else HAVE_ZLIB := 1 HAVE_7ZIP := 1 HAVE_VITA2D := 1 - HAVE_KEYMAPPER := 1 + HAVE_KEYMAPPER := 1 HAVE_NETWORKING := 1 HAVE_SOCKET_LEGACY := 1 HAVE_MENU := 1 diff --git a/configuration.h b/configuration.h index 30eaf38b9c..916c4fa648 100644 --- a/configuration.h +++ b/configuration.h @@ -379,7 +379,6 @@ typedef struct settings unsigned input_libretro_device[MAX_USERS]; unsigned input_analog_dpad_mode[MAX_USERS]; - unsigned input_keymapper_ids[RARCH_CUSTOM_BIND_LIST_END]; unsigned input_keymapper_multi_ids[MAX_USERS][RARCH_CUSTOM_BIND_LIST_END]; unsigned input_remap_ids[MAX_USERS][RARCH_CUSTOM_BIND_LIST_END]; diff --git a/input/input_mapper.c b/input/input_mapper.c index 1bc5c5c6f2..5d09aa580b 100644 --- a/input/input_mapper.c +++ b/input/input_mapper.c @@ -86,7 +86,7 @@ void input_mapper_poll(input_mapper_t *handle) int i, j; settings_t *settings = config_get_ptr(); unsigned device = settings->uints.input_libretro_device[handle->port]; -bool key_event[RARCH_CUSTOM_BIND_LIST_END]; + bool key_event[RARCH_CUSTOM_BIND_LIST_END]; #ifdef HAVE_MENU bool menu_is_alive = menu_driver_is_alive(); #endif diff --git a/input/input_remapping.c b/input/input_remapping.c index a72af21937..b1920ee0c0 100644 --- a/input/input_remapping.c +++ b/input/input_remapping.c @@ -86,18 +86,6 @@ bool input_remapping_load_file(void *data, const char *path) key_remap = -1; - if (settings->uints.keymapper_port == i) - { - if (config_get_int(conf, keymapper_ident[j], &key_remap)) - { - settings->uints.input_keymapper_ids[j] = key_remap; -#if 0 - RARCH_LOG ("%s: %u\n", keymapper_ident[j], settings->uints.input_keymapper_ids[j]); -#endif - } - else - settings->uints.input_keymapper_ids[j] = RETROK_UNKNOWN; - } if (config_get_int(conf, keymapper_ident[j], &key_remap)) settings->uints.input_keymapper_multi_ids[i][j] = key_remap; else @@ -206,10 +194,6 @@ bool input_remapping_save_file(const char *path) else config_unset(conf,key_ident[j]); - if (settings->uints.keymapper_port == i && - settings->uints.input_keymapper_ids[j] != RETROK_UNKNOWN) - config_set_int(conf, keymapper_ident[j], settings->uints.input_keymapper_ids[j]); - } else { @@ -278,7 +262,7 @@ void input_remapping_set_defaults(bool deinit) const struct retro_keybind *keybind = &input_config_binds[i][j]; if (keybind) settings->uints.input_remap_ids[i][j] = keybind->id; - settings->uints.input_keymapper_ids[j] = RETROK_UNKNOWN; + settings->uints.input_keymapper_multi_ids[i][j] = RETROK_UNKNOWN; } for (j = 0; j < 4; j++) diff --git a/menu/cbs/menu_cbs_left.c b/menu/cbs/menu_cbs_left.c index 230b6fea0d..4b579fe169 100644 --- a/menu/cbs/menu_cbs_left.c +++ b/menu/cbs/menu_cbs_left.c @@ -112,15 +112,18 @@ static int action_left_input_desc_kbd(unsigned type, const char *label, bool wraparound) { char desc[PATH_MAX_LENGTH]; - unsigned key_id; + unsigned key_id, id, offset; unsigned remap_id; - unsigned offset = type - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN; settings_t *settings = config_get_ptr(); if (!settings) return 0; - remap_id = settings->uints.input_keymapper_ids[offset]; + offset = type / ((MENU_SETTINGS_INPUT_DESC_KBD_END - (MENU_SETTINGS_INPUT_DESC_KBD_END - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN))) - 1; + id = (type / (offset + 1)) - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN; + + remap_id = + settings->uints.input_keymapper_multi_ids[offset][id]; for (key_id = 0; key_id < MENU_SETTINGS_INPUT_DESC_KBD_END - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN; key_id++) { @@ -133,7 +136,7 @@ static int action_left_input_desc_kbd(unsigned type, const char *label, else key_id = MENU_SETTINGS_INPUT_DESC_KBD_END - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN; - settings->uints.input_keymapper_ids[offset] = key_descriptors[key_id].key; + settings->uints.input_keymapper_multi_ids[offset][id] = key_descriptors[key_id].key; return 0; } diff --git a/menu/cbs/menu_cbs_right.c b/menu/cbs/menu_cbs_right.c index 9469cbc98b..f98f1e72a3 100644 --- a/menu/cbs/menu_cbs_right.c +++ b/menu/cbs/menu_cbs_right.c @@ -105,16 +105,19 @@ int action_right_cheat(unsigned type, const char *label, int action_right_input_desc_kbd(unsigned type, const char *label, bool wraparound) { - unsigned key_id; + unsigned key_id, id, offset; unsigned remap_id; char desc[PATH_MAX_LENGTH]; - unsigned offset = type - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN; settings_t *settings = config_get_ptr(); if (!settings) return 0; - remap_id = settings->uints.input_keymapper_ids[offset]; + offset = type / ((MENU_SETTINGS_INPUT_DESC_KBD_END - (MENU_SETTINGS_INPUT_DESC_KBD_END - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN))) - 1; + id = (type / (offset + 1)) - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN; + + remap_id = + settings->uints.input_keymapper_multi_ids[offset][id]; for (key_id = 0; key_id < MENU_SETTINGS_INPUT_DESC_KBD_END - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN; key_id++) { @@ -127,7 +130,7 @@ int action_right_input_desc_kbd(unsigned type, const char *label, else key_id = 0; - settings->uints.input_keymapper_ids[offset] = key_descriptors[key_id].key; + settings->uints.input_keymapper_multi_ids[offset][id] = key_descriptors[key_id].key; return 0; } From c57f8722e5b7015407994a571a24e9ea51fd246b Mon Sep 17 00:00:00 2001 From: radius Date: Fri, 30 Mar 2018 13:08:58 -0500 Subject: [PATCH 03/35] remap-redux part 2: restore original var names --- configuration.h | 2 +- input/input_mapper.c | 10 +++++----- input/input_remapping.c | 6 +++--- menu/cbs/menu_cbs_get_value.c | 2 +- menu/cbs/menu_cbs_left.c | 4 ++-- menu/cbs/menu_cbs_right.c | 4 ++-- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/configuration.h b/configuration.h index 916c4fa648..f3b8e90b14 100644 --- a/configuration.h +++ b/configuration.h @@ -379,7 +379,7 @@ typedef struct settings unsigned input_libretro_device[MAX_USERS]; unsigned input_analog_dpad_mode[MAX_USERS]; - unsigned input_keymapper_multi_ids[MAX_USERS][RARCH_CUSTOM_BIND_LIST_END]; + unsigned input_keymapper_ids[MAX_USERS][RARCH_CUSTOM_BIND_LIST_END]; unsigned input_remap_ids[MAX_USERS][RARCH_CUSTOM_BIND_LIST_END]; diff --git a/input/input_mapper.c b/input/input_mapper.c index 5d09aa580b..68bfe29e0b 100644 --- a/input/input_mapper.c +++ b/input/input_mapper.c @@ -109,22 +109,22 @@ void input_mapper_poll(input_mapper_t *handle) { if (j < RETROK_LAST) { - if (input_state(i, RETRO_DEVICE_JOYPAD, 0, j) && settings->uints.input_keymapper_multi_ids[i][j] != RETROK_UNKNOWN) + if (input_state(i, RETRO_DEVICE_JOYPAD, 0, j) && settings->uints.input_keymapper_ids[i][j] != RETROK_UNKNOWN) { MAPPER_SET_KEY (handle, - settings->uints.input_keymapper_multi_ids[i][j]); + settings->uints.input_keymapper_ids[i][j]); input_keyboard_event(true, - settings->uints.input_keymapper_multi_ids[i][j], + settings->uints.input_keymapper_ids[i][j], 0, 0, RETRO_DEVICE_KEYBOARD); key_event[j] = true; } else { if (key_event[j] == false && - settings->uints.input_keymapper_multi_ids[i][j] != RETROK_UNKNOWN) + settings->uints.input_keymapper_ids[i][j] != RETROK_UNKNOWN) { input_keyboard_event(false, - settings->uints.input_keymapper_multi_ids[i][j], + settings->uints.input_keymapper_ids[i][j], 0, 0, RETRO_DEVICE_KEYBOARD); } } diff --git a/input/input_remapping.c b/input/input_remapping.c index b1920ee0c0..ad41480c26 100644 --- a/input/input_remapping.c +++ b/input/input_remapping.c @@ -87,9 +87,9 @@ bool input_remapping_load_file(void *data, const char *path) key_remap = -1; if (config_get_int(conf, keymapper_ident[j], &key_remap)) - settings->uints.input_keymapper_multi_ids[i][j] = key_remap; + settings->uints.input_keymapper_ids[i][j] = key_remap; else - settings->uints.input_keymapper_multi_ids[i][j] = RETROK_UNKNOWN; + settings->uints.input_keymapper_ids[i][j] = RETROK_UNKNOWN; } @@ -262,7 +262,7 @@ void input_remapping_set_defaults(bool deinit) const struct retro_keybind *keybind = &input_config_binds[i][j]; if (keybind) settings->uints.input_remap_ids[i][j] = keybind->id; - settings->uints.input_keymapper_multi_ids[i][j] = RETROK_UNKNOWN; + settings->uints.input_keymapper_ids[i][j] = RETROK_UNKNOWN; } for (j = 0; j < 4; j++) diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index fdad42fb50..9743ba6c4b 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -644,7 +644,7 @@ static void menu_action_setting_disp_set_label_input_desc_kbd( id = (type / (offset + 1)) - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN; remap_id = - settings->uints.input_keymapper_multi_ids[offset][id]; + settings->uints.input_keymapper_ids[offset][id]; RARCH_LOG("o: %d, type: %d, remap_id: %d\n", offset, type, remap_id); diff --git a/menu/cbs/menu_cbs_left.c b/menu/cbs/menu_cbs_left.c index 4b579fe169..ab5aaad644 100644 --- a/menu/cbs/menu_cbs_left.c +++ b/menu/cbs/menu_cbs_left.c @@ -123,7 +123,7 @@ static int action_left_input_desc_kbd(unsigned type, const char *label, id = (type / (offset + 1)) - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN; remap_id = - settings->uints.input_keymapper_multi_ids[offset][id]; + settings->uints.input_keymapper_ids[offset][id]; for (key_id = 0; key_id < MENU_SETTINGS_INPUT_DESC_KBD_END - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN; key_id++) { @@ -136,7 +136,7 @@ static int action_left_input_desc_kbd(unsigned type, const char *label, else key_id = MENU_SETTINGS_INPUT_DESC_KBD_END - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN; - settings->uints.input_keymapper_multi_ids[offset][id] = key_descriptors[key_id].key; + settings->uints.input_keymapper_ids[offset][id] = key_descriptors[key_id].key; return 0; } diff --git a/menu/cbs/menu_cbs_right.c b/menu/cbs/menu_cbs_right.c index f98f1e72a3..a5d9de6188 100644 --- a/menu/cbs/menu_cbs_right.c +++ b/menu/cbs/menu_cbs_right.c @@ -117,7 +117,7 @@ int action_right_input_desc_kbd(unsigned type, const char *label, id = (type / (offset + 1)) - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN; remap_id = - settings->uints.input_keymapper_multi_ids[offset][id]; + settings->uints.input_keymapper_ids[offset][id]; for (key_id = 0; key_id < MENU_SETTINGS_INPUT_DESC_KBD_END - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN; key_id++) { @@ -130,7 +130,7 @@ int action_right_input_desc_kbd(unsigned type, const char *label, else key_id = 0; - settings->uints.input_keymapper_multi_ids[offset][id] = key_descriptors[key_id].key; + settings->uints.input_keymapper_ids[offset][id] = key_descriptors[key_id].key; return 0; } From daf262da9649ab9e5cb41415962c3ea9f7a5fc71 Mon Sep 17 00:00:00 2001 From: radius Date: Fri, 30 Mar 2018 23:06:32 -0500 Subject: [PATCH 04/35] remap-redux part 2: reimplement saving --- .vscode/c_cpp_properties.json | 250 +++++++++++++++++----------------- 1 file changed, 126 insertions(+), 124 deletions(-) diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index 81c2529184..52c61506df 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -1,125 +1,127 @@ -{ - "configurations": [ - { - "name": "Mac", - "includePath": [ - "/usr/include", - "/usr/local/include", - "${workspaceRoot}" - ], - "defines": [], - "intelliSenseMode": "clang-x64", - "browse": { - "path": [ - "/usr/include", - "/usr/local/include", - "${workspaceRoot}" - ], - "limitSymbolsToIncludedHeaders": true, - "databaseFilename": "" - }, - "macFrameworkPath": [ - "/System/Library/Frameworks", - "/Library/Frameworks" - ] - }, - { - "name": "Linux", - "includePath": [ - "/usr/include", - "/usr/local/include", - "${workspaceRoot}" - ], - "defines": [], - "intelliSenseMode": "clang-x64", - "browse": { - "path": [ - "/usr/include", - "/usr/local/include", - "${workspaceRoot}" - ], - "limitSymbolsToIncludedHeaders": true, - "databaseFilename": "" - } - }, - { - "name": "Win32", - "includePath": [ - "C:/Program Files (x86)/Windows Kits/10/Include/10.0.15063.0/um", - "C:/Program Files (x86)/Windows Kits/10/Include/10.0.15063.0/ucrt", - "C:/Program Files (x86)/Windows Kits/10/Include/10.0.15063.0/shared", - "C:/Program Files (x86)/Windows Kits/10/Include/10.0.15063.0/winrt", - "${workspaceRoot}" - ], - "defines": [ - "_DEBUG", - "UNICODE" - ], - "intelliSenseMode": "msvc-x64", - "browse": { - "path": [ - "C:/Program Files (x86)/Windows Kits/10/Include/10.0.15063.0/um", - "C:/Program Files (x86)/Windows Kits/10/Include/10.0.15063.0/ucrt", - "C:/Program Files (x86)/Windows Kits/10/Include/10.0.15063.0/shared", - "C:/Program Files (x86)/Windows Kits/10/Include/10.0.15063.0/winrt", - "${workspaceRoot}" - ], - "limitSymbolsToIncludedHeaders": true, - "databaseFilename": "" - } - }, - { - "name": "msys2-mingw32", - "includePath": [ - "C:/msys64/mingw32/include", - "C:/msys64/mingw32/i686-w64-mingw32/include", - "${workspaceRoot}/libretro-common/include", - "${workspaceRoot}/include", - "${workspaceRoot}" - ], - "defines": [ - "_DEBUG", - "UNICODE" - ], - "intelliSenseMode": "msvc-x64", - "browse": { - "path": [ - "C:/msys64/mingw32/include", - "C:/msys64/mingw32/i686-w64-mingw32/include", - "${workspaceRoot}/libretro-common/include", - "${workspaceRoot}/include", - "${workspaceRoot}" - ], - "limitSymbolsToIncludedHeaders": true, - "databaseFilename": "" - } - }, - { - "name": "msys2-mingw64", - "includePath": [ - "C:/msys64/mingw64/include", - "C:/msys64/mingw64/x86_64-w64-mingw32/include", - "${workspaceRoot}/libretro-common/include", - "${workspaceRoot}/include", - "${workspaceRoot}" - ], - "defines": [ - "_DEBUG", - "UNICODE" - ], - "intelliSenseMode": "msvc-x64", - "browse": { - "path": [ - "C:/msys64/mingw64/include", - "C:/msys64/mingw64/x86_64-w64-mingw32/include", - "${workspaceRoot}/libretro-common/include", - "${workspaceRoot}/include", - "${workspaceRoot}" - ], - "limitSymbolsToIncludedHeaders": true, - "databaseFilename": "" - } - } - ], - "version": 3 +{ + "configurations": [ + { + "name": "Mac", + "includePath": [ + "/usr/include", + "/usr/local/include", + "${workspaceRoot}" + ], + "defines": [], + "intelliSenseMode": "clang-x64", + "browse": { + "path": [ + "/usr/include", + "/usr/local/include", + "${workspaceRoot}" + ], + "limitSymbolsToIncludedHeaders": true, + "databaseFilename": "" + }, + "macFrameworkPath": [ + "/System/Library/Frameworks", + "/Library/Frameworks" + ] + }, + { + "name": "Linux", + "includePath": [ + "/usr/include", + "/usr/local/include", + "${workspaceRoot}" + ], + "defines": [], + "intelliSenseMode": "clang-x64", + "browse": { + "path": [ + "/usr/include", + "/usr/local/include", + "${workspaceRoot}" + ], + "limitSymbolsToIncludedHeaders": true, + "databaseFilename": "" + } + }, + { + "name": "Win32", + "includePath": [ + "C:/Program Files (x86)/Windows Kits/10/Include/10.0.15063.0/um", + "C:/Program Files (x86)/Windows Kits/10/Include/10.0.15063.0/ucrt", + "C:/Program Files (x86)/Windows Kits/10/Include/10.0.15063.0/shared", + "C:/Program Files (x86)/Windows Kits/10/Include/10.0.15063.0/winrt", + "${workspaceRoot}" + ], + "defines": [ + "_DEBUG", + "UNICODE" + ], + "intelliSenseMode": "msvc-x64", + "browse": { + "path": [ + "C:/Program Files (x86)/Windows Kits/10/Include/10.0.15063.0/um", + "C:/Program Files (x86)/Windows Kits/10/Include/10.0.15063.0/ucrt", + "C:/Program Files (x86)/Windows Kits/10/Include/10.0.15063.0/shared", + "C:/Program Files (x86)/Windows Kits/10/Include/10.0.15063.0/winrt", + "${workspaceRoot}" + ], + "limitSymbolsToIncludedHeaders": true, + "databaseFilename": "" + }, + "cStandard": "c11", + "cppStandard": "c++17" + }, + { + "name": "msys2-mingw32", + "includePath": [ + "C:/msys64/mingw32/include", + "C:/msys64/mingw32/i686-w64-mingw32/include", + "${workspaceRoot}/libretro-common/include", + "${workspaceRoot}/include", + "${workspaceRoot}" + ], + "defines": [ + "_DEBUG", + "UNICODE" + ], + "intelliSenseMode": "msvc-x64", + "browse": { + "path": [ + "C:/msys64/mingw32/include", + "C:/msys64/mingw32/i686-w64-mingw32/include", + "${workspaceRoot}/libretro-common/include", + "${workspaceRoot}/include", + "${workspaceRoot}" + ], + "limitSymbolsToIncludedHeaders": true, + "databaseFilename": "" + } + }, + { + "name": "msys2-mingw64", + "includePath": [ + "C:/msys64/mingw64/include", + "C:/msys64/mingw64/x86_64-w64-mingw32/include", + "${workspaceRoot}/libretro-common/include", + "${workspaceRoot}/include", + "${workspaceRoot}" + ], + "defines": [ + "_DEBUG", + "UNICODE" + ], + "intelliSenseMode": "msvc-x64", + "browse": { + "path": [ + "C:/msys64/mingw64/include", + "C:/msys64/mingw64/x86_64-w64-mingw32/include", + "${workspaceRoot}/libretro-common/include", + "${workspaceRoot}/include", + "${workspaceRoot}" + ], + "limitSymbolsToIncludedHeaders": true, + "databaseFilename": "" + } + } + ], + "version": 3 } \ No newline at end of file From f6ee035011bd6b86e67e29938c34b5043838b7a0 Mon Sep 17 00:00:00 2001 From: radius Date: Fri, 30 Mar 2018 23:28:20 -0500 Subject: [PATCH 05/35] remap-redux part 2: only add items for devices set to RETRO_DEVICE_KEYBOARD (or a subclass) --- input/input_remapping.c | 1 - menu/menu_displaylist.c | 57 ++++++++++++++++++++++------------------- 2 files changed, 30 insertions(+), 28 deletions(-) diff --git a/input/input_remapping.c b/input/input_remapping.c index ad41480c26..d79970f088 100644 --- a/input/input_remapping.c +++ b/input/input_remapping.c @@ -263,7 +263,6 @@ void input_remapping_set_defaults(bool deinit) if (keybind) settings->uints.input_remap_ids[i][j] = keybind->id; settings->uints.input_keymapper_ids[i][j] = RETROK_UNKNOWN; - } for (j = 0; j < 4; j++) settings->uints.input_remap_ids[i][RARCH_FIRST_CUSTOM_BIND + j] = j; diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index d83ae6b7cf..8f026068fd 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -3274,39 +3274,42 @@ static int menu_displaylist_parse_options_remappings( if (system) { settings_t *settings = config_get_ptr(); + unsigned device; - unsigned device = settings->uints.input_libretro_device[settings->uints.keymapper_port]; - device &= RETRO_DEVICE_MASK; - - if (device == RETRO_DEVICE_KEYBOARD) + for (int i = 0; i < 8; i++) { - for (int i = 0; i < 8; i++) - for (retro_id = 0; retro_id < RARCH_FIRST_CUSTOM_BIND; retro_id++) + device = settings->uints.input_libretro_device[i]; + device &= RETRO_DEVICE_MASK; + + if (device == RETRO_DEVICE_KEYBOARD) { - unsigned user = settings->uints.keymapper_port + 1; - unsigned desc_offset = retro_id; - char descriptor[255]; - const struct retro_keybind *auto_bind = NULL; - const struct retro_keybind *keybind = NULL; - - keybind = &input_config_binds[i][retro_id]; - auto_bind = (const struct retro_keybind*) - input_config_get_bind_auto(i, retro_id); - - input_config_get_bind_string(descriptor, - keybind, auto_bind, sizeof(descriptor)); - - if(!strstr(descriptor, "Auto")) + for (retro_id = 0; retro_id < RARCH_FIRST_CUSTOM_BIND; retro_id++) { - const struct retro_keybind *keyptr = - &input_config_binds[i][retro_id]; + unsigned user = settings->uints.keymapper_port + 1; + unsigned desc_offset = retro_id; + char descriptor[255]; + const struct retro_keybind *auto_bind = NULL; + const struct retro_keybind *keybind = NULL; - strlcpy(descriptor, msg_hash_to_str(keyptr->enum_idx), sizeof(descriptor)); + keybind = &input_config_binds[i][retro_id]; + auto_bind = (const struct retro_keybind*) + input_config_get_bind_auto(i, retro_id); + + input_config_get_bind_string(descriptor, + keybind, auto_bind, sizeof(descriptor)); + + if(!strstr(descriptor, "Auto")) + { + const struct retro_keybind *keyptr = + &input_config_binds[i][retro_id]; + + strlcpy(descriptor, msg_hash_to_str(keyptr->enum_idx), sizeof(descriptor)); + } + + menu_entries_append_enum(info->list, descriptor, "", + MSG_UNKNOWN, + (MENU_SETTINGS_INPUT_DESC_KBD_BEGIN + retro_id) * (i + 1), 0, 0); } - - menu_entries_append_enum(info->list, descriptor, "", - MSG_UNKNOWN, - (MENU_SETTINGS_INPUT_DESC_KBD_BEGIN + retro_id) * (i + 1), 0, 0); } } } From db5f3d7a7511a1a73e88f0b16493053ab5478a7d Mon Sep 17 00:00:00 2001 From: radius Date: Fri, 30 Mar 2018 23:47:49 -0500 Subject: [PATCH 06/35] remap-redux part 2: add keymapper sublabels --- menu/cbs/menu_cbs_sublabel.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 25b3ae9aed..f6dfda3a9e 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -39,6 +39,7 @@ #include "../../retroarch.h" #include "../../content.h" +#include "../../configuration.h" #define default_sublabel_macro(func_name, lbl) \ static int (func_name)(file_list_t *list, unsigned type, unsigned i, const char *label, const char *path, char *s, size_t len) \ @@ -425,7 +426,27 @@ static int action_bind_sublabel_subsystem_add( return 0; } +static int action_bind_sublabel_remap_sublabel( + file_list_t *list, + unsigned type, unsigned i, + const char *label, const char *path, + char *s, size_t len) +{ + char desc[PATH_MAX_LENGTH]; + unsigned offset; + settings_t *settings = config_get_ptr(); + if (!settings) + return 0; + + offset = type / ((MENU_SETTINGS_INPUT_DESC_KBD_END - (MENU_SETTINGS_INPUT_DESC_KBD_END - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN))) - 1; + snprintf(s, len, "User #%d: %s", offset + 1, + input_config_get_device_display_name(offset) ? + input_config_get_device_display_name(offset) : + (input_config_get_device_name(offset) ? + input_config_get_device_name(offset) : "N/A")); + return 0; +} #ifdef HAVE_NETWORKING static int action_bind_sublabel_netplay_room( @@ -485,6 +506,14 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_generic); +#ifdef HAVE_KEYMAPPER + if (type >= MENU_SETTINGS_INPUT_DESC_KBD_BEGIN + && type <= MENU_SETTINGS_INPUT_DESC_KBD_END) + { + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_remap_sublabel); + } +#endif + if (cbs->enum_idx != MSG_UNKNOWN) { switch (cbs->enum_idx) From 51edf47ed21230bdaf1e65ef1a2e0541c3f92887 Mon Sep 17 00:00:00 2001 From: radius Date: Sat, 31 Mar 2018 09:31:52 -0500 Subject: [PATCH 07/35] remap-redux part 2: cleanup keymapper code --- .vscode/settings.json | 1 + input/input_mapper.c | 5 +++-- input/input_remapping.c | 7 ++++++- menu/cbs/menu_cbs_get_value.c | 9 +++++---- menu/cbs/menu_cbs_left.c | 8 ++++++-- menu/cbs/menu_cbs_right.c | 8 ++++++-- menu/cbs/menu_cbs_sublabel.c | 5 ++++- menu/menu_displaylist.c | 2 +- 8 files changed, 32 insertions(+), 13 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index e90ca77e4a..88513c30c2 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -14,4 +14,5 @@ "*.in": "c", "*.rh": "c" }, + "C_Cpp.dimInactiveRegions": false, } \ No newline at end of file diff --git a/input/input_mapper.c b/input/input_mapper.c index 68bfe29e0b..42e4762040 100644 --- a/input/input_mapper.c +++ b/input/input_mapper.c @@ -103,13 +103,14 @@ void input_mapper_poll(input_mapper_t *handle) memset(handle->keys, 0, sizeof(handle->keys)); i = 0; - for (i = 0; i < 8; i++) + for (i = 0; i < MAX_USERS; i++) { for (j = 0; j < RARCH_CUSTOM_BIND_LIST_END; j++) { if (j < RETROK_LAST) { - if (input_state(i, RETRO_DEVICE_JOYPAD, 0, j) && settings->uints.input_keymapper_ids[i][j] != RETROK_UNKNOWN) + if (input_state(i, RETRO_DEVICE_JOYPAD, 0, j) && + settings->uints.input_keymapper_ids[i][j] != RETROK_UNKNOWN) { MAPPER_SET_KEY (handle, settings->uints.input_keymapper_ids[i][j]); diff --git a/input/input_remapping.c b/input/input_remapping.c index d79970f088..e820c162cd 100644 --- a/input/input_remapping.c +++ b/input/input_remapping.c @@ -194,11 +194,16 @@ bool input_remapping_save_file(const char *path) else config_unset(conf,key_ident[j]); + if (settings->uints.input_keymapper_ids[i][j] != RETROK_UNKNOWN) + config_set_int(conf, keymapper_ident[j], + settings->uints.input_keymapper_ids[i][j]); + } else { if(settings->uints.input_remap_ids[i][j] != j - RARCH_FIRST_CUSTOM_BIND) - config_set_int(conf, key_ident[j], settings->uints.input_remap_ids[i][j]); + config_set_int(conf, key_ident[j], + settings->uints.input_remap_ids[i][j]); else config_unset(conf,key_ident[j]); } diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index 9743ba6c4b..bd764c518b 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -640,15 +640,16 @@ static void menu_action_setting_disp_set_label_input_desc_kbd( if (!settings) return; - offset = type / ((MENU_SETTINGS_INPUT_DESC_KBD_END - (MENU_SETTINGS_INPUT_DESC_KBD_END - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN))) - 1; + offset = type / ((MENU_SETTINGS_INPUT_DESC_KBD_END - + (MENU_SETTINGS_INPUT_DESC_KBD_END - + MENU_SETTINGS_INPUT_DESC_KBD_BEGIN))) - 1; id = (type / (offset + 1)) - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN; remap_id = settings->uints.input_keymapper_ids[offset][id]; - RARCH_LOG("o: %d, type: %d, remap_id: %d\n", offset, type, remap_id); - - for (key_id = 0; key_id < MENU_SETTINGS_INPUT_DESC_KBD_END - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN; key_id++) + for (key_id = 0; key_id < MENU_SETTINGS_INPUT_DESC_KBD_END - + MENU_SETTINGS_INPUT_DESC_KBD_BEGIN; key_id++) { if(remap_id == key_descriptors[key_id].key) break; diff --git a/menu/cbs/menu_cbs_left.c b/menu/cbs/menu_cbs_left.c index ab5aaad644..83b7a5446b 100644 --- a/menu/cbs/menu_cbs_left.c +++ b/menu/cbs/menu_cbs_left.c @@ -119,13 +119,17 @@ static int action_left_input_desc_kbd(unsigned type, const char *label, if (!settings) return 0; - offset = type / ((MENU_SETTINGS_INPUT_DESC_KBD_END - (MENU_SETTINGS_INPUT_DESC_KBD_END - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN))) - 1; + offset = type / ((MENU_SETTINGS_INPUT_DESC_KBD_END - + (MENU_SETTINGS_INPUT_DESC_KBD_END - + MENU_SETTINGS_INPUT_DESC_KBD_BEGIN))) - 1; + id = (type / (offset + 1)) - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN; remap_id = settings->uints.input_keymapper_ids[offset][id]; - for (key_id = 0; key_id < MENU_SETTINGS_INPUT_DESC_KBD_END - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN; key_id++) + for (key_id = 0; key_id < MENU_SETTINGS_INPUT_DESC_KBD_END - + MENU_SETTINGS_INPUT_DESC_KBD_BEGIN; key_id++) { if(remap_id == key_descriptors[key_id].key) break; diff --git a/menu/cbs/menu_cbs_right.c b/menu/cbs/menu_cbs_right.c index a5d9de6188..132426f9db 100644 --- a/menu/cbs/menu_cbs_right.c +++ b/menu/cbs/menu_cbs_right.c @@ -113,13 +113,17 @@ int action_right_input_desc_kbd(unsigned type, const char *label, if (!settings) return 0; - offset = type / ((MENU_SETTINGS_INPUT_DESC_KBD_END - (MENU_SETTINGS_INPUT_DESC_KBD_END - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN))) - 1; + offset = type / ((MENU_SETTINGS_INPUT_DESC_KBD_END - + (MENU_SETTINGS_INPUT_DESC_KBD_END - + MENU_SETTINGS_INPUT_DESC_KBD_BEGIN))) - 1; + id = (type / (offset + 1)) - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN; remap_id = settings->uints.input_keymapper_ids[offset][id]; - for (key_id = 0; key_id < MENU_SETTINGS_INPUT_DESC_KBD_END - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN; key_id++) + for (key_id = 0; key_id < MENU_SETTINGS_INPUT_DESC_KBD_END - + MENU_SETTINGS_INPUT_DESC_KBD_BEGIN; key_id++) { if(remap_id == key_descriptors[key_id].key) break; diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index f6dfda3a9e..81403b20a6 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -439,7 +439,10 @@ static int action_bind_sublabel_remap_sublabel( if (!settings) return 0; - offset = type / ((MENU_SETTINGS_INPUT_DESC_KBD_END - (MENU_SETTINGS_INPUT_DESC_KBD_END - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN))) - 1; + offset = type / ((MENU_SETTINGS_INPUT_DESC_KBD_END - + (MENU_SETTINGS_INPUT_DESC_KBD_END - + MENU_SETTINGS_INPUT_DESC_KBD_BEGIN))) - 1; + snprintf(s, len, "User #%d: %s", offset + 1, input_config_get_device_display_name(offset) ? input_config_get_device_display_name(offset) : diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 8f026068fd..207ea58981 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -3276,7 +3276,7 @@ static int menu_displaylist_parse_options_remappings( settings_t *settings = config_get_ptr(); unsigned device; - for (int i = 0; i < 8; i++) + for (int i = 0; i < MAX_USERS; i++) { device = settings->uints.input_libretro_device[i]; device &= RETRO_DEVICE_MASK; From 34649d1abf25c422e439a5f864a20e3f11fdb063 Mon Sep 17 00:00:00 2001 From: radius Date: Sat, 31 Mar 2018 11:13:00 -0500 Subject: [PATCH 08/35] remap-redux part 2: start inverting the gamepad mapper columns --- input/input_defines.h | 2 + menu/cbs/menu_cbs_get_value.c | 78 ++++++++++++++++------------------- menu/menu_cbs.c | 2 +- menu/menu_displaylist.c | 61 ++++++++++++++++----------- menu/menu_driver.h | 2 +- 5 files changed, 76 insertions(+), 69 deletions(-) diff --git a/input/input_defines.h b/input/input_defines.h index 91f14d2766..4f203d4f46 100644 --- a/input/input_defines.h +++ b/input/input_defines.h @@ -28,6 +28,8 @@ RETRO_BEGIN_DECLS #define MAX_INPUT_DEVICES 16 +#define MAX_KEYS 136 + #define RARCH_FIRST_CUSTOM_BIND 16 #define RARCH_FIRST_LIGHTGUN_BIND RARCH_ANALOG_BIND_LIST_END #define RARCH_FIRST_MISC_CUSTOM_BIND RARCH_LIGHTGUN_BIND_LIST_END diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index bd764c518b..36f35b5092 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -547,72 +547,60 @@ static void menu_action_setting_disp_set_label_input_desc( const char *path, char *s2, size_t len2) { - char descriptor[255]; + rarch_system_info_t *system = NULL; + const char* descriptor = NULL; const struct retro_keybind *auto_bind = NULL; const struct retro_keybind *keybind = NULL; settings_t *settings = config_get_ptr(); unsigned inp_desc_index_offset = type - MENU_SETTINGS_INPUT_DESC_BEGIN; unsigned inp_desc_user = inp_desc_index_offset / - (RARCH_FIRST_CUSTOM_BIND + 4); + (RARCH_FIRST_CUSTOM_BIND + 8); unsigned inp_desc_button_index_offset = inp_desc_index_offset - - (inp_desc_user * (RARCH_FIRST_CUSTOM_BIND + 4)); + (inp_desc_user * (RARCH_FIRST_CUSTOM_BIND + 8)); unsigned remap_id = 0; - if (!settings) + system = runloop_get_system_info(); + + if (!system) return; - descriptor[0] = '\0'; - - remap_id = settings->uints.input_remap_ids - [inp_desc_user][inp_desc_button_index_offset]; - - keybind = &input_config_binds[inp_desc_user][remap_id]; - auto_bind = (const struct retro_keybind*) - input_config_get_bind_auto(inp_desc_user, remap_id); - - input_config_get_bind_string(descriptor, - keybind, auto_bind, sizeof(descriptor)); - - if (inp_desc_button_index_offset < RARCH_FIRST_CUSTOM_BIND) - { - if(strstr(descriptor, "Auto") && !strstr(descriptor, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE))) - strlcpy(s, - descriptor, - len); - else - { - const struct retro_keybind *keyptr = &input_config_binds[inp_desc_user] - [remap_id]; - - strlcpy(s, msg_hash_to_str(keyptr->enum_idx), len); - } - } - - + descriptor = system->input_desc_btn[inp_desc_user][inp_desc_button_index_offset]; + if (inp_desc_button_index_offset < RARCH_FIRST_CUSTOM_BIND + 8) + strlcpy(s, descriptor ? descriptor : "---", len); else { - const char *str = NULL; switch (remap_id) { case 0: - str = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X); + descriptor = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS); break; case 1: - str = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y); + descriptor = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS); break; case 2: - str = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X); + descriptor = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS); break; case 3: - str = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y); + descriptor = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS); + break; + case 4: + descriptor = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS); + break; + case 5: + descriptor = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS); + break; + case 6: + descriptor = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS); + break; + case 7: + descriptor = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS); break; } - if (!string_is_empty(str)) - strlcpy(s, str, len); + if (!string_is_empty(descriptor)) + strlcpy(s, descriptor, len); } *w = 19; @@ -654,8 +642,14 @@ static void menu_action_setting_disp_set_label_input_desc_kbd( if(remap_id == key_descriptors[key_id].key) break; } - snprintf(desc, sizeof(desc), "Keyboard %s", key_descriptors[key_id].desc); - strlcpy(s, desc, len); + + if (key_descriptors[key_id].key != RETROK_FIRST) + { + snprintf(desc, sizeof(desc), "Keyboard %s", key_descriptors[key_id].desc); + strlcpy(s, desc, len); + } + else + strlcpy(s, "---", len); *w = 19; strlcpy(s2, path, len2); diff --git a/menu/menu_cbs.c b/menu/menu_cbs.c index 28dd055114..230839574e 100644 --- a/menu/menu_cbs.c +++ b/menu/menu_cbs.c @@ -32,7 +32,7 @@ static void menu_cbs_init_log(const char *entry_label, const char *bind_label, c #endif } -struct key_desc key_descriptors[MENU_SETTINGS_INPUT_DESC_KBD_END] = +struct key_desc key_descriptors[136] = { {RETROK_FIRST, "Unmapped"}, {RETROK_BACKSPACE, "Backspace"}, diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 207ea58981..b3ba5fb744 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -3240,33 +3240,44 @@ static int menu_displaylist_parse_options_remappings( if (system) { + settings_t *settings = config_get_ptr(); + unsigned device; for (p = 0; p < max_users; p++) { - for (retro_id = 0; retro_id < RARCH_FIRST_CUSTOM_BIND + 4; retro_id++) + device = settings->uints.input_libretro_device[p]; + device &= RETRO_DEVICE_MASK; + + if (device == RETRO_DEVICE_JOYPAD || device == RETRO_DEVICE_ANALOG) { - char desc_label[64]; - unsigned user = p + 1; - unsigned desc_offset = retro_id; - const char *description = NULL; + for (retro_id = 0; retro_id < RARCH_FIRST_CUSTOM_BIND + 8; retro_id++) + { + char desc_label[64]; + unsigned user = p + 1; + unsigned desc_offset = retro_id; + char descriptor[255]; + const struct retro_keybind *auto_bind = NULL; + const struct retro_keybind *keybind = NULL; - desc_label[0] = '\0'; + keybind = &input_config_binds[p][retro_id]; + auto_bind = (const struct retro_keybind*) + input_config_get_bind_auto(p, retro_id); - if (desc_offset >= RARCH_FIRST_CUSTOM_BIND) - desc_offset = RARCH_FIRST_CUSTOM_BIND - + (desc_offset - RARCH_FIRST_CUSTOM_BIND) * 2; + input_config_get_bind_string(descriptor, + keybind, auto_bind, sizeof(descriptor)); - description = system->input_desc_btn[p][desc_offset]; + if(!strstr(descriptor, "Auto")) + { + const struct retro_keybind *keyptr = + &input_config_binds[p][retro_id]; - if (!description) - continue; + strlcpy(descriptor, msg_hash_to_str(keyptr->enum_idx), sizeof(descriptor)); + } - snprintf(desc_label, sizeof(desc_label), - "%s %u %s : ", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_USER), - user, description); - menu_entries_append_enum(info->list, desc_label, "", - MSG_UNKNOWN, - MENU_SETTINGS_INPUT_DESC_BEGIN + - (p * (RARCH_FIRST_CUSTOM_BIND + 4)) + retro_id, 0, 0); + menu_entries_append_enum(info->list, descriptor, "", + MSG_UNKNOWN, + MENU_SETTINGS_INPUT_DESC_BEGIN + + (p * (RARCH_FIRST_CUSTOM_BIND + 8)) + retro_id, 0, 0); + } } } } @@ -3276,9 +3287,9 @@ static int menu_displaylist_parse_options_remappings( settings_t *settings = config_get_ptr(); unsigned device; - for (int i = 0; i < MAX_USERS; i++) + for (p = 0; p < MAX_USERS; p++) { - device = settings->uints.input_libretro_device[i]; + device = settings->uints.input_libretro_device[p]; device &= RETRO_DEVICE_MASK; if (device == RETRO_DEVICE_KEYBOARD) @@ -3291,9 +3302,9 @@ static int menu_displaylist_parse_options_remappings( const struct retro_keybind *auto_bind = NULL; const struct retro_keybind *keybind = NULL; - keybind = &input_config_binds[i][retro_id]; + keybind = &input_config_binds[p][retro_id]; auto_bind = (const struct retro_keybind*) - input_config_get_bind_auto(i, retro_id); + input_config_get_bind_auto(p, retro_id); input_config_get_bind_string(descriptor, keybind, auto_bind, sizeof(descriptor)); @@ -3301,14 +3312,14 @@ static int menu_displaylist_parse_options_remappings( if(!strstr(descriptor, "Auto")) { const struct retro_keybind *keyptr = - &input_config_binds[i][retro_id]; + &input_config_binds[p][retro_id]; strlcpy(descriptor, msg_hash_to_str(keyptr->enum_idx), sizeof(descriptor)); } menu_entries_append_enum(info->list, descriptor, "", MSG_UNKNOWN, - (MENU_SETTINGS_INPUT_DESC_KBD_BEGIN + retro_id) * (i + 1), 0, 0); + (MENU_SETTINGS_INPUT_DESC_KBD_BEGIN + retro_id) * (p + 1), 0, 0); } } } diff --git a/menu/menu_driver.h b/menu/menu_driver.h index a18bf606b3..c4df110eb8 100644 --- a/menu/menu_driver.h +++ b/menu/menu_driver.h @@ -208,7 +208,7 @@ enum menu_settings_type MENU_SETTINGS_INPUT_DESC_BEGIN, MENU_SETTINGS_INPUT_DESC_END = MENU_SETTINGS_INPUT_DESC_BEGIN + (MAX_USERS * (RARCH_FIRST_CUSTOM_BIND + 4)), MENU_SETTINGS_INPUT_DESC_KBD_BEGIN, - MENU_SETTINGS_INPUT_DESC_KBD_END = (MENU_SETTINGS_INPUT_DESC_KBD_BEGIN + 135) * MAX_USERS, + MENU_SETTINGS_INPUT_DESC_KBD_END = (MENU_SETTINGS_INPUT_DESC_KBD_BEGIN + 136) * MAX_USERS, MENU_SETTINGS_SUBSYSTEM_LOAD, From c4754815b613b14ad883c544e73f80b987cc58b0 Mon Sep 17 00:00:00 2001 From: radius Date: Sat, 31 Mar 2018 11:35:29 -0500 Subject: [PATCH 09/35] remap-redux part 2: fix small issue with keymapper --- input/input_defines.h | 2 +- menu/cbs/menu_cbs_left.c | 4 ++-- menu/cbs/menu_cbs_right.c | 2 +- menu/menu_cbs.c | 2 +- menu/menu_driver.h | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/input/input_defines.h b/input/input_defines.h index 4f203d4f46..a7be2367d3 100644 --- a/input/input_defines.h +++ b/input/input_defines.h @@ -28,7 +28,7 @@ RETRO_BEGIN_DECLS #define MAX_INPUT_DEVICES 16 -#define MAX_KEYS 136 +#define RARCH_MAX_KEYS 136 #define RARCH_FIRST_CUSTOM_BIND 16 #define RARCH_FIRST_LIGHTGUN_BIND RARCH_ANALOG_BIND_LIST_END diff --git a/menu/cbs/menu_cbs_left.c b/menu/cbs/menu_cbs_left.c index 83b7a5446b..b2980932a5 100644 --- a/menu/cbs/menu_cbs_left.c +++ b/menu/cbs/menu_cbs_left.c @@ -128,7 +128,7 @@ static int action_left_input_desc_kbd(unsigned type, const char *label, remap_id = settings->uints.input_keymapper_ids[offset][id]; - for (key_id = 0; key_id < MENU_SETTINGS_INPUT_DESC_KBD_END - + for (key_id = 0; key_id < RARCH_MAX_KEYS + MENU_SETTINGS_INPUT_DESC_KBD_BEGIN; key_id++) { if(remap_id == key_descriptors[key_id].key) @@ -138,7 +138,7 @@ static int action_left_input_desc_kbd(unsigned type, const char *label, if (key_id > 0) key_id--; else - key_id = MENU_SETTINGS_INPUT_DESC_KBD_END - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN; + key_id = RARCH_MAX_KEYS + MENU_SETTINGS_INPUT_DESC_KBD_BEGIN; settings->uints.input_keymapper_ids[offset][id] = key_descriptors[key_id].key; diff --git a/menu/cbs/menu_cbs_right.c b/menu/cbs/menu_cbs_right.c index 132426f9db..c76f7e1dd3 100644 --- a/menu/cbs/menu_cbs_right.c +++ b/menu/cbs/menu_cbs_right.c @@ -129,7 +129,7 @@ int action_right_input_desc_kbd(unsigned type, const char *label, break; } - if (key_id < MENU_SETTINGS_INPUT_DESC_KBD_END - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN) + if (key_id < RARCH_MAX_KEYS + MENU_SETTINGS_INPUT_DESC_KBD_BEGIN) key_id++; else key_id = 0; diff --git a/menu/menu_cbs.c b/menu/menu_cbs.c index 230839574e..33d4b5a01e 100644 --- a/menu/menu_cbs.c +++ b/menu/menu_cbs.c @@ -32,7 +32,7 @@ static void menu_cbs_init_log(const char *entry_label, const char *bind_label, c #endif } -struct key_desc key_descriptors[136] = +struct key_desc key_descriptors[RARCH_MAX_KEYS] = { {RETROK_FIRST, "Unmapped"}, {RETROK_BACKSPACE, "Backspace"}, diff --git a/menu/menu_driver.h b/menu/menu_driver.h index c4df110eb8..ebc589b306 100644 --- a/menu/menu_driver.h +++ b/menu/menu_driver.h @@ -208,7 +208,7 @@ enum menu_settings_type MENU_SETTINGS_INPUT_DESC_BEGIN, MENU_SETTINGS_INPUT_DESC_END = MENU_SETTINGS_INPUT_DESC_BEGIN + (MAX_USERS * (RARCH_FIRST_CUSTOM_BIND + 4)), MENU_SETTINGS_INPUT_DESC_KBD_BEGIN, - MENU_SETTINGS_INPUT_DESC_KBD_END = (MENU_SETTINGS_INPUT_DESC_KBD_BEGIN + 136) * MAX_USERS, + MENU_SETTINGS_INPUT_DESC_KBD_END = (MENU_SETTINGS_INPUT_DESC_KBD_BEGIN + RARCH_MAX_KEYS) * MAX_USERS, MENU_SETTINGS_SUBSYSTEM_LOAD, From 052887d8b019a32af8f3f76068232a0a07b4a091 Mon Sep 17 00:00:00 2001 From: radius Date: Sat, 31 Mar 2018 11:45:36 -0500 Subject: [PATCH 10/35] remap-redux part 2: fix redefinition of key_descriptors --- menu/cbs/menu_cbs_get_value.c | 2 +- menu/cbs/menu_cbs_left.c | 2 +- menu/cbs/menu_cbs_right.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index 36f35b5092..cbfac887e2 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -54,7 +54,7 @@ cbs->action_get_value_ident = #name; #endif -extern struct key_desc key_descriptors[MENU_SETTINGS_INPUT_DESC_KBD_END]; +extern struct key_desc key_descriptors[RARCH_MAX_KEYS]; static void menu_action_setting_disp_set_label_cheat_num_passes( file_list_t* list, diff --git a/menu/cbs/menu_cbs_left.c b/menu/cbs/menu_cbs_left.c index b2980932a5..7619614734 100644 --- a/menu/cbs/menu_cbs_left.c +++ b/menu/cbs/menu_cbs_left.c @@ -46,7 +46,7 @@ } while(0) #endif -extern struct key_desc key_descriptors[MENU_SETTINGS_INPUT_DESC_KBD_END]; +extern struct key_desc key_descriptors[RARCH_MAX_KEYS]; static int generic_shader_action_parameter_left( struct video_shader_parameter *param, diff --git a/menu/cbs/menu_cbs_right.c b/menu/cbs/menu_cbs_right.c index c76f7e1dd3..bf6838fb50 100644 --- a/menu/cbs/menu_cbs_right.c +++ b/menu/cbs/menu_cbs_right.c @@ -48,7 +48,7 @@ } while(0) #endif -extern struct key_desc key_descriptors[MENU_SETTINGS_INPUT_DESC_KBD_END]; +extern struct key_desc key_descriptors[RARCH_MAX_KEYS]; static int generic_shader_action_parameter_right(struct video_shader_parameter *param, unsigned type, const char *label, bool wraparound) From 7f5fe5ebff876f5450db9dae2d730b9f7151b06c Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 1 Apr 2018 20:57:33 -0500 Subject: [PATCH 11/35] remap-redux part 2: add controller sublabel --- input/input_driver.c | 26 ++++++----- input/input_mapper.c | 85 +++++++++++++++++++++++------------ input/input_mapper.h | 5 ++- menu/cbs/menu_cbs_get_value.c | 59 +++++++----------------- menu/cbs/menu_cbs_left.c | 25 ++++++----- menu/cbs/menu_cbs_right.c | 35 ++++++++------- menu/cbs/menu_cbs_sublabel.c | 34 +++++++++++++- menu/menu_driver.h | 4 +- 8 files changed, 158 insertions(+), 115 deletions(-) diff --git a/input/input_driver.c b/input/input_driver.c index 14ed1c17a9..e3032c405c 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -634,7 +634,8 @@ void input_poll(void) int16_t input_state(unsigned port, unsigned device, unsigned idx, unsigned id) { - int16_t res = 0; + int16_t res = 0; + bool clear = false; device &= RETRO_DEVICE_MASK; @@ -657,8 +658,11 @@ int16_t input_state(unsigned port, unsigned device, switch (device) { case RETRO_DEVICE_JOYPAD: - if (id < RARCH_FIRST_CUSTOM_BIND) - id = settings->uints.input_remap_ids[port][id]; + if (id != settings->uints.input_remap_ids[port][id]) + { + clear = true; + } + break; case RETRO_DEVICE_ANALOG: if (idx < 2 && id < 2) @@ -676,11 +680,9 @@ int16_t input_state(unsigned port, unsigned device, if (((id < RARCH_FIRST_META_KEY) || (device == RETRO_DEVICE_KEYBOARD))) { bool bind_valid = libretro_input_binds[port] && libretro_input_binds[port][id].valid; - + rarch_joypad_info_t joypad_info; if (bind_valid || device == RETRO_DEVICE_KEYBOARD) { - rarch_joypad_info_t joypad_info; - joypad_info.axis_threshold = input_driver_axis_threshold; joypad_info.joy_idx = settings->uints.input_joypad_map[port]; joypad_info.auto_binds = input_autoconf_binds[joypad_info.joy_idx]; @@ -690,6 +692,12 @@ int16_t input_state(unsigned port, unsigned device, } } +#ifdef HAVE_KEYMAPPER + if (input_driver_mapper) + input_mapper_state(input_driver_mapper, + &res, port, device, idx, id, clear); +#endif + #ifdef HAVE_OVERLAY if (overlay_ptr) input_state_overlay(overlay_ptr, &res, port, device, idx, id); @@ -700,12 +708,6 @@ int16_t input_state(unsigned port, unsigned device, input_remote_state(&res, port, device, idx, id); #endif -#ifdef HAVE_KEYMAPPER - if (input_driver_mapper) - input_mapper_state(input_driver_mapper, - &res, port, device, idx, id); -#endif - /* Don't allow turbo for D-pad. */ if (device == RETRO_DEVICE_JOYPAD && (id < RETRO_DEVICE_ID_JOYPAD_UP || id > RETRO_DEVICE_ID_JOYPAD_RIGHT)) diff --git a/input/input_mapper.c b/input/input_mapper.c index 42e4762040..b21d09ac22 100644 --- a/input/input_mapper.c +++ b/input/input_mapper.c @@ -81,6 +81,13 @@ void input_mapper_free(input_mapper_t *handle) free (handle); } +bool flag = false; + +bool input_mapper_button_pressed(input_mapper_t *handle, int id) +{ + return (handle->buttons >> id) & 1U; +} + void input_mapper_poll(input_mapper_t *handle) { int i, j; @@ -93,9 +100,6 @@ void input_mapper_poll(input_mapper_t *handle) device &= RETRO_DEVICE_MASK; - /* for now we only handle keyboard inputs */ - if (device != RETRO_DEVICE_KEYBOARD) - return; #ifdef HAVE_MENU if (menu_is_alive) return; @@ -103,31 +107,56 @@ void input_mapper_poll(input_mapper_t *handle) memset(handle->keys, 0, sizeof(handle->keys)); i = 0; - for (i = 0; i < MAX_USERS; i++) + if (device == RETRO_DEVICE_KEYBOARD) { - for (j = 0; j < RARCH_CUSTOM_BIND_LIST_END; j++) + for (i = 0; i < MAX_USERS; i++) { - if (j < RETROK_LAST) + for (j = 0; j < RARCH_CUSTOM_BIND_LIST_END; j++) { - if (input_state(i, RETRO_DEVICE_JOYPAD, 0, j) && - settings->uints.input_keymapper_ids[i][j] != RETROK_UNKNOWN) + if (j < RETROK_LAST) { - MAPPER_SET_KEY (handle, - settings->uints.input_keymapper_ids[i][j]); - input_keyboard_event(true, - settings->uints.input_keymapper_ids[i][j], - 0, 0, RETRO_DEVICE_KEYBOARD); - key_event[j] = true; - } - else - { - if (key_event[j] == false && + if (input_state(i, RETRO_DEVICE_JOYPAD, 0, j) && settings->uints.input_keymapper_ids[i][j] != RETROK_UNKNOWN) { - input_keyboard_event(false, + MAPPER_SET_KEY (handle, + settings->uints.input_keymapper_ids[i][j]); + input_keyboard_event(true, settings->uints.input_keymapper_ids[i][j], 0, 0, RETRO_DEVICE_KEYBOARD); + key_event[j] = true; } + else + { + if (key_event[j] == false && + settings->uints.input_keymapper_ids[i][j] != RETROK_UNKNOWN) + { + input_keyboard_event(false, + settings->uints.input_keymapper_ids[i][j], + 0, 0, RETRO_DEVICE_KEYBOARD); + } + } + } + } + } + } + if (device == RETRO_DEVICE_JOYPAD) + { + for (i = 0; i < MAX_USERS; i++) + { + for (j = 0; j < RARCH_CUSTOM_BIND_LIST_END; j++) + { + if(input_state(i, RETRO_DEVICE_JOYPAD, i, j)) + { + if (j != settings->uints.input_remap_ids[i][j]) + { + RARCH_LOG("remapped button pressed: old:%d new: %d\n", j, settings->uints.input_remap_ids[i][j]); + handle->buttons |= 1 << settings->uints.input_remap_ids[i][j]; + } + } + if(!input_state(i, RETRO_DEVICE_JOYPAD, i, j)) + { + if (j != settings->uints.input_remap_ids[i][j]) + handle->buttons &= ~(1 << settings->uints.input_remap_ids[i][j]); } } } @@ -140,24 +169,23 @@ void input_mapper_state( unsigned port, unsigned device, unsigned idx, - unsigned id) + unsigned id, + bool clear) { if (!handle) return; switch (device) { + case RETRO_DEVICE_JOYPAD: + /* we should get the new buttons here via input_remapper_button_pressed but it doesn't work because the old state is still there + so both actions trigger */ + if (input_mapper_button_pressed(handle, id)) + *ret = 1; + break; case RETRO_DEVICE_KEYBOARD: if (id < RETROK_LAST) { - /* - RARCH_LOG("State: UDLR %u %u %u %u\n", - MAPPER_GET_KEY(handle, RETROK_UP), - MAPPER_GET_KEY(handle, RETROK_DOWN), - MAPPER_GET_KEY(handle, RETROK_LEFT), - MAPPER_GET_KEY(handle, RETROK_RIGHT) - );*/ - if (MAPPER_GET_KEY(handle, id)) *ret |= 1; } @@ -165,4 +193,5 @@ void input_mapper_state( default: break; } + return; } diff --git a/input/input_mapper.h b/input/input_mapper.h index c50519acd8..fd40cba04d 100644 --- a/input/input_mapper.h +++ b/input/input_mapper.h @@ -37,7 +37,7 @@ void input_mapper_free(input_mapper_t *handle); void input_mapper_poll(input_mapper_t *handle); -bool input_mapper_key_pressed(int key); +bool input_mapper_key_pressed(input_mapper_t *handle, int key); void input_mapper_state( input_mapper_t *handle, @@ -45,7 +45,8 @@ void input_mapper_state( unsigned port, unsigned device, unsigned idx, - unsigned id); + unsigned id, + bool clear); RETRO_END_DECLS diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index cbfac887e2..ed1b625075 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -552,56 +552,29 @@ static void menu_action_setting_disp_set_label_input_desc( const struct retro_keybind *auto_bind = NULL; const struct retro_keybind *keybind = NULL; settings_t *settings = config_get_ptr(); - unsigned inp_desc_index_offset = - type - MENU_SETTINGS_INPUT_DESC_BEGIN; - unsigned inp_desc_user = inp_desc_index_offset / - (RARCH_FIRST_CUSTOM_BIND + 8); - unsigned inp_desc_button_index_offset = inp_desc_index_offset - - (inp_desc_user * (RARCH_FIRST_CUSTOM_BIND + 8)); - unsigned remap_id = 0; + + unsigned key_id, id, offset; + unsigned remap_id = 0; + + if (!settings) + return 0; + + offset = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) / (RARCH_FIRST_CUSTOM_BIND + 8); + + id = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) - (RARCH_FIRST_CUSTOM_BIND + 8) * offset; + + remap_id = + settings->uints.input_remap_ids[offset][id]; system = runloop_get_system_info(); if (!system) return; - descriptor = system->input_desc_btn[inp_desc_user][inp_desc_button_index_offset]; + descriptor = system->input_desc_btn[offset][remap_id]; - if (inp_desc_button_index_offset < RARCH_FIRST_CUSTOM_BIND + 8) - strlcpy(s, descriptor ? descriptor : "---", len); - else - { - switch (remap_id) - { - case 0: - descriptor = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS); - break; - case 1: - descriptor = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS); - break; - case 2: - descriptor = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS); - break; - case 3: - descriptor = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS); - break; - case 4: - descriptor = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS); - break; - case 5: - descriptor = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS); - break; - case 6: - descriptor = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS); - break; - case 7: - descriptor = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS); - break; - } - - if (!string_is_empty(descriptor)) - strlcpy(s, descriptor, len); - } + if (!string_is_empty(descriptor)) + strlcpy(s, descriptor, len); *w = 19; strlcpy(s2, path, len2); diff --git a/menu/cbs/menu_cbs_left.c b/menu/cbs/menu_cbs_left.c index 7619614734..f27952c779 100644 --- a/menu/cbs/menu_cbs_left.c +++ b/menu/cbs/menu_cbs_left.c @@ -90,19 +90,24 @@ static int action_left_cheat(unsigned type, const char *label, wraparound); } +/* fix-me: incomplete, lacks error checking */ static int action_left_input_desc(unsigned type, const char *label, - bool wraparound) + bool wraparound) { - unsigned inp_desc_index_offset = type - - MENU_SETTINGS_INPUT_DESC_BEGIN; - unsigned inp_desc_user = inp_desc_index_offset / - (RARCH_FIRST_CUSTOM_BIND + 4); - unsigned inp_desc_button_index_offset = inp_desc_index_offset - - (inp_desc_user * (RARCH_FIRST_CUSTOM_BIND + 4)); - settings_t *settings = config_get_ptr(); - if (settings->uints.input_remap_ids[inp_desc_user][inp_desc_button_index_offset] > 0) - settings->uints.input_remap_ids[inp_desc_user][inp_desc_button_index_offset]--; + unsigned key_id, id, offset; + unsigned remap_id = 0; + settings_t *settings = config_get_ptr(); + + if (!settings) + return 0; + + offset = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) / (RARCH_FIRST_CUSTOM_BIND + 8); + + id = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) - (RARCH_FIRST_CUSTOM_BIND + 8) * offset; + + if (settings->uints.input_remap_ids[offset][id] > 0) + settings->uints.input_remap_ids[offset][id]--; return 0; } diff --git a/menu/cbs/menu_cbs_right.c b/menu/cbs/menu_cbs_right.c index bf6838fb50..9dd8e1fd40 100644 --- a/menu/cbs/menu_cbs_right.c +++ b/menu/cbs/menu_cbs_right.c @@ -107,7 +107,6 @@ int action_right_input_desc_kbd(unsigned type, const char *label, { unsigned key_id, id, offset; unsigned remap_id; - char desc[PATH_MAX_LENGTH]; settings_t *settings = config_get_ptr(); if (!settings) @@ -129,6 +128,8 @@ int action_right_input_desc_kbd(unsigned type, const char *label, break; } + RARCH_LOG("o:%u t:%u i:%u r:%u\n", offset, type, id, remap_id); + if (key_id < RARCH_MAX_KEYS + MENU_SETTINGS_INPUT_DESC_KBD_BEGIN) key_id++; else @@ -140,26 +141,28 @@ int action_right_input_desc_kbd(unsigned type, const char *label, } #endif +/* fix-me: incomplete, lacks error checking */ int action_right_input_desc(unsigned type, const char *label, bool wraparound) { -unsigned inp_desc_index_offset = type - MENU_SETTINGS_INPUT_DESC_BEGIN; -unsigned inp_desc_user = inp_desc_index_offset / (RARCH_FIRST_CUSTOM_BIND + 4); -unsigned inp_desc_button_index_offset = inp_desc_index_offset - (inp_desc_user * (RARCH_FIRST_CUSTOM_BIND + 4)); -settings_t *settings = config_get_ptr(); -if (inp_desc_button_index_offset < RARCH_FIRST_CUSTOM_BIND) -{ - if (settings->uints.input_remap_ids[inp_desc_user][inp_desc_button_index_offset] < RARCH_FIRST_CUSTOM_BIND - 1) - settings->uints.input_remap_ids[inp_desc_user][inp_desc_button_index_offset]++; -} -else -{ - if (settings->uints.input_remap_ids[inp_desc_user][inp_desc_button_index_offset] < 4 - 1) - settings->uints.input_remap_ids[inp_desc_user][inp_desc_button_index_offset]++; -} + unsigned key_id, id, offset; + unsigned remap_id = 0; + settings_t *settings = config_get_ptr(); -return 0; + if (!settings) + return 0; + + offset = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) / (RARCH_FIRST_CUSTOM_BIND + 8); + + id = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) - (RARCH_FIRST_CUSTOM_BIND + 8) * offset; + + if (settings->uints.input_remap_ids[offset][id] < RARCH_FIRST_CUSTOM_BIND) + settings->uints.input_remap_ids[offset][id]++; + + RARCH_LOG("o:%u t:%u i:%u r:%u\n", offset, type, id, remap_id); + + return 0; } static int action_right_scroll(unsigned type, const char *label, diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 81403b20a6..3facf11794 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -426,7 +426,7 @@ static int action_bind_sublabel_subsystem_add( return 0; } -static int action_bind_sublabel_remap_sublabel( +static int action_bind_sublabel_remap_kbd_sublabel( file_list_t *list, unsigned type, unsigned i, const char *label, const char *path, @@ -451,6 +451,30 @@ static int action_bind_sublabel_remap_sublabel( return 0; } + +static int action_bind_sublabel_remap_sublabel( + file_list_t *list, + unsigned type, unsigned i, + const char *label, const char *path, + char *s, size_t len) +{ + char desc[PATH_MAX_LENGTH]; + unsigned offset; + settings_t *settings = config_get_ptr(); + + if (!settings) + return 0; + + offset = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) / (RARCH_FIRST_CUSTOM_BIND + 8); + + snprintf(s, len, "User #%d: %s", offset + 1, + input_config_get_device_display_name(offset) ? + input_config_get_device_display_name(offset) : + (input_config_get_device_name(offset) ? + input_config_get_device_name(offset) : "N/A")); + return 0; +} + #ifdef HAVE_NETWORKING static int action_bind_sublabel_netplay_room( file_list_t *list, @@ -513,10 +537,16 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, if (type >= MENU_SETTINGS_INPUT_DESC_KBD_BEGIN && type <= MENU_SETTINGS_INPUT_DESC_KBD_END) { - BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_remap_sublabel); + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_remap_kbd_sublabel); } #endif + if (type >= MENU_SETTINGS_INPUT_DESC_BEGIN + && type <= MENU_SETTINGS_INPUT_DESC_END) + { + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_remap_sublabel); + } + if (cbs->enum_idx != MSG_UNKNOWN) { switch (cbs->enum_idx) diff --git a/menu/menu_driver.h b/menu/menu_driver.h index ebc589b306..94195c73d9 100644 --- a/menu/menu_driver.h +++ b/menu/menu_driver.h @@ -206,9 +206,9 @@ enum menu_settings_type MENU_SETTINGS_CHEAT_BEGIN, MENU_SETTINGS_CHEAT_END = MENU_SETTINGS_CHEAT_BEGIN + (MAX_CHEAT_COUNTERS - 1), MENU_SETTINGS_INPUT_DESC_BEGIN, - MENU_SETTINGS_INPUT_DESC_END = MENU_SETTINGS_INPUT_DESC_BEGIN + (MAX_USERS * (RARCH_FIRST_CUSTOM_BIND + 4)), + MENU_SETTINGS_INPUT_DESC_END = MENU_SETTINGS_INPUT_DESC_BEGIN + ((RARCH_FIRST_CUSTOM_BIND + 8) * MAX_USERS), MENU_SETTINGS_INPUT_DESC_KBD_BEGIN, - MENU_SETTINGS_INPUT_DESC_KBD_END = (MENU_SETTINGS_INPUT_DESC_KBD_BEGIN + RARCH_MAX_KEYS) * MAX_USERS, + MENU_SETTINGS_INPUT_DESC_KBD_END = MENU_SETTINGS_INPUT_DESC_KBD_BEGIN + (RARCH_MAX_KEYS * MAX_USERS), MENU_SETTINGS_SUBSYSTEM_LOAD, From be2c648596b0332b80c2c1c5fa15f0a4209c4c98 Mon Sep 17 00:00:00 2001 From: radius Date: Mon, 2 Apr 2018 00:08:40 -0500 Subject: [PATCH 12/35] remap-redux part2: after 60 attempsts, new mapper works, N:1 mapping too --- input/input_driver.c | 21 ++++++++++++--------- input/input_mapper.c | 24 +++++++++--------------- menu/cbs/menu_cbs_get_value.c | 2 +- 3 files changed, 22 insertions(+), 25 deletions(-) diff --git a/input/input_driver.c b/input/input_driver.c index e3032c405c..d307f102a7 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -579,6 +579,8 @@ void input_poll(void) if (input_driver_block_libretro_input) return; + + for (i = 0; i < max_users; i++) { if (libretro_input_binds[i][RARCH_TURBO_ENABLE].valid) @@ -603,6 +605,11 @@ void input_poll(void) input_driver_axis_threshold); #endif +#ifdef HAVE_KEYMAPPER + if (input_driver_mapper) + input_mapper_poll(input_driver_mapper); +#endif + #ifdef HAVE_COMMAND if (input_driver_command) command_poll(input_driver_command); @@ -612,11 +619,6 @@ void input_poll(void) if (input_driver_remote) input_remote_poll(input_driver_remote, max_users); #endif - -#ifdef HAVE_KEYMAPPER - if (input_driver_mapper) - input_mapper_poll(input_driver_mapper); -#endif } /** @@ -659,9 +661,7 @@ int16_t input_state(unsigned port, unsigned device, { case RETRO_DEVICE_JOYPAD: if (id != settings->uints.input_remap_ids[port][id]) - { clear = true; - } break; case RETRO_DEVICE_ANALOG: @@ -687,8 +687,11 @@ int16_t input_state(unsigned port, unsigned device, joypad_info.joy_idx = settings->uints.input_joypad_map[port]; joypad_info.auto_binds = input_autoconf_binds[joypad_info.joy_idx]; - res = current_input->input_state( - current_input_data, joypad_info, libretro_input_binds, port, device, idx, id); + if (!clear) + res = current_input->input_state( + current_input_data, joypad_info, libretro_input_binds, port, device, idx, id); + else + res = 0; } } diff --git a/input/input_mapper.c b/input/input_mapper.c index b21d09ac22..6dcd2de98e 100644 --- a/input/input_mapper.c +++ b/input/input_mapper.c @@ -58,7 +58,7 @@ struct input_mapper /* the whole keyboard state */ uint32_t keys[RETROK_LAST / 32 + 1]; /* This is a bitmask of (1 << key_bind_id). */ - uint64_t buttons; + retro_bits_t buttons; }; input_mapper_t *input_mapper_new(uint16_t port) @@ -85,7 +85,7 @@ bool flag = false; bool input_mapper_button_pressed(input_mapper_t *handle, int id) { - return (handle->buttons >> id) & 1U; + return BIT256_GET(handle->buttons, id); } void input_mapper_poll(input_mapper_t *handle) @@ -141,23 +141,17 @@ void input_mapper_poll(input_mapper_t *handle) } if (device == RETRO_DEVICE_JOYPAD) { + retro_bits_t current_input; + input_keys_pressed(settings, ¤t_input); + BIT256_CLEAR_ALL(handle->buttons); for (i = 0; i < MAX_USERS; i++) { for (j = 0; j < RARCH_CUSTOM_BIND_LIST_END; j++) { - if(input_state(i, RETRO_DEVICE_JOYPAD, i, j)) - { - if (j != settings->uints.input_remap_ids[i][j]) - { - RARCH_LOG("remapped button pressed: old:%d new: %d\n", j, settings->uints.input_remap_ids[i][j]); - handle->buttons |= 1 << settings->uints.input_remap_ids[i][j]; - } - } - if(!input_state(i, RETRO_DEVICE_JOYPAD, i, j)) - { - if (j != settings->uints.input_remap_ids[i][j]) - handle->buttons &= ~(1 << settings->uints.input_remap_ids[i][j]); - } + int aux = BIT256_GET(current_input, j); + int remap = settings->uints.input_remap_ids[i][j]; + if (aux == 1 && j != remap) + BIT256_SET(handle->buttons, remap); } } } diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index ed1b625075..e19a4db51f 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -557,7 +557,7 @@ static void menu_action_setting_disp_set_label_input_desc( unsigned remap_id = 0; if (!settings) - return 0; + return; offset = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) / (RARCH_FIRST_CUSTOM_BIND + 8); From f7b94e5f66ae1cb9cfe3c8ae88504efcb4596a08 Mon Sep 17 00:00:00 2001 From: radius Date: Mon, 2 Apr 2018 20:27:51 -0500 Subject: [PATCH 13/35] remap-redux part2: clean up gamepad mapper callbacks --- menu/cbs/menu_cbs_get_value.c | 11 +++++------ menu/cbs/menu_cbs_left.c | 14 +++++--------- menu/cbs/menu_cbs_right.c | 14 +++++--------- 3 files changed, 15 insertions(+), 24 deletions(-) diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index e19a4db51f..489da78c4d 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -553,25 +553,24 @@ static void menu_action_setting_disp_set_label_input_desc( const struct retro_keybind *keybind = NULL; settings_t *settings = config_get_ptr(); - unsigned key_id, id, offset; + unsigned btn_idx, user_idx; unsigned remap_id = 0; if (!settings) return; - offset = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) / (RARCH_FIRST_CUSTOM_BIND + 8); - - id = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) - (RARCH_FIRST_CUSTOM_BIND + 8) * offset; + user_idx = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) / (RARCH_FIRST_CUSTOM_BIND + 8); + btn_idx = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) - (RARCH_FIRST_CUSTOM_BIND + 8) * user_idx; remap_id = - settings->uints.input_remap_ids[offset][id]; + settings->uints.input_remap_ids[user_idx][btn_idx]; system = runloop_get_system_info(); if (!system) return; - descriptor = system->input_desc_btn[offset][remap_id]; + descriptor = system->input_desc_btn[user_idx][remap_id]; if (!string_is_empty(descriptor)) strlcpy(s, descriptor, len); diff --git a/menu/cbs/menu_cbs_left.c b/menu/cbs/menu_cbs_left.c index f27952c779..a4015d1c6d 100644 --- a/menu/cbs/menu_cbs_left.c +++ b/menu/cbs/menu_cbs_left.c @@ -90,24 +90,20 @@ static int action_left_cheat(unsigned type, const char *label, wraparound); } -/* fix-me: incomplete, lacks error checking */ static int action_left_input_desc(unsigned type, const char *label, bool wraparound) { - - unsigned key_id, id, offset; - unsigned remap_id = 0; + unsigned btn_idx, user_idx; settings_t *settings = config_get_ptr(); if (!settings) return 0; - offset = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) / (RARCH_FIRST_CUSTOM_BIND + 8); + user_idx = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) / (RARCH_FIRST_CUSTOM_BIND + 8); + btn_idx = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) - (RARCH_FIRST_CUSTOM_BIND + 8) * user_idx; - id = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) - (RARCH_FIRST_CUSTOM_BIND + 8) * offset; - - if (settings->uints.input_remap_ids[offset][id] > 0) - settings->uints.input_remap_ids[offset][id]--; + if (settings->uints.input_remap_ids[user_idx][btn_idx] > 0) + settings->uints.input_remap_ids[user_idx][btn_idx]--; return 0; } diff --git a/menu/cbs/menu_cbs_right.c b/menu/cbs/menu_cbs_right.c index 9dd8e1fd40..44141a1b05 100644 --- a/menu/cbs/menu_cbs_right.c +++ b/menu/cbs/menu_cbs_right.c @@ -146,21 +146,17 @@ int action_right_input_desc(unsigned type, const char *label, bool wraparound) { - unsigned key_id, id, offset; - unsigned remap_id = 0; + unsigned btn_idx, user_idx; settings_t *settings = config_get_ptr(); if (!settings) return 0; - offset = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) / (RARCH_FIRST_CUSTOM_BIND + 8); + user_idx = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) / (RARCH_FIRST_CUSTOM_BIND + 8); + btn_idx = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) - (RARCH_FIRST_CUSTOM_BIND + 8) * user_idx; - id = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) - (RARCH_FIRST_CUSTOM_BIND + 8) * offset; - - if (settings->uints.input_remap_ids[offset][id] < RARCH_FIRST_CUSTOM_BIND) - settings->uints.input_remap_ids[offset][id]++; - - RARCH_LOG("o:%u t:%u i:%u r:%u\n", offset, type, id, remap_id); + if (settings->uints.input_remap_ids[user_idx][btn_idx] < RARCH_FIRST_CUSTOM_BIND) + settings->uints.input_remap_ids[user_idx][btn_idx]++; return 0; } From e71826e3d64e9207503d634b7df910072f268e43 Mon Sep 17 00:00:00 2001 From: radius Date: Mon, 2 Apr 2018 20:29:47 -0500 Subject: [PATCH 14/35] remap-redux part2: clean up gamepad mapper callbacks --- menu/cbs/menu_cbs_get_value.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index 489da78c4d..5c3f92c50c 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -547,14 +547,13 @@ static void menu_action_setting_disp_set_label_input_desc( const char *path, char *s2, size_t len2) { - rarch_system_info_t *system = NULL; - const char* descriptor = NULL; + rarch_system_info_t *system = NULL; + settings_t *settings = config_get_ptr(); + const char* descriptor = NULL; const struct retro_keybind *auto_bind = NULL; const struct retro_keybind *keybind = NULL; - settings_t *settings = config_get_ptr(); - unsigned btn_idx, user_idx; - unsigned remap_id = 0; + unsigned btn_idx, user_idx, remap_idx; if (!settings) return; @@ -562,7 +561,7 @@ static void menu_action_setting_disp_set_label_input_desc( user_idx = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) / (RARCH_FIRST_CUSTOM_BIND + 8); btn_idx = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) - (RARCH_FIRST_CUSTOM_BIND + 8) * user_idx; - remap_id = + remap_idx = settings->uints.input_remap_ids[user_idx][btn_idx]; system = runloop_get_system_info(); @@ -570,7 +569,7 @@ static void menu_action_setting_disp_set_label_input_desc( if (!system) return; - descriptor = system->input_desc_btn[user_idx][remap_id]; + descriptor = system->input_desc_btn[user_idx][remap_idx]; if (!string_is_empty(descriptor)) strlcpy(s, descriptor, len); From 921a30da88f1977d68b1afa158a6b2e6bab66311 Mon Sep 17 00:00:00 2001 From: radius Date: Mon, 2 Apr 2018 21:12:05 -0500 Subject: [PATCH 15/35] remap-redux part2: add empty description --- menu/cbs/menu_cbs_get_value.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index 5c3f92c50c..07382ac111 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -573,6 +573,9 @@ static void menu_action_setting_disp_set_label_input_desc( if (!string_is_empty(descriptor)) strlcpy(s, descriptor, len); + else + strlcpy(s, "---", len); + *w = 19; strlcpy(s2, path, len2); From 058b4cea7958d0fba9038f003e0f0beb58e72008 Mon Sep 17 00:00:00 2001 From: radius Date: Mon, 2 Apr 2018 21:22:09 -0500 Subject: [PATCH 16/35] remap-redux part2: add empty description to analogs that are currently not implemented --- menu/cbs/menu_cbs_get_value.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index 07382ac111..838e0d413a 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -569,7 +569,8 @@ static void menu_action_setting_disp_set_label_input_desc( if (!system) return; - descriptor = system->input_desc_btn[user_idx][remap_idx]; + if (btn_idx < RARCH_FIRST_CUSTOM_BIND) + descriptor = system->input_desc_btn[user_idx][remap_idx]; if (!string_is_empty(descriptor)) strlcpy(s, descriptor, len); From 59da4b880e65921205ae00892268e8ec9931c44d Mon Sep 17 00:00:00 2001 From: radius Date: Mon, 2 Apr 2018 21:47:10 -0500 Subject: [PATCH 17/35] remap-redux part2: add empty description to analogs that are currently not remappable --- menu/cbs/menu_cbs_get_value.c | 1 - menu/cbs/menu_cbs_right.c | 5 +++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index 838e0d413a..387594ddf2 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -580,7 +580,6 @@ static void menu_action_setting_disp_set_label_input_desc( *w = 19; strlcpy(s2, path, len2); - } #ifdef HAVE_KEYMAPPER diff --git a/menu/cbs/menu_cbs_right.c b/menu/cbs/menu_cbs_right.c index 44141a1b05..88c42f0549 100644 --- a/menu/cbs/menu_cbs_right.c +++ b/menu/cbs/menu_cbs_right.c @@ -155,6 +155,11 @@ int action_right_input_desc(unsigned type, const char *label, user_idx = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) / (RARCH_FIRST_CUSTOM_BIND + 8); btn_idx = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) - (RARCH_FIRST_CUSTOM_BIND + 8) * user_idx; +#if 1 + for (int i = 0; i < RARCH_FIRST_CUSTOM_BIND; i++) + RARCH_LOG("[remap-debug]: user %d button %d new id %d\n", user_idx, i, settings->uints.input_remap_ids[user_idx][i]); +#endif + if (settings->uints.input_remap_ids[user_idx][btn_idx] < RARCH_FIRST_CUSTOM_BIND) settings->uints.input_remap_ids[user_idx][btn_idx]++; From 23331aa48412a41e3f2f54e4644b738251da7c6f Mon Sep 17 00:00:00 2001 From: radius Date: Mon, 2 Apr 2018 22:05:48 -0500 Subject: [PATCH 18/35] remap-redux part2: wraparound --- menu/cbs/menu_cbs_get_value.c | 6 +----- menu/cbs/menu_cbs_left.c | 14 +++++++++++--- menu/cbs/menu_cbs_right.c | 27 ++++++++++++++++++--------- 3 files changed, 30 insertions(+), 17 deletions(-) diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index 387594ddf2..5233673a5c 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -547,11 +547,9 @@ static void menu_action_setting_disp_set_label_input_desc( const char *path, char *s2, size_t len2) { - rarch_system_info_t *system = NULL; + rarch_system_info_t *system = runloop_get_system_info(); settings_t *settings = config_get_ptr(); const char* descriptor = NULL; - const struct retro_keybind *auto_bind = NULL; - const struct retro_keybind *keybind = NULL; unsigned btn_idx, user_idx, remap_idx; @@ -564,8 +562,6 @@ static void menu_action_setting_disp_set_label_input_desc( remap_idx = settings->uints.input_remap_ids[user_idx][btn_idx]; - system = runloop_get_system_info(); - if (!system) return; diff --git a/menu/cbs/menu_cbs_left.c b/menu/cbs/menu_cbs_left.c index a4015d1c6d..4bc7b093a1 100644 --- a/menu/cbs/menu_cbs_left.c +++ b/menu/cbs/menu_cbs_left.c @@ -93,10 +93,11 @@ static int action_left_cheat(unsigned type, const char *label, static int action_left_input_desc(unsigned type, const char *label, bool wraparound) { - unsigned btn_idx, user_idx; - settings_t *settings = config_get_ptr(); + rarch_system_info_t *system = runloop_get_system_info(); + settings_t *settings = config_get_ptr(); + unsigned btn_idx, user_idx, remap_idx; - if (!settings) + if (!settings || !system) return 0; user_idx = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) / (RARCH_FIRST_CUSTOM_BIND + 8); @@ -104,6 +105,13 @@ static int action_left_input_desc(unsigned type, const char *label, if (settings->uints.input_remap_ids[user_idx][btn_idx] > 0) settings->uints.input_remap_ids[user_idx][btn_idx]--; + else + settings->uints.input_remap_ids[user_idx][btn_idx] = RARCH_FIRST_CUSTOM_BIND; + + /* skip the not used button (unless they are at the end by calling the right desc function recursively */ + remap_idx = settings->uints.input_remap_ids[user_idx][btn_idx]; + if (string_is_empty(system->input_desc_btn[user_idx][remap_idx]) && remap_idx < RARCH_FIRST_CUSTOM_BIND) + action_left_input_desc(type, label, wraparound); return 0; } diff --git a/menu/cbs/menu_cbs_right.c b/menu/cbs/menu_cbs_right.c index 88c42f0549..dd984f7856 100644 --- a/menu/cbs/menu_cbs_right.c +++ b/menu/cbs/menu_cbs_right.c @@ -145,23 +145,32 @@ int action_right_input_desc_kbd(unsigned type, const char *label, int action_right_input_desc(unsigned type, const char *label, bool wraparound) { + rarch_system_info_t *system = runloop_get_system_info(); + settings_t *settings = config_get_ptr(); + unsigned btn_idx, user_idx, remap_idx; - unsigned btn_idx, user_idx; - settings_t *settings = config_get_ptr(); - - if (!settings) + if (!settings || !system) return 0; user_idx = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) / (RARCH_FIRST_CUSTOM_BIND + 8); btn_idx = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) - (RARCH_FIRST_CUSTOM_BIND + 8) * user_idx; -#if 1 - for (int i = 0; i < RARCH_FIRST_CUSTOM_BIND; i++) - RARCH_LOG("[remap-debug]: user %d button %d new id %d\n", user_idx, i, settings->uints.input_remap_ids[user_idx][i]); -#endif - if (settings->uints.input_remap_ids[user_idx][btn_idx] < RARCH_FIRST_CUSTOM_BIND) settings->uints.input_remap_ids[user_idx][btn_idx]++; + else + settings->uints.input_remap_ids[user_idx][btn_idx] = 0; + + /* skip the not used button (unless they are at the end by calling the right desc function recursively */ + remap_idx = settings->uints.input_remap_ids[user_idx][btn_idx]; + if (string_is_empty(system->input_desc_btn[user_idx][remap_idx]) && remap_idx < RARCH_FIRST_CUSTOM_BIND) + action_right_input_desc(type, label, wraparound); + +#if 0 + int i = 0; + RARCH_LOG("[remap-debug] new descriptor for %d: %s\n", remap_idx, system->input_desc_btn[user_idx][remap_idx]); + for (i = 0; i < RARCH_FIRST_CUSTOM_BIND; i++) + RARCH_LOG("[remap-debug]: user %d button %d new id %d\n", user_idx, i, settings->uints.input_remap_ids[user_idx][i]); +#endif return 0; } From 5efba1c257b5ab2be91b76d1e850d25472b522b4 Mon Sep 17 00:00:00 2001 From: radius Date: Tue, 3 Apr 2018 00:21:33 -0500 Subject: [PATCH 19/35] remap-redux part2: better wraparound, skip analogs, add RARCH_UNMAPPED --- input/input_defines.h | 2 ++ input/input_driver.c | 7 ---- input/input_mapper.c | 63 +++++++++++++++++++++++++++++++---- input/input_remapping.c | 23 ++++++++----- menu/cbs/menu_cbs_get_value.c | 3 ++ menu/cbs/menu_cbs_left.c | 14 ++++++-- menu/cbs/menu_cbs_right.c | 15 ++++++--- 7 files changed, 97 insertions(+), 30 deletions(-) diff --git a/input/input_defines.h b/input/input_defines.h index a7be2367d3..12e2be7e97 100644 --- a/input/input_defines.h +++ b/input/input_defines.h @@ -35,6 +35,8 @@ RETRO_BEGIN_DECLS #define RARCH_FIRST_MISC_CUSTOM_BIND RARCH_LIGHTGUN_BIND_LIST_END #define RARCH_FIRST_META_KEY RARCH_CUSTOM_BIND_LIST_END +#define RARCH_UNMAPPED 1024 + /* RetroArch specific bind IDs. */ enum { diff --git a/input/input_driver.c b/input/input_driver.c index d307f102a7..1e694ef4e0 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -666,13 +666,6 @@ int16_t input_state(unsigned port, unsigned device, break; case RETRO_DEVICE_ANALOG: if (idx < 2 && id < 2) - { - unsigned new_id = RARCH_FIRST_CUSTOM_BIND + (idx * 2 + id); - - new_id = settings->uints.input_remap_ids[port][new_id]; - idx = (new_id & 2) >> 1; - id = new_id & 1; - } break; } } diff --git a/input/input_mapper.c b/input/input_mapper.c index 6dcd2de98e..64c95cf02d 100644 --- a/input/input_mapper.c +++ b/input/input_mapper.c @@ -92,7 +92,10 @@ void input_mapper_poll(input_mapper_t *handle) { int i, j; settings_t *settings = config_get_ptr(); + retro_bits_t current_input; unsigned device = settings->uints.input_libretro_device[handle->port]; + unsigned current_button_value; + unsigned remap_button; bool key_event[RARCH_CUSTOM_BIND_LIST_END]; #ifdef HAVE_MENU bool menu_is_alive = menu_driver_is_alive(); @@ -141,18 +144,66 @@ void input_mapper_poll(input_mapper_t *handle) } if (device == RETRO_DEVICE_JOYPAD) { - retro_bits_t current_input; input_keys_pressed(settings, ¤t_input); BIT256_CLEAR_ALL(handle->buttons); for (i = 0; i < MAX_USERS; i++) { - for (j = 0; j < RARCH_CUSTOM_BIND_LIST_END; j++) + /* this loop iterates on all users and all buttons, and checks if a pressed button + is assigned to any other button than the default one, then it sets the bit on the + mapper input bitmap, later on the original input is cleared in input_state */ + + for (j = 0; j < RARCH_FIRST_CUSTOM_BIND; j++) { - int aux = BIT256_GET(current_input, j); - int remap = settings->uints.input_remap_ids[i][j]; - if (aux == 1 && j != remap) - BIT256_SET(handle->buttons, remap); + current_button_value = BIT256_GET(current_input, j); + remap_button = settings->uints.input_remap_ids[i][j]; + if (current_button_value == 1 && j != remap_button && + remap_button != RARCH_UNMAPPED) + BIT256_SET(handle->buttons, remap_button); } +#if 0 + /* --CURRENTLY NOT IMPLEMENTED-- + this loop should iterate on all users and all analog stick axes and if the axes are + moved and is assigned to a button it should set the bit on the mapper input bitmap. + Once implemented we should make sure to clear the original analog + stick input in input_state in input_driver.c */ + + for (j = RARCH_FIRST_CUSTOM_BIND; j < RARCH_CUSTOM_BIND_LIST_END; j++) + { + + } +#endif + } + } + if (device == RETRO_DEVICE_ANALOG) + { + input_keys_pressed(settings, ¤t_input); + BIT256_CLEAR_ALL(handle->buttons); + for (i = 0; i < MAX_USERS; i++) + { + /* this loop iterates on all users and all buttons, and checks if a pressed button + is assigned to any other button than the default one, then it sets the bit on the + mapper input bitmap, later on the original input is cleared in input_state */ + + for (j = 0; j < RARCH_FIRST_CUSTOM_BIND; j++) + { + current_button_value = BIT256_GET(current_input, j); + remap_button = settings->uints.input_remap_ids[i][j]; + if (current_button_value == 1 && j != remap_button && + remap_button != RARCH_UNMAPPED) + BIT256_SET(handle->buttons, remap_button); + } +#if 0 + /* --CURRENTLY NOT IMPLEMENTED-- + this loop should iterate on all users and all analog stick axes and if the axes are + moved and is assigned to a button or another stick, it should set the bit on the + mapper input bitmap. Once implemented we should make sure to clear the original analog + stick input in input_state in input_driver.c */ + + for (j = RARCH_FIRST_CUSTOM_BIND; j < RARCH_CUSTOM_BIND_LIST_END; j++) + { + + } +#endif } } } diff --git a/input/input_remapping.c b/input/input_remapping.c index e820c162cd..43431a17fd 100644 --- a/input/input_remapping.c +++ b/input/input_remapping.c @@ -73,18 +73,21 @@ bool input_remapping_load_file(void *data, const char *path) for (j = 0; j < RARCH_FIRST_CUSTOM_BIND + 4; j++) { - int key_remap = -1; + int btn_remap = -1; fill_pathname_join_delim(key_ident[j], s1, key_strings[j], '_', sizeof(key_ident[j])); fill_pathname_join_delim(keymapper_ident[j], s2, key_strings[j], '_', sizeof(key_ident[j])); - if (config_get_int(conf, key_ident[j], &key_remap) - && key_remap < RARCH_FIRST_CUSTOM_BIND) - settings->uints.input_remap_ids[i][j] = key_remap; + if (config_get_int(conf, key_ident[j], &btn_remap) + && (btn_remap < RARCH_FIRST_CUSTOM_BIND && btn_remap != -1)) + settings->uints.input_remap_ids[i][j] = btn_remap; + else if (config_get_int(conf, key_ident[j], &btn_remap) + && (btn_remap == -1)) + settings->uints.input_remap_ids[i][j] = RARCH_UNMAPPED; - key_remap = -1; + int key_remap = -1; if (config_get_int(conf, keymapper_ident[j], &key_remap)) settings->uints.input_keymapper_ids[i][j] = key_remap; @@ -96,7 +99,7 @@ bool input_remapping_load_file(void *data, const char *path) for (j = 0; j < 4; j++) { - int key_remap = -1; + int btn_remap = -1; snprintf(key_ident[RARCH_FIRST_CUSTOM_BIND + j], sizeof(key_ident[RARCH_FIRST_CUSTOM_BIND + j]), @@ -105,9 +108,9 @@ bool input_remapping_load_file(void *data, const char *path) key_strings[RARCH_FIRST_CUSTOM_BIND + j]); if (config_get_int(conf, key_ident[RARCH_FIRST_CUSTOM_BIND + j], - &key_remap) && (key_remap < 4)) + &btn_remap) && (btn_remap < 4)) settings->uints.input_remap_ids[i][RARCH_FIRST_CUSTOM_BIND + j] = - key_remap; + btn_remap; } snprintf(s1, sizeof(s1), "input_player%u_analog_dpad_mode", i + 1); @@ -189,8 +192,10 @@ bool input_remapping_save_file(const char *path) /* only save values that have been modified */ if(j < RARCH_FIRST_CUSTOM_BIND) { - if(settings->uints.input_remap_ids[i][j] != j) + if(settings->uints.input_remap_ids[i][j] != j && settings->uints.input_remap_ids[i][j] != RARCH_UNMAPPED) config_set_int(conf, key_ident[j], settings->uints.input_remap_ids[i][j]); + else if (settings->uints.input_remap_ids[i][j] != j && settings->uints.input_remap_ids[i][j] == RARCH_UNMAPPED) + config_set_int(conf, key_ident[j], -1); else config_unset(conf,key_ident[j]); diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index 5233673a5c..f6bcfd117e 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -562,6 +562,9 @@ static void menu_action_setting_disp_set_label_input_desc( remap_idx = settings->uints.input_remap_ids[user_idx][btn_idx]; + if (remap_idx == RARCH_UNMAPPED) + settings->uints.input_remap_ids[user_idx][btn_idx] = RARCH_UNMAPPED; + if (!system) return; diff --git a/menu/cbs/menu_cbs_left.c b/menu/cbs/menu_cbs_left.c index 4bc7b093a1..98e96b721b 100644 --- a/menu/cbs/menu_cbs_left.c +++ b/menu/cbs/menu_cbs_left.c @@ -103,14 +103,22 @@ static int action_left_input_desc(unsigned type, const char *label, user_idx = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) / (RARCH_FIRST_CUSTOM_BIND + 8); btn_idx = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) - (RARCH_FIRST_CUSTOM_BIND + 8) * user_idx; + if (settings->uints.input_remap_ids[user_idx][btn_idx] == RARCH_UNMAPPED) + settings->uints.input_remap_ids[user_idx][btn_idx] = RARCH_CUSTOM_BIND_LIST_END - 1; + if (settings->uints.input_remap_ids[user_idx][btn_idx] > 0) settings->uints.input_remap_ids[user_idx][btn_idx]--; + else if (settings->uints.input_remap_ids[user_idx][btn_idx] == 0) + settings->uints.input_remap_ids[user_idx][btn_idx] = RARCH_UNMAPPED; else - settings->uints.input_remap_ids[user_idx][btn_idx] = RARCH_FIRST_CUSTOM_BIND; + settings->uints.input_remap_ids[user_idx][btn_idx] = RARCH_CUSTOM_BIND_LIST_END - 1; - /* skip the not used button (unless they are at the end by calling the right desc function recursively */ remap_idx = settings->uints.input_remap_ids[user_idx][btn_idx]; - if (string_is_empty(system->input_desc_btn[user_idx][remap_idx]) && remap_idx < RARCH_FIRST_CUSTOM_BIND) + + /* skip the not used buttons (unless they are at the end by calling the right desc function recursively + also skip all the axes until analog remapping is implemented */ + if ((string_is_empty(system->input_desc_btn[user_idx][remap_idx]) && remap_idx < RARCH_CUSTOM_BIND_LIST_END) || + (remap_idx >= RARCH_FIRST_CUSTOM_BIND && remap_idx < RARCH_CUSTOM_BIND_LIST_END)) action_left_input_desc(type, label, wraparound); return 0; diff --git a/menu/cbs/menu_cbs_right.c b/menu/cbs/menu_cbs_right.c index dd984f7856..ee6cbd85b2 100644 --- a/menu/cbs/menu_cbs_right.c +++ b/menu/cbs/menu_cbs_right.c @@ -155,20 +155,25 @@ int action_right_input_desc(unsigned type, const char *label, user_idx = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) / (RARCH_FIRST_CUSTOM_BIND + 8); btn_idx = (type - MENU_SETTINGS_INPUT_DESC_BEGIN) - (RARCH_FIRST_CUSTOM_BIND + 8) * user_idx; - if (settings->uints.input_remap_ids[user_idx][btn_idx] < RARCH_FIRST_CUSTOM_BIND) + if (settings->uints.input_remap_ids[user_idx][btn_idx] < RARCH_CUSTOM_BIND_LIST_END - 1) settings->uints.input_remap_ids[user_idx][btn_idx]++; + else if (settings->uints.input_remap_ids[user_idx][btn_idx] == RARCH_CUSTOM_BIND_LIST_END - 1) + settings->uints.input_remap_ids[user_idx][btn_idx] = RARCH_UNMAPPED; else settings->uints.input_remap_ids[user_idx][btn_idx] = 0; - /* skip the not used button (unless they are at the end by calling the right desc function recursively */ remap_idx = settings->uints.input_remap_ids[user_idx][btn_idx]; - if (string_is_empty(system->input_desc_btn[user_idx][remap_idx]) && remap_idx < RARCH_FIRST_CUSTOM_BIND) + + /* skip the not used buttons (unless they are at the end by calling the right desc function recursively + also skip all the axes until analog remapping is implemented */ + if ((string_is_empty(system->input_desc_btn[user_idx][remap_idx]) && remap_idx < RARCH_CUSTOM_BIND_LIST_END) || + (remap_idx >= RARCH_FIRST_CUSTOM_BIND && remap_idx < RARCH_CUSTOM_BIND_LIST_END)) action_right_input_desc(type, label, wraparound); #if 0 int i = 0; - RARCH_LOG("[remap-debug] new descriptor for %d: %s\n", remap_idx, system->input_desc_btn[user_idx][remap_idx]); - for (i = 0; i < RARCH_FIRST_CUSTOM_BIND; i++) + //RARCH_LOG("[remap-debug] new descriptor for %d: %s\n", remap_idx, system->input_desc_btn[user_idx][remap_idx]); + for (i = 0; i < RARCH_ANALOG_BIND_LIST_END; i++) RARCH_LOG("[remap-debug]: user %d button %d new id %d\n", user_idx, i, settings->uints.input_remap_ids[user_idx][i]); #endif From e130afff739a9025b4b48be847020a23c18b429f Mon Sep 17 00:00:00 2001 From: radius Date: Tue, 3 Apr 2018 00:28:10 -0500 Subject: [PATCH 20/35] remap-redux part2: cleanup --- input/input_driver.c | 5 +++-- input/input_mapper.c | 6 +----- input/input_mapper.h | 3 +-- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/input/input_driver.c b/input/input_driver.c index 1e694ef4e0..3432549352 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -673,9 +673,10 @@ int16_t input_state(unsigned port, unsigned device, if (((id < RARCH_FIRST_META_KEY) || (device == RETRO_DEVICE_KEYBOARD))) { bool bind_valid = libretro_input_binds[port] && libretro_input_binds[port][id].valid; - rarch_joypad_info_t joypad_info; + if (bind_valid || device == RETRO_DEVICE_KEYBOARD) { + rarch_joypad_info_t joypad_info; joypad_info.axis_threshold = input_driver_axis_threshold; joypad_info.joy_idx = settings->uints.input_joypad_map[port]; joypad_info.auto_binds = input_autoconf_binds[joypad_info.joy_idx]; @@ -691,7 +692,7 @@ int16_t input_state(unsigned port, unsigned device, #ifdef HAVE_KEYMAPPER if (input_driver_mapper) input_mapper_state(input_driver_mapper, - &res, port, device, idx, id, clear); + &res, port, device, idx, id); #endif #ifdef HAVE_OVERLAY diff --git a/input/input_mapper.c b/input/input_mapper.c index 64c95cf02d..e97ce1974f 100644 --- a/input/input_mapper.c +++ b/input/input_mapper.c @@ -47,7 +47,6 @@ #define MAPPER_GET_KEY(state, key) (((state)->keys[(key) / 32] >> ((key) % 32)) & 1) #define MAPPER_SET_KEY(state, key) (state)->keys[(key) / 32] |= 1 << ((key) % 32) -#define MAPPER_UNSET_KEY(state, key) (state)->keys[(key) / 32] |= 0 << ((key) % 32) struct input_mapper { @@ -214,8 +213,7 @@ void input_mapper_state( unsigned port, unsigned device, unsigned idx, - unsigned id, - bool clear) + unsigned id) { if (!handle) return; @@ -223,8 +221,6 @@ void input_mapper_state( switch (device) { case RETRO_DEVICE_JOYPAD: - /* we should get the new buttons here via input_remapper_button_pressed but it doesn't work because the old state is still there - so both actions trigger */ if (input_mapper_button_pressed(handle, id)) *ret = 1; break; diff --git a/input/input_mapper.h b/input/input_mapper.h index fd40cba04d..5f2b91e51b 100644 --- a/input/input_mapper.h +++ b/input/input_mapper.h @@ -45,8 +45,7 @@ void input_mapper_state( unsigned port, unsigned device, unsigned idx, - unsigned id, - bool clear); + unsigned id); RETRO_END_DECLS From 958216ede9d0b2f16c60f1e60e24c39d25854ba6 Mon Sep 17 00:00:00 2001 From: radius Date: Tue, 3 Apr 2018 00:30:58 -0500 Subject: [PATCH 21/35] remap-redux part2: change remap file labels because old ones are incompatible --- input/input_remapping.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/input/input_remapping.c b/input/input_remapping.c index 43431a17fd..370e31a6a9 100644 --- a/input/input_remapping.c +++ b/input/input_remapping.c @@ -68,7 +68,7 @@ bool input_remapping_load_file(void *data, const char *path) s1[0] = '\0'; s2[0] = '\0'; - snprintf(s1, sizeof(s1), "input_player%u", i + 1); + snprintf(s1, sizeof(s1), "input_player%u_btn", i + 1); snprintf(s2, sizeof(s2), "input_player%u_key", i + 1); for (j = 0; j < RARCH_FIRST_CUSTOM_BIND + 4; j++) @@ -179,7 +179,7 @@ bool input_remapping_save_file(const char *path) s1[0] = '\0'; s2[0] = '\0'; - snprintf(s1, sizeof(s1), "input_player%u", i + 1); + snprintf(s1, sizeof(s1), "input_player%u_btn", i + 1); snprintf(s2, sizeof(s2), "input_player%u_key", i + 1); for (j = 0; j < RARCH_FIRST_CUSTOM_BIND + 4; j++) From 2415f821afe5b190a5baba16523c8abafdbc8f4e Mon Sep 17 00:00:00 2001 From: radius Date: Tue, 3 Apr 2018 00:34:20 -0500 Subject: [PATCH 22/35] remap-redux part2: hide analogs for now --- menu/menu_displaylist.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index b3ba5fb744..106c16f445 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -3249,7 +3249,8 @@ static int menu_displaylist_parse_options_remappings( if (device == RETRO_DEVICE_JOYPAD || device == RETRO_DEVICE_ANALOG) { - for (retro_id = 0; retro_id < RARCH_FIRST_CUSTOM_BIND + 8; retro_id++) + /* change to RARCH_FIRST_CUSTOM_BIND + 8 once analog remapping is implemented */ + for (retro_id = 0; retro_id < RARCH_FIRST_CUSTOM_BIND; retro_id++) { char desc_label[64]; unsigned user = p + 1; From e42e79db28d451730b854d12032627a69d488109 Mon Sep 17 00:00:00 2001 From: radius Date: Tue, 3 Apr 2018 00:36:26 -0500 Subject: [PATCH 23/35] remap-redux part2: rename variable --- input/input_driver.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/input/input_driver.c b/input/input_driver.c index 3432549352..ba6b263f85 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -637,7 +637,10 @@ int16_t input_state(unsigned port, unsigned device, unsigned idx, unsigned id) { int16_t res = 0; - bool clear = false; + + /* used to reset input state of a button when the gamepad mapper + is in action for that button*/ + bool reset_state = false; device &= RETRO_DEVICE_MASK; @@ -661,7 +664,7 @@ int16_t input_state(unsigned port, unsigned device, { case RETRO_DEVICE_JOYPAD: if (id != settings->uints.input_remap_ids[port][id]) - clear = true; + reset_state = true; break; case RETRO_DEVICE_ANALOG: @@ -681,7 +684,7 @@ int16_t input_state(unsigned port, unsigned device, joypad_info.joy_idx = settings->uints.input_joypad_map[port]; joypad_info.auto_binds = input_autoconf_binds[joypad_info.joy_idx]; - if (!clear) + if (!reset_state) res = current_input->input_state( current_input_data, joypad_info, libretro_input_binds, port, device, idx, id); else From d8d22a9c4037e580b2383be9c6a4c542ae66c9dc Mon Sep 17 00:00:00 2001 From: radius Date: Tue, 3 Apr 2018 20:16:15 -0500 Subject: [PATCH 24/35] remap-redux part2: simplify this code a bit, still not working --- .vscode/launch.json | 43 ++++++------------------ input/input_driver.c | 29 ++++++++++++++++ input/input_driver.h | 2 ++ input/input_mapper.c | 78 ++++++++++++-------------------------------- 4 files changed, 62 insertions(+), 90 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 6e1f69631a..4880045ed9 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -4,45 +4,22 @@ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ - { - "name": "msys2-mingw64 debug", + { + "name": "(gdb) Attach", "type": "cppdbg", - "request": "launch", + "request": "attach", "program": "${workspaceFolder}/retroarch.exe", - "args": [], - "stopAtEntry": false, - "cwd": "${workspaceFolder}", - "environment": [], - "externalConsole": true, + "processId": "${command:pickProcess}", "MIMode": "gdb", "miDebuggerPath": "c:\\msys64\\mingw64\\bin\\gdb.exe", "setupCommands": [ - { - "description": "Enable pretty-printing for gdb", - "text": "-enable-pretty-printing", - "ignoreFailures": true - } + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } ] }, - { - "name": "msys2-mingw32 debug", - "type": "cppdbg", - "request": "launch", - "program": "${workspaceFolder}/retroarch.exe", - "args": [], - "stopAtEntry": false, - "cwd": "${workspaceFolder}", - "environment": [], - "externalConsole": true, - "MIMode": "gdb", - "miDebuggerPath": "c:\\msys64\\mingw32\\bin\\gdb.exe", - "setupCommands": [ - { - "description": "Enable pretty-printing for gdb", - "text": "-enable-pretty-printing", - "ignoreFailures": true - } - ] - } + ] } \ No newline at end of file diff --git a/input/input_driver.c b/input/input_driver.c index ba6b263f85..14cd308b0d 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -1127,6 +1127,35 @@ void input_keys_pressed(void *data, retro_bits_t* p_new_state) } } +void input_get_state_for_port(void *data, unsigned port, retro_bits_t* p_new_state) +{ + unsigned i; + rarch_joypad_info_t joypad_info; + settings_t *settings = (settings_t*)data; + const struct retro_keybind *binds = input_config_binds[port]; + + BIT256_CLEAR_ALL_PTR(p_new_state); + + joypad_info.joy_idx = settings->uints.input_joypad_map[port]; + joypad_info.auto_binds = input_autoconf_binds[joypad_info.joy_idx]; + joypad_info.axis_threshold = input_driver_axis_threshold; + + input_driver_block_libretro_input = false; + input_driver_block_hotkey = false; + + for (i = 0; i < RARCH_FIRST_CUSTOM_BIND; i++) + { + bool bit_pressed = false; + + if (binds[i].valid && current_input->input_state(current_input_data, + joypad_info, &binds, port, RETRO_DEVICE_JOYPAD, 0, i)) + bit_pressed = true; + + if (bit_pressed) + BIT256_SET_PTR(p_new_state, i); + } +} + void *input_driver_get_data(void) { return current_input_data; diff --git a/input/input_driver.h b/input/input_driver.h index 2ef47c7d24..07ff1a285f 100644 --- a/input/input_driver.h +++ b/input/input_driver.h @@ -343,6 +343,8 @@ void input_menu_keys_pressed(void *data, retro_bits_t* new_state); void *input_driver_get_data(void); +void input_get_state_for_port(void *data, unsigned port, retro_bits_t* p_new_state); + const input_driver_t *input_get_ptr(void); void *input_get_data(void); diff --git a/input/input_mapper.c b/input/input_mapper.c index e97ce1974f..e7853d5141 100644 --- a/input/input_mapper.c +++ b/input/input_mapper.c @@ -50,14 +50,12 @@ struct input_mapper { - /* The controller port that will be polled*/ - uint8_t port; /* Left X, Left Y, Right X, Right Y */ int16_t analog[4]; /* the whole keyboard state */ uint32_t keys[RETROK_LAST / 32 + 1]; /* This is a bitmask of (1 << key_bind_id). */ - retro_bits_t buttons; + retro_bits_t buttons[MAX_USERS]; }; input_mapper_t *input_mapper_new(uint16_t port) @@ -68,8 +66,6 @@ input_mapper_t *input_mapper_new(uint16_t port) if (!handle) return NULL; - handle->port = port; - return handle; } @@ -82,9 +78,9 @@ void input_mapper_free(input_mapper_t *handle) bool flag = false; -bool input_mapper_button_pressed(input_mapper_t *handle, int id) +bool input_mapper_button_pressed(input_mapper_t *handle, unsigned port, unsigned id) { - return BIT256_GET(handle->buttons, id); + return BIT256_GET(handle->buttons[port], id); } void input_mapper_poll(input_mapper_t *handle) @@ -92,7 +88,8 @@ void input_mapper_poll(input_mapper_t *handle) int i, j; settings_t *settings = config_get_ptr(); retro_bits_t current_input; - unsigned device = settings->uints.input_libretro_device[handle->port]; + unsigned max_users = *(input_driver_get_uint(INPUT_ACTION_MAX_USERS)); + unsigned device = 0; unsigned current_button_value; unsigned remap_button; bool key_event[RARCH_CUSTOM_BIND_LIST_END]; @@ -100,24 +97,25 @@ void input_mapper_poll(input_mapper_t *handle) bool menu_is_alive = menu_driver_is_alive(); #endif - device &= RETRO_DEVICE_MASK; - #ifdef HAVE_MENU if (menu_is_alive) return; #endif memset(handle->keys, 0, sizeof(handle->keys)); - i = 0; - if (device == RETRO_DEVICE_KEYBOARD) + + for (i = 0; i < 2; i++) { - for (i = 0; i < MAX_USERS; i++) + device = settings->uints.input_libretro_device[i]; + device &= RETRO_DEVICE_MASK; + + if (device == RETRO_DEVICE_KEYBOARD) { for (j = 0; j < RARCH_CUSTOM_BIND_LIST_END; j++) { if (j < RETROK_LAST) { - if (input_state(i, RETRO_DEVICE_JOYPAD, 0, j) && + if (input_state(i, RETRO_DEVICE_JOYPAD, 0, j) && settings->uints.input_keymapper_ids[i][j] != RETROK_UNKNOWN) { MAPPER_SET_KEY (handle, @@ -129,7 +127,7 @@ void input_mapper_poll(input_mapper_t *handle) } else { - if (key_event[j] == false && + if (key_event[j] == false && settings->uints.input_keymapper_ids[i][j] != RETROK_UNKNOWN) { input_keyboard_event(false, @@ -140,71 +138,37 @@ void input_mapper_poll(input_mapper_t *handle) } } } - } - if (device == RETRO_DEVICE_JOYPAD) - { - input_keys_pressed(settings, ¤t_input); - BIT256_CLEAR_ALL(handle->buttons); - for (i = 0; i < MAX_USERS; i++) + if (device == RETRO_DEVICE_JOYPAD) { /* this loop iterates on all users and all buttons, and checks if a pressed button is assigned to any other button than the default one, then it sets the bit on the mapper input bitmap, later on the original input is cleared in input_state */ + BIT256_CLEAR_ALL(handle->buttons[i]); + input_get_state_for_port(settings, i, ¤t_input); for (j = 0; j < RARCH_FIRST_CUSTOM_BIND; j++) { current_button_value = BIT256_GET(current_input, j); remap_button = settings->uints.input_remap_ids[i][j]; if (current_button_value == 1 && j != remap_button && - remap_button != RARCH_UNMAPPED) - BIT256_SET(handle->buttons, remap_button); + remap_button != RARCH_UNMAPPED) + BIT256_SET(handle->buttons[i], remap_button); } #if 0 /* --CURRENTLY NOT IMPLEMENTED-- this loop should iterate on all users and all analog stick axes and if the axes are moved and is assigned to a button it should set the bit on the mapper input bitmap. - Once implemented we should make sure to clear the original analog + Once implemented we should make sure to clear the original analog stick input in input_state in input_driver.c */ for (j = RARCH_FIRST_CUSTOM_BIND; j < RARCH_CUSTOM_BIND_LIST_END; j++) - { - - } + { } #endif } } - if (device == RETRO_DEVICE_ANALOG) - { - input_keys_pressed(settings, ¤t_input); - BIT256_CLEAR_ALL(handle->buttons); - for (i = 0; i < MAX_USERS; i++) - { - /* this loop iterates on all users and all buttons, and checks if a pressed button - is assigned to any other button than the default one, then it sets the bit on the - mapper input bitmap, later on the original input is cleared in input_state */ - for (j = 0; j < RARCH_FIRST_CUSTOM_BIND; j++) - { - current_button_value = BIT256_GET(current_input, j); - remap_button = settings->uints.input_remap_ids[i][j]; - if (current_button_value == 1 && j != remap_button && - remap_button != RARCH_UNMAPPED) - BIT256_SET(handle->buttons, remap_button); - } -#if 0 - /* --CURRENTLY NOT IMPLEMENTED-- - this loop should iterate on all users and all analog stick axes and if the axes are - moved and is assigned to a button or another stick, it should set the bit on the - mapper input bitmap. Once implemented we should make sure to clear the original analog - stick input in input_state in input_driver.c */ - for (j = RARCH_FIRST_CUSTOM_BIND; j < RARCH_CUSTOM_BIND_LIST_END; j++) - { - } -#endif - } - } } void input_mapper_state( @@ -221,7 +185,7 @@ void input_mapper_state( switch (device) { case RETRO_DEVICE_JOYPAD: - if (input_mapper_button_pressed(handle, id)) + if (input_mapper_button_pressed(handle, port, id)) *ret = 1; break; case RETRO_DEVICE_KEYBOARD: From 1fa28f0e31449cd42fdba2da38adf520aefe3693 Mon Sep 17 00:00:00 2001 From: radius Date: Tue, 3 Apr 2018 22:39:34 -0500 Subject: [PATCH 25/35] remap-redux part2: let's use this function instead, add logging --- input/input_driver.c | 9 ++++----- input/input_mapper.c | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/input/input_driver.c b/input/input_driver.c index 14cd308b0d..94f6a009eb 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -1140,16 +1140,15 @@ void input_get_state_for_port(void *data, unsigned port, retro_bits_t* p_new_sta joypad_info.auto_binds = input_autoconf_binds[joypad_info.joy_idx]; joypad_info.axis_threshold = input_driver_axis_threshold; - input_driver_block_libretro_input = false; - input_driver_block_hotkey = false; - for (i = 0; i < RARCH_FIRST_CUSTOM_BIND; i++) { bool bit_pressed = false; - if (binds[i].valid && current_input->input_state(current_input_data, - joypad_info, &binds, port, RETRO_DEVICE_JOYPAD, 0, i)) + if (input_driver_input_state(joypad_info, &binds, port, RETRO_DEVICE_JOYPAD, 0, i) == 1) + { + RARCH_LOG("button pressed port: %d id: %d\n", port, i); bit_pressed = true; + } if (bit_pressed) BIT256_SET_PTR(p_new_state, i); diff --git a/input/input_mapper.c b/input/input_mapper.c index e7853d5141..a9c5703fec 100644 --- a/input/input_mapper.c +++ b/input/input_mapper.c @@ -144,7 +144,7 @@ void input_mapper_poll(input_mapper_t *handle) is assigned to any other button than the default one, then it sets the bit on the mapper input bitmap, later on the original input is cleared in input_state */ BIT256_CLEAR_ALL(handle->buttons[i]); - input_get_state_for_port(settings, i, ¤t_input); + input_get_state_for_port(settings, 0, ¤t_input); for (j = 0; j < RARCH_FIRST_CUSTOM_BIND; j++) { From 4260423e484c1f2d0e72aa61a54ab746239b8460 Mon Sep 17 00:00:00 2001 From: radius Date: Tue, 3 Apr 2018 22:57:33 -0500 Subject: [PATCH 26/35] remap-redux part2: let's use this function instead, add logging --- input/input_mapper.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/input/input_mapper.c b/input/input_mapper.c index a9c5703fec..e7853d5141 100644 --- a/input/input_mapper.c +++ b/input/input_mapper.c @@ -144,7 +144,7 @@ void input_mapper_poll(input_mapper_t *handle) is assigned to any other button than the default one, then it sets the bit on the mapper input bitmap, later on the original input is cleared in input_state */ BIT256_CLEAR_ALL(handle->buttons[i]); - input_get_state_for_port(settings, 0, ¤t_input); + input_get_state_for_port(settings, i, ¤t_input); for (j = 0; j < RARCH_FIRST_CUSTOM_BIND; j++) { From fa3dfd5f6334b87796910cab74fe04da056575df Mon Sep 17 00:00:00 2001 From: radius Date: Wed, 4 Apr 2018 12:22:07 -0500 Subject: [PATCH 27/35] remap-redux part2: finally user 2 mapping works! --- .vscode/launch.json | 20 ++++++++++++++++++++ input/input_driver.c | 7 +------ input/input_mapper.c | 3 +-- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 4880045ed9..e7552247cc 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -4,6 +4,26 @@ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ + { + "name": "(gdb) Launch", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/retroarch.exe", + "args": ["-v"], + "stopAtEntry": false, + "cwd": "${workspaceFolder}", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "miDebuggerPath": "c:\\msys64\\mingw64\\bin\\gdb.exe", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ] + }, { "name": "(gdb) Attach", "type": "cppdbg", diff --git a/input/input_driver.c b/input/input_driver.c index 94f6a009eb..defdd62c2d 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -1132,8 +1132,6 @@ void input_get_state_for_port(void *data, unsigned port, retro_bits_t* p_new_sta unsigned i; rarch_joypad_info_t joypad_info; settings_t *settings = (settings_t*)data; - const struct retro_keybind *binds = input_config_binds[port]; - BIT256_CLEAR_ALL_PTR(p_new_state); joypad_info.joy_idx = settings->uints.input_joypad_map[port]; @@ -1144,11 +1142,8 @@ void input_get_state_for_port(void *data, unsigned port, retro_bits_t* p_new_sta { bool bit_pressed = false; - if (input_driver_input_state(joypad_info, &binds, port, RETRO_DEVICE_JOYPAD, 0, i) == 1) - { - RARCH_LOG("button pressed port: %d id: %d\n", port, i); + if (input_driver_input_state(joypad_info, libretro_input_binds, port, RETRO_DEVICE_JOYPAD, 0, i) != 0) bit_pressed = true; - } if (bit_pressed) BIT256_SET_PTR(p_new_state, i); diff --git a/input/input_mapper.c b/input/input_mapper.c index e7853d5141..3239cf5600 100644 --- a/input/input_mapper.c +++ b/input/input_mapper.c @@ -104,11 +104,10 @@ void input_mapper_poll(input_mapper_t *handle) memset(handle->keys, 0, sizeof(handle->keys)); - for (i = 0; i < 2; i++) + for (i = 0; i < max_users; i++) { device = settings->uints.input_libretro_device[i]; device &= RETRO_DEVICE_MASK; - if (device == RETRO_DEVICE_KEYBOARD) { for (j = 0; j < RARCH_CUSTOM_BIND_LIST_END; j++) From 3792a5e502c98cbdc7b6f40de9cc45516466df2a Mon Sep 17 00:00:00 2001 From: radius Date: Wed, 4 Apr 2018 21:33:03 -0500 Subject: [PATCH 28/35] remap-redux part2: cleanup --- Makefile.common | 4 +--- Makefile.msvc | 1 - Makefile.vita | 1 - Makefile.wiiu | 1 - configuration.c | 6 ------ griffin/griffin.c | 2 -- input/input_driver.c | 21 ++++----------------- input/input_mapper.c | 13 ++++++------- input/input_mapper.h | 2 +- menu/cbs/menu_cbs_get_value.c | 4 ---- menu/cbs/menu_cbs_left.c | 4 ---- menu/cbs/menu_cbs_right.c | 4 ---- menu/cbs/menu_cbs_select.c | 4 ---- menu/cbs/menu_cbs_sublabel.c | 2 -- menu/menu_displaylist.c | 2 -- qb/config.libs.sh | 1 - qb/config.params.sh | 1 - 17 files changed, 12 insertions(+), 61 deletions(-) diff --git a/Makefile.common b/Makefile.common index 2e0d9b61ae..b12ea01505 100644 --- a/Makefile.common +++ b/Makefile.common @@ -1605,9 +1605,7 @@ ifeq ($(HAVE_NETWORKING), 1) $(LIBRETRO_COMM_DIR)/utils/md5.o endif - ifeq ($(HAVE_KEYMAPPER), 1) - OBJ += input/input_mapper.o - endif + OBJ += input/input_mapper.o ifeq ($(HAVE_NETWORKGAMEPAD), 1) OBJ += input/input_remote.o \ diff --git a/Makefile.msvc b/Makefile.msvc index 77d02fc9fa..48405fd5c2 100644 --- a/Makefile.msvc +++ b/Makefile.msvc @@ -53,7 +53,6 @@ HAVE_NETWORK_CMD := 1 HAVE_OVERLAY := 1 HAVE_LANGEXTRA := 1 HAVE_CHEEVOS := 1 -HAVE_KEYMAPPER := 1 HAVE_SHADERPIPELINE := 1 HAVE_IMAGEVIEWER := 1 diff --git a/Makefile.vita b/Makefile.vita index efa4646cfb..5645c9cabd 100644 --- a/Makefile.vita +++ b/Makefile.vita @@ -33,7 +33,6 @@ else HAVE_ZLIB := 1 HAVE_7ZIP := 1 HAVE_VITA2D := 1 - HAVE_KEYMAPPER := 1 HAVE_NETWORKING := 1 HAVE_SOCKET_LEGACY := 1 HAVE_MENU := 1 diff --git a/Makefile.wiiu b/Makefile.wiiu index 5b2d3625a9..bcba3cd881 100644 --- a/Makefile.wiiu +++ b/Makefile.wiiu @@ -133,7 +133,6 @@ endif HAVE_ZLIB = 1 HAVE_7ZIP = 1 HAVE_BUILTINZLIB = 1 - HAVE_KEYMAPPER = 1 HAVE_LIBRETRODB = 1 HAVE_ZARCH = 0 HAVE_MATERIALUI = 1 diff --git a/configuration.c b/configuration.c index 9f0eed8a04..beb10a34d2 100644 --- a/configuration.c +++ b/configuration.c @@ -1358,9 +1358,6 @@ static struct config_bool_setting *populate_settings_bool(settings_t *settings, #ifdef HAVE_NETWORKGAMEPAD SETTING_BOOL("network_remote_enable", &settings->bools.network_remote_enable, false, false /* TODO */, false); #endif -#ifdef HAVE_KEYMAPPER - SETTING_BOOL("keymapper_enable", &settings->bools.keymapper_enable, true, true /* TODO */, false); -#endif #ifdef HAVE_NETWORKING SETTING_BOOL("netplay_nat_traversal", &settings->bools.netplay_nat_traversal, true, true, false); #endif @@ -1465,9 +1462,6 @@ static struct config_uint_setting *populate_settings_uint(settings_t *settings, #ifdef HAVE_NETWORKGAMEPAD SETTING_UINT("network_remote_base_port", &settings->uints.network_remote_base_port, true, network_remote_base_port, false); #endif -#ifdef HAVE_KEYMAPPER - SETTING_UINT("keymapper_port", &settings->uints.keymapper_port, true, 0, false); -#endif #ifdef GEKKO SETTING_UINT("video_viwidth", &settings->uints.video_viwidth, true, video_viwidth, false); #endif diff --git a/griffin/griffin.c b/griffin/griffin.c index e92b9da779..b9720bfa45 100644 --- a/griffin/griffin.c +++ b/griffin/griffin.c @@ -1242,9 +1242,7 @@ MENU #include "../cores/libretro-net-retropad/net_retropad_core.c" #endif -#ifdef HAVE_KEYMAPPER #include "../input/input_mapper.c" -#endif #include "../command.c" diff --git a/input/input_driver.c b/input/input_driver.c index defdd62c2d..70a7d0340d 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -34,9 +34,7 @@ #include "input_remote.h" #endif -#ifdef HAVE_KEYMAPPER #include "input_mapper.h" -#endif #include "input_driver.h" #include "input_keymaps.h" @@ -377,9 +375,7 @@ static command_t *input_driver_command = NULL; #ifdef HAVE_NETWORKGAMEPAD static input_remote_t *input_driver_remote = NULL; #endif -#ifdef HAVE_KEYMAPPER static input_mapper_t *input_driver_mapper = NULL; -#endif static const input_driver_t *current_input = NULL; static void *current_input_data = NULL; static bool input_driver_block_hotkey = false; @@ -605,10 +601,8 @@ void input_poll(void) input_driver_axis_threshold); #endif -#ifdef HAVE_KEYMAPPER - if (input_driver_mapper) + if (settings->bools.input_remap_binds_enable && input_driver_mapper) input_mapper_poll(input_driver_mapper); -#endif #ifdef HAVE_COMMAND if (input_driver_command) @@ -692,11 +686,9 @@ int16_t input_state(unsigned port, unsigned device, } } -#ifdef HAVE_KEYMAPPER - if (input_driver_mapper) + if (settings->bools.input_remap_binds_enable && input_driver_mapper) input_mapper_state(input_driver_mapper, &res, port, device, idx, id); -#endif #ifdef HAVE_OVERLAY if (overlay_ptr) @@ -1368,11 +1360,9 @@ void input_driver_deinit_remote(void) void input_driver_deinit_mapper(void) { -#ifdef HAVE_KEYMAPPER if (input_driver_mapper) input_mapper_free(input_driver_mapper); input_driver_mapper = NULL; -#endif } bool input_driver_init_remote(void) @@ -1397,20 +1387,17 @@ bool input_driver_init_remote(void) bool input_driver_init_mapper(void) { -#ifdef HAVE_KEYMAPPER settings_t *settings = config_get_ptr(); - if (!settings->bools.keymapper_enable) + if (!settings->bools.input_remap_binds_enable) return false; - input_driver_mapper = input_mapper_new( - settings->uints.keymapper_port); + input_driver_mapper = input_mapper_new(); if (input_driver_mapper) return true; RARCH_ERR("Failed to initialize input mapper.\n"); -#endif return false; } diff --git a/input/input_mapper.c b/input/input_mapper.c index 3239cf5600..93a4295fa9 100644 --- a/input/input_mapper.c +++ b/input/input_mapper.c @@ -58,7 +58,7 @@ struct input_mapper retro_bits_t buttons[MAX_USERS]; }; -input_mapper_t *input_mapper_new(uint16_t port) +input_mapper_t *input_mapper_new(void) { input_mapper_t* handle = (input_mapper_t*) calloc(1, sizeof(*handle)); @@ -76,8 +76,6 @@ void input_mapper_free(input_mapper_t *handle) free (handle); } -bool flag = false; - bool input_mapper_button_pressed(input_mapper_t *handle, unsigned port, unsigned id) { return BIT256_GET(handle->buttons[port], id); @@ -108,6 +106,8 @@ void input_mapper_poll(input_mapper_t *handle) { device = settings->uints.input_libretro_device[i]; device &= RETRO_DEVICE_MASK; + + /* keyboard to gamepad remapping */ if (device == RETRO_DEVICE_KEYBOARD) { for (j = 0; j < RARCH_CUSTOM_BIND_LIST_END; j++) @@ -137,7 +137,9 @@ void input_mapper_poll(input_mapper_t *handle) } } } - if (device == RETRO_DEVICE_JOYPAD) + + /* gamepad remapping */ + if (device == RETRO_DEVICE_JOYPAD || device == RETRO_DEVICE_ANALOG) { /* this loop iterates on all users and all buttons, and checks if a pressed button is assigned to any other button than the default one, then it sets the bit on the @@ -165,9 +167,6 @@ void input_mapper_poll(input_mapper_t *handle) #endif } } - - - } void input_mapper_state( diff --git a/input/input_mapper.h b/input/input_mapper.h index 5f2b91e51b..21741d008e 100644 --- a/input/input_mapper.h +++ b/input/input_mapper.h @@ -31,7 +31,7 @@ RETRO_BEGIN_DECLS typedef struct input_mapper input_mapper_t; -input_mapper_t *input_mapper_new(uint16_t port); +input_mapper_t *input_mapper_new(void); void input_mapper_free(input_mapper_t *handle); diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index f6bcfd117e..54e39b2bcd 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -581,7 +581,6 @@ static void menu_action_setting_disp_set_label_input_desc( strlcpy(s2, path, len2); } -#ifdef HAVE_KEYMAPPER static void menu_action_setting_disp_set_label_input_desc_kbd( file_list_t* list, unsigned *w, unsigned type, unsigned i, @@ -627,7 +626,6 @@ static void menu_action_setting_disp_set_label_input_desc_kbd( *w = 19; strlcpy(s2, path, len2); } -#endif static void menu_action_setting_disp_set_label_cheat( file_list_t* list, @@ -2076,14 +2074,12 @@ static int menu_cbs_init_bind_get_string_representation_compare_type( BIND_ACTION_GET_VALUE(cbs, menu_action_setting_disp_set_label_libretro_perf_counters); } -#ifdef HAVE_KEYMAPPER else if (type >= MENU_SETTINGS_INPUT_DESC_KBD_BEGIN && type <= MENU_SETTINGS_INPUT_DESC_KBD_END) { BIND_ACTION_GET_VALUE(cbs, menu_action_setting_disp_set_label_input_desc_kbd); } -#endif else { switch (type) diff --git a/menu/cbs/menu_cbs_left.c b/menu/cbs/menu_cbs_left.c index 98e96b721b..37b0d51270 100644 --- a/menu/cbs/menu_cbs_left.c +++ b/menu/cbs/menu_cbs_left.c @@ -124,7 +124,6 @@ static int action_left_input_desc(unsigned type, const char *label, return 0; } -#ifdef HAVE_KEYMAPPER static int action_left_input_desc_kbd(unsigned type, const char *label, bool wraparound) { @@ -161,7 +160,6 @@ static int action_left_input_desc_kbd(unsigned type, const char *label, return 0; } -#endif static int action_left_scroll(unsigned type, const char *label, bool wraparound) @@ -633,13 +631,11 @@ static int menu_cbs_init_bind_left_compare_type(menu_file_list_cbs_t *cbs, { BIND_ACTION_LEFT(cbs, action_left_input_desc); } -#ifdef HAVE_KEYMAPPER else if (type >= MENU_SETTINGS_INPUT_DESC_KBD_BEGIN && type <= MENU_SETTINGS_INPUT_DESC_KBD_END) { BIND_ACTION_LEFT(cbs, action_left_input_desc_kbd); } -#endif else if ((type >= MENU_SETTINGS_PLAYLIST_ASSOCIATION_START)) { BIND_ACTION_LEFT(cbs, playlist_association_left); diff --git a/menu/cbs/menu_cbs_right.c b/menu/cbs/menu_cbs_right.c index ee6cbd85b2..8451f51029 100644 --- a/menu/cbs/menu_cbs_right.c +++ b/menu/cbs/menu_cbs_right.c @@ -101,7 +101,6 @@ int action_right_cheat(unsigned type, const char *label, wraparound); } -#ifdef HAVE_KEYMAPPER int action_right_input_desc_kbd(unsigned type, const char *label, bool wraparound) { @@ -139,7 +138,6 @@ int action_right_input_desc_kbd(unsigned type, const char *label, return 0; } -#endif /* fix-me: incomplete, lacks error checking */ int action_right_input_desc(unsigned type, const char *label, @@ -503,13 +501,11 @@ static int menu_cbs_init_bind_right_compare_type(menu_file_list_cbs_t *cbs, { BIND_ACTION_RIGHT(cbs, action_right_input_desc); } -#ifdef HAVE_KEYMAPPER else if (type >= MENU_SETTINGS_INPUT_DESC_KBD_BEGIN && type <= MENU_SETTINGS_INPUT_DESC_KBD_END) { BIND_ACTION_RIGHT(cbs, action_right_input_desc_kbd); } -#endif else if ((type >= MENU_SETTINGS_PLAYLIST_ASSOCIATION_START)) { BIND_ACTION_RIGHT(cbs, playlist_association_right); diff --git a/menu/cbs/menu_cbs_select.c b/menu/cbs/menu_cbs_select.c index 0246455d0d..7a6bc5e047 100644 --- a/menu/cbs/menu_cbs_select.c +++ b/menu/cbs/menu_cbs_select.c @@ -146,14 +146,12 @@ static int action_select_input_desc(const char *path, const char *label, unsigne return action_right_input_desc(type, label, true); } -#ifdef HAVE_KEYMAPPER static int action_select_input_desc_kbd(const char *path, const char *label, unsigned type, size_t idx) { return action_right_input_desc_kbd(type, label, true); } -#endif #ifdef HAVE_NETWORKING static int action_select_netplay_connect_room(const char *path, @@ -223,13 +221,11 @@ static int menu_cbs_init_bind_select_compare_type( { BIND_ACTION_SELECT(cbs, action_select_input_desc); } -#ifdef HAVE_KEYMAPPER else if (type >= MENU_SETTINGS_INPUT_DESC_KBD_BEGIN && type <= MENU_SETTINGS_INPUT_DESC_KBD_END) { BIND_ACTION_SELECT(cbs, action_select_input_desc_kbd); } -#endif else { diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 3facf11794..735b2911b7 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -533,13 +533,11 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_generic); -#ifdef HAVE_KEYMAPPER if (type >= MENU_SETTINGS_INPUT_DESC_KBD_BEGIN && type <= MENU_SETTINGS_INPUT_DESC_KBD_END) { BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_remap_kbd_sublabel); } -#endif if (type >= MENU_SETTINGS_INPUT_DESC_BEGIN && type <= MENU_SETTINGS_INPUT_DESC_END) diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 106c16f445..44df5c5cf4 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -3282,7 +3282,6 @@ static int menu_displaylist_parse_options_remappings( } } } - #ifdef HAVE_KEYMAPPER if (system) { settings_t *settings = config_get_ptr(); @@ -3325,7 +3324,6 @@ static int menu_displaylist_parse_options_remappings( } } } - #endif return 0; } diff --git a/qb/config.libs.sh b/qb/config.libs.sh index e0c3382d5b..701d8c162d 100644 --- a/qb/config.libs.sh +++ b/qb/config.libs.sh @@ -210,7 +210,6 @@ if [ "$HAVE_NETWORKING" = 'yes' ]; then check_lib '' MINIUPNPC '-lminiupnpc' else die : 'Warning: All networking features have been disabled.' - HAVE_KEYMAPPER='no' HAVE_NETWORK_CMD='no' HAVE_NETWORKGAMEPAD='no' HAVE_CHEEVOS='no' diff --git a/qb/config.params.sh b/qb/config.params.sh index 94135f94f6..f3899a3403 100644 --- a/qb/config.params.sh +++ b/qb/config.params.sh @@ -31,7 +31,6 @@ HAVE_SSA=auto # SSA/ASS for FFmpeg subtitle support HAVE_DYLIB=auto # Dynamic loading support HAVE_NETWORKING=auto # Networking features (recommended) HAVE_NETWORKGAMEPAD=auto # Networked game pad (plus baked-in core) -HAVE_KEYMAPPER=yes # Networked game pad (plus baked-in core) C89_NETWORKGAMEPAD=no HAVE_MINIUPNPC=auto # Mini UPnP client library (for NAT traversal) HAVE_BUILTINMINIUPNPC=yes # Bake in Mini UPnP client library (for NAT traversal) From 06860bf704c328917602612a37a707821e2ce2da Mon Sep 17 00:00:00 2001 From: radius Date: Wed, 4 Apr 2018 22:27:25 -0500 Subject: [PATCH 29/35] remap-redux part2: rewrite keymapper to work like gamepad mapper --- input/input_mapper.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/input/input_mapper.c b/input/input_mapper.c index 93a4295fa9..805297a3b9 100644 --- a/input/input_mapper.c +++ b/input/input_mapper.c @@ -110,27 +110,29 @@ void input_mapper_poll(input_mapper_t *handle) /* keyboard to gamepad remapping */ if (device == RETRO_DEVICE_KEYBOARD) { + input_get_state_for_port(settings, i, ¤t_input); for (j = 0; j < RARCH_CUSTOM_BIND_LIST_END; j++) { - if (j < RETROK_LAST) { - if (input_state(i, RETRO_DEVICE_JOYPAD, 0, j) && - settings->uints.input_keymapper_ids[i][j] != RETROK_UNKNOWN) + current_button_value = BIT256_GET(current_input, j); + remap_button = settings->uints.input_keymapper_ids[i][j]; + if (current_button_value == 1 && j != remap_button && + remap_button != RETROK_UNKNOWN) { MAPPER_SET_KEY (handle, - settings->uints.input_keymapper_ids[i][j]); + remap_button); input_keyboard_event(true, - settings->uints.input_keymapper_ids[i][j], + remap_button, 0, 0, RETRO_DEVICE_KEYBOARD); key_event[j] = true; } else { if (key_event[j] == false && - settings->uints.input_keymapper_ids[i][j] != RETROK_UNKNOWN) + remap_button != RETROK_UNKNOWN) { input_keyboard_event(false, - settings->uints.input_keymapper_ids[i][j], + remap_button, 0, 0, RETRO_DEVICE_KEYBOARD); } } From f662d9f65fc593b4d526e7d3f7212452214276b5 Mon Sep 17 00:00:00 2001 From: radius Date: Sat, 7 Apr 2018 23:43:41 -0500 Subject: [PATCH 30/35] remap-redux part2: start adding analog remapping --- input/input_remapping.c | 93 ++++++++++++++++++++--------------- menu/cbs/menu_cbs_get_value.c | 20 ++++++-- menu/cbs/menu_cbs_left.c | 4 +- menu/cbs/menu_cbs_right.c | 4 +- menu/menu_displaylist.c | 2 +- 5 files changed, 72 insertions(+), 51 deletions(-) diff --git a/input/input_remapping.c b/input/input_remapping.c index 370e31a6a9..15a34c1d7d 100644 --- a/input/input_remapping.c +++ b/input/input_remapping.c @@ -53,64 +53,70 @@ bool input_remapping_load_file(void *data, const char *path) for (i = 0; i < MAX_USERS; i++) { - char s1[64], s2[64]; + char s1[64], s2[64], s3[64]; + char btn_ident[RARCH_FIRST_CUSTOM_BIND + 4][128] = {{0}}; char key_ident[RARCH_FIRST_CUSTOM_BIND + 4][128] = {{0}}; - char keymapper_ident[RARCH_FIRST_CUSTOM_BIND + 4][128] = {{0}}; - char key_strings[RARCH_FIRST_CUSTOM_BIND + 4][128] = - { "b", "y", "select", "start", + char stk_ident[RARCH_FIRST_CUSTOM_BIND + 4][128] = {{0}}; + + char key_strings[RARCH_FIRST_CUSTOM_BIND + 8][128] = { + "b", "y", "select", "start", "up", "down", "left", "right", "a", "x", "l", "r", "l2", "r2", - "l3", "r3", "l_x", "l_y", "r_x", "r_y" }; + "l3", "r3", "l_x+", "l_x-", "l_y+", "l_y-", "r_x+", "r_x-", "r_y+", "r_y-" }; old_analog_dpad_mode[i] = settings->uints.input_analog_dpad_mode[i]; old_libretro_device[i] = settings->uints.input_libretro_device[i]; s1[0] = '\0'; s2[0] = '\0'; + s3[0] = '\0'; snprintf(s1, sizeof(s1), "input_player%u_btn", i + 1); snprintf(s2, sizeof(s2), "input_player%u_key", i + 1); + snprintf(s3, sizeof(s3), "input_player%u_stk", i + 1); - for (j = 0; j < RARCH_FIRST_CUSTOM_BIND + 4; j++) + for (j = 0; j < RARCH_FIRST_CUSTOM_BIND; j++) { int btn_remap = -1; - fill_pathname_join_delim(key_ident[j], s1, - key_strings[j], '_', sizeof(key_ident[j])); - fill_pathname_join_delim(keymapper_ident[j], s2, - key_strings[j], '_', sizeof(key_ident[j])); + fill_pathname_join_delim(btn_ident[j], s1, + key_strings[j], '_', sizeof(btn_ident[j])); + fill_pathname_join_delim(key_ident[j], s2, + key_strings[j], '_', sizeof(btn_ident[j])); - if (config_get_int(conf, key_ident[j], &btn_remap) + if (config_get_int(conf, btn_ident[j], &btn_remap) && (btn_remap < RARCH_FIRST_CUSTOM_BIND && btn_remap != -1)) settings->uints.input_remap_ids[i][j] = btn_remap; - else if (config_get_int(conf, key_ident[j], &btn_remap) + else if (config_get_int(conf, btn_ident[j], &btn_remap) && (btn_remap == -1)) settings->uints.input_remap_ids[i][j] = RARCH_UNMAPPED; int key_remap = -1; - if (config_get_int(conf, keymapper_ident[j], &key_remap)) + if (config_get_int(conf, key_ident[j], &key_remap)) settings->uints.input_keymapper_ids[i][j] = key_remap; else settings->uints.input_keymapper_ids[i][j] = RETROK_UNKNOWN; - - } - for (j = 0; j < 4; j++) + for (j = RARCH_FIRST_CUSTOM_BIND; j < RARCH_FIRST_CUSTOM_BIND + 8; j++) { - int btn_remap = -1; + int stk_remap = -1; - snprintf(key_ident[RARCH_FIRST_CUSTOM_BIND + j], - sizeof(key_ident[RARCH_FIRST_CUSTOM_BIND + j]), + fill_pathname_join_delim(stk_ident[j], s3, + key_strings[j], '$', sizeof(stk_ident[j])); + + snprintf(stk_ident[j], + sizeof(stk_ident[j]), "%s_%s", - s1, - key_strings[RARCH_FIRST_CUSTOM_BIND + j]); + s3, + key_strings[j]); - if (config_get_int(conf, key_ident[RARCH_FIRST_CUSTOM_BIND + j], - &btn_remap) && (btn_remap < 4)) - settings->uints.input_remap_ids[i][RARCH_FIRST_CUSTOM_BIND + j] = - btn_remap; + if (config_get_int(conf, stk_ident[j], + &stk_remap)) + settings->uints.input_remap_ids[i][j] = + stk_remap; + RARCH_LOG("stk_ident: %s:%d\n", stk_ident[j], settings->uints.input_remap_ids[i][j]); } snprintf(s1, sizeof(s1), "input_player%u_analog_dpad_mode", i + 1); @@ -167,50 +173,55 @@ bool input_remapping_save_file(const char *path) for (i = 0; i < max_users; i++) { - char s1[64], s2[64]; + char s1[64], s2[64], s3[64]; + char btn_ident[RARCH_FIRST_CUSTOM_BIND + 4][128] = {{0}}; char key_ident[RARCH_FIRST_CUSTOM_BIND + 4][128] = {{0}}; - char keymapper_ident[RARCH_FIRST_CUSTOM_BIND + 4][128] = {{0}}; - char key_strings[RARCH_FIRST_CUSTOM_BIND + 4][128] = { + char stk_ident[RARCH_FIRST_CUSTOM_BIND + 4][128] = {{0}}; + + char key_strings[RARCH_FIRST_CUSTOM_BIND + 8][128] = { "b", "y", "select", "start", "up", "down", "left", "right", "a", "x", "l", "r", "l2", "r2", - "l3", "r3", "l_x", "l_y", "r_x", "r_y" }; + "l3", "r3", "l_x+", "l_x-", "l_y+", "l_y-", "r_x+", "r_x-", "r_y+", "r_y-" }; s1[0] = '\0'; s2[0] = '\0'; snprintf(s1, sizeof(s1), "input_player%u_btn", i + 1); snprintf(s2, sizeof(s2), "input_player%u_key", i + 1); + snprintf(s3, sizeof(s1), "input_player%u_stk", i + 1); for (j = 0; j < RARCH_FIRST_CUSTOM_BIND + 4; j++) { - fill_pathname_join_delim(key_ident[j], s1, - key_strings[j], '_', sizeof(key_ident[j])); - fill_pathname_join_delim(keymapper_ident[j], s2, - key_strings[j], '_', sizeof(key_ident[j])); + fill_pathname_join_delim(btn_ident[j], s1, + key_strings[j], '_', sizeof(btn_ident[j])); + fill_pathname_join_delim(key_ident[j], s2, + key_strings[j], '_', sizeof(btn_ident[j])); /* only save values that have been modified */ if(j < RARCH_FIRST_CUSTOM_BIND) { if(settings->uints.input_remap_ids[i][j] != j && settings->uints.input_remap_ids[i][j] != RARCH_UNMAPPED) - config_set_int(conf, key_ident[j], settings->uints.input_remap_ids[i][j]); + config_set_int(conf, btn_ident[j], settings->uints.input_remap_ids[i][j]); else if (settings->uints.input_remap_ids[i][j] != j && settings->uints.input_remap_ids[i][j] == RARCH_UNMAPPED) - config_set_int(conf, key_ident[j], -1); + config_set_int(conf, btn_ident[j], -1); else - config_unset(conf,key_ident[j]); + config_unset(conf,btn_ident[j]); if (settings->uints.input_keymapper_ids[i][j] != RETROK_UNKNOWN) - config_set_int(conf, keymapper_ident[j], + config_set_int(conf, key_ident[j], settings->uints.input_keymapper_ids[i][j]); } else { + fill_pathname_join_delim(stk_ident[j], s3, + key_strings[j], '_', sizeof(stk_ident[j])); if(settings->uints.input_remap_ids[i][j] != j - RARCH_FIRST_CUSTOM_BIND) - config_set_int(conf, key_ident[j], + config_set_int(conf, stk_ident[j], settings->uints.input_remap_ids[i][j]); else - config_unset(conf,key_ident[j]); + config_unset(conf,btn_ident[j]); } } snprintf(s1, sizeof(s1), "input_libretro_device_p%u", i + 1); @@ -274,8 +285,8 @@ void input_remapping_set_defaults(bool deinit) settings->uints.input_remap_ids[i][j] = keybind->id; settings->uints.input_keymapper_ids[i][j] = RETROK_UNKNOWN; } - for (j = 0; j < 4; j++) - settings->uints.input_remap_ids[i][RARCH_FIRST_CUSTOM_BIND + j] = j; + for (j = RARCH_FIRST_CUSTOM_BIND; j < RARCH_FIRST_CUSTOM_BIND + 8; j++) + settings->uints.input_remap_ids[i][j] = j; if (old_analog_dpad_mode[i]) settings->uints.input_analog_dpad_mode[i] = old_analog_dpad_mode[i]; diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index 54e39b2bcd..215162cf77 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -550,6 +550,7 @@ static void menu_action_setting_disp_set_label_input_desc( rarch_system_info_t *system = runloop_get_system_info(); settings_t *settings = config_get_ptr(); const char* descriptor = NULL; + char buf[256]; unsigned btn_idx, user_idx, remap_idx; @@ -561,18 +562,27 @@ static void menu_action_setting_disp_set_label_input_desc( remap_idx = settings->uints.input_remap_ids[user_idx][btn_idx]; - +/* if (remap_idx == RARCH_UNMAPPED) settings->uints.input_remap_ids[user_idx][btn_idx] = RARCH_UNMAPPED; - +*/ if (!system) return; - if (btn_idx < RARCH_FIRST_CUSTOM_BIND) - descriptor = system->input_desc_btn[user_idx][remap_idx]; + descriptor = system->input_desc_btn[user_idx][remap_idx]; - if (!string_is_empty(descriptor)) + if (!string_is_empty(descriptor) && remap_idx < RARCH_FIRST_CUSTOM_BIND) strlcpy(s, descriptor, len); + else if (!string_is_empty(descriptor) && remap_idx >= RARCH_FIRST_CUSTOM_BIND && remap_idx % 2 == 0) + { + snprintf(buf, sizeof(buf), "%s %c", descriptor, '+'); + strlcpy(s, buf, len); + } + else if (!string_is_empty(descriptor) && remap_idx >= RARCH_FIRST_CUSTOM_BIND && remap_idx % 2 != 0) + { + snprintf(buf, sizeof(buf), "%s %c", descriptor, '-'); + strlcpy(s, buf, len); + } else strlcpy(s, "---", len); diff --git a/menu/cbs/menu_cbs_left.c b/menu/cbs/menu_cbs_left.c index 37b0d51270..53115b011d 100644 --- a/menu/cbs/menu_cbs_left.c +++ b/menu/cbs/menu_cbs_left.c @@ -117,8 +117,8 @@ static int action_left_input_desc(unsigned type, const char *label, /* skip the not used buttons (unless they are at the end by calling the right desc function recursively also skip all the axes until analog remapping is implemented */ - if ((string_is_empty(system->input_desc_btn[user_idx][remap_idx]) && remap_idx < RARCH_CUSTOM_BIND_LIST_END) || - (remap_idx >= RARCH_FIRST_CUSTOM_BIND && remap_idx < RARCH_CUSTOM_BIND_LIST_END)) + if ((string_is_empty(system->input_desc_btn[user_idx][remap_idx]) && remap_idx < RARCH_CUSTOM_BIND_LIST_END) /*|| + (remap_idx >= RARCH_FIRST_CUSTOM_BIND && remap_idx < RARCH_CUSTOM_BIND_LIST_END)*/) action_left_input_desc(type, label, wraparound); return 0; diff --git a/menu/cbs/menu_cbs_right.c b/menu/cbs/menu_cbs_right.c index 8451f51029..0f2fa245a6 100644 --- a/menu/cbs/menu_cbs_right.c +++ b/menu/cbs/menu_cbs_right.c @@ -164,8 +164,8 @@ int action_right_input_desc(unsigned type, const char *label, /* skip the not used buttons (unless they are at the end by calling the right desc function recursively also skip all the axes until analog remapping is implemented */ - if ((string_is_empty(system->input_desc_btn[user_idx][remap_idx]) && remap_idx < RARCH_CUSTOM_BIND_LIST_END) || - (remap_idx >= RARCH_FIRST_CUSTOM_BIND && remap_idx < RARCH_CUSTOM_BIND_LIST_END)) + if ((string_is_empty(system->input_desc_btn[user_idx][remap_idx]) && remap_idx < RARCH_CUSTOM_BIND_LIST_END) /*|| + (remap_idx >= RARCH_FIRST_CUSTOM_BIND && remap_idx < RARCH_CUSTOM_BIND_LIST_END)*/) action_right_input_desc(type, label, wraparound); #if 0 diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 44df5c5cf4..d8a276e72a 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -3250,7 +3250,7 @@ static int menu_displaylist_parse_options_remappings( if (device == RETRO_DEVICE_JOYPAD || device == RETRO_DEVICE_ANALOG) { /* change to RARCH_FIRST_CUSTOM_BIND + 8 once analog remapping is implemented */ - for (retro_id = 0; retro_id < RARCH_FIRST_CUSTOM_BIND; retro_id++) + for (retro_id = 0; retro_id < RARCH_FIRST_CUSTOM_BIND + 8; retro_id++) { char desc_label[64]; unsigned user = p + 1; From 0ed9f055710aa4e3c497817c92e756ca149238af Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 8 Apr 2018 00:44:05 -0500 Subject: [PATCH 31/35] remap-redux part2: - remapping analogs to buttons works 100% - remapping analogs to other analogs still messed up for some reason - need to reset input of the original axis in input_driver.c still --- input/input_driver.c | 32 ++++++++++++++++++- input/input_mapper.c | 31 ++++++++++++++---- libretro-common/include/retro_miscellaneous.h | 2 ++ 3 files changed, 58 insertions(+), 7 deletions(-) diff --git a/input/input_driver.c b/input/input_driver.c index 70a7d0340d..bad2559b6d 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -1121,7 +1121,8 @@ void input_keys_pressed(void *data, retro_bits_t* p_new_state) void input_get_state_for_port(void *data, unsigned port, retro_bits_t* p_new_state) { - unsigned i; + unsigned i, j; + int16_t val; rarch_joypad_info_t joypad_info; settings_t *settings = (settings_t*)data; BIT256_CLEAR_ALL_PTR(p_new_state); @@ -1140,6 +1141,35 @@ void input_get_state_for_port(void *data, unsigned port, retro_bits_t* p_new_sta if (bit_pressed) BIT256_SET_PTR(p_new_state, i); } + + /* left-stick x */ + val = input_joypad_analog(input_driver_get_joypad_driver(), joypad_info, port, 0, 0, libretro_input_binds[port]); + if (val >= 0) + p_new_state->analogs[0] = val; + else + p_new_state->analogs[1] = val; + + /* left-stick y */ + val = input_joypad_analog(input_driver_get_joypad_driver(), joypad_info, port, 0, 1, libretro_input_binds[port]); + if (val >= 0) + p_new_state->analogs[2] = val; + else + p_new_state->analogs[3] = val; + + /* right-stick x */ + val = input_joypad_analog(input_driver_get_joypad_driver(), joypad_info, port, 1, 0, libretro_input_binds[port]); + if (val >= 0) + p_new_state->analogs[4] = val; + else + p_new_state->analogs[5] = val; + + /* right-stick y */ + val = input_joypad_analog(input_driver_get_joypad_driver(), joypad_info, port, 1, 1, libretro_input_binds[port]); + if (val >= 0) + p_new_state->analogs[6] = val; + else + p_new_state->analogs[7] = val; + } void *input_driver_get_data(void) diff --git a/input/input_mapper.c b/input/input_mapper.c index 805297a3b9..a467e6008f 100644 --- a/input/input_mapper.c +++ b/input/input_mapper.c @@ -51,7 +51,7 @@ struct input_mapper { /* Left X, Left Y, Right X, Right Y */ - int16_t analog[4]; + int16_t analog[MAX_USERS][8]; /* the whole keyboard state */ uint32_t keys[RETROK_LAST / 32 + 1]; /* This is a bitmask of (1 << key_bind_id). */ @@ -83,13 +83,14 @@ bool input_mapper_button_pressed(input_mapper_t *handle, unsigned port, unsigned void input_mapper_poll(input_mapper_t *handle) { - int i, j; + int i, j, k; settings_t *settings = config_get_ptr(); retro_bits_t current_input; unsigned max_users = *(input_driver_get_uint(INPUT_ACTION_MAX_USERS)); unsigned device = 0; unsigned current_button_value; - unsigned remap_button; + int16_t current_axis_value; + unsigned remap_button, remap_axis; bool key_event[RARCH_CUSTOM_BIND_LIST_END]; #ifdef HAVE_MENU bool menu_is_alive = menu_driver_is_alive(); @@ -157,15 +158,29 @@ void input_mapper_poll(input_mapper_t *handle) remap_button != RARCH_UNMAPPED) BIT256_SET(handle->buttons[i], remap_button); } -#if 0 +#if 1 /* --CURRENTLY NOT IMPLEMENTED-- this loop should iterate on all users and all analog stick axes and if the axes are moved and is assigned to a button it should set the bit on the mapper input bitmap. Once implemented we should make sure to clear the original analog stick input in input_state in input_driver.c */ - for (j = RARCH_FIRST_CUSTOM_BIND; j < RARCH_CUSTOM_BIND_LIST_END; j++) - { } + for (j = 0; j < 8; j++) + { + handle->analog[i][j] = 0; + + k = j + RARCH_FIRST_CUSTOM_BIND; + current_axis_value = current_input.analogs[j]; + remap_axis = settings->uints.input_remap_ids[i][k]; + if (current_axis_value != 0 && k != remap_axis && remap_axis != RARCH_UNMAPPED) + { + if (remap_axis < RARCH_FIRST_CUSTOM_BIND) + BIT256_SET(handle->buttons[i], remap_axis); + else + handle->analog[i][remap_axis - RARCH_FIRST_CUSTOM_BIND] = current_axis_value; + } + + } #endif } } @@ -188,6 +203,10 @@ void input_mapper_state( if (input_mapper_button_pressed(handle, port, id)) *ret = 1; break; + case RETRO_DEVICE_ANALOG: + if (handle->analog[port][idx == 0 ? id : id / 2] != 0) + *ret = handle->analog[port][idx == 0 ? id : id / 2]; + break; case RETRO_DEVICE_KEYBOARD: if (id < RETROK_LAST) { diff --git a/libretro-common/include/retro_miscellaneous.h b/libretro-common/include/retro_miscellaneous.h index 23f9ef02ac..d39b51feca 100644 --- a/libretro-common/include/retro_miscellaneous.h +++ b/libretro-common/include/retro_miscellaneous.h @@ -153,6 +153,8 @@ static INLINE bool bits_any_set(uint32_t* ptr, uint32_t count) typedef struct { uint32_t data[8]; + uint16_t analogs[8]; } retro_bits_t; + #endif From c608951ff890d81ee6e6934d871bf282d8dd827f Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 8 Apr 2018 01:45:40 -0500 Subject: [PATCH 32/35] remap-redux part2: - remapping analogs to buttons works 100% - remapping to analogs needs the "new input rules written" based on the value and the new axis --- input/input_driver.c | 24 ++++++++++++++++++++++++ input/input_mapper.c | 18 ++++++++++++------ 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/input/input_driver.c b/input/input_driver.c index bad2559b6d..35cfb2860b 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -663,6 +663,30 @@ int16_t input_state(unsigned port, unsigned device, break; case RETRO_DEVICE_ANALOG: if (idx < 2 && id < 2) + { + if (idx == 0) + { + if (id == 0 && settings->uints.input_remap_ids[port][16] != 16) + reset_state = true; + if (id == 0 && settings->uints.input_remap_ids[port][17] != 17) + reset_state = true; + if (id == 1 && settings->uints.input_remap_ids[port][18] != 18) + reset_state = true; + if (id == 1 && settings->uints.input_remap_ids[port][19] != 19) + reset_state = true; + } + if (idx == 1) + { + if (id == 0 && settings->uints.input_remap_ids[port][16] != 20) + reset_state = true; + if (id == 0 && settings->uints.input_remap_ids[port][17] != 21) + reset_state = true; + if (id == 1 && settings->uints.input_remap_ids[port][18] != 22) + reset_state = true; + if (id == 1 && settings->uints.input_remap_ids[port][19] != 23) + reset_state = true; + } + } break; } } diff --git a/input/input_mapper.c b/input/input_mapper.c index a467e6008f..930a757846 100644 --- a/input/input_mapper.c +++ b/input/input_mapper.c @@ -51,7 +51,8 @@ struct input_mapper { /* Left X, Left Y, Right X, Right Y */ - int16_t analog[MAX_USERS][8]; + int16_t analog_value[MAX_USERS][8]; + int new_axis[MAX_USERS][8]; /* the whole keyboard state */ uint32_t keys[RETROK_LAST / 32 + 1]; /* This is a bitmask of (1 << key_bind_id). */ @@ -148,6 +149,7 @@ void input_mapper_poll(input_mapper_t *handle) is assigned to any other button than the default one, then it sets the bit on the mapper input bitmap, later on the original input is cleared in input_state */ BIT256_CLEAR_ALL(handle->buttons[i]); + input_get_state_for_port(settings, i, ¤t_input); for (j = 0; j < RARCH_FIRST_CUSTOM_BIND; j++) @@ -167,17 +169,23 @@ void input_mapper_poll(input_mapper_t *handle) for (j = 0; j < 8; j++) { - handle->analog[i][j] = 0; - k = j + RARCH_FIRST_CUSTOM_BIND; current_axis_value = current_input.analogs[j]; remap_axis = settings->uints.input_remap_ids[i][k]; + if (current_axis_value != 0 && k != remap_axis && remap_axis != RARCH_UNMAPPED) { if (remap_axis < RARCH_FIRST_CUSTOM_BIND) + { BIT256_SET(handle->buttons[i], remap_axis); + //RARCH_LOG("axis %d remapped to button %d val %d\n", j, remap_axis, current_axis_value); + } else - handle->analog[i][remap_axis - RARCH_FIRST_CUSTOM_BIND] = current_axis_value; + { + handle->analog_value[i][remap_axis - RARCH_FIRST_CUSTOM_BIND] = current_axis_value; + handle->new_axis[i][remap_axis - RARCH_FIRST_CUSTOM_BIND] = remap_axis; + RARCH_LOG("axis %d(%d) remapped to axis %d val %d\n", j, k, remap_axis - RARCH_FIRST_CUSTOM_BIND, current_axis_value); + } } } @@ -204,8 +212,6 @@ void input_mapper_state( *ret = 1; break; case RETRO_DEVICE_ANALOG: - if (handle->analog[port][idx == 0 ? id : id / 2] != 0) - *ret = handle->analog[port][idx == 0 ? id : id / 2]; break; case RETRO_DEVICE_KEYBOARD: if (id < RETROK_LAST) From 72065aee0b629c9e87a624086303d35ec9610c10 Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 8 Apr 2018 02:49:46 -0500 Subject: [PATCH 33/35] remap-redux part2: analog to analog input rules are working for left stick to left stick and left stick to right, for some reason not for right stick to right stick (inverting axes) or right stick to left... --- input/input_driver.c | 8 ++--- input/input_mapper.c | 76 +++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 75 insertions(+), 9 deletions(-) diff --git a/input/input_driver.c b/input/input_driver.c index 35cfb2860b..3df9740e19 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -677,13 +677,13 @@ int16_t input_state(unsigned port, unsigned device, } if (idx == 1) { - if (id == 0 && settings->uints.input_remap_ids[port][16] != 20) + if (id == 0 && settings->uints.input_remap_ids[port][20] != 20) reset_state = true; - if (id == 0 && settings->uints.input_remap_ids[port][17] != 21) + if (id == 0 && settings->uints.input_remap_ids[port][21] != 21) reset_state = true; - if (id == 1 && settings->uints.input_remap_ids[port][18] != 22) + if (id == 1 && settings->uints.input_remap_ids[port][22] != 22) reset_state = true; - if (id == 1 && settings->uints.input_remap_ids[port][19] != 23) + if (id == 1 && settings->uints.input_remap_ids[port][23] != 23) reset_state = true; } } diff --git a/input/input_mapper.c b/input/input_mapper.c index 930a757846..add2d226be 100644 --- a/input/input_mapper.c +++ b/input/input_mapper.c @@ -52,7 +52,6 @@ struct input_mapper { /* Left X, Left Y, Right X, Right Y */ int16_t analog_value[MAX_USERS][8]; - int new_axis[MAX_USERS][8]; /* the whole keyboard state */ uint32_t keys[RETROK_LAST / 32 + 1]; /* This is a bitmask of (1 << key_bind_id). */ @@ -149,6 +148,8 @@ void input_mapper_poll(input_mapper_t *handle) is assigned to any other button than the default one, then it sets the bit on the mapper input bitmap, later on the original input is cleared in input_state */ BIT256_CLEAR_ALL(handle->buttons[i]); + for (j = 0; j < 8; j++) + handle->analog_value[i][j] = 0; input_get_state_for_port(settings, i, ¤t_input); @@ -170,6 +171,7 @@ void input_mapper_poll(input_mapper_t *handle) for (j = 0; j < 8; j++) { k = j + RARCH_FIRST_CUSTOM_BIND; + current_axis_value = current_input.analogs[j]; remap_axis = settings->uints.input_remap_ids[i][k]; @@ -178,13 +180,20 @@ void input_mapper_poll(input_mapper_t *handle) if (remap_axis < RARCH_FIRST_CUSTOM_BIND) { BIT256_SET(handle->buttons[i], remap_axis); - //RARCH_LOG("axis %d remapped to button %d val %d\n", j, remap_axis, current_axis_value); + /* RARCH_LOG("axis %d remapped to button %d val %d\n", j, remap_axis, current_axis_value); */ } else { - handle->analog_value[i][remap_axis - RARCH_FIRST_CUSTOM_BIND] = current_axis_value; - handle->new_axis[i][remap_axis - RARCH_FIRST_CUSTOM_BIND] = remap_axis; - RARCH_LOG("axis %d(%d) remapped to axis %d val %d\n", j, k, remap_axis - RARCH_FIRST_CUSTOM_BIND, current_axis_value); + int invert = 1; + /*if ((k == 16 && remap_axis == 17) || (k == 17 && remap_axis == 16) || + (k == 18 && remap_axis == 19) || (k == 19 && remap_axis == 18) || + (k == 20 && remap_axis == 21) || (k == 21 && remap_axis == 20) || + (k == 22 && remap_axis == 23) || (k == 23 && remap_axis == 22))*/ + if ((k % 2 == 0 && remap_axis % 2 != 0) || (k % 2 != 0 && remap_axis % 2 == 0)) + invert = -1; + + handle->analog_value[i][remap_axis - RARCH_FIRST_CUSTOM_BIND] = current_axis_value * invert; + /* RARCH_LOG("axis %d(%d) remapped to axis %d val %d\n", j, k, remap_axis - RARCH_FIRST_CUSTOM_BIND, current_axis_value); */ } } @@ -212,6 +221,63 @@ void input_mapper_state( *ret = 1; break; case RETRO_DEVICE_ANALOG: + { + int val = 0; + if (idx == 0) + { + if (id == 0) + { + if (handle->analog_value[port][0]) + val = handle->analog_value[port][0]; + else if (handle->analog_value[port][1]) + val = handle->analog_value[port][1]; + + if(handle->analog_value[port][0] || handle->analog_value[port][1]) + { + *ret = val; + } + } + if (id == 1) + { + if (handle->analog_value[port][2]) + val = handle->analog_value[port][2]; + else if (handle->analog_value[port][3]) + val = handle->analog_value[port][3]; + + if(handle->analog_value[port][2] || handle->analog_value[port][3]) + { + *ret = val; + } + } + if (idx == 1) + { + if (id == 0) + { + if (handle->analog_value[port][4]) + val = handle->analog_value[port][4]; + else if (handle->analog_value[port][5]) + val = handle->analog_value[port][5]; + + if(handle->analog_value[port][4] || handle->analog_value[port][5]) + { + *ret = val; + } + } + if (id == 1) + { + if (handle->analog_value[port][6]) + val = handle->analog_value[port][6]; + else if (handle->analog_value[port][7]) + val = handle->analog_value[port][7]; + + if(handle->analog_value[port][6] || handle->analog_value[port][7]) + { + *ret = val; + } + } + } + } + } break; case RETRO_DEVICE_KEYBOARD: if (id < RETROK_LAST) From f517ca3b56eeab569c405c9d967306985acb9729 Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 8 Apr 2018 11:01:47 -0500 Subject: [PATCH 34/35] remap-redux part2: fix right stick --- input/input_mapper.c | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/input/input_mapper.c b/input/input_mapper.c index add2d226be..130c8a71c2 100644 --- a/input/input_mapper.c +++ b/input/input_mapper.c @@ -249,31 +249,31 @@ void input_mapper_state( *ret = val; } } - if (idx == 1) + } + if (idx == 1) + { + if (id == 0) { - if (id == 0) - { - if (handle->analog_value[port][4]) - val = handle->analog_value[port][4]; - else if (handle->analog_value[port][5]) - val = handle->analog_value[port][5]; + if (handle->analog_value[port][4]) + val = handle->analog_value[port][4]; + else if (handle->analog_value[port][5]) + val = handle->analog_value[port][5]; - if(handle->analog_value[port][4] || handle->analog_value[port][5]) - { - *ret = val; - } + if(handle->analog_value[port][4] || handle->analog_value[port][5]) + { + *ret = val; } - if (id == 1) - { - if (handle->analog_value[port][6]) - val = handle->analog_value[port][6]; - else if (handle->analog_value[port][7]) - val = handle->analog_value[port][7]; + } + if (id == 1) + { + if (handle->analog_value[port][6]) + val = handle->analog_value[port][6]; + else if (handle->analog_value[port][7]) + val = handle->analog_value[port][7]; - if(handle->analog_value[port][6] || handle->analog_value[port][7]) - { - *ret = val; - } + if(handle->analog_value[port][6] || handle->analog_value[port][7]) + { + *ret = val; } } } From 2b9b82945947c187a149280d905ea8e4a17b3641 Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 8 Apr 2018 12:12:45 -0500 Subject: [PATCH 35/35] remap-redux part2: fix saving, loading and set defaults --- input/input_mapper.c | 40 ++++++++++++++++++++++------------------ input/input_remapping.c | 39 ++++++++++++++++++++++++++++----------- 2 files changed, 50 insertions(+), 29 deletions(-) diff --git a/input/input_mapper.c b/input/input_mapper.c index 130c8a71c2..67da220234 100644 --- a/input/input_mapper.c +++ b/input/input_mapper.c @@ -158,15 +158,21 @@ void input_mapper_poll(input_mapper_t *handle) current_button_value = BIT256_GET(current_input, j); remap_button = settings->uints.input_remap_ids[i][j]; if (current_button_value == 1 && j != remap_button && - remap_button != RARCH_UNMAPPED) + remap_button != RARCH_UNMAPPED && remap_button < RARCH_FIRST_CUSTOM_BIND) BIT256_SET(handle->buttons[i], remap_button); + else if (current_button_value == 1 && j != remap_button && + remap_button != RARCH_UNMAPPED && remap_button >= RARCH_FIRST_CUSTOM_BIND) + { + int invert = 1; + + if (remap_button % 2 != 0) + invert = -1; + + handle->analog_value[i][remap_button - RARCH_FIRST_CUSTOM_BIND] = 32767 * invert; + /* RARCH_LOG("axis %d(%d) remapped to axis %d val %d\n", j, k, + remap_button - RARCH_FIRST_CUSTOM_BIND, current_axis_value); */ + } } -#if 1 - /* --CURRENTLY NOT IMPLEMENTED-- - this loop should iterate on all users and all analog stick axes and if the axes are - moved and is assigned to a button it should set the bit on the mapper input bitmap. - Once implemented we should make sure to clear the original analog - stick input in input_state in input_driver.c */ for (j = 0; j < 8; j++) { @@ -180,25 +186,23 @@ void input_mapper_poll(input_mapper_t *handle) if (remap_axis < RARCH_FIRST_CUSTOM_BIND) { BIT256_SET(handle->buttons[i], remap_axis); - /* RARCH_LOG("axis %d remapped to button %d val %d\n", j, remap_axis, current_axis_value); */ + /* RARCH_LOG("axis %d remapped to button %d val %d\n", j, + remap_axis, current_axis_value); */ } else { int invert = 1; - /*if ((k == 16 && remap_axis == 17) || (k == 17 && remap_axis == 16) || - (k == 18 && remap_axis == 19) || (k == 19 && remap_axis == 18) || - (k == 20 && remap_axis == 21) || (k == 21 && remap_axis == 20) || - (k == 22 && remap_axis == 23) || (k == 23 && remap_axis == 22))*/ + if ((k % 2 == 0 && remap_axis % 2 != 0) || (k % 2 != 0 && remap_axis % 2 == 0)) invert = -1; handle->analog_value[i][remap_axis - RARCH_FIRST_CUSTOM_BIND] = current_axis_value * invert; - /* RARCH_LOG("axis %d(%d) remapped to axis %d val %d\n", j, k, remap_axis - RARCH_FIRST_CUSTOM_BIND, current_axis_value); */ + /* RARCH_LOG("axis %d(%d) remapped to axis %d val %d\n", j, k, + remap_axis - RARCH_FIRST_CUSTOM_BIND, current_axis_value); */ } } } -#endif } } } @@ -234,7 +238,7 @@ void input_mapper_state( if(handle->analog_value[port][0] || handle->analog_value[port][1]) { - *ret = val; + *ret |= val; } } if (id == 1) @@ -246,7 +250,7 @@ void input_mapper_state( if(handle->analog_value[port][2] || handle->analog_value[port][3]) { - *ret = val; + *ret |= val; } } } @@ -261,7 +265,7 @@ void input_mapper_state( if(handle->analog_value[port][4] || handle->analog_value[port][5]) { - *ret = val; + *ret |= val; } } if (id == 1) @@ -273,7 +277,7 @@ void input_mapper_state( if(handle->analog_value[port][6] || handle->analog_value[port][7]) { - *ret = val; + *ret |= val; } } } diff --git a/input/input_remapping.c b/input/input_remapping.c index 15a34c1d7d..d16d65781a 100644 --- a/input/input_remapping.c +++ b/input/input_remapping.c @@ -58,6 +58,8 @@ bool input_remapping_load_file(void *data, const char *path) char key_ident[RARCH_FIRST_CUSTOM_BIND + 4][128] = {{0}}; char stk_ident[RARCH_FIRST_CUSTOM_BIND + 4][128] = {{0}}; + bool ret = false; + char key_strings[RARCH_FIRST_CUSTOM_BIND + 8][128] = { "b", "y", "select", "start", "up", "down", "left", "right", @@ -85,11 +87,12 @@ bool input_remapping_load_file(void *data, const char *path) key_strings[j], '_', sizeof(btn_ident[j])); if (config_get_int(conf, btn_ident[j], &btn_remap) - && (btn_remap < RARCH_FIRST_CUSTOM_BIND && btn_remap != -1)) + && btn_remap != -1) settings->uints.input_remap_ids[i][j] = btn_remap; else if (config_get_int(conf, btn_ident[j], &btn_remap) - && (btn_remap == -1)) + && btn_remap == -1) settings->uints.input_remap_ids[i][j] = RARCH_UNMAPPED; + /* else do nothing, important */ int key_remap = -1; @@ -112,11 +115,15 @@ bool input_remapping_load_file(void *data, const char *path) s3, key_strings[j]); - if (config_get_int(conf, stk_ident[j], - &stk_remap)) - settings->uints.input_remap_ids[i][j] = - stk_remap; - RARCH_LOG("stk_ident: %s:%d\n", stk_ident[j], settings->uints.input_remap_ids[i][j]); + RARCH_LOG("pre_ident: %s:%d\n", stk_ident[j], settings->uints.input_remap_ids[i][j]); + + if (config_get_int(conf, stk_ident[j], &stk_remap) && stk_remap != -1) + settings->uints.input_remap_ids[i][j] = stk_remap; + else if (config_get_int(conf, stk_ident[j], &stk_remap) && stk_remap == -1) + settings->uints.input_remap_ids[i][j] = RARCH_UNMAPPED; + /* else do nothing, important */ + + /*RARCH_LOG("stk_ident: %s:%d\n", stk_ident[j], settings->uints.input_remap_ids[i][j]);*/ } snprintf(s1, sizeof(s1), "input_player%u_analog_dpad_mode", i + 1); @@ -191,7 +198,7 @@ bool input_remapping_save_file(const char *path) snprintf(s2, sizeof(s2), "input_player%u_key", i + 1); snprintf(s3, sizeof(s1), "input_player%u_stk", i + 1); - for (j = 0; j < RARCH_FIRST_CUSTOM_BIND + 4; j++) + for (j = 0; j < RARCH_FIRST_CUSTOM_BIND + 8; j++) { fill_pathname_join_delim(btn_ident[j], s1, key_strings[j], '_', sizeof(btn_ident[j])); @@ -201,9 +208,11 @@ bool input_remapping_save_file(const char *path) /* only save values that have been modified */ if(j < RARCH_FIRST_CUSTOM_BIND) { - if(settings->uints.input_remap_ids[i][j] != j && settings->uints.input_remap_ids[i][j] != RARCH_UNMAPPED) + if(settings->uints.input_remap_ids[i][j] != j && + settings->uints.input_remap_ids[i][j] != RARCH_UNMAPPED) config_set_int(conf, btn_ident[j], settings->uints.input_remap_ids[i][j]); - else if (settings->uints.input_remap_ids[i][j] != j && settings->uints.input_remap_ids[i][j] == RARCH_UNMAPPED) + else if (settings->uints.input_remap_ids[i][j] != j && + settings->uints.input_remap_ids[i][j] == RARCH_UNMAPPED) config_set_int(conf, btn_ident[j], -1); else config_unset(conf,btn_ident[j]); @@ -217,9 +226,14 @@ bool input_remapping_save_file(const char *path) { fill_pathname_join_delim(stk_ident[j], s3, key_strings[j], '_', sizeof(stk_ident[j])); - if(settings->uints.input_remap_ids[i][j] != j - RARCH_FIRST_CUSTOM_BIND) + if(settings->uints.input_remap_ids[i][j] != j && + settings->uints.input_remap_ids[i][j] != RARCH_UNMAPPED) config_set_int(conf, stk_ident[j], settings->uints.input_remap_ids[i][j]); + else if(settings->uints.input_remap_ids[i][j] != j && + settings->uints.input_remap_ids[i][j] == RARCH_UNMAPPED) + config_set_int(conf, stk_ident[j], + -1); else config_unset(conf,btn_ident[j]); } @@ -286,7 +300,10 @@ void input_remapping_set_defaults(bool deinit) settings->uints.input_keymapper_ids[i][j] = RETROK_UNKNOWN; } for (j = RARCH_FIRST_CUSTOM_BIND; j < RARCH_FIRST_CUSTOM_BIND + 8; j++) + { + RARCH_LOG("******************User: %d Val: %d\n", i, j ); settings->uints.input_remap_ids[i][j] = j; + } if (old_analog_dpad_mode[i]) settings->uints.input_analog_dpad_mode[i] = old_analog_dpad_mode[i];