From b66819392385d1af71f25f9a00c93a083c2e40d6 Mon Sep 17 00:00:00 2001 From: Brian Koropoff Date: Wed, 8 Nov 2017 16:59:52 -0800 Subject: [PATCH 001/183] scanner: allow matching archives by member This allows more flexible detection of content packaged as multiple compressed files (e.g. MAME). --- core_info.c | 44 +++++++++++++++++++++++++++++++++++++++++++ core_info.h | 3 +++ tasks/task_database.c | 11 ++++++++++- 3 files changed, 57 insertions(+), 1 deletion(-) diff --git a/core_info.c b/core_info.c index 659a71fc6d..c2989d883b 100644 --- a/core_info.c +++ b/core_info.c @@ -389,6 +389,10 @@ static core_info_list_t *core_info_list_new(const char *path) &tmp_bool)) core_info[i].supports_no_game = tmp_bool; + if (config_get_bool(conf, "database_match_archive_member", + &tmp_bool)) + core_info[i].database_match_archive_member = tmp_bool; + core_info[i].config_data = conf; } else @@ -823,6 +827,46 @@ size_t core_info_list_num_info_files(core_info_list_t *core_info_list) return num; } +bool core_info_database_match_archive_member(const char *database_path) +{ + char *database = NULL; + const char *new_path = path_basename(database_path); + + if (string_is_empty(new_path)) + return false; + + database = strdup(new_path); + + if (string_is_empty(database)) + goto error; + + path_remove_extension(database); + + if (core_info_curr_list) + { + size_t i; + + for (i = 0; i < core_info_curr_list->count; i++) + { + const core_info_t *info = &core_info_curr_list->list[i]; + + if (!info->database_match_archive_member) + continue; + + if (!string_list_find_elem(info->databases_list, database)) + continue; + + free(database); + return true; + } + } + +error: + if (database) + free(database); + return false; +} + bool core_info_database_supports_content_path(const char *database_path, const char *path) { char *database = NULL; diff --git a/core_info.h b/core_info.h index 2800cd2edf..a151091673 100644 --- a/core_info.h +++ b/core_info.h @@ -38,6 +38,7 @@ typedef struct typedef struct { bool supports_no_game; + bool database_match_archive_member; size_t firmware_count; char *path; void *config_data; @@ -120,6 +121,8 @@ bool core_info_load(core_info_ctx_find_t *info); bool core_info_database_supports_content_path(const char *database_path, const char *path); +bool core_info_database_match_archive_member(const char *database_path); + bool core_info_unsupported_content_path(const char *path); RETRO_END_DECLS diff --git a/tasks/task_database.c b/tasks/task_database.c index 6e49a4125a..cef5171480 100644 --- a/tasks/task_database.c +++ b/tasks/task_database.c @@ -797,6 +797,7 @@ static int database_info_list_iterate_found_match( database_info_get_current_element_name(db); database_info_t *db_info_entry = &db_state->info->list[db_state->entry_index]; + char *hash; db_crc[0] = '\0'; db_playlist_path[0] = '\0'; @@ -827,6 +828,11 @@ static int database_info_list_iterate_found_match( entry_path_str, archive_name, '#', PATH_MAX_LENGTH * sizeof(char)); + if (core_info_database_match_archive_member( + db_state->list->elems[db_state->list_index].data) && + (hash = strchr(entry_path_str, '#'))) + *hash = '\0'; + #if 0 RARCH_LOG("Found match in database !\n"); @@ -900,7 +906,10 @@ static int task_database_iterate_crc_lookup( query[0] = '\0'; /* don't scan files that can't be in this database */ - if (!core_info_database_supports_content_path( + if (!(path_contains_compressed_file(name) && + core_info_database_match_archive_member( + db_state->list->elems[db_state->list_index].data)) && + !core_info_database_supports_content_path( db_state->list->elems[db_state->list_index].data, name)) return database_info_list_iterate_next(db_state); From bedf65e72ee87e950668d4ed542f05526f0735db Mon Sep 17 00:00:00 2001 From: Brian Koropoff Date: Wed, 8 Nov 2017 18:11:05 -0800 Subject: [PATCH 002/183] scanner: prioritize databases with recent matches This should improve performance when scanning many files in a row that all match against the same database, which is the expectation. --- tasks/task_database.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tasks/task_database.c b/tasks/task_database.c index cef5171480..3f3b158bc7 100644 --- a/tasks/task_database.c +++ b/tasks/task_database.c @@ -868,6 +868,17 @@ static int database_info_list_iterate_found_match( free(db_playlist_base_str); free(db_crc); + /* Move database to start since we are likely to match against it + again */ + if (db_state->list_index != 0) + { + struct string_list_elem entry = db_state->list->elems[db_state->list_index]; + memmove(&db_state->list->elems[1], + &db_state->list->elems[0], + sizeof(entry) * db_state->list_index); + db_state->list->elems[0] = entry; + } + return 0; } From 1db8ae9f6038553d93a9beef8ddcd7e7ffd77cb5 Mon Sep 17 00:00:00 2001 From: Brian Koropoff Date: Wed, 8 Nov 2017 18:22:26 -0800 Subject: [PATCH 003/183] Update changelog --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index 6de0f51c9e..aa525a0463 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -45,6 +45,7 @@ - SCANNER: Support CHD files. - SCANNER: Support Gamecube ISO scanning. - SCANNER: Use primary data track of disc images for CRC lookups rather than cue files. This is slower but finds matches more reliably, and is necessary for CHD files to work at all. Update your databases! +- SCANNER: Fall back on looking inside archives when matching MAME/FBA content (most recent cores only). If you had difficulty with content being detected before, you may have better luck now. Update your databases and core info! # 1.6.7 - SCANNER: Fix directory scanning. From 711877b05653079d2163f02d0cb8b7de4389b7e7 Mon Sep 17 00:00:00 2001 From: Brian Koropoff Date: Wed, 8 Nov 2017 19:41:13 -0800 Subject: [PATCH 004/183] content: preserve info for history/favorites If the content came from a playlist, use the original label. Preserve the core path and name in the favorites list. --- command.c | 23 ++++++++++++++++++++--- menu/cbs/menu_cbs_ok.c | 12 +++++++----- retroarch.h | 1 + tasks/task_content.c | 12 +++++++++++- tasks/tasks_internal.h | 1 + 5 files changed, 40 insertions(+), 9 deletions(-) diff --git a/command.c b/command.c index e458b1d640..97b847c484 100644 --- a/command.c +++ b/command.c @@ -2237,18 +2237,35 @@ TODO: Add a setting for these tweaks */ ui_companion_driver_toggle(); break; case CMD_EVENT_ADD_TO_FAVORITES: + { + global_t *global = global_get_ptr(); + rarch_system_info_t *sys_info = runloop_get_system_info(); + const char *core_name = NULL; + const char *core_path = NULL; + const char *label = NULL; + + if (sys_info) + { + core_name = sys_info->info.library_name; + core_path = path_get(RARCH_PATH_CORE); + } + + if (!string_is_empty(global->name.label)) + label = global->name.label; + playlist_push( g_defaults.content_favorites, (const char*)data, - NULL, - file_path_str(FILE_PATH_DETECT), - file_path_str(FILE_PATH_DETECT), + label, + core_path, + core_name, NULL, NULL ); playlist_write_file(g_defaults.content_favorites); runloop_msg_queue_push(msg_hash_to_str(MSG_ADDED_TO_FAVORITES), 1, 180, true); break; + } case CMD_EVENT_RESTART_RETROARCH: if (!frontend_driver_set_fork(FRONTEND_FORK_RESTART)) return false; diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 00725f6909..c00e8410e5 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -1566,7 +1566,7 @@ static int action_ok_playlist_entry_collection(const char *path, if (!task_push_load_content_from_playlist_from_menu( - new_core_path, path, + new_core_path, path, entry_label, &content_info, NULL, NULL)) return -1; @@ -1582,6 +1582,7 @@ static int action_ok_playlist_entry(const char *path, size_t selection_ptr = 0; playlist_t *playlist = g_defaults.content_history; const char *entry_path = NULL; + const char *entry_label = NULL; const char *core_path = NULL; const char *core_name = NULL; playlist_t *tmp_playlist = NULL; @@ -1598,7 +1599,7 @@ static int action_ok_playlist_entry(const char *path, selection_ptr = entry_idx; playlist_get_index(playlist, selection_ptr, - &entry_path, NULL, &core_path, &core_name, NULL, NULL); + &entry_path, &entry_label, &core_path, &core_name, NULL, NULL); if ( string_is_equal(core_path, file_path_str(FILE_PATH_DETECT)) && string_is_equal(core_name, file_path_str(FILE_PATH_DETECT))) @@ -1662,7 +1663,7 @@ static int action_ok_playlist_entry(const char *path, NULL, NULL); if (!task_push_load_content_from_playlist_from_menu( - core_path, path, + core_path, path, entry_label, &content_info, NULL, NULL)) return -1; @@ -1679,6 +1680,7 @@ static int action_ok_playlist_entry_start_content(const char *path, bool playlist_initialized = false; playlist_t *playlist = NULL; const char *entry_path = NULL; + const char *entry_label = NULL; const char *core_path = NULL; const char *core_name = NULL; playlist_t *tmp_playlist = NULL; @@ -1708,7 +1710,7 @@ static int action_ok_playlist_entry_start_content(const char *path, selection_ptr = rdb_entry_start_game_selection_ptr; playlist_get_index(playlist, selection_ptr, - &entry_path, NULL, &core_path, &core_name, NULL, NULL); + &entry_path, &entry_label, &core_path, &core_name, NULL, NULL); if ( string_is_equal(core_path, file_path_str(FILE_PATH_DETECT)) && string_is_equal(core_name, file_path_str(FILE_PATH_DETECT))) @@ -1772,7 +1774,7 @@ static int action_ok_playlist_entry_start_content(const char *path, playlist_info.idx, &path, NULL, NULL, NULL, NULL, NULL); if (!task_push_load_content_from_playlist_from_menu( - core_path, path, + core_path, path, entry_label, &content_info, NULL, NULL)) return -1; diff --git a/retroarch.h b/retroarch.h index a8600f665b..a0e813c571 100644 --- a/retroarch.h +++ b/retroarch.h @@ -225,6 +225,7 @@ typedef struct global char ups[8192]; char bps[8192]; char ips[8192]; + char label[8192]; char *remapfile; } name; diff --git a/tasks/task_content.c b/tasks/task_content.c index 65a4ab6974..d82d912e34 100644 --- a/tasks/task_content.c +++ b/tasks/task_content.c @@ -920,7 +920,9 @@ static bool task_load_content(content_ctx_info_t *content_info, { const char *core_path = NULL; const char *core_name = NULL; + const char *label = NULL; playlist_t *playlist_tmp = g_defaults.content_history; + global_t *global = global_get_ptr(); switch (path_is_media_type(tmp)) { @@ -955,13 +957,16 @@ static bool task_load_content(content_ctx_info_t *content_info, content_ctx->history_list_enable = settings->bools.history_list_enable; } + if (global && !string_is_empty(global->name.label)) + label = global->name.label; + if ( content_ctx->history_list_enable && playlist_tmp && playlist_push( playlist_tmp, tmp, - NULL, + label, core_path, core_name, NULL, @@ -1150,6 +1155,7 @@ bool task_push_start_dummy_core(content_ctx_info_t *content_info) bool task_push_load_content_from_playlist_from_menu( const char *core_path, const char *fullpath, + const char *label, content_ctx_info_t *content_info, retro_task_callback_t cb, void *user_data) @@ -1191,6 +1197,10 @@ bool task_push_load_content_from_playlist_from_menu( content_ctx.name_bps = strdup(global->name.bps); if (!string_is_empty(global->name.ups)) content_ctx.name_ups = strdup(global->name.ups); + if (label) + strlcpy(global->name.label, label, sizeof(global->name.label)); + else + global->name.label[0] = '\0'; } if (!string_is_empty(settings->paths.directory_system)) diff --git a/tasks/tasks_internal.h b/tasks/tasks_internal.h index e9174eac43..bf32504ef0 100644 --- a/tasks/tasks_internal.h +++ b/tasks/tasks_internal.h @@ -198,6 +198,7 @@ bool task_push_load_content_with_new_core_from_menu( bool task_push_load_content_from_playlist_from_menu( const char *core_path, const char *fullpath, + const char *label, content_ctx_info_t *content_info, retro_task_callback_t cb, void *user_data); From efad07e89f6de433a6b0a9f1125d9a7412b892c7 Mon Sep 17 00:00:00 2001 From: Ash Date: Sun, 19 Nov 2017 17:18:03 +1100 Subject: [PATCH 005/183] [WiiU] Add proper DRC touch scaling for non-720p resolutions --- input/drivers_joypad/wiiu_joypad.c | 34 +++++++++++++++--------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/input/drivers_joypad/wiiu_joypad.c b/input/drivers_joypad/wiiu_joypad.c index 71f23aa99b..8fac55d0ae 100644 --- a/input/drivers_joypad/wiiu_joypad.c +++ b/input/drivers_joypad/wiiu_joypad.c @@ -212,33 +212,33 @@ static void wiiu_joypad_poll(void) if (vpad.tpNormal.touched && vpad.tpNormal.validity == VPAD_VALID) { struct video_viewport vp = {0}; video_driver_get_viewport_info(&vp); - VPADTouchData cal = {0}; + VPADTouchData cal720p = {0}; /* Calibrates data to a 720p screen, seems to clamp outer 12px */ - VPADGetTPCalibratedPoint(0, &cal, &(vpad.tpNormal)); + VPADGetTPCalibratedPoint(0, &cal720p, &(vpad.tpNormal)); + /* Recalibrate to match video driver's coordinate system */ + VPADTouchData calNative = {0}; + calNative.x = scaleTP(12, 1268, 0, vp.full_width, cal720p.x); + calNative.y = scaleTP(12, 708, 0, vp.full_height, cal720p.y); /* Clamp to actual game image */ + VPADTouchData calClamped = calNative; bool touchClamped = false; - if (cal.x < vp.x) { - cal.x = vp.x; + if (calClamped.x < vp.x) { + calClamped.x = vp.x; touchClamped = true; - } else if (cal.x > vp.x + vp.width) { - cal.x = vp.x + vp.width; + } else if (calClamped.x > vp.x + vp.width) { + calClamped.x = vp.x + vp.width; touchClamped = true; } - if (cal.y < vp.y) { - cal.y = vp.y; + if (calClamped.y < vp.y) { + calClamped.y = vp.y; touchClamped = true; - } else if (cal.y > vp.y + vp.height) { - cal.y = vp.y + vp.height; + } else if (calClamped.y > vp.y + vp.height) { + calClamped.y = vp.y + vp.height; touchClamped = true; } - /* Account for 12px clamp on VPADGetTPCalibratedPoint */ - if (vp.x < 12) vp.x = 12; - if (vp.y < 12) vp.y = 12; - if (vp.x + vp.width > 1268) vp.width = 1268 - vp.x; - if (vp.y + vp.height > 708) vp.height = 708 - vp.y; /* Calibrate to libretro spec and save as axis 2 (idx 4,5) */ - analog_state[0][2][0] = scaleTP(vp.x, vp.x + vp.width, -0x7fff, 0x7fff, cal.x); - analog_state[0][2][1] = scaleTP(vp.y, vp.y + vp.height, -0x7fff, 0x7fff, cal.y); + analog_state[0][2][0] = scaleTP(vp.x, vp.x + vp.width, -0x7fff, 0x7fff, calClamped.x); + analog_state[0][2][1] = scaleTP(vp.y, vp.y + vp.height, -0x7fff, 0x7fff, calClamped.y); /* Emulating a button (#19) for touch; lets people assign it to menu for that traditional RetroArch Wii U feel */ From a1539e432ccc7861eb67ad993c1c014488b14d31 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 19 Nov 2017 17:23:00 +0100 Subject: [PATCH 006/183] Set netplay_check_frames default to 600 now --- config.def.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.def.h b/config.def.h index 880da62e0a..cbbffb0ffb 100644 --- a/config.def.h +++ b/config.def.h @@ -528,7 +528,7 @@ static const bool netplay_nat_traversal = false; static const unsigned netplay_delay_frames = 16; -static const int netplay_check_frames = 30; +static const int netplay_check_frames = 600; static const bool netplay_use_mitm_server = false; From 5b3c1edbef507ab49fd66a31a76513bb73809077 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 19 Nov 2017 17:29:09 +0100 Subject: [PATCH 007/183] Revert "qb: Add some safe defaults." This reverts commit 0114c7b0c49a6ea3637b5dd2bd4abf0395b84116. --- qb/qb.system.sh | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/qb/qb.system.sh b/qb/qb.system.sh index 45541ea1e4..0589126905 100644 --- a/qb/qb.system.sh +++ b/qb/qb.system.sh @@ -1,7 +1,3 @@ -IFS=' -' -\unalias -a 2>/dev/null -PATH="$(command -p getconf PATH):$PATH" if [ -n "$CROSS_COMPILE" ]; then case "$CROSS_COMPILE" in @@ -30,3 +26,4 @@ if [ -e /etc/lsb-release ]; then fi echo "Checking operating system ... $OS ${DISTRO}" + From c5dfa314add1b65a1429ea21f6904a8d7f9df99f Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 19 Nov 2017 12:43:13 -0500 Subject: [PATCH 008/183] fix leak --- network/netplay/netplay_discovery.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/network/netplay/netplay_discovery.c b/network/netplay/netplay_discovery.c index 8f9104251b..5a7eec920b 100644 --- a/network/netplay/netplay_discovery.c +++ b/network/netplay/netplay_discovery.c @@ -237,6 +237,11 @@ bool netplay_lan_ad_server(netplay_t *netplay) char reply_addr[NETPLAY_HOST_STR_LEN], port_str[6]; struct addrinfo *our_addr, hints = {0}; + net_ifinfo_t interfaces; + + if (!net_ifinfo_new(&interfaces)) + return false; + if (lan_ad_server_fd < 0 && !init_lan_ad_server_socket(netplay, RARCH_DEFAULT_PORT)) return false; @@ -277,11 +282,6 @@ bool netplay_lan_ad_server(netplay_t *netplay) strlcpy(reply_addr, ad_packet_buffer.address, NETPLAY_HOST_STR_LEN); - net_ifinfo_t interfaces; - - if (!net_ifinfo_new(&interfaces)) - return false; - for (k = 0; k < interfaces.size; k++) { char *p; @@ -349,6 +349,7 @@ bool netplay_lan_ad_server(netplay_t *netplay) } } + net_ifinfo_free(&interfaces); return true; } From 8dfc585c59318d0e8a81a819026d7a896d1bf09e Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 19 Nov 2017 13:07:51 -0500 Subject: [PATCH 009/183] fix another leak --- network/netplay/netplay_discovery.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/network/netplay/netplay_discovery.c b/network/netplay/netplay_discovery.c index 5a7eec920b..68e8a9eff3 100644 --- a/network/netplay/netplay_discovery.c +++ b/network/netplay/netplay_discovery.c @@ -339,6 +339,8 @@ bool netplay_lan_ad_server(netplay_t *netplay) /* And send it */ sendto(lan_ad_server_fd, (const char*)&ad_packet_buffer, sizeof(struct ad_packet), 0, our_addr->ai_addr, our_addr->ai_addrlen); + if (our_addr) + freeaddrinfo_retro(our_addr); } else continue; @@ -347,10 +349,10 @@ bool netplay_lan_ad_server(netplay_t *netplay) continue; } } - } net_ifinfo_free(&interfaces); + return true; } From 7be0dd9b18699a6e7a15641b7806422fe17c256d Mon Sep 17 00:00:00 2001 From: celerizer <33245078+celerizer@users.noreply.github.com> Date: Sun, 19 Nov 2017 14:16:49 -0600 Subject: [PATCH 010/183] RA Leaderboards: BCD and Ignore Unused Fields - Support for binary-coded-decimal submits (b0x1234) - Ignore unused fields from older leaderboards (PRO, FOR, TTL, DES) --- cheevos/cheevos.c | 160 ++++++++++++++++++++++++++++++++-------------- cheevos/var.c | 14 +++- cheevos/var.h | 1 + 3 files changed, 127 insertions(+), 48 deletions(-) diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c index c5aca66d00..9ad63a365c 100644 --- a/cheevos/cheevos.c +++ b/cheevos/cheevos.c @@ -534,6 +534,8 @@ static void cheevos_add_var(const cheevos_var_t* var, char** memaddr, { if (var->type == CHEEVOS_VAR_TYPE_DELTA_MEM) cheevos_add_char(memaddr, left, 'd'); + else if (var->is_bcd) + cheevos_add_char(memaddr, left, 'b'); cheevos_add_string(memaddr, left, "0x"); cheevos_add_var_size(memaddr, left, var); @@ -884,7 +886,7 @@ static int cheevos_parse_condition(cheevos_condition_t *condition, const char* m cheevos_condset_t *condset = NULL; cheevos_condset_t *conds = NULL; const cheevos_condset_t* end = NULL; - + (void)conds; condition->condsets = (cheevos_condset_t*) @@ -915,9 +917,10 @@ static int cheevos_parse_condition(cheevos_condition_t *condition, const char* m { while (--condset >= condition->condsets) { - free((void*)condset->conds); + if ((void*)condset->conds) + free((void*)condset->conds); } - + return -1; } @@ -937,9 +940,19 @@ static void cheevos_free_condition(cheevos_condition_t* condition) if (condition->condsets) { for (i = 0; i < condition->count; i++) - free((void*)condition->condsets[i].conds); + { + if (condition->condsets[i].conds) + { + free(condition->condsets[i].conds); + condition->condsets[i].conds = NULL; + } + } - free((void*)condition->condsets); + if (condition->condsets) + { + free(condition->condsets); + condition->condsets = NULL; + } } } @@ -955,8 +968,12 @@ static int cheevos_parse_expression(cheevos_expr_t *expr, const char* mem) expr->count = 1; expr->compare_count = 1; - for (aux = mem; *aux != '"'; aux++) + for (aux = mem;; aux++) + { + if(*aux == '"' || *aux == ':') + break; expr->count += *aux == '_'; + } expr->terms = (cheevos_term_t*)calloc(expr->count, sizeof(cheevos_term_t)); @@ -990,13 +1007,17 @@ static int cheevos_parse_expression(cheevos_expr_t *expr, const char* mem) } /* no multiplier at end of string */ - else if (*aux == '\0' || *aux == '"' || *aux == ',') + else if (*aux == '\0' || *aux == '"' || *aux == ',') return 0; /* invalid character in expression */ else { - free((void*)expr->terms); + if (expr->terms) + { + free(expr->terms); + expr->terms = NULL; + } return -1; } } @@ -1053,8 +1074,6 @@ static int cheevos_parse_mem(cheevos_leaderboard_t *lb, const char* mem) if (cheevos_parse_expression(&lb->value, mem + 4)) goto error; } - else - goto error; for (mem += 4;; mem++) { @@ -1072,7 +1091,11 @@ error: cheevos_free_condition(&lb->start); cheevos_free_condition(&lb->cancel); cheevos_free_condition(&lb->submit); - free((void*)lb->value.terms); + if (lb->value.terms) + { + free((void*)lb->value.terms); + lb->value.terms = NULL; + } return -1; } @@ -1130,10 +1153,26 @@ static int cheevos_new_cheevo(cheevos_readud_t *ud) return 0; error: - free((void*)cheevo->title); - free((void*)cheevo->description); - free((void*)cheevo->author); - free((void*)cheevo->badge); + if (cheevo->title) + { + free((void*)cheevo->title); + cheevo->title = NULL; + } + if (cheevo->description) + { + free((void*)cheevo->description); + cheevo->description = NULL; + } + if (cheevo->author) + { + free((void*)cheevo->author); + cheevo->author = NULL; + } + if (cheevo->badge) + { + free((void*)cheevo->badge); + cheevo->badge = NULL; + } return -1; } @@ -1228,8 +1267,10 @@ static int cheevos_new_lboard(cheevos_readud_t *ud) return 0; error: - free((void*)lboard->title); - free((void*)lboard->description); + if ((void*)lboard->title) + free((void*)lboard->title); + if ((void*)lboard->description) + free((void*)lboard->description); return -1; } @@ -1405,9 +1446,12 @@ static int cheevos_parse(const char *json) if ( !cheevos_locals.core.cheevos || !cheevos_locals.unofficial.cheevos || !cheevos_locals.leaderboards) { - free((void*)cheevos_locals.core.cheevos); - free((void*)cheevos_locals.unofficial.cheevos); - free((void*)cheevos_locals.leaderboards); + if ((void*)cheevos_locals.core.cheevos) + free((void*)cheevos_locals.core.cheevos); + if ((void*)cheevos_locals.unofficial.cheevos) + free((void*)cheevos_locals.unofficial.cheevos); + if ((void*)cheevos_locals.leaderboards) + free((void*)cheevos_locals.leaderboards); cheevos_locals.core.count = cheevos_locals.unofficial.count = cheevos_locals.lboard_count = 0; @@ -1930,7 +1974,7 @@ static void cheevos_test_leaderboards(void) snprintf(msg, sizeof(msg), "Submitted %s for %s", formatted_value, lboard->title); msg[sizeof(msg) - 1] = 0; runloop_msg_queue_push(msg, 0, 2 * 60, false); - } + } } if (cheevos_test_lboard_condition(&lboard->cancel)) @@ -1964,15 +2008,20 @@ Free the loaded achievements. static void cheevos_free_condset(const cheevos_condset_t *set) { - free((void*)set->conds); + if (set->conds) + free((void*)set->conds); } static void cheevos_free_cheevo(const cheevo_t *cheevo) { - free((void*)cheevo->title); - free((void*)cheevo->description); - free((void*)cheevo->author); - free((void*)cheevo->badge); + if (cheevo->title) + free((void*)cheevo->title); + if (cheevo->description) + free((void*)cheevo->description); + if (cheevo->author) + free((void*)cheevo->author); + if (cheevo->badge) + free((void*)cheevo->badge); cheevos_free_condset(cheevo->condition.condsets); } @@ -1984,7 +2033,8 @@ static void cheevos_free_cheevo_set(const cheevoset_t *set) while (cheevo < end) cheevos_free_cheevo(cheevo++); - free((void*)set->cheevos); + if (set->cheevos) + free((void*)set->cheevos); } #ifndef CHEEVOS_DONT_DEACTIVATE @@ -2605,7 +2655,7 @@ static int cheevos_iterate(coro_t* coro) /* Load the content into memory, or copy it over to our own buffer */ if (!CHEEVOS_VAR_DATA) { - CHEEVOS_VAR_STREAM = filestream_open(CHEEVOS_VAR_PATH, RFILE_MODE_READ, 0); + CHEEVOS_VAR_STREAM = filestream_open(CHEEVOS_VAR_PATH, RFILE_MODE_READ, -1); if (!CHEEVOS_VAR_STREAM) CORO_STOP(); @@ -2757,11 +2807,13 @@ static int cheevos_iterate(coro_t* coro) #endif if (cheevos_parse(CHEEVOS_VAR_JSON)) { - free((void*)CHEEVOS_VAR_JSON); + if ((void*)CHEEVOS_VAR_JSON) + free((void*)CHEEVOS_VAR_JSON); CORO_STOP(); } - free((void*)CHEEVOS_VAR_JSON); + if ((void*)CHEEVOS_VAR_JSON) + free((void*)CHEEVOS_VAR_JSON); cheevos_loaded = true; /* @@ -2869,7 +2921,7 @@ static int cheevos_iterate(coro_t* coro) * Output CHEEVOS_VAR_GAMEID the Retro Achievements game ID, or 0 if not found *************************************************************************/ CORO_SUB(LYNX_MD5) - + if (CHEEVOS_VAR_LEN < 0x0240) { CHEEVOS_VAR_GAMEID = 0; @@ -3052,12 +3104,14 @@ static int cheevos_iterate(coro_t* coro) if (cheevos_get_value(CHEEVOS_VAR_JSON, CHEEVOS_JSON_KEY_GAMEID, gameid, sizeof(gameid))) { - free((void*)CHEEVOS_VAR_JSON); + if ((void*)CHEEVOS_VAR_JSON) + free((void*)CHEEVOS_VAR_JSON); RARCH_ERR("[CHEEVOS]: error getting game_id.\n"); CORO_RET(); } - free((void*)CHEEVOS_VAR_JSON); + if ((void*)CHEEVOS_VAR_JSON) + free((void*)CHEEVOS_VAR_JSON); RARCH_LOG("[CHEEVOS]: got game id %s.\n", gameid); CHEEVOS_VAR_GAMEID = strtol(gameid, NULL, 10); CORO_RET(); @@ -3139,7 +3193,8 @@ static int cheevos_iterate(coro_t* coro) if (CHEEVOS_VAR_JSON) { int res = cheevos_get_value(CHEEVOS_VAR_JSON, CHEEVOS_JSON_KEY_TOKEN, cheevos_locals.token, sizeof(cheevos_locals.token)); - free((void*)CHEEVOS_VAR_JSON); + if ((void*)CHEEVOS_VAR_JSON) + free((void*)CHEEVOS_VAR_JSON); if (!res) { @@ -3188,7 +3243,7 @@ static int cheevos_iterate(coro_t* coro) { if (CHEEVOS_VAR_K != 0) RARCH_LOG("[CHEEVOS]: Retrying HTTP request: %u of 5\n", CHEEVOS_VAR_K + 1); - + CHEEVOS_VAR_JSON = NULL; CHEEVOS_VAR_CONN = net_http_connection_new(CHEEVOS_VAR_URL, "GET", NULL); @@ -3281,8 +3336,9 @@ static int cheevos_iterate(coro_t* coro) RARCH_LOG("[CHEEVOS]: deactivated unlocked achievements in softcore mode.\n"); else RARCH_ERR("[CHEEVOS]: error deactivating unlocked achievements in softcore mode.\n"); - - free((void*)CHEEVOS_VAR_JSON); + + if ((void*)CHEEVOS_VAR_JSON) + free((void*)CHEEVOS_VAR_JSON); } else RARCH_ERR("[CHEEVOS]: error retrieving list of unlocked achievements in softcore mode.\n"); @@ -3309,8 +3365,9 @@ static int cheevos_iterate(coro_t* coro) RARCH_LOG("[CHEEVOS]: deactivated unlocked achievements in hardcore mode.\n"); else RARCH_ERR("[CHEEVOS]: error deactivating unlocked achievements in hardcore mode.\n"); - - free((void*)CHEEVOS_VAR_JSON); + + if ((void*)CHEEVOS_VAR_JSON) + free((void*)CHEEVOS_VAR_JSON); } else RARCH_ERR("[CHEEVOS]: error retrieving list of unlocked achievements in hardcore mode.\n"); @@ -3343,7 +3400,8 @@ static int cheevos_iterate(coro_t* coro) if (CHEEVOS_VAR_JSON) { RARCH_LOG("[CHEEVOS]: posted playing activity.\n"); - free((void*)CHEEVOS_VAR_JSON); + if ((void*)CHEEVOS_VAR_JSON) + free((void*)CHEEVOS_VAR_JSON); } else RARCH_ERR("[CHEEVOS]: error posting playing activity.\n"); @@ -3358,11 +3416,16 @@ static void cheevos_task_handler(retro_task_t *task) { coro_t *coro = (coro_t*)task->state; + if (!coro) + return; + if (!cheevos_iterate(coro)) { task_set_finished(task, true); - free(CHEEVOS_VAR_DATA); - free((void*)CHEEVOS_VAR_PATH); + if (CHEEVOS_VAR_DATA) + free(CHEEVOS_VAR_DATA); + if ((void*)CHEEVOS_VAR_PATH) + free((void*)CHEEVOS_VAR_PATH); free((void*)coro); } } @@ -3370,8 +3433,8 @@ static void cheevos_task_handler(retro_task_t *task) bool cheevos_load(const void *data) { retro_task_t *task; - coro_t *coro; - const struct retro_game_info *info; + const struct retro_game_info *info = NULL; + coro_t *coro = NULL; cheevos_loaded = 0; @@ -3387,7 +3450,8 @@ bool cheevos_load(const void *data) if (!task) { - free((void*)coro); + if ((void*)coro) + free((void*)coro); return false; } @@ -3406,8 +3470,10 @@ bool cheevos_load(const void *data) if (!CHEEVOS_VAR_DATA) { - free((void*)task); - free((void*)coro); + if ((void*)task) + free((void*)task); + if ((void*)coro) + free((void*)coro); return false; } diff --git a/cheevos/var.c b/cheevos/var.c index 2b567bf21e..36828b46b3 100644 --- a/cheevos/var.c +++ b/cheevos/var.c @@ -119,12 +119,21 @@ void cheevos_var_parse(cheevos_var_t* var, const char** memaddr) const char *str = *memaddr; unsigned base = 16; + var->is_bcd = false; + if (toupper((unsigned char)*str) == 'D' && str[1] == '0' && toupper((unsigned char)str[2]) == 'X') { /* d0x + 4 hex digits */ str += 3; var->type = CHEEVOS_VAR_TYPE_DELTA_MEM; } + else if (toupper((unsigned char)*str) == 'B' && str[1] == '0' && toupper((unsigned char)str[2]) == 'X') + { + /* b0x (binary-coded decimal) */ + str += 3; + var->is_bcd = true; + var->type = CHEEVOS_VAR_TYPE_ADDRESS; + } else if (*str == '0' && toupper((unsigned char)str[1]) == 'X') { /* 0x + 4 hex digits */ @@ -406,5 +415,8 @@ unsigned cheevos_var_get_value(cheevos_var_t* var) break; } - return value; + if(var->is_bcd) + return (((value >> 4) & 0xf) * 10) + (value & 0xf); + else + return value; } diff --git a/cheevos/var.h b/cheevos/var.h index 2e9959288e..336b65d4ed 100644 --- a/cheevos/var.h +++ b/cheevos/var.h @@ -62,6 +62,7 @@ typedef struct cheevos_var_size_t size; cheevos_var_type_t type; int bank_id; + bool is_bcd; unsigned value; unsigned previous; } cheevos_var_t; From 8f14a92c5449f41fc003836d1de18edb2200fa7e Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 19 Nov 2017 15:50:01 -0500 Subject: [PATCH 011/183] console build fixes --- Makefile.wiiu | 1 + menu/cbs/menu_cbs_ok.c | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Makefile.wiiu b/Makefile.wiiu index b83d1caae7..669686e93d 100644 --- a/Makefile.wiiu +++ b/Makefile.wiiu @@ -73,6 +73,7 @@ else BLACKLIST := BLACKLIST += input/input_overlay.o BLACKLIST += tasks/task_overlay.o + BLACKLIST += network/netplay/netplay_discovery.o BLACKLIST += $(LIBRETRO_COMM_DIR)/net/net_ifinfo.o OBJ := $(filter-out $(BLACKLIST),$(OBJ)) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 145bcf013c..c1b8c3ec91 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -3737,11 +3737,14 @@ static void netplay_refresh_rooms_cb(void *task_data, void *user_data, const cha char s[PATH_MAX_LENGTH]; unsigned i = 0; unsigned j = 0; + lan_room_count = 0; file_list_t *file_list = menu_entries_get_selection_buf_ptr(0); +#ifndef RARCH_CONSOLE netplay_discovery_driver_ctl(RARCH_NETPLAY_DISCOVERY_CTL_LAN_GET_RESPONSES, &lan_hosts); if (lan_hosts) - lan_room_count = (int)lan_hosts->size; + lan_room_count = (int)lan_hosts->size; +#endif netplay_rooms_parse(data->data); @@ -3866,7 +3869,9 @@ static int action_ok_push_netplay_refresh_rooms(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { char url [2048] = "http://newlobby.libretro.com/list/"; +#ifndef RARCH_CONSOLE task_push_netplay_lan_scan(netplay_lan_scan_callback); +#endif task_push_http_transfer(url, true, NULL, netplay_refresh_rooms_cb, NULL); return 0; } From b7f3bede61d25f9888f3447c195e235e5f72efb9 Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 19 Nov 2017 16:04:22 -0500 Subject: [PATCH 012/183] hook up touch callback --- menu/cbs/menu_cbs_select.c | 59 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/menu/cbs/menu_cbs_select.c b/menu/cbs/menu_cbs_select.c index 84132b7a01..74ca3ef2c8 100644 --- a/menu/cbs/menu_cbs_select.c +++ b/menu/cbs/menu_cbs_select.c @@ -23,6 +23,12 @@ #include "../widgets/menu_entry.h" #include "../menu_cbs.h" #include "../menu_setting.h" +#include "../../tasks/tasks_internal.h" + +#ifdef HAVE_NETWORKING +#include "../../network/netplay/netplay.h" +#include "../../network/netplay/netplay_discovery.h" +#endif #ifndef BIND_ACTION_SELECT #define BIND_ACTION_SELECT(cbs, name) \ @@ -148,6 +154,53 @@ static int action_select_input_desc_kbd(const char *path, const char *label, uns return action_right_input_desc_kbd(type, label, true); } +static int action_select_netplay_connect_room(const char *path, const char *label, unsigned type, + size_t idx) +{ +#ifdef HAVE_NETWORKING + char tmp_hostname[4115]; + + tmp_hostname[0] = '\0'; + + if (netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_DATA_INITED, NULL)) + command_event(CMD_EVENT_NETPLAY_DEINIT, NULL); + netplay_driver_ctl(RARCH_NETPLAY_CTL_ENABLE_CLIENT, NULL); + + if (netplay_room_list[idx - 3].host_method == NETPLAY_HOST_METHOD_MITM) + { + snprintf(tmp_hostname, + sizeof(tmp_hostname), + "%s|%d", + netplay_room_list[idx - 3].mitm_address, + netplay_room_list[idx - 3].mitm_port); + } + else + { + snprintf(tmp_hostname, + sizeof(tmp_hostname), + "%s|%d", + netplay_room_list[idx - 3].address, + netplay_room_list[idx - 3].port); + } + +#if 0 + RARCH_LOG("[lobby] connecting to: %s with game: %s/%08x\n", + tmp_hostname, + netplay_room_list[idx - 3].gamename, + netplay_room_list[idx - 3].gamecrc); +#endif + + task_push_netplay_crc_scan(netplay_room_list[idx - 3].gamecrc, + netplay_room_list[idx - 3].gamename, + tmp_hostname, netplay_room_list[idx - 3].corename); + +#else + return -1; + +#endif + return 0; +} + static int menu_cbs_init_bind_select_compare_type( menu_file_list_cbs_t *cbs, unsigned type) { @@ -180,6 +233,12 @@ static int menu_cbs_init_bind_select_compare_type( BIND_ACTION_SELECT(cbs, action_select_input_desc_kbd); } #endif +#ifdef HAVE_NETWORKING + else if (type == MENU_ENUM_LABEL_CONNECT_NETPLAY_ROOM) + { + BIND_ACTION_SELECT(cbs, action_select_netplay_connect_room); + } +#endif else { switch (type) From b32a69889e2aa718de19e02913bf7629ae515d25 Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 19 Nov 2017 16:21:26 -0500 Subject: [PATCH 013/183] console buildfix --- Makefile.wiiu | 1 - network/netplay/netplay_discovery.c | 9 ++++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Makefile.wiiu b/Makefile.wiiu index 669686e93d..b83d1caae7 100644 --- a/Makefile.wiiu +++ b/Makefile.wiiu @@ -73,7 +73,6 @@ else BLACKLIST := BLACKLIST += input/input_overlay.o BLACKLIST += tasks/task_overlay.o - BLACKLIST += network/netplay/netplay_discovery.o BLACKLIST += $(LIBRETRO_COMM_DIR)/net/net_ifinfo.o OBJ := $(filter-out $(BLACKLIST),$(OBJ)) diff --git a/network/netplay/netplay_discovery.c b/network/netplay/netplay_discovery.c index 68e8a9eff3..2ed53fbd73 100644 --- a/network/netplay/netplay_discovery.c +++ b/network/netplay/netplay_discovery.c @@ -123,8 +123,10 @@ void deinit_netplay_discovery(void) } /** Discovery control */ +/* Todo: implement net_ifinfo and ntohs for consoles */ bool netplay_discovery_driver_ctl(enum rarch_netplay_discovery_ctl_state state, void *data) { +#ifndef RARCH_CONSOLE char port_str[6]; int k = 0; int ret; @@ -191,7 +193,7 @@ bool netplay_discovery_driver_ctl(enum rarch_netplay_discovery_ctl_state state, default: return false; } - +#endif return true; } @@ -228,6 +230,8 @@ error: */ bool netplay_lan_ad_server(netplay_t *netplay) { +/* Todo: implement net_ifinfo and ntohs for consoles */ +#ifndef RARCH_CONSOLE fd_set fds; struct timeval tmp_tv = {0}; struct sockaddr their_addr; @@ -351,8 +355,7 @@ bool netplay_lan_ad_server(netplay_t *netplay) } } net_ifinfo_free(&interfaces); - - +#endif return true; } From 9e3d63182482e11caddb0ca97aaa70540c0dfd56 Mon Sep 17 00:00:00 2001 From: meepingsnesroms Date: Sun, 19 Nov 2017 13:25:17 -0800 Subject: [PATCH 014/183] Fix outdated name of function (libretrodb_tool) --- libretro-db/libretrodb_tool.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libretro-db/libretrodb_tool.c b/libretro-db/libretrodb_tool.c index 7e3a09c8af..e137e248e2 100644 --- a/libretro-db/libretrodb_tool.c +++ b/libretro-db/libretrodb_tool.c @@ -118,7 +118,7 @@ int main(int argc, char ** argv) { if (argc != 4) { - printf("Usage: %s find-name \n", argv[0]); + printf("Usage: %s get-names \n", argv[0]); goto error; } From 4a09dfdb30022b9a022b05999ea39cd5d143c956 Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 19 Nov 2017 16:47:34 -0500 Subject: [PATCH 015/183] fix netplay join with touch --- menu/cbs/menu_cbs_select.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/menu/cbs/menu_cbs_select.c b/menu/cbs/menu_cbs_select.c index 74ca3ef2c8..bdca580865 100644 --- a/menu/cbs/menu_cbs_select.c +++ b/menu/cbs/menu_cbs_select.c @@ -233,14 +233,9 @@ static int menu_cbs_init_bind_select_compare_type( BIND_ACTION_SELECT(cbs, action_select_input_desc_kbd); } #endif -#ifdef HAVE_NETWORKING - else if (type == MENU_ENUM_LABEL_CONNECT_NETPLAY_ROOM) - { - BIND_ACTION_SELECT(cbs, action_select_netplay_connect_room); - } -#endif else { + switch (type) { case FILE_TYPE_USE_DIRECTORY: @@ -268,6 +263,14 @@ int menu_cbs_init_bind_select(menu_file_list_cbs_t *cbs, BIND_ACTION_SELECT(cbs, action_select_default); +#ifdef HAVE_NETWORKING + if (cbs->enum_idx == MENU_ENUM_LABEL_CONNECT_NETPLAY_ROOM) + { + BIND_ACTION_SELECT(cbs, action_select_netplay_connect_room); + return 0; + } +#endif + if (cbs->setting) { uint64_t flags = cbs->setting->flags; From 34934b169cc3f3d171b207fa155e191e1c02bff0 Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 19 Nov 2017 17:33:41 -0500 Subject: [PATCH 016/183] silence coverity warning --- network/netplay/netplay_discovery.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/network/netplay/netplay_discovery.c b/network/netplay/netplay_discovery.c index 2ed53fbd73..e5aef49622 100644 --- a/network/netplay/netplay_discovery.c +++ b/network/netplay/netplay_discovery.c @@ -338,11 +338,14 @@ bool netplay_lan_ad_server(netplay_t *netplay) snprintf(port_str, 6, "%hu", ntohs(((struct sockaddr_in*)(&their_addr))->sin_port)); if (getaddrinfo_retro(reply_addr, port_str, &hints, &our_addr) < 0) continue; - RARCH_LOG ("[discovery] sending reply to %s \n", reply_addr); + else + { + RARCH_LOG ("[discovery] sending reply to %s \n", reply_addr); - /* And send it */ - sendto(lan_ad_server_fd, (const char*)&ad_packet_buffer, - sizeof(struct ad_packet), 0, our_addr->ai_addr, our_addr->ai_addrlen); + /* And send it */ + sendto(lan_ad_server_fd, (const char*)&ad_packet_buffer, + sizeof(struct ad_packet), 0, our_addr->ai_addr, our_addr->ai_addrlen); + } if (our_addr) freeaddrinfo_retro(our_addr); } From e10aee3f1d512f5957d2c0741e12b120ed5fbc29 Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 19 Nov 2017 21:04:58 -0500 Subject: [PATCH 017/183] get a proper error --- network/netplay/netplay_discovery.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/network/netplay/netplay_discovery.c b/network/netplay/netplay_discovery.c index e5aef49622..1004c67bbe 100644 --- a/network/netplay/netplay_discovery.c +++ b/network/netplay/netplay_discovery.c @@ -171,7 +171,7 @@ bool netplay_discovery_driver_ctl(enum rarch_netplay_discovery_ctl_state state, ret = sendto(lan_ad_client_fd, (const char *) &ad_packet_buffer, sizeof(struct ad_packet), 0, addr->ai_addr, addr->ai_addrlen); if (ret < (ssize_t) (2*sizeof(uint32_t))) - RARCH_WARN("[discovery] Failed to send netplay discovery query (error: %d)\n", ret); + RARCH_WARN("[discovery] Failed to send netplay discovery query (error: %d)\n", errno); } freeaddrinfo_retro(addr); From ed9cd1a70d8a2069c38679e01f398ac09047ff87 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 20 Nov 2017 17:54:13 +0100 Subject: [PATCH 018/183] MSVC 2005 - buildfix --- menu/cbs/menu_cbs_ok.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 8186e1f478..1a32f07b2f 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -3739,8 +3739,9 @@ static void netplay_refresh_rooms_cb(void *task_data, void *user_data, const cha char s[PATH_MAX_LENGTH]; unsigned i = 0; unsigned j = 0; + file_list_t *list = menu_entries_get_selection_buf_ptr(0); + lan_room_count = 0; - file_list_t *file_list = menu_entries_get_selection_buf_ptr(0); #ifndef RARCH_CONSOLE netplay_discovery_driver_ctl(RARCH_NETPLAY_DISCOVERY_CTL_LAN_GET_RESPONSES, &lan_hosts); @@ -3805,7 +3806,7 @@ static void netplay_refresh_rooms_cb(void *task_data, void *user_data, const cha } netplay_room_count += lan_room_count; } - netplay_refresh_rooms_menu(file_list); + netplay_refresh_rooms_menu(list); } } From 4f5fc6e4ad8f21c517fab57a2a37669e419c1423 Mon Sep 17 00:00:00 2001 From: orbea Date: Mon, 20 Nov 2017 13:08:58 -0800 Subject: [PATCH 019/183] Fix build with ffmpeg snapshots. Fixes https://github.com/libretro/RetroArch/issues/5717 --- record/drivers/record_ffmpeg.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/record/drivers/record_ffmpeg.c b/record/drivers/record_ffmpeg.c index b74875f293..98369638a7 100644 --- a/record/drivers/record_ffmpeg.c +++ b/record/drivers/record_ffmpeg.c @@ -348,7 +348,7 @@ static bool ffmpeg_init_audio(ffmpeg_t *handle) if (params->audio_qscale) { - audio->codec->flags |= CODEC_FLAG_QSCALE; + audio->codec->flags |= AV_CODEC_FLAG_QSCALE; audio->codec->global_quality = params->audio_global_quality; } else if (params->audio_bit_rate) @@ -358,7 +358,7 @@ static bool ffmpeg_init_audio(ffmpeg_t *handle) audio->codec->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL; if (handle->muxer.ctx->oformat->flags & AVFMT_GLOBALHEADER) - audio->codec->flags |= CODEC_FLAG_GLOBAL_HEADER; + audio->codec->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; if (avcodec_open2(audio->codec, codec, params->audio_opts ? ¶ms->audio_opts : NULL) != 0) return false; @@ -378,7 +378,7 @@ static bool ffmpeg_init_audio(ffmpeg_t *handle) if (!audio->buffer) return false; - audio->outbuf_size = FF_MIN_BUFFER_SIZE; + audio->outbuf_size = AV_INPUT_BUFFER_MIN_SIZE; audio->outbuf = (uint8_t*)av_malloc(audio->outbuf_size); if (!audio->outbuf) return false; @@ -490,14 +490,14 @@ static bool ffmpeg_init_video(ffmpeg_t *handle) if (params->video_qscale) { - video->codec->flags |= CODEC_FLAG_QSCALE; + video->codec->flags |= AV_CODEC_FLAG_QSCALE; video->codec->global_quality = params->video_global_quality; } else if (params->video_bit_rate) video->codec->bit_rate = params->video_bit_rate; if (handle->muxer.ctx->oformat->flags & AVFMT_GLOBALHEADER) - video->codec->flags |= CODEC_FLAG_GLOBAL_HEADER; + video->codec->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; if (avcodec_open2(video->codec, codec, params->video_opts ? ¶ms->video_opts : NULL) != 0) From 69212cf7c7516d49afd10b0c31ffd91d7955b2f1 Mon Sep 17 00:00:00 2001 From: Fayne Aldan Date: Mon, 20 Nov 2017 15:19:36 -0700 Subject: [PATCH 020/183] Move Retrosystem to end Enums shouldn't be reordered --- menu/menu_driver.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/menu/menu_driver.h b/menu/menu_driver.h index 07cabb5255..d660ccbb4b 100644 --- a/menu/menu_driver.h +++ b/menu/menu_driver.h @@ -243,12 +243,12 @@ enum xmb_icon_theme XMB_ICON_THEME_MONOCHROME = 0, XMB_ICON_THEME_FLATUI, XMB_ICON_THEME_RETROACTIVE, - XMB_ICON_THEME_RETROSYSTEM, XMB_ICON_THEME_PIXEL, XMB_ICON_THEME_NEOACTIVE, XMB_ICON_THEME_SYSTEMATIC, XMB_ICON_THEME_DOTART, XMB_ICON_THEME_CUSTOM, + XMB_ICON_THEME_RETROSYSTEM, XMB_ICON_THEME_LAST }; From 76dadbc6035f2fab361c0f0cf7e2f1b0e9723259 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 20 Nov 2017 23:38:25 +0100 Subject: [PATCH 021/183] Try to retain backwards compat. with older ffmpeg versions --- record/drivers/record_ffmpeg.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/record/drivers/record_ffmpeg.c b/record/drivers/record_ffmpeg.c index 98369638a7..4cdab159f1 100644 --- a/record/drivers/record_ffmpeg.c +++ b/record/drivers/record_ffmpeg.c @@ -68,6 +68,17 @@ extern "C" { #include "../../gfx/video_driver.h" #include "../../verbosity.h" +#ifndef AV_CODEC_FLAG_QSCALE +#define AV_CODEC_FLAG_QSCALE CODEC_FLAG_QSCALE +#endif + +#ifndef AV_CODEC_FLAG_GLOBAL_HEADER +#define AV_CODEC_FLAG_GLOBAL_HEADER CODEC_FLAG_GLOBAL_HEADER +#endif + +#ifndef AV_INPUT_BUFFER_MIN_SIZE +#define AV_INPUT_BUFFER_MIN_SIZE FF_MIN_BUFFER_SIZE +#endif #ifndef PIX_FMT_RGB32 #define PIX_FMT_RGB32 AV_PIX_FMT_RGB32 From 25c116e192cfc40c3e42a6f51b57f65f8cd69c7e Mon Sep 17 00:00:00 2001 From: Rob Loach Date: Mon, 20 Nov 2017 18:46:07 -0500 Subject: [PATCH 022/183] Fix strdup() memory leak --- menu/widgets/menu_dialog.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/menu/widgets/menu_dialog.c b/menu/widgets/menu_dialog.c index 4e4ecb065b..30f645d824 100644 --- a/menu/widgets/menu_dialog.c +++ b/menu/widgets/menu_dialog.c @@ -263,8 +263,13 @@ void menu_dialog_push(void) info.list = menu_entries_get_menu_stack_ptr(0); info.enum_idx = MENU_ENUM_LABEL_HELP; - info.label = strdup( - msg_hash_to_str(MENU_ENUM_LABEL_HELP)); + + // Set the label string, if it exists. + const char *label = msg_hash_to_str(MENU_ENUM_LABEL_HELP); + if (label) + { + info.label = strdup(label); + } menu_displaylist_ctl(DISPLAYLIST_HELP, &info); } From 9e3d6adf6e7a45006f552d4d9cf0d8be98ac2c4b Mon Sep 17 00:00:00 2001 From: Rob Loach Date: Mon, 20 Nov 2017 18:47:27 -0500 Subject: [PATCH 023/183] Fix coding standard --- menu/widgets/menu_dialog.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/menu/widgets/menu_dialog.c b/menu/widgets/menu_dialog.c index 30f645d824..601418347b 100644 --- a/menu/widgets/menu_dialog.c +++ b/menu/widgets/menu_dialog.c @@ -267,9 +267,7 @@ void menu_dialog_push(void) // Set the label string, if it exists. const char *label = msg_hash_to_str(MENU_ENUM_LABEL_HELP); if (label) - { info.label = strdup(label); - } menu_displaylist_ctl(DISPLAYLIST_HELP, &info); } From d36d3e2c89323bd0f6de05e03f545a6365028c8d Mon Sep 17 00:00:00 2001 From: Twinaphex Date: Tue, 21 Nov 2017 04:38:38 +0100 Subject: [PATCH 024/183] Update menu_dialog.c --- menu/widgets/menu_dialog.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/menu/widgets/menu_dialog.c b/menu/widgets/menu_dialog.c index 601418347b..4157e31502 100644 --- a/menu/widgets/menu_dialog.c +++ b/menu/widgets/menu_dialog.c @@ -255,6 +255,7 @@ void menu_dialog_push_pending(bool push, enum menu_dialog_type type) void menu_dialog_push(void) { menu_displaylist_info_t info; + const char *label; if (!menu_dialog_is_push_pending()) return; @@ -264,10 +265,10 @@ void menu_dialog_push(void) info.list = menu_entries_get_menu_stack_ptr(0); info.enum_idx = MENU_ENUM_LABEL_HELP; - // Set the label string, if it exists. - const char *label = msg_hash_to_str(MENU_ENUM_LABEL_HELP); + /* Set the label string, if it exists. */ + label = msg_hash_to_str(MENU_ENUM_LABEL_HELP); if (label) - info.label = strdup(label); + info.label = strdup(label); menu_displaylist_ctl(DISPLAYLIST_HELP, &info); } From b744f2a2c9382683c8cfb43f86159554bf9c8b49 Mon Sep 17 00:00:00 2001 From: orbea Date: Sun, 19 Nov 2017 11:46:38 -0800 Subject: [PATCH 025/183] qb: Add a function to find executables in the $PATH --- qb/qb.comp.sh | 8 ++++---- qb/qb.system.sh | 22 +++++++++++++++++++++- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/qb/qb.comp.sh b/qb/qb.comp.sh index 01b3e8ffa6..eaec4be124 100644 --- a/qb/qb.comp.sh +++ b/qb/qb.comp.sh @@ -14,7 +14,7 @@ cc_works=0 if [ "$CC" ]; then "$CC" -o "$TEMP_EXE" "$TEMP_C" >/dev/null 2>&1 && cc_works=1 else - for CC in $(printf %s "$(which ${CROSS_COMPILE}gcc ${CROSS_COMPILE}cc ${CROSS_COMPILE}clang 2>/dev/null)") ''; do + for CC in $(exists ${CROSS_COMPILE}gcc ${CROSS_COMPILE}cc ${CROSS_COMPILE}clang) ''; do "$CC" -o "$TEMP_EXE" "$TEMP_C" >/dev/null 2>&1 && cc_works=1 && break done fi @@ -44,7 +44,7 @@ cxx_works=0 if [ "$CXX" ]; then "$CXX" -o "$TEMP_EXE" "$TEMP_CXX" >/dev/null 2>&1 && cxx_works=1 else - for CXX in $(printf %s "$(which ${CROSS_COMPILE}g++ ${CROSS_COMPILE}c++ ${CROSS_COMPILE}clang++ 2>/dev/null)") ''; do + for CXX in $(exists ${CROSS_COMPILE}g++ ${CROSS_COMPILE}c++ ${CROSS_COMPILE}clang++) ''; do "$CXX" -o "$TEMP_EXE" "$TEMP_CXX" >/dev/null 2>&1 && cxx_works=1 && break done fi @@ -67,7 +67,7 @@ fi if [ "$OS" = "Win32" ]; then echobuf="Checking for windres" if [ -z "$WINDRES" ]; then - WINDRES=$(which ${CROSS_COMPILE}windres) + WINDRES=$(exists ${CROSS_COMPILE}windres) [ "$WINDRES" ] || die 1 "$echobuf ... Not found. Exiting." fi echo "$echobuf ... $WINDRES" @@ -76,7 +76,7 @@ fi [ -n "$PKG_CONF_PATH" ] || { PKG_CONF_PATH="none" - for p in $(which "${CROSS_COMPILE}pkg-config" 2>/dev/null) ''; do + for p in $(exists "${CROSS_COMPILE}pkg-config") ''; do [ -n "$p" ] && { PKG_CONF_PATH=$p; break; diff --git a/qb/qb.system.sh b/qb/qb.system.sh index 0589126905..597ba350c0 100644 --- a/qb/qb.system.sh +++ b/qb/qb.system.sh @@ -1,3 +1,24 @@ +exists() # checks executables listed in $@ against the $PATH +{ + v=1 + while [ "$#" -gt 0 ]; do + arg="$1" + shift 1 + case "$arg" in ''|*/) continue ;; esac + x="${arg##*/}" + z="${arg%/*}" + [ ! -f "$z/$x" ] || [ ! -x "$z/$x" ] && [ "$z/$x" = "$arg" ] && continue + [ "$x" = "$z" ] && [ -x "$z/$x" ] && [ ! -f "$arg" ] && z= + p=":$z:$PATH" + while [ "$p" != "${p#*:}" ]; do + p="${p#*:}" + d="${p%%:*}" + { [ -f "$d/$x" ] && [ -x "$d/$x" ] && \ + { printf %s\\n "$d/$x"; v=0; break; }; } || : + done + done + return "$v" +} if [ -n "$CROSS_COMPILE" ]; then case "$CROSS_COMPILE" in @@ -26,4 +47,3 @@ if [ -e /etc/lsb-release ]; then fi echo "Checking operating system ... $OS ${DISTRO}" - From d9afa9170cf80bad09cdcd2d0c9d47de9f7a4a9f Mon Sep 17 00:00:00 2001 From: Supernature2k Date: Tue, 21 Nov 2017 12:04:47 +0100 Subject: [PATCH 026/183] Fix https://github.com/libretro/RetroArch/issues/5737 fix issue with network command working only 1 time each see https://github.com/libretro/RetroArch/issues/5737 --- command.c | 1 + 1 file changed, 1 insertion(+) diff --git a/command.c b/command.c index 97b847c484..4003ec563c 100644 --- a/command.c +++ b/command.c @@ -641,6 +641,7 @@ static void command_stdin_poll(command_t *handle) bool command_poll(command_t *handle) { + memset(handle->state, 0, sizeof(handle->state)); #if defined(HAVE_NETWORKING) && defined(HAVE_NETWORK_CMD) && defined(HAVE_COMMAND) command_network_poll(handle); #endif From 2c7e5f98fcc22761cbc2816a688479b6af07963e Mon Sep 17 00:00:00 2001 From: twinaphex Date: Tue, 21 Nov 2017 16:26:45 +0100 Subject: [PATCH 027/183] Bump version code --- pkg/android/phoenix/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/android/phoenix/AndroidManifest.xml b/pkg/android/phoenix/AndroidManifest.xml index a892856fc3..501b4fa7dd 100644 --- a/pkg/android/phoenix/AndroidManifest.xml +++ b/pkg/android/phoenix/AndroidManifest.xml @@ -1,7 +1,7 @@ From 6f5cad5f5993e27fc1daa5e5e04f1749164f9a1c Mon Sep 17 00:00:00 2001 From: twinaphex Date: Tue, 21 Nov 2017 16:31:17 +0100 Subject: [PATCH 028/183] Bump to version 1.6.9 --- CHANGES.md | 2 ++ pkg/android/phoenix/AndroidManifest.xml | 2 +- version.all | 4 ++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 27fc3a3020..a73b5c9ecf 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,5 @@ +# 1.7.0 (future) + # 1.6.9 (future) # 1.6.8 diff --git a/pkg/android/phoenix/AndroidManifest.xml b/pkg/android/phoenix/AndroidManifest.xml index 501b4fa7dd..b2896d6872 100644 --- a/pkg/android/phoenix/AndroidManifest.xml +++ b/pkg/android/phoenix/AndroidManifest.xml @@ -2,7 +2,7 @@ diff --git a/version.all b/version.all index 2bea844e2c..ce3e230e61 100644 --- a/version.all +++ b/version.all @@ -6,8 +6,8 @@ # /* - pkg/snap/snapcraft.yaml (including the github url) */ #if 0 -RARCH_VERSION="1.6.8" +RARCH_VERSION="1.6.9" #endif #ifndef PACKAGE_VERSION -#define PACKAGE_VERSION "1.6.8" +#define PACKAGE_VERSION "1.6.9" #endif From e8b10d342a7c5723bd8ad6a8d5eac830d1259ab4 Mon Sep 17 00:00:00 2001 From: Twinaphex Date: Tue, 21 Nov 2017 16:40:48 +0100 Subject: [PATCH 029/183] Update CHANGES.md --- CHANGES.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index a73b5c9ecf..c825908cf1 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,6 +1,8 @@ # 1.7.0 (future) -# 1.6.9 (future) +# 1.6.9 +- COMMON: Small memory leak. +- NETPLAY: Fix network command only working once. # 1.6.8 - Audio: Fix the Audio DSP picker From 29b421512a4b74f67e51cf82ca90668b71715306 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Tue, 21 Nov 2017 19:22:44 +0100 Subject: [PATCH 030/183] Try to be safer --- command.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/command.c b/command.c index 4003ec563c..ebd7e9c2a8 100644 --- a/command.c +++ b/command.c @@ -1379,17 +1379,22 @@ static bool command_event_save_config(const char *config_path, { if (string_is_empty(config_path) || !config_save_file(config_path)) { - snprintf(s, len, "%s \"%s\".", - msg_hash_to_str(MSG_FAILED_SAVING_CONFIG_TO), - path_get(RARCH_PATH_CONFIG)); - RARCH_ERR("%s\n", s); + const char *str = path_get(RARCH_PATH_CONFIG); + + if (string_is_empty(str)) + { + snprintf(s, len, "%s \"%s\".", + msg_hash_to_str(MSG_FAILED_SAVING_CONFIG_TO), + str); + RARCH_ERR("%s\n", s); + } return false; } snprintf(s, len, "[Config]: %s \"%s\".", msg_hash_to_str(MSG_SAVED_NEW_CONFIG_TO), - path_get(RARCH_PATH_CONFIG)); + config_path); RARCH_LOG("%s\n", s); return true; } @@ -1490,7 +1495,8 @@ static bool command_event_save_core_config(void) command_event_save_config(config_path, msg, sizeof(msg)); - runloop_msg_queue_push(msg, 1, 180, true); + if (!string_is_empty(msg)) + runloop_msg_queue_push(msg, 1, 180, true); if (overrides_active) rarch_ctl(RARCH_CTL_SET_OVERRIDES_ACTIVE, NULL); From c0567266b1f66699ed5205d9901f2fef4d7f87bc Mon Sep 17 00:00:00 2001 From: twinaphex Date: Tue, 21 Nov 2017 19:40:39 +0100 Subject: [PATCH 031/183] Fix mistake --- command.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/command.c b/command.c index ebd7e9c2a8..2a6c9ad27e 100644 --- a/command.c +++ b/command.c @@ -1381,7 +1381,7 @@ static bool command_event_save_config(const char *config_path, { const char *str = path_get(RARCH_PATH_CONFIG); - if (string_is_empty(str)) + if (!string_is_empty(str)) { snprintf(s, len, "%s \"%s\".", msg_hash_to_str(MSG_FAILED_SAVING_CONFIG_TO), From ca1ae5276ec8fc4401c652a686092dfd8560c913 Mon Sep 17 00:00:00 2001 From: theheroGAC Date: Tue, 21 Nov 2017 20:42:46 +0100 Subject: [PATCH 032/183] small change to translation --- intl/msg_hash_it.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/intl/msg_hash_it.h b/intl/msg_hash_it.h index c94ed5b0b8..2ebdad385b 100644 --- a/intl/msg_hash_it.h +++ b/intl/msg_hash_it.h @@ -2228,7 +2228,7 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, MSG_HASH(MSG_SLOW_MOTION, "Slow motion.") MSG_HASH(MSG_FAST_FORWARD, - "Avanti veloce.") + "Avanzamento rapido.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Riavvolgimento lento.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, From e10dd4d95e1cf0c2d24cf614c8907f6df913b40e Mon Sep 17 00:00:00 2001 From: orbea Date: Tue, 21 Nov 2017 13:29:46 -0800 Subject: [PATCH 033/183] Silence -Wunused-function warning. --- gfx/video_driver.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gfx/video_driver.c b/gfx/video_driver.c index d9dd3ce7c4..b4ae34c571 100644 --- a/gfx/video_driver.c +++ b/gfx/video_driver.c @@ -497,10 +497,12 @@ const char* config_get_video_driver_options(void) return char_list_new_special(STRING_LIST_VIDEO_DRIVERS, NULL); } +#ifdef HAVE_VULKAN static bool hw_render_context_is_vulkan(enum retro_hw_context_type type) { return type == RETRO_HW_CONTEXT_VULKAN; } +#endif static bool hw_render_context_is_gl(enum retro_hw_context_type type) { From bfe84d3348c53ba36ff5b18ad83c83c3b9253a58 Mon Sep 17 00:00:00 2001 From: TotalCaesar659 Date: Wed, 22 Nov 2017 04:14:34 +0300 Subject: [PATCH 034/183] Updated Russian translation --- intl/msg_hash_ru.h | 638 ++++++++++++++++++++++----------------------- 1 file changed, 319 insertions(+), 319 deletions(-) diff --git a/intl/msg_hash_ru.h b/intl/msg_hash_ru.h index 3cc733e238..f2e9a9826a 100644 --- a/intl/msg_hash_ru.h +++ b/intl/msg_hash_ru.h @@ -25,11 +25,11 @@ MSG_HASH( ) MSG_HASH( MSG_GOT_CONNECTION_FROM, - "Установленно соединение с: \"%s\"" + "Установлено соединение с: \"%s\"" ) MSG_HASH( MSG_GOT_CONNECTION_FROM_NAME, - "Установленно соединение с: \"%s (%s)\"" + "Установлено соединение с: \"%s (%s)\"" ) MSG_HASH( MSG_PUBLIC_ADDRESS, @@ -41,7 +41,7 @@ MSG_HASH( ) MSG_HASH( MSG_NETPLAY_USERS_HAS_FLIPPED, - "Netplay users has flipped" + "Пользователи Netplay отключились" ) MSG_HASH( MSG_SETTING_DISK_IN_TRAY, @@ -49,7 +49,7 @@ MSG_HASH( ) MSG_HASH( MSG_WAITING_FOR_CLIENT, - "Ожидание клиента ..." + "Ожидание клиента..." ) MSG_HASH( MSG_NETPLAY_YOU_HAVE_LEFT_THE_GAME, @@ -61,7 +61,7 @@ MSG_HASH( ) MSG_HASH( MSG_NETPLAY_IMPLEMENTATIONS_DIFFER, - "Реализации различаются. Убедитесь, что вы используете точные версии RetroArch и выбранного ядра." + "Реализации различаются. Убедитесь, что вы используете одинаковые версии RetroArch и выбранного ядра." ) MSG_HASH( MSG_NETPLAY_ENDIAN_DEPENDENT, @@ -93,7 +93,7 @@ MSG_HASH( ) MSG_HASH( MSG_NETPLAY_CANNOT_PLAY_UNPRIVILEGED, - "У вас недостаточно прав чтобы играть" + "У вас недостаточно прав, чтобы играть" ) MSG_HASH( MSG_NETPLAY_CANNOT_PLAY_NO_SLOTS, @@ -105,7 +105,7 @@ MSG_HASH( ) MSG_HASH( MSG_NETPLAY_PEER_PAUSED, - "Netplay peer \"%s\" paused" + "Пир netplay \"%s\" приостановил игру" ) MSG_HASH( MSG_NETPLAY_CHANGED_NICK, @@ -121,11 +121,11 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_HARD_SYNC, - "Синхронизируйте CPU и GPU.Это улучшит производительность." + "Синхронизируйте CPU и GPU. Это улучшит производительность." ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_THREADED, - "Повышает производительность за счёт понижения количества кадров в секунду. Использовать только когда другие способы не сработали." + "Повышает производительность за счёт понижения количества кадров в секунду. Использовать только тогда, когда другие способы не сработали." ) MSG_HASH( MSG_AUDIO_VOLUME, @@ -157,7 +157,7 @@ MSG_HASH( ) MSG_HASH( MSG_SORRY_UNIMPLEMENTED_CORES_DONT_DEMAND_CONTENT_NETPLAY, - "Sorry, unimplemented: cores that don't demand content cannot participate in netplay." + "К сожалению, данная функция не работает: ядра, не запрашивающие контент, не могут участвовать в netplay." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ACCOUNTS_CHEEVOS_PASSWORD, @@ -189,7 +189,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_LIST_HARDCORE, - "Список достижений (Hardcore)" + "Список достижений (хардкор)" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ADD_CONTENT_LIST, @@ -221,15 +221,15 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_DEVICE, - "Аудио-устройство" + "Аудиоустройство" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_DRIVER, - "Аудио драйвер" + "Аудиодрайвер" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_DSP_PLUGIN, - "Аудио плагин DSP" + "Аудиоплагин DSP" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_ENABLE, @@ -237,7 +237,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_FILTER_DIR, - "Аудио фильтр" + "Аудиофильтр" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_TURBO_DEADZONE_LIST, @@ -257,7 +257,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_OUTPUT_RATE, - "Частота аудиовыхода (KHz)" + "Частота аудиовыхода (КГц)" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_RATE_CONTROL_DELTA, @@ -277,7 +277,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_VOLUME, - "Уровень громкости звука (dB)" + "Уровень громкости звука (дБ)" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_WASAPI_EXCLUSIVE_MODE, @@ -285,15 +285,15 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_WASAPI_FLOAT_FORMAT, - "WASAPI Float Format" + "Формат WASAPI с плавающей точкой" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_WASAPI_SH_BUFFER_LENGTH, - "WASAPI Shared Buffer Length" + "Длина общего буфера WASAPI" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUTOSAVE_INTERVAL, - "Интервал авто-сохранений" + "Интервал автосохранений" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUTO_OVERRIDES_ENABLE, @@ -301,7 +301,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUTO_REMAPS_ENABLE, - "Load Remap Files Automatically" + "Загружать файлы Remap автоматически" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUTO_SHADERS_ENABLE, @@ -433,11 +433,11 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_HARDCORE_MODE_ENABLE, - "Достижения в Hardcore Mode" + "Достижения в хардкорном режиме" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_LOCKED_ACHIEVEMENTS, - "Заблокированные Достижения:" + "Заблокированные достижения:" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_LOCKED_ENTRY, @@ -449,11 +449,11 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_TEST_UNOFFICIAL, - "Тестовые Неофициальные Достижения" + "Тестовые неофициальные достижения" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_VERBOSE_ENABLE, - "Achievements Verbose Mode" + "Режим подробного протоколирования достижений" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ACHIEVEMENTS, @@ -489,7 +489,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_DATABASE_DIRECTORY, - "База Данных контента" + "База данных контента" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_DIR, @@ -547,7 +547,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_SET_SUPPORTS_NO_CONTENT_ENABLE, MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_UPDATER_AUTO_EXTRACT_ARCHIVE, "Автоматически извлечь загруженный архив") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_UPDATER_BUILDBOT_URL, - "Создание ботов URL") + "URL билдбота ядер") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_UPDATER_LIST, "Обновить ядро") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_UPDATER_SETTINGS, @@ -599,17 +599,17 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_DOWNLOAD_CORE_CONTENT, MSG_HASH(MENU_ENUM_LABEL_VALUE_DPI_OVERRIDE_ENABLE, "Разрешить переопределение DPI") MSG_HASH(MENU_ENUM_LABEL_VALUE_DPI_OVERRIDE_VALUE, - "DPI Переопределение") + "Переопределение DPI") MSG_HASH(MENU_ENUM_LABEL_VALUE_DRIVER_SETTINGS, "Драйвер") MSG_HASH(MENU_ENUM_LABEL_VALUE_DUMMY_ON_CORE_SHUTDOWN, "Загрузка макета при выключении ядра") MSG_HASH(MENU_ENUM_LABEL_VALUE_CHECK_FOR_MISSING_FIRMWARE, - "Проверять в отсутствие firmware перед загрузкой") + "Проверять отсутствие firmware перед загрузкой") MSG_HASH(MENU_ENUM_LABEL_VALUE_DYNAMIC_WALLPAPER, "Динамические обои") MSG_HASH(MENU_ENUM_LABEL_VALUE_DYNAMIC_WALLPAPERS_DIRECTORY, - "Динамические обои") + "Каталог с динамическими обоями") MSG_HASH(MENU_ENUM_LABEL_VALUE_CHEEVOS_ENABLE, "Включить достижения") MSG_HASH(MENU_ENUM_LABEL_VALUE_ENTRY_HOVER_COLOR, @@ -637,7 +637,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_OPTIONS_IN_USE, MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP, "Помощь") MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_AUDIO_VIDEO_TROUBLESHOOTING, - "Устранение проблем с аудио / видео") + "Устранение проблем с аудио/видео") MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_CHANGE_VIRTUAL_GAMEPAD, "Изменение обложки виртуального геймпада") MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_CONTROLS, @@ -659,47 +659,47 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_HORIZONTAL_MENU, MSG_HASH(MENU_ENUM_LABEL_VALUE_IMAGES_TAB, "Образ") MSG_HASH(MENU_ENUM_LABEL_VALUE_INFORMATION, - "информация") + "Информация") MSG_HASH(MENU_ENUM_LABEL_VALUE_INFORMATION_LIST, "Информация") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ADC_TYPE, - "Аналого-цифровой тип") + "Аналогово-цифровой тип") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ALL_USERS_CONTROL_MENU, "Все пользователи управляют меню") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X, - "Левый аналог ось - X") + "Левый аналоговый стик - ось X") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS, - "Левый аналог ось - X (влево)") + "Левый аналоговый стик - ось X (влево)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS, - "Левый аналог ось - X+ (вправо)") + "Левый аналоговый стик - ось X+ (вправо)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y, - "Левый аналог ось - Y") + "Левый аналоговый стик - ось Y") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_MINUS, - "Левый аналог ось - Y- (вверх)") + "Левый аналоговый стик - ось Y- (вверх)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS, - "Левый аналог ось - Y+ (вниз)") + "Левый аналоговый стик - ось Y+ (вниз)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X, - "Правый аналог ось - X") + "Правый аналоговый стик - ось X") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS, - "Правый аналог ось - X- (влево)") + "Правый аналоговый стик - ось X- (влево)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_PLUS, - "Правый аналог ось - X + (вправо)") + "Правый аналоговый стик - ось X + (вправо)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y, - "Правый аналог ось - Y") + "Правый аналоговый стик - ось Y") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, - "Правый аналог ось - Y- (вверх)") + "Правый аналоговый стик - ось Y- (вверх)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, - "Правый аналог ось - Y+ (вниз)") + "Правый аналоговый стик - ось Y+ (вниз)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, - "Авто-конфигурация включена") + "Автоматическая настройка включена") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, "Мертвая зона у стиков") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "Сменить функции кнопок OK и Отмена") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_BIND_ALL, - "Скрепить всё") + "Привязать всё") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_BIND_DEFAULT_ALL, - "Скрепить все по умолчанию") + "Привязать всё по умолчанию") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_BIND_TIMEOUT, "Тайм-аут привязки") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_DESCRIPTOR_HIDE_UNBOUND, @@ -761,9 +761,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MENU_ENUM_TOGGLE_GAMEPAD_COMBO, "Переключать меню геймпадом") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_MINUS, - "Cheat index -") + "Индекс чита -") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_PLUS, - "Cheat index +") + "Индекс чита +") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_TOGGLE, "Переключить чит") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_EJECT_TOGGLE, @@ -795,9 +795,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, "Отключения звука") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_FLIP, - "Netplay отразить пользователей") + "Отключить пользователей Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_GAME_WATCH, - "Переключить режим игры / наблюдателя Netplay") + "Переключить режим игры/наблюдателя Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_OSK, "Переключение экранной клавиатуры") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_OVERLAY_NEXT, @@ -847,7 +847,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_REMAPPING_DIRECTORY, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_REMAP_BINDS_ENABLE, "Включить замену привязок") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_SAVE_AUTOCONFIG, - "Сохранить авто-конфигурацию") + "Сохранить автоматическую настройку") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_SETTINGS, "Ввод") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_SMALL_KEYBOARD_ENABLE, @@ -855,15 +855,15 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_SMALL_KEYBOARD_ENABLE, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_TOUCH_ENABLE, "Включить касание") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, - "Турбо-режим включить") + "Включить турборежим") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_TURBO_PERIOD, - "Турбо-период") + "Период турборежима") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_USER_BINDS, - "Вход пользователя% u Binds") + "Привязки ввода пользователя %u") MSG_HASH(MENU_ENUM_LABEL_VALUE_INTERNAL_STORAGE_STATUS, "Состояние внутренней памяти") MSG_HASH(MENU_ENUM_LABEL_VALUE_JOYPAD_AUTOCONFIG_DIR, - "Ввод авто-конфига") + "Ввод автоматической настройки") MSG_HASH(MENU_ENUM_LABEL_VALUE_JOYPAD_DRIVER, "Драйвер геймпада") MSG_HASH(MENU_ENUM_LABEL_VALUE_LAKKA_SERVICES, @@ -877,7 +877,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_DUTCH, MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_ENGLISH, "Английский") MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_ESPERANTO, - "Esperanto") + "Эсперанто") MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_FRENCH, "Французский") MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_GERMAN, @@ -891,9 +891,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_KOREAN, MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_POLISH, "Польский") MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_PORTUGUESE_BRAZIL, - "португальский (Бразилия)") + "Португальский (Бразилия)") MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_PORTUGUESE_PORTUGAL, - "португальский (Португалия)") + "Португальский (Португалия)") MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_RUSSIAN, "Русский") MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_SPANISH, @@ -901,11 +901,11 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_SPANISH, MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_VIETNAMESE, "Вьетнамский") MSG_HASH(MENU_ENUM_LABEL_VALUE_LEFT_ANALOG, - "Левый аналог") + "Левый аналоговый стик") MSG_HASH(MENU_ENUM_LABEL_VALUE_LIBRETRO_DIR_PATH, "Ядро") MSG_HASH(MENU_ENUM_LABEL_VALUE_LIBRETRO_INFO_PATH, - "Информация ядра") + "Информация о ядре") MSG_HASH(MENU_ENUM_LABEL_VALUE_LIBRETRO_LOG_LEVEL, "Уровень ведения журнала") MSG_HASH(MENU_ENUM_LABEL_VALUE_LINEAR, @@ -919,7 +919,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_LIST, MSG_HASH(MENU_ENUM_LABEL_VALUE_LOAD_STATE, "Состояние загрузки") MSG_HASH(MENU_ENUM_LABEL_VALUE_LOCATION_ALLOW, - "Разрешить местоположение") + "Разрешить определение местоположения") MSG_HASH(MENU_ENUM_LABEL_VALUE_LOCATION_DRIVER, "Местоположение") MSG_HASH(MENU_ENUM_LABEL_VALUE_LOGGING_SETTINGS, @@ -971,7 +971,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_MORE, MSG_HASH(MENU_ENUM_LABEL_VALUE_MOUSE_ENABLE, "Поддержка мыши") MSG_HASH(MENU_ENUM_LABEL_VALUE_MULTIMEDIA_SETTINGS, - "Мультимедия") + "Мультимедиа") MSG_HASH(MENU_ENUM_LABEL_VALUE_MUSIC_TAB, "Музыка") MSG_HASH(MENU_ENUM_LABEL_VALUE_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE, @@ -983,13 +983,13 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_NEAREST, MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY, "Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_ALLOW_SLAVES, - "Allow Slave-Mode Clients") + "Разрешать клиентов в режиме Slave") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_CHECK_FRAMES, "Проверка фреймов Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_INPUT_LATENCY_FRAMES_MIN, - "Input Latency Frames") + "Кадры задержки ввода") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_INPUT_LATENCY_FRAMES_RANGE, - "Input Latency Frames Range") + "Диапазон кадров задержки ввода") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_CLIENT_SWAP_INPUT, "Netplay P2 использует C1") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_DELAY_FRAMES, @@ -1017,13 +1017,13 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_PASSWORD, MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_PUBLIC_ANNOUNCE, "Публично анонсировать Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_REQUIRE_SLAVES, - "Disallow Non-Slave-Mode Clients") + "Запретить клиентов не в режиме Slave") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_SETTINGS, "Настройки Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_START_AS_SPECTATOR, - "Netplay режим наблюдателя") + "Режим наблюдателя Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_STATELESS_MODE, - "Netplay Stateless Mode") + "Режим без состояния Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_SPECTATE_PASSWORD, "Пароль сервера режима Spectate-Only") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_SPECTATOR_MODE_ENABLE, @@ -1031,7 +1031,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_SPECTATOR_MODE_ENABLE, MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_TCP_UDP_PORT, "Порт Netplay TCP / UDP") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_NAT_TRAVERSAL, - "Netplay NAT Traversal") + "Пересечение NAT в Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_CMD_ENABLE, "Сетевые команды") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_CMD_PORT, @@ -1069,9 +1069,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_INFORMATION_AVAILABLE, MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_ITEMS, "Нет элементов.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_NETPLAY_HOSTS_FOUND, - "Сетевыех хостов не найдено.") + "Сетевые хосты не найдены.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_NETWORKS_FOUND, - "Сетей не найдено.") + "Сети не найдены.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_PERFORMANCE_COUNTERS, "Нет счетчиков производительности.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_PLAYLISTS, @@ -1211,7 +1211,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORD_DRIVER, MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORD_ENABLE, "Включить запись") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORD_PATH, - "Сохранить запись вывода как ...") + "Сохранить запись вывода как...") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORD_USE_OUTPUT_DIRECTORY, "Сохранить записи в выходном каталоге") MSG_HASH(MENU_ENUM_LABEL_VALUE_REMAP_FILE, @@ -1331,9 +1331,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SORT_SAVESTATES_ENABLE, MSG_HASH(MENU_ENUM_LABEL_VALUE_SSH_ENABLE, "SSH включён") MSG_HASH(MENU_ENUM_LABEL_VALUE_START_CORE, - "запустить ядро") + "Запустить ядро") MSG_HASH(MENU_ENUM_LABEL_VALUE_START_NET_RETROPAD, - "Запустить удаленный Ретро-геймпад") + "Запустить удаленный ретро-геймпад") MSG_HASH(MENU_ENUM_LABEL_VALUE_START_VIDEO_PROCESSOR, "Запустить видеопроцессор") MSG_HASH(MENU_ENUM_LABEL_VALUE_STATE_SLOT, @@ -1349,7 +1349,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SUSPEND_SCREENSAVER_ENABLE, MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_BGM_ENABLE, "Включен режим BGM") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_DIRECTORY, - "Система / BIOS") + "Система/BIOS") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFORMATION, "Системная информация") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_7ZIP_SUPPORT, @@ -1371,9 +1371,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_CPU_FEATURES, MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DISPLAY_METRIC_DPI, "Отображать индекс DPI") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DISPLAY_METRIC_MM_HEIGHT, - "Отображать высоту (mm)") + "Отображать высоту (мм)") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DISPLAY_METRIC_MM_WIDTH, - "Отображать ширину (mm)") + "Отображать ширину (мм)") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DSOUND_SUPPORT, "Поддержка DirectSound") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_WASAPI_SUPPORT, @@ -1439,7 +1439,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE, MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_CHARGED, "Заряжена") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_CHARGING, - "Заряжается ") + "Заряжается") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_DISCHARGING, "Разряжается") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_NO_SOURCE, @@ -1501,13 +1501,13 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAILS_DIRECTORY, MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAILS_UPDATER_LIST, "Обновление эскизов") MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAIL_MODE_BOXARTS, - "Артбоксы") + "Бокс-арты") MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAIL_MODE_SCREENSHOTS, "Скриншоты") MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAIL_MODE_TITLE_SCREENS, "Экраны заголовков") MSG_HASH(MENU_ENUM_LABEL_VALUE_TIMEDATE_ENABLE, - "Показать время/дату") + "Показать дату/время") MSG_HASH(MENU_ENUM_LABEL_VALUE_TITLE_COLOR, "Цвет заголовков в меню") MSG_HASH(MENU_ENUM_LABEL_VALUE_TRUE, @@ -1531,7 +1531,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATER_SETTINGS, MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_ASSETS, "Обновить активы") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_AUTOCONFIG_PROFILES, - "Обновить профили авто-конфигурации") + "Обновить профили автоматической настройки") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_CG_SHADERS, "Обновление Cg шейдеров") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_CHEATS, @@ -1559,9 +1559,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_USER_SETTINGS, MSG_HASH(MENU_ENUM_LABEL_VALUE_USE_BUILTIN_IMAGE_VIEWER, "Использовать встроенный просмотрщик изображений") MSG_HASH(MENU_ENUM_LABEL_VALUE_USE_BUILTIN_PLAYER, - "Использовать встроенный медиа-плеер") + "Использовать встроенный медиаплеер") MSG_HASH(MENU_ENUM_LABEL_VALUE_USE_THIS_DIRECTORY, - "<Использовать этот катало>") + "<Использовать этот каталог>") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ALLOW_ROTATE, "Разрешить вращение") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO, @@ -1571,17 +1571,17 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_AUTO, MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_INDEX, "Соотношение сторон") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION, - "Вставка черного кадра") + "Вставка чёрного кадра") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_CROP_OVERSCAN, "Обрезка обрезки (перезагрузка)") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DISABLE_COMPOSITION, "Отключить компоновку рабочего стола") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DRIVER, - "Видео драйвер") + "Видеодрайвер") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FILTER, - "Видео фильтр") + "Видеофильтр") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FILTER_DIR, - "Видео фильтр") + "Видеофильтр") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FILTER_FLICKER, "Мерцающий фильтр") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FONT_ENABLE, @@ -1599,7 +1599,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FRAME_DELAY, MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FULLSCREEN, "Использовать полноэкранный режим") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_GAMMA, - "Видео гамма") + "Видеогамма") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_GPU_RECORD, "Использовать GPU Recording") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT, @@ -1631,7 +1631,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SCALE_INTEGER, MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SETTINGS, "Видео") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_DIR, - "Видео шейдер") + "Видеошейдер") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_NUM_PASSES, "Шейдерные проходы") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PARAMETERS, @@ -1683,7 +1683,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FULLSCREEN_X, MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FULLSCREEN_Y, "Полноэкранная высота") MSG_HASH(MENU_ENUM_LABEL_VALUE_WIFI_DRIVER, - "Wi-Fi драйвер") + "Драйвер Wi-Fi") MSG_HASH(MENU_ENUM_LABEL_VALUE_WIFI_SETTINGS, "Wi-Fi") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ALPHA_FACTOR, @@ -1713,9 +1713,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_APPLE_GREEN, "Зеленое яблоко") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_DARK, - "Темно") + "Тёмный") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_DARK_PURPLE, - "Темно фиолетовый") + "Тёмно-фиолетовый") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_ELECTRIC_BLUE, "Электрический синий") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_GOLDEN, @@ -1723,7 +1723,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_GOLDEN, MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_LEGACY_RED, "Красный") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_MIDNIGHT_BLUE, - "Темно-синий") + "Тёмно-синий") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_PLAIN, "Обычный") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_UNDERSEA, @@ -1759,37 +1759,37 @@ MSG_HASH(MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_TWO, MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_ENABLE, "Включение или отключение достижений. Для получения дополнительной информации посетите страницу http://retroachievements.org") MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_TEST_UNOFFICIAL, - "Включение или отключение неофициальных достижений и / или бета-функций в целях тестирования.") + "Включение или отключение неофициальных достижений и/или бета-функций в целях тестирования.") MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_HARDCORE_MODE_ENABLE, - "Включить или отключить сохранения, читы, перемотка назад, перемотка вперед, пауза и замедленное воспроизведение для всех игр.") + "Включить или отключить сохранения, читы, перемотку назад, перемотку вперед, паузу и замедленное воспроизведение для всех игр.") MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_VERBOSE_ENABLE, - "Enable or disable OSD verbosity for achievements.") + "Включить или отключить экран OSD для достижений.") MSG_HASH(MENU_ENUM_SUBLABEL_DRIVER_SETTINGS, - "Изменение драйверов для этой системы.") + "Изменить драйвера для этой системы.") MSG_HASH(MENU_ENUM_SUBLABEL_RETRO_ACHIEVEMENTS_SETTINGS, - "Изменение настроек для достижений.") + "Изменить настройки достижений.") MSG_HASH(MENU_ENUM_SUBLABEL_CORE_SETTINGS, - "Изменить настройки для ядра.") + "Изменить настройки ядра.") MSG_HASH(MENU_ENUM_SUBLABEL_RECORDING_SETTINGS, - "Изменить настройки для записи.") + "Изменить настройки записи.") MSG_HASH(MENU_ENUM_SUBLABEL_ONSCREEN_DISPLAY_SETTINGS, "Измените настройки отображения перекрытия, наложения клавиатуры и уведомлений на экране.") MSG_HASH(MENU_ENUM_SUBLABEL_FRAME_THROTTLE_SETTINGS, - "Измените настройки для перемотки, быстрой перемотки и замедленного воспроизведения.") + "Измените настройки перемотки, быстрой перемотки и замедленного воспроизведения.") MSG_HASH(MENU_ENUM_SUBLABEL_SAVING_SETTINGS, - "Измените настройки для сохранения.") + "Измените настройки сохранения.") MSG_HASH(MENU_ENUM_SUBLABEL_LOGGING_SETTINGS, - "Изменить настройки для ведения журнала.") + "Изменить настройки ведения журнала.") MSG_HASH(MENU_ENUM_SUBLABEL_USER_INTERFACE_SETTINGS, - "Изменить настройки для пользовательского интерфейса.") + "Изменить настройки пользовательского интерфейса.") MSG_HASH(MENU_ENUM_SUBLABEL_USER_SETTINGS, - "Измените учетные записи, имя пользователя и язык.") + "Изменить учетные записи, имя пользователя и язык.") MSG_HASH(MENU_ENUM_SUBLABEL_PRIVACY_SETTINGS, - "Измените настройки конфиденциальности.") + "Изменить настройки конфиденциальности.") MSG_HASH(MENU_ENUM_SUBLABEL_DIRECTORY_SETTINGS, "Изменение каталогов по умолчанию для этой системы.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_SETTINGS, - "Изменить настройки для списков воспроизведения.") + "Изменить настройки списков воспроизведения.") MSG_HASH(MENU_ENUM_SUBLABEL_NETWORK_SETTINGS, "Настроить параметры сервера и сети.") MSG_HASH(MENU_ENUM_SUBLABEL_ADD_CONTENT_LIST, @@ -1819,7 +1819,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_USER_BINDS, MSG_HASH(MENU_ENUM_SUBLABEL_LOG_VERBOSITY, "Включить или отключить ведение журнала в терминале.") MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY, - "Присоединиться или создать сеанс netplay.") + "Присоединиться или создать сеанс Netplay.") MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_LAN_SCAN_SETTINGS, "Поиск и подключение к серверу по локальной сети.") MSG_HASH(MENU_ENUM_SUBLABEL_INFORMATION_LIST_LIST, @@ -1831,7 +1831,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_SAMBA_ENABLE, MSG_HASH(MENU_ENUM_SUBLABEL_SERVICES_SETTINGS, "Управление службами операционной системы.") MSG_HASH(MENU_ENUM_SUBLABEL_SHOW_HIDDEN_FILES, - "Показывать скрытые файлы / каталоги внутри файлового менеджера.") + "Показывать скрытые файлы/каталоги внутри файлового менеджера.") MSG_HASH(MENU_ENUM_SUBLABEL_SSH_ENABLE, "Включить или отключить удаленный доступ к командной строке.") MSG_HASH(MENU_ENUM_SUBLABEL_SUSPEND_SCREENSAVER_ENABLE, @@ -1847,7 +1847,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FRAME_DELAY, MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_HARD_SYNC_FRAMES, "Устанавливает, сколько кадров процессор может запустить перед графическим процессором при использовании« Hard GPU Sync.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_MAX_SWAPCHAIN_IMAGES, - "Указывает видеодрайверу какой режим буферизации использовать.") + "Указывает видеодрайверу, какой режим буферизации использовать.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_MONITOR_INDEX, "Выбирает, какой экран дисплея использовать.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_REFRESH_RATE_AUTO, @@ -1871,13 +1871,13 @@ MSG_HASH(MSG_AUDIO_MUTED, MSG_HASH(MSG_AUDIO_UNMUTED, "Звук вкл.") MSG_HASH(MSG_AUTOCONFIG_FILE_ERROR_SAVING, - "Ошибка при сохранении файла авто-конфигурации.") + "Ошибка при сохранении файла автоматической настройки.") MSG_HASH(MSG_AUTOCONFIG_FILE_SAVED_SUCCESSFULLY, - "Файл авто-конфигурации успешно сохранен.") + "Файл автоматической настройки успешно сохранен.") MSG_HASH(MSG_AUTOSAVE_FAILED, "Ошибка автосохранения.") MSG_HASH(MSG_AUTO_SAVE_STATE_TO, - "Процесс авто-сохранения") + "Процесс автосохранения") MSG_HASH(MSG_BLOCKING_SRAM_OVERWRITE, "Перезапись SRAM запрещена.") MSG_HASH(MSG_BRINGING_UP_COMMAND_INTERFACE_ON_PORT, @@ -1887,9 +1887,9 @@ MSG_HASH(MSG_BYTES, MSG_HASH(MSG_CANNOT_INFER_NEW_CONFIG_PATH, "Вывод командного интерфейса на порт.") MSG_HASH(MSG_CHEEVOS_HARDCORE_MODE_ENABLE, - "Режим Hardcore включен, ваши сохранения и функция перемотки отключены.") + "Хардкорный режим включен, ваши сохранения и функция перемотки отключены.") MSG_HASH(MSG_COMPARING_WITH_KNOWN_MAGIC_NUMBERS, - "Сравнение с известными магическими числами ...") + "Сравнение с известными магическими числами...") MSG_HASH(MSG_COMPILED_AGAINST_API, "Скомпилирован против API") MSG_HASH(MSG_CONFIG_DIRECTORY_NOT_SET, @@ -1901,7 +1901,7 @@ MSG_HASH(MSG_CONTENT_CRC32S_DIFFER, MSG_HASH(MSG_CONTENT_LOADING_SKIPPED_IMPLEMENTATION_WILL_DO_IT, "Загрузка контента пропущена, реализация будет загружена сама по себе.") MSG_HASH(MSG_CORE_DOES_NOT_SUPPORT_SAVESTATES, - "Ядро не поддерживает быстрые сохранение.") + "Ядро не поддерживает быстрые сохранения.") MSG_HASH(MSG_CORE_OPTIONS_FILE_CREATED_SUCCESSFULLY, "Файл основных настроек успешно создан.") MSG_HASH(MSG_COULD_NOT_FIND_ANY_NEXT_DRIVER, @@ -1915,9 +1915,9 @@ MSG_HASH(MSG_COULD_NOT_OPEN_DATA_TRACK, MSG_HASH(MSG_COULD_NOT_READ_CONTENT_FILE, "Не удалось прочитать файл контента") MSG_HASH(MSG_COULD_NOT_READ_MOVIE_HEADER, - "Не удалось прочитать заголовок видео ролика.") + "Не удалось прочитать заголовок видеоролика.") MSG_HASH(MSG_COULD_NOT_READ_STATE_FROM_MOVIE, - "Не удалось прочитать состояние видео ролика.") + "Не удалось прочитать состояние видеоролика.") MSG_HASH(MSG_CRC32_CHECKSUM_MISMATCH, "Ошибка контрольной суммы CRC32 между файлом содержимого и контрольной суммой сохраненного содержимого в заголовке файла воспроизведения), что, скорее всего, приведет к рассинхронизации при воспроизведении.") MSG_HASH(MSG_CUSTOM_TIMING_GIVEN, @@ -2159,9 +2159,9 @@ MSG_HASH(MSG_RESTORED_OLD_SAVE_STATE, MSG_HASH(MSG_RESTORING_DEFAULT_SHADER_PRESET_TO, "Шейдеры: восстановление стандартных настроек шейдера") MSG_HASH(MSG_REVERTING_SAVEFILE_DIRECTORY_TO, - "Возврат каталога savefile на") + "Возврат каталога карт памяти на") MSG_HASH(MSG_REVERTING_SAVESTATE_DIRECTORY_TO, - "Возврат каталога savestate к") + "Возврат каталога сохранений к") MSG_HASH(MSG_REWINDING, "Перемотка.") MSG_HASH(MSG_REWIND_INIT, @@ -2249,7 +2249,7 @@ MSG_HASH(MSG_VIRTUAL_DISK_TRAY, MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_LATENCY, "Требуемая длительность звукового сигнала в миллисекундах. Невозможно удостовериться, что звуковой драйвер не может обеспечить заданную задержку.") MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_MUTE, - "Отключить / включить звук.") + "Отключить/включить звук.") MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_RATE_CONTROL_DELTA, "Помогает сгладить недостатки времени при синхронизации аудио и видео в одно и то же время. Имейте в виду, что если отключено, правильную синхронизацию получить почти невозможно." @@ -2280,15 +2280,15 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_WASAPI_EXCLUSIVE_MODE, - "Allow the WASAPI driver to take exclusive control of the audio device. If disabled, it will use shared mode instead." + "Разрешить драйверу WASAPI получать полный контроль над аудиоустройством. При отключении будет использоваться общий режим." ) MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_WASAPI_FLOAT_FORMAT, - "Use float format for the WASAPI driver, if supported by your audio device." + "Использовать формат с плавающей точкой для драйвера WASAPI, если он поддерживается вашим аудиоустройством." ) MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_WASAPI_SH_BUFFER_LENGTH, - "The intermediate buffer length (in frames) when using the WASAPI driver in shared mode." + "Длина промежуточного буфера (в кадрах) при использовании драйвера WASAPI в общем режиме." ) MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_SYNC, @@ -2304,11 +2304,11 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_TURBO_PERIOD, - "Описывает период, в котором переключаются турбо кнопки. Значение описывается в кадрах." + "Описывает период, в котором переключаются турбокнопки. Значение описывается в кадрах." ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_DUTY_CYCLE, - "Описывает, как долго должен действовать период турбо кнопки. Значение описывается в кадрах." + "Описывает, как долго должен действовать период турбокнопки. Значение описывается в кадрах." ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_VSYNC, @@ -2316,19 +2316,19 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_ALLOW_ROTATE, - "Разрешить ядрам задавать поворот, при отключении, запросы на поворот игнорируются, что полезно при настройках, когда один из них поворачивает экран вручную." + "Разрешить ядрам задавать поворот, при отключении запросы на поворот игнорируются, что полезно при настройках, когда один из них поворачивает экран вручную." ) MSG_HASH( MENU_ENUM_SUBLABEL_DUMMY_ON_CORE_SHUTDOWN, - "Некоторые ядра могут иметь функцию отключения, если она включена, это предотвратит остановку ядра от RetroArch, вместо этого он загрузит фиктивное ядро." + "Некоторые ядра могут иметь функцию отключения. Если она включена, это предотвратит остановку ядра от RetroArch, вместо этого он загрузит фиктивное ядро." ) MSG_HASH( MENU_ENUM_SUBLABEL_CHECK_FOR_MISSING_FIRMWARE, - "Проверьте, все ли необходимые микропрограммы присутствуют, прежде чем пытаться загрузить контент." + "Перед загрузкой контента проверьте, все ли необходимые микропрограммы присутствуют." ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_REFRESH_RATE, - "Вертикальная частота обновления экрана. Используется для расчета подходящей скорости ввода аудиосигнала. ПРИМЕЧАНИЕ: Это будет проигнорировано, если включено« Потоковое видео." + "Вертикальная частота обновления экрана. Используется для расчета подходящей скорости ввода аудиосигнала. ПРИМЕЧАНИЕ: Это будет проигнорировано, если включено потоковое видео." ) MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_ENABLE, @@ -2340,7 +2340,7 @@ MSG_HASH( ) MSG_HASH( MSG_FAILED, - "Не вышло" + "Не удалось" ) MSG_HASH( MSG_SUCCEEDED, @@ -2360,11 +2360,11 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_DEVELOPER, - "База данных - Фильтр: Разработчик" + "База данных - фильтр: разработчик" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_PUBLISHER, - "База данных - Фильтр: Издатель" + "База данных - фильтр: издатель" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DISABLED, @@ -2380,41 +2380,41 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_ORIGIN, - "База Данных - Фильтр : по происхождению") + "База данных - фильтр: по происхождению") MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_FRANCHISE, - "База Данных - Фильтр : по франчайзу") + "База данных - фильтр: по франчайзу") MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_ESRB_RATING, - "База Данных - Фильтр : по рейтингу ESRB") + "База данных - фильтр: по рейтингу ESRB") MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_ELSPA_RATING, - "База Данных - Фильтр : по рейтингу ELSPA") + "База данных - фильтр: по рейтингу ELSPA") MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_PEGI_RATING, - "База Данных - Фильтрr : по рейтингу PEGI") + "База данных - фильтр: по рейтингу PEGI") MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_CERO_RATING, - "База Данных - Фильтр : по рейтингу CERO") + "База данных - фильтр: по рейтингу CERO") MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_BBFC_RATING, - "База Данных - Фильтр : по рейтингу BBFC") + "База данных - фильтр: по рейтингу BBFC") MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_MAX_USERS, - "База Данных - Фильтр : по кол-во игроков") + "База данных - фильтр: по кол-во игроков") MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_RELEASEDATE_BY_MONTH, - "База Данных - Фильтр : Вышедшие по месяцам") + "База данных - фильтр: Вышедшие по месяцам") MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_RELEASEDATE_BY_YEAR, - "База Данных - Фильтр : Вышедшие по годам") + "База данных - фильтр: Вышедшие по годам") MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_EDGE_MAGAZINE_ISSUE, - "База Данных - Фильтр : ошибки журнела Edge") + "База данных - фильтр: ошибки журнела Edge") MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_EDGE_MAGAZINE_RATING, - "База Данных - Фильтрr : рейтинг журнала Edge") + "База данных - фильтр: рейтинг журнала Edge") MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_DATABASE_INFO, "Информация базы данных") MSG_HASH(MSG_WIFI_SCAN_COMPLETE, - "Сканирование Wi-Fi успешно завершен.") + "Сканирование Wi-Fi успешно завершено.") MSG_HASH(MSG_SCANNING_WIRELESS_NETWORKS, - "Scanning wireless networks...") + "Сканирование беспроводных сетей...") MSG_HASH(MSG_NETPLAY_LAN_SCAN_COMPLETE, - "Netplay scan complete.") + "Сканирование Netplay завершено.") MSG_HASH(MSG_NETPLAY_LAN_SCANNING, - "Scanning for netplay hosts...") + "Сканирование хостов Netplay...") MSG_HASH(MENU_ENUM_SUBLABEL_PAUSE_NONACTIVE, - "Ставить на паузу когда окно теряет фокус.") + "Ставить на паузу, когда окно теряет фокус.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_DISABLE_COMPOSITION, "Включить или отключить композицию (только для Windows).") MSG_HASH(MENU_ENUM_SUBLABEL_HISTORY_LIST_ENABLE, @@ -2424,11 +2424,11 @@ MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_HISTORY_SIZE, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_UNIFIED_MENU_CONTROLS, "Унифицировать управление в меню") MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_UNIFIED_MENU_CONTROLS, - "Использовать управление в меню, такое же как в игре (для клавиатуры).") + "Использовать такое же управление в меню, как в игре (для клавиатуры).") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FONT_ENABLE, "Показывать сообщения на экране.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_USER_REMOTE_ENABLE, - "User %d Remote Enable") + "Включить удаленного пользователя %d") MSG_HASH(MENU_ENUM_LABEL_VALUE_BATTERY_LEVEL_ENABLE, "Показать заряд батареи") MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FILE, @@ -2442,7 +2442,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SCALE, MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_START_WHEN_LOADED, "Netplay заработает, когда вы запустите игру.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_LOAD_CONTENT_MANUALLY, - "Couldn't find a suitable core or content file, load manually.") + "Не удается найти требуемое ядро или файл контента, загрузите его вручную.") MSG_HASH( MENU_ENUM_LABEL_VALUE_BROWSE_URL_LIST, "Просмотр URL" @@ -2456,7 +2456,7 @@ MSG_HASH( "Старт" ) MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_BOKEH, - "Bokeh") + "Боке") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_REFRESH_ROOMS, "Обновить список комнат") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME, @@ -2470,13 +2470,13 @@ MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_CROP_OVERSCAN, MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SMOOTH, "Добавляет небольшое смазывание к изображению, чтобы избавиться от острых пикселей. Эта настройка мало влияет на производительность.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FILTER, - "Применяется CPU-powered видеофильтр. ПРИМЕЧАНИЕ: Возможна высокая нагрузка на производительность. Некоторые фильтры могут работать только на некоторых ядер, которые используют 32bit или 16bit палитру.") + "Применяется видеофильтр, работающий на CPU. ПРИМЕЧАНИЕ: Возможна высокая нагрузка на производительность. Некоторые фильтры могут работать только на некоторых ядрах, использующих 32-битную или 16-битную палитру.") MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_USERNAME, "Введите имя пользователя от вашего аккаунта Retro Achievements.") MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_PASSWORD, "Введите пароль от вашего аккаунта Retro Achievements.") MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_NICKNAME, - "Введите ваш никнейм. Он будет использоваться в netplay сесиях и т.д.") + "Введите ваш никнейм. Он будет использоваться в сессиях Netplay и т.д.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_POST_FILTER_RECORD, "Записывать процесс игры с выбранными фильтрами (неработает с шейдерами). Ваше видео будет выглядить красивым =)") MSG_HASH(MENU_ENUM_SUBLABEL_CORE_LIST, @@ -2494,9 +2494,9 @@ MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_WINDOW_WIDTH, MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_WINDOW_HEIGHT, "Изменить размер высоты для окна дисплея. Если вы поменяете параметр на 0, то программа будет пытаться масштабировать окно как можно больше.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FULLSCREEN_X, - "Set the custom width size for the non-windowed fullscreen mode. Leaving it at 0 will use the desktop resolution.") + "Установить свой размер ширины для неоконного полноэкранного режима. Если оставить его значение на 0, то будет использовано разрешение рабочего стола.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FULLSCREEN_Y, - "Set the custom height size for the non-windowed fullscreen mode. Leaving it at 0 will use the desktop resolution") + "Установить свой размер высоты для неоконного полноэкранного режима. Если оставить его значение на 0, то будет использовано разрешение рабочего стола.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_MESSAGE_POS_X, "Изменить положение оповещение по горизонтали.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_MESSAGE_POS_Y, @@ -2504,26 +2504,26 @@ MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_MESSAGE_POS_Y, MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FONT_SIZE, "Изменить размер шрифта уведомления.") MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_OVERLAY_HIDE_IN_MENU, - "Спрятать наложения в меню интерфеся, и показывать снова после выхода из него.") + "Спрятать наложения в меню интерфейса, и показывать снова после выхода из него.") MSG_HASH( MENU_ENUM_SUBLABEL_CONTENT_COLLECTION_LIST, - "После сканирование контента он появится в этом списке ." + "После сканирования контента он появится в этом списке ." ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SCALE_INTEGER, - "Only scales video in integer steps. The base size depends on system-reported geometry and aspect ratio. If 'Force Aspect' is not set, X/Y will be integer scaled independently." + "Только масштабирует видео с целочисленным интервалом. Базовый размер зависит от системной геометрии экрана и соотношения сторон. Если 'Принудительная установка' не включена, значения X/Y будут изменяться независимо друг от друга." ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_GPU_SCREENSHOT, - "Screenshots output of GPU shaded material if available." + "Вывод скриншотов с затененным материалом с помощью GPU, если доступно." ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_ROTATION, - "Forces a certain rotation of the screen. The rotation is added to rotations which the core sets." + "Принудительно задает определенный поворот экрана. Он добавляется к поворотам, уже заданным ядром." ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_FORCE_SRGB_DISABLE, - "Forcibly disable sRGB FBO support. Some Intel OpenGL drivers on Windows have video problems with sRGB FBO support if this is enabled. Enabling this can work around it." + "Принудительно отключить поддержку sRGB FBO. Некоторые драйвера Intel OpenGL на Windows испытывают проблемы с включенной поддержкой sRGB FBO. Включение этой настройки может обойти эту проблему." ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_FULLSCREEN, @@ -2535,39 +2535,39 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_GPU_RECORD, - "Records output of GPU shaded material if available." + "Записывает вывод с затененным материалом с помощью GPU, если доступно." ) MSG_HASH( MENU_ENUM_SUBLABEL_SAVESTATE_AUTO_INDEX, - "When making a savestate, save state index is automatically increased before it is saved. When loading content, the index will be set to the highest existing index." + "Перед сохранением автоматически увеличивается его индекс. При загрузке индекс будет установлен на максимальный существующий." ) MSG_HASH( MENU_ENUM_SUBLABEL_BLOCK_SRAM_OVERWRITE, - "Block Save RAM from being overwritten when loading save states. Might potentially lead to buggy games." + "Блокировать сохранение ОЗУ от перезаписи при загрузке сохранений. Может привести к багам в играх." ) MSG_HASH( MENU_ENUM_SUBLABEL_FASTFORWARD_RATIO, - "The maximum rate at which content will be run when using fast forward (e.g., 5.0x for 60 fps content = 300 fps cap). If set to 0.0x, fastforward ratio is unlimited (no FPS cap)." + "Максимальный множитель, на котором контент будет запущен при перемотке вперед (например, 5.0x для 60 кадров в секунду контента = ограничение 300 кадров в секунду). Если установлен на 0.0x - скорость перемотки вперед будет неограниченной (нет лимита кадров в секунду)." ) MSG_HASH( MENU_ENUM_SUBLABEL_SLOWMOTION_RATIO, - "When in slow motion, content will slow down by the factor specified/set." + "При снижении скорости контент будет замедляться в соответствии с заданными факторами/настройками." ) MSG_HASH( MENU_ENUM_SUBLABEL_REWIND_ENABLE, - "Enable rewinding. This will take a performance hit when playing." + "Включить перемотку. Это может снижать производительность при воспроизведении." ) MSG_HASH( MENU_ENUM_SUBLABEL_REWIND_GRANULARITY, - "When rewinding a defined number of frames, you can rewind several frames at a time, increasing the rewind speed." + "При перемотке на определенное количество кадров, вы можете перематывать несколько кадров сразу, увеличивая скорость перемотки." ) MSG_HASH( MENU_ENUM_SUBLABEL_LIBRETRO_LOG_LEVEL, - "Sets log level for cores. If a log level issued by a core is below this value, it is ignored." + "Устанавливает уровень ведения журнала для ядер. Если уровень ведения журнала, заданный ядром, ниже его значения, то он игнорируется." ) MSG_HASH( MENU_ENUM_SUBLABEL_PERFCNT_ENABLE, - "Enable performance counters for RetroArch (and cores)." + "Включить счетчики производительности для RetroArch (и ядер)." ) MSG_HASH( MENU_ENUM_SUBLABEL_SAVESTATE_AUTO_SAVE, @@ -2583,87 +2583,87 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_AUTOSAVE_INTERVAL, - "Autosaves the non-volatile Save RAM at a regular interval. This is disabled by default unless set otherwise. The interval is measured in seconds. A value of 0 disables autosave." + "Автоматически сохраняет энергонезависимую ОЗУ сохранений через регулярные промежутки времени. По умолчанию отключено, если не включено явно. Интервал измеряется в секундах. Значение 0 отключает автосохранение." ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_REMAP_BINDS_ENABLE, - "If enabled, overrides the input binds with the remapped binds set for the current core." + "Если включено, перезаписывает привязки ввода переназначенными для текущего ядра." ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_AUTODETECT_ENABLE, - "Enable input auto-detection. Will attempt to autoconfigure joypads, Plug-and-Play style." + "Включить автоматическое обнаружение ввода. Будет производена попытка автоматической настройки геймпадов Plug-and-Play." ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_INPUT_SWAP_OK_CANCEL, - "Swap buttons for OK/Cancel. Disabled is the Japanese button orientation, enabled is the western orientation." + "Поменять местами кнопки OK/Отмена. Отключено — японское расположение кнопок, включено — западное расположение." ) MSG_HASH( MENU_ENUM_SUBLABEL_PAUSE_LIBRETRO, - "If disabled, the content will keep running in the background when RetroArch's menu is toggled." + "Если включено, контент будет запущен в фоне при включении меню RetroArch." ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_DRIVER, - "Video driver to use." + "Используемый видеодрайвер." ) MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_DRIVER, - "Audio driver to use." + "Используемый аудиодрайвер." ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_DRIVER, - "Input driver to use. Depending on the video driver, it might force a different input driver." + "Используемый драйвер ввода. В зависимости от видеодрайвера драйвер ввода может быть установлен принудительно." ) MSG_HASH( MENU_ENUM_SUBLABEL_JOYPAD_DRIVER, - "Joypad driver to use." + "Используемый драйвер геймпада." ) MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_RESAMPLER_DRIVER, - "Audio resampler driver to use." + "Используемый драйвер аудиоресэмплера." ) MSG_HASH( MENU_ENUM_SUBLABEL_CAMERA_DRIVER, - "Camera driver to use." + "Используемый драйвер камеры." ) MSG_HASH( MENU_ENUM_SUBLABEL_LOCATION_DRIVER, - "Location driver to use." + "Используемый драйвер местоположения." ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_DRIVER, - "Menu driver to use." + "Используемый драйвер меню." ) MSG_HASH( MENU_ENUM_SUBLABEL_RECORD_DRIVER, - "Record driver to use." + "Используемый драйвер записи." ) MSG_HASH( MENU_ENUM_SUBLABEL_WIFI_DRIVER, - "WiFi driver to use." + "Используемый драйвер Wi-Fi." ) MSG_HASH( MENU_ENUM_SUBLABEL_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE, - "Filter files being shown in filebrowser by supported extensions." + "Фильтровать файлы в файловом менеджере по поддерживаемым расширениям." ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_WALLPAPER, - "Select an image to set as menu wallpaper." + "Выберите изображение для установки в качестве обоев меню." ) MSG_HASH( MENU_ENUM_SUBLABEL_DYNAMIC_WALLPAPER, - "Dynamically load a new wallpaper depending on context." + "Динамически загружать новые обои в зависимости от контекста." ) MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_DEVICE, - "Override the default audio device the audio driver uses. This is driver dependent." + "Перебивать аудиоустройство по умолчанию, используя аудиодрайвер. Эта настройка зависит от драйвера." ) MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_DSP_PLUGIN, - "Audio DSP plugin that processes audio before it's sent to the driver." + "Аудиоплагин DSP, обрабатывающий аудио до отправки драйверу." ) MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_OUTPUT_RATE, - "Audio output sample rate." + "Частота дискретизации аудиовывода." ) MSG_HASH( MENU_ENUM_SUBLABEL_OVERLAY_OPACITY, @@ -2687,7 +2687,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_TCP_UDP_PORT, - "The port of the host IP address. Can be either a TCP or UDP port." + "Порт IP-адреса хоста. Может быть порт TCP или UDP." ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_PASSWORD, @@ -2695,39 +2695,39 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_PUBLIC_ANNOUNCE, - "Whether to announce netplay games publicly. If unset, clients must manually connect rather than using the public lobby." + "Анонсировать игру netplay публично. Если не установлено, клиенту придется подключаться вручную, не используя публичное лобби." ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_SPECTATE_PASSWORD, - "The password for connecting to the netplay host with only spectator privileges. Used only in host mode." + "Пароль для подключения к хосту netplay только с правами наблюдателя. Используется только в режиме хоста." ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_START_AS_SPECTATOR, - "Whether to start netplay in spectator mode." + "Начинать netplay в режиме наблюдателя." ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_ALLOW_SLAVES, - "Whether to allow connections in slave mode. Slave-mode clients require very little processing power on either side, but will suffer significantly from network latency." + "Разрешать подключения в режиме slave. Клиенты в режиме slave требуют немного вычислительной мощности со своей стороны, но задержка сети может значительно увеличиться." ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_REQUIRE_SLAVES, - "Whether to disallow connections not in slave mode. Not recommended except for very fast networks with very weak machines." + "Запрещать подключения не в режиме slave. Не рекомендуется, за исключением очень быстрых сетей с очень слабыми машинами." ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_STATELESS_MODE, - "Whether to run netplay in a mode not requiring save states. If set to true, a very fast network is required, but no rewinding is performed, so there will be no netplay jitter." + "Запускать netplay в режиме, не требующем сохранения. Если включено, потребуется очень быстрая сеть, но netplay будет без заиканий, поскольку нет повторов." ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_CHECK_FRAMES, - "The frequency in frames with which netplay will verify that the host and client are in sync." + "Частота кадров, с которой netplay будет проверять синхронизацию хоста и клиента." ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_NAT_TRAVERSAL, - "When hosting, attempt to listen for connections from the public Internet, using UPnP or similar technologies to escape LANs." + "В режиме хоста, пытаться слушать подключения из публичного Интернета, используя UPnP или похожие технологии для избежания локальных сетей." ) MSG_HASH( MENU_ENUM_SUBLABEL_STDIN_CMD_ENABLE, - "Enable stdin command interface." + "Включить интерфейс команды stdin." ) MSG_HASH( MENU_ENUM_SUBLABEL_MOUSE_ENABLE, @@ -2751,58 +2751,58 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_NAVIGATION_WRAPAROUND, - "Wrap-around to beginning and/or end if boundary of list is reached horizontally or vertically." + "Сортировка к началу и/или концу, если достигнута горизонтальная или вертикальная граница списка." ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_ENABLE_HOST, - "Запустить netplay на хосте (сервера)." + "Запустить netplay на хосте (сервере)." ) MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_ENABLE_CLIENT, "Включить netplay в режиме клиента.") MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_DISCONNECT, "Отключить активное соединение Netplay.") MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_DIRECTORY, - "Scans a directory for compatible files and add them to the collection.") + "Сканирует каталог для поиска совместимых файлов и добавляет их в коллекцию.") MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_FILE, - "Scans a compatible file and add it to the collection.") + "Сканирует совместимый файл и добавляет его в коллекцию.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SWAP_INTERVAL, - "Uses a custom swap interval for Vsync. Set this to effectively halve monitor refresh rate." + "Использует заданный интервал обновления для вертикальной синхронизации. Установите для эффективной частоты обновления монитора." ) MSG_HASH(MENU_ENUM_SUBLABEL_SORT_SAVEFILES_ENABLE, - "Sort save files in folders named after the core used." + "Сортировать карты памяти в каталогах, названные после использования ядра." ) MSG_HASH(MENU_ENUM_SUBLABEL_SORT_SAVESTATES_ENABLE, - "Sort save states in folders named after the core used." + "Сортировать файлы сохранений в каталогах, названные после использования ядра." ) MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_CLIENT_SWAP_INPUT, - "When being client over netplay, use keybinds for Player 1.") + "Будучи клиентом netplay, использовать привязки клавиш для Игрока 1.") MSG_HASH(MENU_ENUM_SUBLABEL_CORE_UPDATER_BUILDBOT_URL, - "URL to core updater directory on the Libretro buildbot.") + "URL каталога обновлений ядра на билдботе Libretro.") MSG_HASH(MENU_ENUM_SUBLABEL_BUILDBOT_ASSETS_URL, - "URL to assets updater directory on the Libretro buildbot.") + "URL каталога обновлений содержимого на билдботе Libretro.") MSG_HASH(MENU_ENUM_SUBLABEL_CORE_UPDATER_AUTO_EXTRACT_ARCHIVE, - "After downloading, automatically extract files contained in the downloaded archives." + "После загрузки, автоматически извлекать файлы из загруженных архивов." ) MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_REFRESH_ROOMS, - "Scan for new rooms.") + "Сканировать для поиска новых комнат.") MSG_HASH(MENU_ENUM_SUBLABEL_DELETE_ENTRY, - "Remove this entry from the collection.") + "Удалить эту запись из коллекции.") MSG_HASH(MENU_ENUM_SUBLABEL_INFORMATION, - "View more information about the content.") + "Просмотреть больше информации о содержимом.") MSG_HASH(MENU_ENUM_SUBLABEL_RUN, - "Start the content.") + "Запустить содержимое.") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_FILE_BROWSER_SETTINGS, - "Adjusts filebrowser settings.") + "Задает настройки файлового менеджера.") MSG_HASH( MENU_ENUM_SUBLABEL_AUTO_REMAPS_ENABLE, - "Enable customized controls by default at startup." + "Включить измененное управление по умолчанию при запуске." ) MSG_HASH( MENU_ENUM_SUBLABEL_AUTO_OVERRIDES_ENABLE, - "Enable customized configuration by default at startup." + "Включить измененную конфигурацию по умолчанию при запуске." ) MSG_HASH(MENU_ENUM_SUBLABEL_GAME_SPECIFIC_OPTIONS, - "Enable customized core options by default at startup.") + "Включить измененные настройки ядра по умолчанию при запуске.") MSG_HASH(MENU_ENUM_SUBLABEL_CORE_ENABLE, "Показывать название ядра в главном меню.") MSG_HASH(MENU_ENUM_SUBLABEL_DATABASE_MANAGER, @@ -2813,73 +2813,73 @@ MSG_HASH(MENU_ENUM_SUBLABEL_TAKE_SCREENSHOT, "Сделать скриншот экрана.") MSG_HASH( MENU_ENUM_SUBLABEL_CLOSE_CONTENT, - "Выход из игры. Все несохраненные файлы возможно пропадут." + "Выход из игры. Все несохраненные файлы, возможно, пропадут." ) MSG_HASH(MENU_ENUM_SUBLABEL_LOAD_STATE, - "Load a saved state from the currently selected slot.") + "Загрузить сохранение из текущего выбранного слота.") MSG_HASH(MENU_ENUM_SUBLABEL_SAVE_STATE, - "Save a state to the currently selected slot.") + "Сохранить в текущий выбранный слот.") MSG_HASH(MENU_ENUM_SUBLABEL_RESUME, - "Resume the currently running content and leave the Quick Menu.") + "Продолжить контент, запущенный в данный момент, и выйти в быстрое меню.") MSG_HASH(MENU_ENUM_SUBLABEL_RESUME_CONTENT, - "Resume the currently running content and leave the Quick Menu.") + "Продолжить контент, запущенный в данный момент, и выйти в быстрое меню.") MSG_HASH(MENU_ENUM_SUBLABEL_STATE_SLOT, - "Changes the currently selected state slot.") + "Изменяет выбранный слот сохранения.") MSG_HASH(MENU_ENUM_SUBLABEL_UNDO_LOAD_STATE, - "If a state was loaded, content will go back to the state prior to loading.") + "При загруженном сохранении, контент изменит свое состояние на предшествующее загруженному.") MSG_HASH(MENU_ENUM_SUBLABEL_UNDO_SAVE_STATE, - "If a state was overwritten, it will roll back to the previous save state.") + "Если сохранение было перезаписано, будет произведен откат на предшествующее.") MSG_HASH( MENU_ENUM_SUBLABEL_ACCOUNTS_RETRO_ACHIEVEMENTS, "Сервис Retro Achievements. Для дополнительной информации, посетите страницу http://retroachievements.org" ) MSG_HASH( MENU_ENUM_SUBLABEL_ACCOUNTS_LIST, - "Manages currently configured accounts." + "Управляет настроенными профилями." ) MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_META_REWIND, "Управление настройками перемотки.") MSG_HASH(MENU_ENUM_SUBLABEL_RESTART_CONTENT, "Перезапустить игру.") MSG_HASH(MENU_ENUM_SUBLABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CORE, - "Saves an override configuration file which will apply for all content loaded with this core. Will take precedence over the main configuration.") + "Сохраняет файл настроек, который будет применен ко всему контенту, загруженному с этим ядром. Он будет иметь более высокий приоритет над основной конфигурацией.") MSG_HASH(MENU_ENUM_SUBLABEL_SAVE_CURRENT_CONFIG_OVERRIDE_GAME, - "Saves an override configuration file which will apply for the current content only. Will take precedence over the main configuration.") + "Сохраняет файл настроек, который будет применен только к текущему контенту. Он будет иметь более высокий приоритет над основной конфигурацией.") MSG_HASH(MENU_ENUM_SUBLABEL_CORE_CHEAT_OPTIONS, - "Set up cheat codes.") + "Настроить чит-коды.") MSG_HASH(MENU_ENUM_SUBLABEL_SHADER_OPTIONS, - "Set up shaders to visually augment the image.") + "Настроить шейдеры для визуального улучшения изображения.") MSG_HASH(MENU_ENUM_SUBLABEL_CORE_INPUT_REMAPPING_OPTIONS, - "Change the controls for the currently running content.") + "Изменить управление для контента, запущенного в данный момент.") MSG_HASH(MENU_ENUM_SUBLABEL_CORE_OPTIONS, - "Change the options for the currently running content.") + "Изменить настройки для контента, запущенного в данный момент.") MSG_HASH(MENU_ENUM_SUBLABEL_SHOW_ADVANCED_SETTINGS, "Показывать расширенные настройки для опытных пользователей (скрыто по умолчанию).") MSG_HASH(MENU_ENUM_SUBLABEL_THREADED_DATA_RUNLOOP_ENABLE, - "Perform tasks on a separate thread.") + "Выполнять задачи в отдельном потоке.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_REMOVE, - "Allow the user to remove entries from collections.") + "Разрешить пользователю удалять отдельные записи из коллекции.") MSG_HASH(MENU_ENUM_SUBLABEL_SYSTEM_DIRECTORY, - "Sets the System directory. Cores can query for this directory to load BIOSes, system-specific configs, etc.") + "Устанавливает каталог System. Ядра могут запрашивать его для загрузки BIOS, системных настроек и т.д.") MSG_HASH(MENU_ENUM_SUBLABEL_RGUI_BROWSER_DIRECTORY, "Установить начальный каталог для файлового браузера.") MSG_HASH( MENU_ENUM_SUBLABEL_CONTENT_DIR, - "Usually set by developers who bundle libretro/RetroArch apps to point to assets." + "Обычно настраивается разработчиками, составляющими комплекты приложений libretro/RetroArch для указания содержимого." ) MSG_HASH(MENU_ENUM_SUBLABEL_DYNAMIC_WALLPAPERS_DIRECTORY, - "Directory to store wallpapers dynamically loaded by the menu depending on context.") + "Каталог для хранения обоев, динамически загружающихся в меню в зависимости от контекста.") MSG_HASH(MENU_ENUM_SUBLABEL_THUMBNAILS_DIRECTORY, - "Supplementary thumbnails (boxarts/misc. images, etc.) are stored here." + "Дополнительные миниатюры (бокс-арты/другие изображения и т.д.) хранятся здесь." ) MSG_HASH(MENU_ENUM_SUBLABEL_RGUI_CONFIG_DIRECTORY, - "Sets start directory for menu configuration browser.") + "Задает стартовый каталог для браузера настройки меню.") MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_INPUT_LATENCY_FRAMES_MIN, - "The number of frames of input latency for netplay to use to hide network latency. Reduces jitter and makes netplay less CPU-intensive, at the expense of noticeable input lag.") + "Количество кадров задержки ввода для netplay для сокрытия задержки сети. Уменьшает лаги и делает netplay менее требовательным к CPU, ценой значительной задержки ввода.") MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_INPUT_LATENCY_FRAMES_RANGE, - "The range of frames of input latency that may be used to hide network latency. Reduces jitter and makes netplay less CPU-intensive, at the expense of unpredictable input lag.") + "Диапазон кадров задержки ввода для netplay для сокрытия задержки сети. Уменьшает лаги и делает netplay менее требовательным к CPU, ценой непредсказуемой задержки ввода.") MSG_HASH(MENU_ENUM_SUBLABEL_DISK_CYCLE_TRAY_STATUS, - "Cycle the current disk. If the disk is inserted, it will eject the disk. If the disk has not been inserted, it will be inserted. ") + "Зацикливать текущий диск. Если вставлен диск, он будет извлечен. Если диск не вставлен, он будет вставлен.") MSG_HASH(MENU_ENUM_SUBLABEL_DISK_INDEX, "Изменить индекс диска.") MSG_HASH(MENU_ENUM_SUBLABEL_DISK_OPTIONS, @@ -2891,7 +2891,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_MENU_ENUM_THROTTLE_FRAMERATE, MSG_HASH(MENU_ENUM_SUBLABEL_XMB_THEME, "Выберите другую тему для значка. Изменения заработают после перезагрузки.") MSG_HASH(MENU_ENUM_SUBLABEL_XMB_SHADOWS_ENABLE, - "Включить тени для всех значков. Это приведет к незначительному нагрузке.") + "Включить тени для всех значков. Это приведет к незначительной нагрузке.") MSG_HASH(MENU_ENUM_SUBLABEL_MATERIALUI_MENU_COLOR_THEME, "Выберите другую тему цветового градиента.") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_WALLPAPER_OPACITY, @@ -2899,7 +2899,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_MENU_WALLPAPER_OPACITY, MSG_HASH(MENU_ENUM_SUBLABEL_XMB_MENU_COLOR_THEME, "Выберите другую тему цветового градиента.") MSG_HASH(MENU_ENUM_SUBLABEL_XMB_RIBBON_ENABLE, - "Выберите анимированный фоновый эффект. Может быть GPU-intensive в зависимости от эффекта. Если производительность не тянет на это, то либо выключите это, либо вернитесь к более простому эффекту.") + "Выберите анимированный фоновый эффект. Может быть требовательным к GPU в зависимости от эффекта. Если производительность не тянет на это, то либо выключите это, либо вернитесь к более простому эффекту.") MSG_HASH(MENU_ENUM_SUBLABEL_XMB_FONT, "Выбрать основной шрифт для меню интерфейса.") MSG_HASH(MENU_ENUM_SUBLABEL_XMB_SHOW_IMAGES, @@ -2931,11 +2931,11 @@ MSG_HASH(MENU_ENUM_SUBLABEL_CORE_ASSETS_DIRECTORY, MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_REMAPPING_DIRECTORY, "Сохранить все переназначенные элементы управления в этой папке.") MSG_HASH(MENU_ENUM_SUBLABEL_LIBRETRO_DIR_PATH, - "путь к папке, в котором программа ищет контент / ядра.") + "путь к папке, в котором программа ищет контент/ядра.") MSG_HASH(MENU_ENUM_SUBLABEL_LIBRETRO_INFO_PATH, - "Здесь хранятся файлы информации контента / ядра.") + "Здесь хранятся файлы информации контента/ядра.") MSG_HASH(MENU_ENUM_SUBLABEL_JOYPAD_AUTOCONFIG_DIR, - "Если игровой джойстик подключен, то джойстик будет автомотически подстроен, если существует одходящий файл авто-конфигурации.") + "Если игровой джойстик подключен, то джойстик будет автомотически подстроен, если существует подходящий файл автоматической настройки.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_DIRECTORY, "Сохранять все коллекции в выбранной папке.") MSG_HASH( @@ -2943,10 +2943,10 @@ MSG_HASH( "Если выбрана папка, содержимое, которое временно извлечено (например, из архивов), будет извлечено в этой папке." ) MSG_HASH(MENU_ENUM_SUBLABEL_CURSOR_DIRECTORY, - "Выберите папку, где хранятся saved queries..") + "Сохраненные запросы находятся в этом каталоге.") MSG_HASH( MENU_ENUM_SUBLABEL_CONTENT_DATABASE_DIRECTORY, - "Выберите папку для хранения базы данных." + "Базы данных находятся в этом каталоге." ) MSG_HASH( MENU_ENUM_SUBLABEL_ASSETS_DIRECTORY, @@ -2970,10 +2970,10 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_FILTER_DIR, - "Выберите папку, где будут находиться GPU-based фильтры." + "Выберите папку, где будут находиться фильтры, обрабатываемые GPU." ) MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHADER_DIR, - "Выберите папку, где будут находиться GPU-based шейдеры.") + "Выберите папку, где будут находиться шейдеры, обрабатываемые GPU.") MSG_HASH(MENU_ENUM_SUBLABEL_RECORDING_OUTPUT_DIRECTORY, "Выберите папку, где будут сохраняться ваши записи.") MSG_HASH(MENU_ENUM_SUBLABEL_RECORDING_CONFIG_DIRECTORY, @@ -2991,7 +2991,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET, MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_SAVE_AS, "Сохраните текущие настройки шейдера в качестве нового предустановленного шейдера.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_SAVE_CORE, - "Сохраните текущие настройки шейдера как настройки по умолчанию для этого игры / ядра.") + "Сохраните текущие настройки шейдера как настройки по умолчанию для этого игры/ядра.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_SAVE_GAME, "Сохраните текущие настройки шейдера в качестве настроек по умолчанию для игры.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHADER_PARAMETERS, @@ -3000,10 +3000,10 @@ MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_PARAMETERS, "Изменяет настройки шейдера, которая в настоящее время используется в меню.") MSG_HASH( MENU_ENUM_SUBLABEL_CHEAT_NUM_PASSES, - "Увеличение или уменьшение кол-во используемых чит-кодов." + "Увеличение или уменьшение количества используемых чит-кодов." ) MSG_HASH(MENU_ENUM_SUBLABEL_CHEAT_APPLY_CHANGES, - "Изменения чит-кодов заработают сиюсекундно.") + "Изменения чит-кодов заработают немедленно.") MSG_HASH( MENU_ENUM_SUBLABEL_CHEAT_FILE_LOAD, "Открыть чит-файл." @@ -3046,7 +3046,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_MIXER_VOLUME, - "Уровень громкости звукового микшера (dB)" + "Уровень громкости звукового микшера (дБ)" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_MIXER_MUTE, @@ -3103,114 +3103,114 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_ICONS_ENABLE, MSG_HASH(MENU_ENUM_SUBLABEL_MATERIALUI_ICONS_ENABLE, "Отображать или скрывать иконки интерфейса, отображающиеся в левой части меню.") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MAIN_MENU_ENABLE_SETTINGS, - "Enable Settings Tab") + "Включить вкладку Настройки") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_SHOW_SETTINGS_PASSWORD, - "Set Password For Enabling Settings Tab") + "Задать пароль для включения вкладки Настройки") MSG_HASH(MSG_INPUT_ENABLE_SETTINGS_PASSWORD, - "Enter Password") + "Введите пароль") MSG_HASH(MSG_INPUT_ENABLE_SETTINGS_PASSWORD_OK, - "Password correct.") + "Пароль верен.") MSG_HASH(MSG_INPUT_ENABLE_SETTINGS_PASSWORD_NOK, - "Password incorrect.") + "Пароль неверен.") MSG_HASH(MENU_ENUM_SUBLABEL_XMB_MAIN_MENU_ENABLE_SETTINGS, - "Enables the Settings tab. A restart is required for the tab to appear.") + "Включает вкладку Настройки. Для появления вкладки требуется перезапуск.") MSG_HASH(MENU_ENUM_SUBLABEL_XMB_SHOW_SETTINGS_PASSWORD, - "Supplying a password when hiding the settings tab makes it possible to later restore it from the menu, by going to the Main Menu tab, selecting Enable Settings Tab and entering the password.") + "Применение пароля при скрытии вкладки Настройки может позже восстановить ее из меню. Для этого нужно перейти на вкладку Главное меню, выбрать Включить вкладку Настройки и ввести пароль.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_RENAME, - "Allow the user to rename entries in collections.") + "Разрешить пользователю переименовывать записи в коллекции.") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_RENAME, - "Allow to rename entries") + "Разрешить переименовывать записи") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_LOAD_CORE, - "Show Load Core") + "Показать Загрузить ядро") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_LOAD_CORE, - "Show/hide the 'Load Core' option.") + "Показать/скрыть настройку 'Загрузить ядро'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_LOAD_CONTENT, - "Show Load Content") + "Показать Загрузить содержимое") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_LOAD_CONTENT, - "Show/hide the 'Load Content' option.") + "Показать/скрыть настройку 'Загрузить содержимое'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_INFORMATION, - "Show Information") + "Показать Информация") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_INFORMATION, - "Show/hide the 'Information' option.") + "Показать/скрыть настройку 'Информация'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_CONFIGURATIONS, - "Show Configurations") + "Показать Настройки") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_CONFIGURATIONS, - "Show/hide the 'Configurations' option.") + "Показать/скрыть настройку 'Настройки'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_HELP, - "Show Help") + "Показать Помощь") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_HELP, - "Show/hide the 'Help' option.") + "Показать/скрыть настройку 'Помощь'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_QUIT_RETROARCH, - "Show Quit RetroArch") + "Показать Выйти из RetroArch") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_QUIT_RETROARCH, - "Show/hide the 'Quit RetroArch' option.") + "Показать/скрыть настройку 'Выйти из RetroArch'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_REBOOT, - "Show Reboot") + "Показать Перезагрузить") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_REBOOT, - "Show/hide the 'Reboot' option.") + "Показать/скрыть настройку 'Перезагрузить'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_VIEWS_SETTINGS, - "Quick Menu") + "Быстрое меню") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_VIEWS_SETTINGS, - "Show or hide elements on the Quick Menu screen.") + "Показать/скрыть элементы на экране быстрого меню.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_TAKE_SCREENSHOT, - "Show Take Screenshot") + "Показать Сделать скриншот") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_TAKE_SCREENSHOT, - "Show/hide the 'Take Screenshot' option.") + "Показать/скрыть настройку 'Сделать скриншот'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SAVE_LOAD_STATE, - "Show Save/Load State") + "Показать Сохранить/Загрузить") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SAVE_LOAD_STATE, - "Show/hide the options for saving/loading state.") + "Показать/скрыть настройки для сохранения/загрузки.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_UNDO_SAVE_LOAD_STATE, - "Show Undo Save/Load State") + "Показать отменить сохранение/загрузку") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_UNDO_SAVE_LOAD_STATE, - "Show/hide the options for undoing save/load state.") + "Показать/скрыть настройки для отмены сохранения загрузки.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_ADD_TO_FAVORITES, - "Show Add to Favorites") + "Показать Добавить в избранное") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_ADD_TO_FAVORITES, - "Show/hide the 'Add to Favorites' option.") + "Показать/скрыть настройку 'Добавить в избранное'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_OPTIONS, - "Show Options") + "Показать Настройки") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_OPTIONS, - "Show/hide the 'Options' option.") + "Показать/скрыть настройку 'Настройки'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_CONTROLS, - "Show Controls") + "Показать Управление") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_CONTROLS, - "Show/hide the 'Controls' option.") + "Показать/скрыть настройку 'Управление'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_CHEATS, - "Show Cheats") + "Показать Чит-коды") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_CHEATS, - "Show/hide the 'Cheats' option.") + "Показать/скрыть настройку 'Чит-коды'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SHADERS, - "Show Shaders") + "Показать Шейдеры") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SHADERS, - "Show/hide the 'Shaders' option.") + "Показать/скрыть настройку 'Шейдеры'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SAVE_CORE_OVERRIDES, - "Show Save Core Overrides") + "Показать Сохранить переопределения ядра") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SAVE_CORE_OVERRIDES, - "Show/hide the 'Save Core Overrides' option.") + "Показать/скрыть настройку 'Сохранить переопределения ядра'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SAVE_GAME_OVERRIDES, - "Show Save Game Overrides") + "Показать Сохранить переопределения игры") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SAVE_GAME_OVERRIDES, - "Show/hide the 'Save Game Overrides' option.") + "Показать/скрыть настройку 'Сохранить переопределения игры.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_INFORMATION, - "Show Information") + "Показать Информация") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_INFORMATION, - "Show/hide the 'Information' option.") + "Показать/скрыть настройку 'Информация'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_DISABLE_KIOSK_MODE, - "Disable Kiosk Mode") + "Отключить режим киоска") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_DISABLE_KIOSK_MODE, - "Disables kiosk mode. A restart is required for the change to take full effect.") + "Отключает режим киоска. Для достижения нужного эффекта требуется перезапуск.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_ENABLE_KIOSK_MODE, - "Enable Kiosk Mode") + "Включить режим киоска") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_ENABLE_KIOSK_MODE, - "Protects the setup by hiding all configuration related settings.") + "Защищает конфигурацию путем скрытия всех настроек.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_KIOSK_MODE_PASSWORD, - "Set Password For Disabling Kiosk Mode") + "Задать пароль для отключения режима киоска") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_KIOSK_MODE_PASSWORD, - "Supplying a password when enabling kiosk mode makes it possible to later disable it from the menu, by going to the Main Menu, selecting Disable Kiosk Mode and entering the password.") + "Поддержка пароля при включенном режиме киоска дает возможность позже отключить его из меню. Для этого нежно перейти в главное меню, выбрать Отключить режим киоска и ввести пароль.") MSG_HASH(MSG_INPUT_KIOSK_MODE_PASSWORD, - "Enter Password") + "Введите пароль") MSG_HASH(MSG_INPUT_KIOSK_MODE_PASSWORD_OK, - "Password correct.") + "Пароль верен.") MSG_HASH(MSG_INPUT_KIOSK_MODE_PASSWORD_NOK, - "Password incorrect.") + "Пароль неверен.") From 3c975fe6bd93d8c27f139557e5c71f16a118c2a0 Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Tue, 21 Nov 2017 23:57:20 -0500 Subject: [PATCH 035/183] add option to force 32-bit compilation on 64-bit compilers --- Makefile | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index caf65feb12..8e70dd430d 100644 --- a/Makefile +++ b/Makefile @@ -119,10 +119,16 @@ endif RARCH_OBJ := $(addprefix $(OBJDIR)/,$(OBJ)) +ifneq ($(X86),) + CFLAGS += -m32 + CXXLAGS += -m32 + LDFLAGS += -m32 +endif + ifneq ($(SANITIZER),) - CFLAGS := -fsanitize=$(SANITIZER) $(CFLAGS) - CXXFLAGS := -fsanitize=$(SANITIZER) $(CXXFLAGS) - LDFLAGS := -fsanitize=$(SANITIZER) $(LDFLAGS) + CFLAGS := -fsanitize=$(SANITIZER) $(CFLAGS) + CXXFLAGS := -fsanitize=$(SANITIZER) $(CXXFLAGS) + LDFLAGS := -fsanitize=$(SANITIZER) $(LDFLAGS) endif ifneq ($(findstring $(GPERFTOOLS),profiler),) From 20b73cd67615df07c73ca3d2cfaecb27848db71e Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Wed, 22 Nov 2017 00:01:42 -0500 Subject: [PATCH 036/183] x11: add RetroArch logo to window title bar --- gfx/drivers_context/x_ctx.c | 52 ++++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/gfx/drivers_context/x_ctx.c b/gfx/drivers_context/x_ctx.c index 665d2a75d9..08e6b7bcef 100644 --- a/gfx/drivers_context/x_ctx.c +++ b/gfx/drivers_context/x_ctx.c @@ -113,6 +113,53 @@ static enum gfx_ctx_api x_api = GFX_CTX_NONE; static gfx_ctx_x_data_t *current_context_data = NULL; +const unsigned long retroarch_icon_data[] = { + 16, 16, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, + 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, + 0xffffffff, 0xffffffff, 0x000000ff, 0xffffffff, 0xffffffff, 0x00000000, + 0xffffffff, 0xffffffff, 0x000000ff, 0xffffffff, 0xffffffff, 0xffffffff, + 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x000000ff, 0xffffffff, + 0xffffffff, 0x000000ff, 0xffffffff, 0xffffffff, 0xffffffff, 0x000000ff, + 0xffffffff, 0xffffffff, 0x000000ff, 0xffffffff, 0x00000000, 0x00000000, + 0x00000000, 0xffffffff, 0x000000ff, 0xffffffff, 0x000000ff, 0x000000ff, + 0x000000ff, 0x000000ff, 0x000000ff, 0x000000ff, 0x000000ff, 0xffffffff, + 0x000000ff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, + 0x000000ff, 0x000000ff, 0x000000ff, 0xffffffff, 0x000000ff, 0x000000ff, + 0x000000ff, 0xffffffff, 0x000000ff, 0x000000ff, 0x000000ff, 0xffffffff, + 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x000000ff, 0x000000ff, + 0x000000ff, 0x000000ff, 0x000000ff, 0x000000ff, 0x000000ff, 0x000000ff, + 0x000000ff, 0x000000ff, 0x000000ff, 0xffffffff, 0x00000000, 0x00000000, + 0x00000000, 0xffffffff, 0xffffffff, 0x000000ff, 0x000000ff, 0x000000ff, + 0x000000ff, 0x000000ff, 0x000000ff, 0x000000ff, 0x000000ff, 0x000000ff, + 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xffffffff, 0xffffffff, 0x000000ff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0x000000ff, 0xffffffff, 0xffffffff, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x000000ff, + 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, + 0xffffffff, 0x000000ff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, + 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000 +}; + #ifdef HAVE_OPENGL static PFNGLXCREATECONTEXTATTRIBSARBPROC glx_create_context_attribs; @@ -574,6 +621,8 @@ static bool gfx_ctx_x_set_video_mode(void *data, XSetWindowAttributes swa = {0}; int (*old_handler)(Display*, XErrorEvent*) = NULL; gfx_ctx_x_data_t *x = (gfx_ctx_x_data_t*)data; + Atom net_wm_icon = XInternAtom(g_x11_dpy, "_NET_WM_ICON", False); + Atom cardinal = XInternAtom(g_x11_dpy, "CARDINAL", False); frontend_driver_install_signal_handler(); @@ -661,6 +710,8 @@ static bool gfx_ctx_x_set_video_mode(void *data, (true_full ? CWOverrideRedirect : 0), &swa); XSetWindowBackground(g_x11_dpy, g_x11_win, 0); + XChangeProperty(g_x11_dpy, g_x11_win, net_wm_icon, cardinal, 32, PropModeReplace, (const unsigned char*)retroarch_icon_data, sizeof(retroarch_icon_data) / sizeof(*retroarch_icon_data)); + switch (x_api) { case GFX_CTX_OPENGL_API: @@ -1137,4 +1188,3 @@ const gfx_ctx_driver_t gfx_ctx_x = { #endif gfx_ctx_x_make_current }; - From 8e0ee72283cfcfebb3b64aa73ae9776b54573f0c Mon Sep 17 00:00:00 2001 From: meleu Date: Wed, 22 Nov 2017 12:56:17 -0200 Subject: [PATCH 037/183] cheevos: do not show "0 of 0 cheevos unlocked" msg **This will happen only if `cheevos_verbose_enable = true`.** When loading a game tha doesn't have any achievement, instead of showing an OSD message saying "You have 0 of 0 achievements unlocked." just say "This game doesn't have any achievement." I've just added an `if(cheevos_locals.core.count > 0)` and added indentation. The diff makes it look like it got more changes than it actually got. --- cheevos/cheevos.c | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c index 9ad63a365c..16a9e01775 100644 --- a/cheevos/cheevos.c +++ b/cheevos/cheevos.c @@ -2830,25 +2830,31 @@ static int cheevos_iterate(coro_t* coro) if(CHEEVOS_VAR_SETTINGS->bools.cheevos_verbose_enable) { - const cheevo_t* cheevo = cheevos_locals.core.cheevos; - const cheevo_t* end = cheevo + cheevos_locals.core.count; - int number_of_unlocked = cheevos_locals.core.count; - int mode; - char msg[256]; + if(cheevos_locals.core.count > 0) + { + const cheevo_t* cheevo = cheevos_locals.core.cheevos; + const cheevo_t* end = cheevo + cheevos_locals.core.count; + int number_of_unlocked = cheevos_locals.core.count; + int mode; + char msg[256]; - if(CHEEVOS_VAR_SETTINGS->bools.cheevos_hardcore_mode_enable) - mode = CHEEVOS_ACTIVE_HARDCORE; + if(CHEEVOS_VAR_SETTINGS->bools.cheevos_hardcore_mode_enable) + mode = CHEEVOS_ACTIVE_HARDCORE; + else + mode = CHEEVOS_ACTIVE_SOFTCORE; + + for(; cheevo < end; cheevo++) + if(cheevo->active & mode) + number_of_unlocked--; + + snprintf(msg, sizeof(msg), "You have %d of %d achievements unlocked.", + number_of_unlocked, cheevos_locals.core.count); + msg[sizeof(msg) - 1] = 0; + runloop_msg_queue_push(msg, 0, 6 * 60, false); + } else - mode = CHEEVOS_ACTIVE_SOFTCORE; + runloop_msg_queue_push("This game doesn't have any achievement.", 0, 5 * 60, false); - for(; cheevo < end; cheevo++) - if(cheevo->active & mode) - number_of_unlocked--; - - snprintf(msg, sizeof(msg), "You have %d of %d achievements unlocked.", - number_of_unlocked, cheevos_locals.core.count); - msg[sizeof(msg) - 1] = 0; - runloop_msg_queue_push(msg, 0, 6 * 60, false); } CORO_STOP(); From e72c2bd34a66d3eb4cdf229a3d2a491dde9cfd28 Mon Sep 17 00:00:00 2001 From: TotalCaesar659 Date: Wed, 22 Nov 2017 19:04:59 +0300 Subject: [PATCH 038/183] Making description more concrete and adding Russian translation --- retroarch.desktop | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/retroarch.desktop b/retroarch.desktop index ffbff3c980..f9ae21d6b7 100644 --- a/retroarch.desktop +++ b/retroarch.desktop @@ -1,9 +1,10 @@ [Desktop Entry] Version=1.0 Name=RetroArch -GenericName=Libretro Frontend +GenericName=RetroArch Type=Application -Comment=Multi-Engine Platform +Comment=Frontend for emulators, game engines and media players +Comment[ru]=Графический интерфейс для эмуляторов, игровых движков и медиаплееров Icon=retroarch Exec=retroarch Terminal=false From f0becad9d9a731969fed531fbffbaca122c6cf93 Mon Sep 17 00:00:00 2001 From: Alcaro Date: Wed, 22 Nov 2017 23:46:23 +0100 Subject: [PATCH 039/183] Document this one's syntax --- qb/qb.params.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qb/qb.params.sh b/qb/qb.params.sh index 4d79d9e177..189727c9ea 100644 --- a/qb/qb.params.sh +++ b/qb/qb.params.sh @@ -34,7 +34,7 @@ General options: EOF print_help_option "--prefix=PATH" "Install path prefix" print_help_option "--global-config-dir=PATH" "System wide config file prefix" - print_help_option "--host=HOST" "cross-compile to build programs to run on HOST" + print_help_option "--host=HOST" "call HOST-gcc instead of gcc; can be used for cross compilation" print_help_option "--help" "Show this help" echo "" From 8ab308d9ddc34361ebf078d3d954875387445498 Mon Sep 17 00:00:00 2001 From: orbea Date: Wed, 22 Nov 2017 15:21:12 -0800 Subject: [PATCH 040/183] qb: Honor the --build option. This makes some distros happy even if it does nothing. --- qb/qb.libs.sh | 1 + qb/qb.params.sh | 2 ++ 2 files changed, 3 insertions(+) diff --git a/qb/qb.libs.sh b/qb/qb.libs.sh index 79270c04e6..05935a4a4a 100644 --- a/qb/qb.libs.sh +++ b/qb/qb.libs.sh @@ -230,6 +230,7 @@ create_config_make() echo "INCLUDE_DIRS = $INCLUDE_DIRS" echo "LIBRARY_DIRS = $LIBRARY_DIRS" echo "PACKAGE_NAME = $PACKAGE_NAME" + echo "BUILD = $BUILD" echo "PREFIX = $PREFIX" while [ "$1" ]; do diff --git a/qb/qb.params.sh b/qb/qb.params.sh index 189727c9ea..5d16647806 100644 --- a/qb/qb.params.sh +++ b/qb/qb.params.sh @@ -34,6 +34,7 @@ General options: EOF print_help_option "--prefix=PATH" "Install path prefix" print_help_option "--global-config-dir=PATH" "System wide config file prefix" + print_help_option "--build=BUILD" "The build system (no-op)" print_help_option "--host=HOST" "call HOST-gcc instead of gcc; can be used for cross compilation" print_help_option "--help" "Show this help" @@ -83,6 +84,7 @@ parse_input() # Parse stuff :V case "$1" in --prefix=*) PREFIX=${1##--prefix=};; --global-config-dir=*) GLOBAL_CONFIG_DIR=${1##--global-config-dir=};; + --build=*) BUILD="${1#*=}";; --host=*) CROSS_COMPILE=${1##--host=}-;; --enable-*) opt_exists "${1##--enable-}" "$1" From e82502f80a99cdd2ba3bc7719293d479c6d25f0a Mon Sep 17 00:00:00 2001 From: orbea Date: Wed, 22 Nov 2017 15:33:35 -0800 Subject: [PATCH 041/183] qb: Document syntax better. --- qb/qb.params.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qb/qb.params.sh b/qb/qb.params.sh index 5d16647806..d574c60057 100644 --- a/qb/qb.params.sh +++ b/qb/qb.params.sh @@ -35,7 +35,7 @@ EOF print_help_option "--prefix=PATH" "Install path prefix" print_help_option "--global-config-dir=PATH" "System wide config file prefix" print_help_option "--build=BUILD" "The build system (no-op)" - print_help_option "--host=HOST" "call HOST-gcc instead of gcc; can be used for cross compilation" + print_help_option "--host=HOST" "Cross-compile with HOST-gcc instead of gcc" print_help_option "--help" "Show this help" echo "" From 4318a43ab311b0f779359470dc7c2da6dc90b3a1 Mon Sep 17 00:00:00 2001 From: meleu Date: Wed, 22 Nov 2017 22:34:48 -0200 Subject: [PATCH 042/183] better grammar --- cheevos/cheevos.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c index 16a9e01775..575ac7d0b1 100644 --- a/cheevos/cheevos.c +++ b/cheevos/cheevos.c @@ -2853,7 +2853,7 @@ static int cheevos_iterate(coro_t* coro) runloop_msg_queue_push(msg, 0, 6 * 60, false); } else - runloop_msg_queue_push("This game doesn't have any achievement.", 0, 5 * 60, false); + runloop_msg_queue_push("This game has no achievements.", 0, 5 * 60, false); } From 4069ddc926e62a1d436ff577046e79d713159075 Mon Sep 17 00:00:00 2001 From: Justin Weiss Date: Wed, 22 Nov 2017 19:33:48 -0800 Subject: [PATCH 043/183] Expand symlinks in default configuration paths for iOS devices CFSearchPathForDirectoriesInDomains returns a path in /var, while getenv(HOME) returns the same path in /private/var. /var is a symlink to /private/var, but when config is generated, the difference in paths means they won't be abbreviated correctly. This change expands symlinks before filling in the default directories, so those paths will match. --- frontend/drivers/platform_darwin.m | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/frontend/drivers/platform_darwin.m b/frontend/drivers/platform_darwin.m index ee7ec7b7bb..df2ff6c28f 100644 --- a/frontend/drivers/platform_darwin.m +++ b/frontend/drivers/platform_darwin.m @@ -48,6 +48,7 @@ #include #include +#include #include #include #include @@ -335,6 +336,15 @@ static void frontend_darwin_get_environment_settings(int *argc, char *argv[], CFSearchPathForDirectoriesInDomains(CFDocumentDirectory, CFUserDomainMask, 1, home_dir_buf, sizeof(home_dir_buf)); +#if TARGET_OS_IPHONE + char resolved_home_dir_buf[PATH_MAX_LENGTH] = {0}; + if (realpath(home_dir_buf, resolved_home_dir_buf)) { + retro_assert(strlcpy(home_dir_buf, + resolved_home_dir_buf, + sizeof(home_dir_buf)) < sizeof(home_dir_buf)); + } +#endif + strlcat(home_dir_buf, "/RetroArch", sizeof(home_dir_buf)); fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_SHADER], home_dir_buf, "shaders_glsl", From 84e80e47df768fc4d8c393d2fec467bce29e39e3 Mon Sep 17 00:00:00 2001 From: GameDragon2k Date: Fri, 20 Oct 2017 20:26:13 -0400 Subject: [PATCH 044/183] Initial test for badge icon --- cheevos/cheevos.c | 12 ++++++++++-- menu/drivers/xmb.c | 27 +++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c index 9ad63a365c..0ed68488ae 100644 --- a/cheevos/cheevos.c +++ b/cheevos/cheevos.c @@ -2157,14 +2157,14 @@ void cheevos_populate_menu(void *data, bool hardcore) { menu_entries_append_enum(info->list, cheevo->title, cheevo->description, MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); + MENU_SETTINGS_CHEEVOS_START + i, 0, atoi(cheevo->badge)); items_found++; } else { menu_entries_append_enum(info->list, cheevo->title, cheevo->description, MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); + MENU_SETTINGS_CHEEVOS_START + i, 0, atoi(cheevo->badge)); items_found++; } } @@ -3337,8 +3337,12 @@ static int cheevos_iterate(coro_t* coro) else RARCH_ERR("[CHEEVOS]: error deactivating unlocked achievements in softcore mode.\n"); +<<<<<<< HEAD if ((void*)CHEEVOS_VAR_JSON) free((void*)CHEEVOS_VAR_JSON); +======= + free((void*)CHEEVOS_VAR_JSON); +>>>>>>> Initial test for badge icon } else RARCH_ERR("[CHEEVOS]: error retrieving list of unlocked achievements in softcore mode.\n"); @@ -3366,8 +3370,12 @@ static int cheevos_iterate(coro_t* coro) else RARCH_ERR("[CHEEVOS]: error deactivating unlocked achievements in hardcore mode.\n"); +<<<<<<< HEAD if ((void*)CHEEVOS_VAR_JSON) free((void*)CHEEVOS_VAR_JSON); +======= + free((void*)CHEEVOS_VAR_JSON); +>>>>>>> Initial test for badge icon } else RARCH_ERR("[CHEEVOS]: error retrieving list of unlocked achievements in hardcore mode.\n"); diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index c1d5dac42e..49df1ce1c8 100755 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -252,6 +252,15 @@ typedef struct xmb_handle menu_texture_item list[XMB_TEXTURE_LAST]; } textures; +#ifdef HAVE_CHEEVOS + struct + { + size_t current_badge; + menu_texture_item test; + menu_texture_item list[XMB_TEXTURE_LAST]; + } badges; +#endif + xmb_node_t main_menu_node; #ifdef HAVE_IMAGEVIEWER xmb_node_t images_tab_node; @@ -2239,6 +2248,20 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb, #endif } +#ifdef HAVE_CHEEVOS + if ((type >= MENU_SETTINGS_CHEEVOS_START) && + (type < MENU_SETTINGS_NETPLAY_ROOMS_START)) + { + unsigned new_id = type - MENU_SETTINGS_CHEEVOS_START; + int bufferSize = 16; + char new_str[bufferSize]; + snprintf(new_str, bufferSize, "%05d", (int)xmb->badges.current_badge); + strcat(new_str, ".png"); + menu_display_reset_textures_list(new_str, "badges", &xmb->badges.list[new_id], TEXTURE_FILTER_MIPMAP_LINEAR); + return xmb->badges.list[new_id]; + } +#endif + return xmb->textures.list[XMB_TEXTURE_SUBSETTING]; } @@ -2466,6 +2489,10 @@ static int xmb_draw_item( if (color[3] != 0) { +#ifdef HAVE_CHEEVOS + xmb->badges.current_badge = entry->entry_idx; +#endif + math_matrix_4x4 mymat_tmp; menu_display_ctx_rotate_draw_t rotate_draw; uintptr_t texture = xmb_icon_get_id(xmb, core_node, node, From ec2808685d848199b01bffa9d58ff460dec159b8 Mon Sep 17 00:00:00 2001 From: GameDragon2k Date: Sat, 21 Oct 2017 17:46:13 -0400 Subject: [PATCH 045/183] Add files to handle all cheevos badges. --- Makefile.common | 4 ++++ cheevos/badges.c | 31 +++++++++++++++++++++++++++++++ cheevos/badges.h | 27 +++++++++++++++++++++++++++ 3 files changed, 62 insertions(+) create mode 100644 cheevos/badges.c create mode 100644 cheevos/badges.h diff --git a/Makefile.common b/Makefile.common index 95012320df..737820a16c 100644 --- a/Makefile.common +++ b/Makefile.common @@ -1474,8 +1474,12 @@ ifeq ($(HAVE_NETWORKING), 1) ifeq ($(HAVE_CHEEVOS), 1) DEFINES += -DHAVE_CHEEVOS OBJ += cheevos/cheevos.o \ +<<<<<<< HEAD cheevos/var.o \ cheevos/cond.o \ +======= + cheevos/badges.o \ +>>>>>>> Add files to handle all cheevos badges. $(LIBRETRO_COMM_DIR)/utils/md5.o endif diff --git a/cheevos/badges.c b/cheevos/badges.c new file mode 100644 index 0000000000..4dca01fef6 --- /dev/null +++ b/cheevos/badges.c @@ -0,0 +1,31 @@ +#include "badges.h" +#include "../menu/menu_driver.h" +#include "../verbosity.h" + +badges_ctx_t badges_ctx; + +void set_badge_menu_texture(badges_ctx_t * badges, int i) +{ + const char * locked_suffix = (badges->badge_locked[i] == true) ? "_lock.png" : ".png"; + + unsigned int bufferSize = 16; + char badge_file[bufferSize]; + + snprintf(badge_file, bufferSize, "%s", badges->badge_id_list[i]); + strcat(badge_file, locked_suffix); + + // Badge directory should probably use a definition + menu_display_reset_textures_list(badge_file, "badges", &badges->menu_texture_list[i],TEXTURE_FILTER_MIPMAP_LINEAR); +} + +void set_badge_info (badges_ctx_t *badge_struct, int id, const char *badge_id, bool active) +{ + badge_struct->badge_id_list[id] = badge_id; + badge_struct->badge_locked[id] = active; + set_badge_menu_texture(badge_struct, id); +} + +menu_texture_item get_badge_texture (int id) +{ + return badges_ctx.menu_texture_list[id]; +} diff --git a/cheevos/badges.h b/cheevos/badges.h new file mode 100644 index 0000000000..b5b9011122 --- /dev/null +++ b/cheevos/badges.h @@ -0,0 +1,27 @@ +#ifndef __RARCH_BADGE_H +#define __RARCH_BADGE_H + +#include "../menu/menu_driver.h" + +#include + +RETRO_BEGIN_DECLS + +#define CHEEVOS_BADGE_LIMIT 256 + +typedef struct +{ + bool badge_locked[CHEEVOS_BADGE_LIMIT]; + const char * badge_id_list[CHEEVOS_BADGE_LIMIT]; + menu_texture_item menu_texture_list[CHEEVOS_BADGE_LIMIT]; +} badges_ctx_t; + +void set_badge_menu_texture(badges_ctx_t * badges, int i); +extern void set_badge_info (badges_ctx_t *badge_struct, int id, const char *badge_id, bool active); +extern menu_texture_item get_badge_texture(int id); + +extern badges_ctx_t badges_ctx; + +RETRO_END_DECLS + +#endif From 8b9ad28ecbe5f7bf0105123ec14013b1813f0c81 Mon Sep 17 00:00:00 2001 From: GameDragon2k Date: Sat, 21 Oct 2017 17:48:26 -0400 Subject: [PATCH 046/183] channges to populate and apply badges. --- cheevos/cheevos.c | 7 +++++-- menu/drivers/xmb.c | 25 +++++-------------------- 2 files changed, 10 insertions(+), 22 deletions(-) diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c index 0ed68488ae..bce5770895 100644 --- a/cheevos/cheevos.c +++ b/cheevos/cheevos.c @@ -35,6 +35,7 @@ #include "../menu/menu_entries.h" #endif +#include "badges.h" #include "cheevos.h" #include "var.h" #include "cond.h" @@ -2157,16 +2158,17 @@ void cheevos_populate_menu(void *data, bool hardcore) { menu_entries_append_enum(info->list, cheevo->title, cheevo->description, MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY, - MENU_SETTINGS_CHEEVOS_START + i, 0, atoi(cheevo->badge)); + MENU_SETTINGS_CHEEVOS_START + i, 0, 0); items_found++; } else { menu_entries_append_enum(info->list, cheevo->title, cheevo->description, MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY, - MENU_SETTINGS_CHEEVOS_START + i, 0, atoi(cheevo->badge)); + MENU_SETTINGS_CHEEVOS_START + i, 0, 0); items_found++; } + set_badge_info(&badges_ctx, i, cheevo->badge, (cheevo->active & CHEEVOS_ACTIVE_SOFTCORE)); } else { @@ -2184,6 +2186,7 @@ void cheevos_populate_menu(void *data, bool hardcore) MENU_SETTINGS_CHEEVOS_START + i, 0, 0); items_found++; } + set_badge_info(&badges_ctx, i, cheevo->badge, (cheevo->active & CHEEVOS_ACTIVE_HARDCORE)); } } diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index 49df1ce1c8..c5bc6a2c47 100755 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -61,6 +61,8 @@ #include "../../tasks/tasks_internal.h" +#include "../../cheevos/badges.h" + #define XMB_RIBBON_ROWS 64 #define XMB_RIBBON_COLS 64 #define XMB_RIBBON_VERTICES 2*XMB_RIBBON_COLS*XMB_RIBBON_ROWS-2*XMB_RIBBON_COLS @@ -252,15 +254,6 @@ typedef struct xmb_handle menu_texture_item list[XMB_TEXTURE_LAST]; } textures; -#ifdef HAVE_CHEEVOS - struct - { - size_t current_badge; - menu_texture_item test; - menu_texture_item list[XMB_TEXTURE_LAST]; - } badges; -#endif - xmb_node_t main_menu_node; #ifdef HAVE_IMAGEVIEWER xmb_node_t images_tab_node; @@ -2252,13 +2245,9 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb, if ((type >= MENU_SETTINGS_CHEEVOS_START) && (type < MENU_SETTINGS_NETPLAY_ROOMS_START)) { - unsigned new_id = type - MENU_SETTINGS_CHEEVOS_START; - int bufferSize = 16; - char new_str[bufferSize]; - snprintf(new_str, bufferSize, "%05d", (int)xmb->badges.current_badge); - strcat(new_str, ".png"); - menu_display_reset_textures_list(new_str, "badges", &xmb->badges.list[new_id], TEXTURE_FILTER_MIPMAP_LINEAR); - return xmb->badges.list[new_id]; + //return badges_ctx.menu_texture_list[type - MENU_SETTINGS_CHEEVOS_START]; + int new_id = type - MENU_SETTINGS_CHEEVOS_START; + return get_badge_texture( new_id ); } #endif @@ -2489,10 +2478,6 @@ static int xmb_draw_item( if (color[3] != 0) { -#ifdef HAVE_CHEEVOS - xmb->badges.current_badge = entry->entry_idx; -#endif - math_matrix_4x4 mymat_tmp; menu_display_ctx_rotate_draw_t rotate_draw; uintptr_t texture = xmb_icon_get_id(xmb, core_node, node, From 63090ae2e485ba8b5e4b2217c043dbc04df661fb Mon Sep 17 00:00:00 2001 From: GameDragon2k Date: Sun, 22 Oct 2017 13:02:16 -0400 Subject: [PATCH 047/183] Simple http request function to download badges. --- cheevos/badges.c | 53 +++++++++++++++++++++++++++++++++++++++++++++-- cheevos/badges.h | 1 + cheevos/cheevos.c | 47 +++++++++++++++++++++++++++++------------ 3 files changed, 86 insertions(+), 15 deletions(-) diff --git a/cheevos/badges.c b/cheevos/badges.c index 4dca01fef6..d143084660 100644 --- a/cheevos/badges.c +++ b/cheevos/badges.c @@ -1,9 +1,58 @@ -#include "badges.h" -#include "../menu/menu_driver.h" +#include +#include + #include "../verbosity.h" +#include "../network/net_http_special.h" + +#include "badges.h" badges_ctx_t badges_ctx; +bool download_badge(const char* filename) +{ + char fullpath[PATH_MAX_LENGTH]; + + strcpy(fullpath, "badges/"); + strcat(fullpath, filename); + + if(path_file_exists(fullpath)) + { + return true; + } + else + { + size_t mysize = 1024 * 100; + size_t *size; + size = &mysize; + + const char **buffer = malloc(sizeof(*buffer) * mysize); + char url[PATH_MAX_LENGTH]; + strcpy(url, "http://i.retroachievements.org/Badge/"); + strcat(url, filename); + + retro_time_t *timeout; + retro_time_t timesecs = 10000000; //10 seconds + timeout = ×ecs; + + if(net_http_get(buffer, size, url, timeout) != NET_HTTP_GET_OK) + { + printf("[CHEEVOS]: Download to %s failed.\n", fullpath); + return false; + } + + if (!filestream_write_file(fullpath, *buffer, *size)) + { + printf("[CHEEVOS]: Write to %s failed.\n", fullpath); + return false; + } + else + { + printf("[CHEEVOS]: %s downloaded.\n", fullpath); + return true; + } + } +} + void set_badge_menu_texture(badges_ctx_t * badges, int i) { const char * locked_suffix = (badges->badge_locked[i] == true) ? "_lock.png" : ".png"; diff --git a/cheevos/badges.h b/cheevos/badges.h index b5b9011122..da0e4d6787 100644 --- a/cheevos/badges.h +++ b/cheevos/badges.h @@ -19,6 +19,7 @@ typedef struct void set_badge_menu_texture(badges_ctx_t * badges, int i); extern void set_badge_info (badges_ctx_t *badge_struct, int id, const char *badge_id, bool active); extern menu_texture_item get_badge_texture(int id); +extern bool download_badge(const char* filename); extern badges_ctx_t badges_ctx; diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c index bce5770895..4edf5e87f7 100644 --- a/cheevos/cheevos.c +++ b/cheevos/cheevos.c @@ -2573,11 +2573,12 @@ static int cheevos_iterate(coro_t* coro) FILL_MD5 = -7, GET_GAMEID = -8, GET_CHEEVOS = -9, - LOGIN = -10, - HTTP_GET = -11, - DEACTIVATE = -12, - PLAYING = -13, - DELAY = -14 + GET_BADGES = -10, + LOGIN = -11, + HTTP_GET = -12, + DEACTIVATE = -13, + PLAYING = -14, + DELAY = -15 }; static const uint32_t genesis_exts[] = @@ -2817,6 +2818,7 @@ static int cheevos_iterate(coro_t* coro) if ((void*)CHEEVOS_VAR_JSON) free((void*)CHEEVOS_VAR_JSON); + cheevos_loaded = true; /* @@ -3153,6 +3155,33 @@ static int cheevos_iterate(coro_t* coro) RARCH_LOG("[CHEEVOS]: got achievements for game id %u.\n", CHEEVOS_VAR_GAMEID); CORO_RET(); + /************************************************************************** + * Info Gets the achievements from Retro Achievements + * Inputs CHEEVOS_VAR_GAMEID + * Outputs CHEEVOS_VAR_JSON + *************************************************************************/ + CORO_SUB(GET_BADGES) + + char badge_filename[16]; + cheevo_t *cheevo = cheevos_locals.core.cheevos; + const cheevo_t *end = cheevos_locals.core.cheevos + + cheevos_locals.core.count; + + for (unsigned i = 0; cheevo < end ; cheevo++) + { + strcpy(badge_filename, cheevo->badge); + strcat(badge_filename, ".png"); + if (!download_badge(badge_filename)) + break; + + strcpy(badge_filename, cheevo->badge); + strcat(badge_filename, "_lock.png"); + if (!download_badge(badge_filename)) + break; + } + + CORO_RET(); + /************************************************************************** * Info Logs in the user at Retro Achievements *************************************************************************/ @@ -3340,12 +3369,8 @@ static int cheevos_iterate(coro_t* coro) else RARCH_ERR("[CHEEVOS]: error deactivating unlocked achievements in softcore mode.\n"); -<<<<<<< HEAD if ((void*)CHEEVOS_VAR_JSON) free((void*)CHEEVOS_VAR_JSON); -======= - free((void*)CHEEVOS_VAR_JSON); ->>>>>>> Initial test for badge icon } else RARCH_ERR("[CHEEVOS]: error retrieving list of unlocked achievements in softcore mode.\n"); @@ -3373,12 +3398,8 @@ static int cheevos_iterate(coro_t* coro) else RARCH_ERR("[CHEEVOS]: error deactivating unlocked achievements in hardcore mode.\n"); -<<<<<<< HEAD if ((void*)CHEEVOS_VAR_JSON) free((void*)CHEEVOS_VAR_JSON); -======= - free((void*)CHEEVOS_VAR_JSON); ->>>>>>> Initial test for badge icon } else RARCH_ERR("[CHEEVOS]: error retrieving list of unlocked achievements in hardcore mode.\n"); From cfe59bcf2a6787d1e951eab79e32b4e39a39a02c Mon Sep 17 00:00:00 2001 From: GameDragon2k Date: Thu, 23 Nov 2017 06:58:19 -0500 Subject: [PATCH 048/183] Cheevos badges --- cheevos/badges.c | 52 ++++++++--------------------------------- cheevos/badges.h | 2 +- cheevos/cheevos.c | 56 +++++++++++++++++++++++++++++++++++++-------- file_path_special.c | 49 +++++++++++++++++++++++++++++---------- file_path_special.h | 5 ++-- menu/drivers/xmb.c | 6 +++-- 6 files changed, 102 insertions(+), 68 deletions(-) diff --git a/cheevos/badges.c b/cheevos/badges.c index d143084660..922a1de22e 100644 --- a/cheevos/badges.c +++ b/cheevos/badges.c @@ -1,6 +1,7 @@ #include #include +#include "../file_path_special.h" #include "../verbosity.h" #include "../network/net_http_special.h" @@ -8,49 +9,12 @@ badges_ctx_t badges_ctx; -bool download_badge(const char* filename) +bool badge_exists(const char* filepath) { - char fullpath[PATH_MAX_LENGTH]; - - strcpy(fullpath, "badges/"); - strcat(fullpath, filename); - - if(path_file_exists(fullpath)) - { + if(path_file_exists(filepath)) return true; - } else - { - size_t mysize = 1024 * 100; - size_t *size; - size = &mysize; - - const char **buffer = malloc(sizeof(*buffer) * mysize); - char url[PATH_MAX_LENGTH]; - strcpy(url, "http://i.retroachievements.org/Badge/"); - strcat(url, filename); - - retro_time_t *timeout; - retro_time_t timesecs = 10000000; //10 seconds - timeout = ×ecs; - - if(net_http_get(buffer, size, url, timeout) != NET_HTTP_GET_OK) - { - printf("[CHEEVOS]: Download to %s failed.\n", fullpath); - return false; - } - - if (!filestream_write_file(fullpath, *buffer, *size)) - { - printf("[CHEEVOS]: Write to %s failed.\n", fullpath); - return false; - } - else - { - printf("[CHEEVOS]: %s downloaded.\n", fullpath); - return true; - } - } + return false; } void set_badge_menu_texture(badges_ctx_t * badges, int i) @@ -63,8 +27,12 @@ void set_badge_menu_texture(badges_ctx_t * badges, int i) snprintf(badge_file, bufferSize, "%s", badges->badge_id_list[i]); strcat(badge_file, locked_suffix); - // Badge directory should probably use a definition - menu_display_reset_textures_list(badge_file, "badges", &badges->menu_texture_list[i],TEXTURE_FILTER_MIPMAP_LINEAR); + char fullpath[PATH_MAX_LENGTH]; + fill_pathname_application_special(fullpath, + PATH_MAX_LENGTH * sizeof(char), + APPLICATION_SPECIAL_DIRECTORY_THUMBNAILS_CHEEVOS_BADGES); + + menu_display_reset_textures_list(badge_file, fullpath, &badges->menu_texture_list[i],TEXTURE_FILTER_MIPMAP_LINEAR); } void set_badge_info (badges_ctx_t *badge_struct, int id, const char *badge_id, bool active) diff --git a/cheevos/badges.h b/cheevos/badges.h index da0e4d6787..863aa34e1a 100644 --- a/cheevos/badges.h +++ b/cheevos/badges.h @@ -16,10 +16,10 @@ typedef struct menu_texture_item menu_texture_list[CHEEVOS_BADGE_LIMIT]; } badges_ctx_t; +bool badge_exists(const char* filepath); void set_badge_menu_texture(badges_ctx_t * badges, int i); extern void set_badge_info (badges_ctx_t *badge_struct, int id, const char *badge_id, bool active); extern menu_texture_item get_badge_texture(int id); -extern bool download_badge(const char* filename); extern badges_ctx_t badges_ctx; diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c index 4edf5e87f7..1c5f57058d 100644 --- a/cheevos/cheevos.c +++ b/cheevos/cheevos.c @@ -16,6 +16,7 @@ #include #include +#include #include #include #include @@ -40,6 +41,7 @@ #include "var.h" #include "cond.h" +#include "../file_path_special.h" #include "../command.h" #include "../dynamic.h" #include "../configuration.h" @@ -77,6 +79,9 @@ * THE USER'S PASSWORD, TAKE CARE! */ #undef CHEEVOS_LOG_PASSWORD +/* Define this macro to log downloaded badge images. */ +#undef CHEEVOS_LOG_BADGES + /* C89 wants only int values in enums. */ #define CHEEVOS_JSON_KEY_GAMEID 0xb4960eecU #define CHEEVOS_JSON_KEY_ACHIEVEMENTS 0x69749ae1U @@ -2856,6 +2861,8 @@ static int cheevos_iterate(coro_t* coro) runloop_msg_queue_push(msg, 0, 6 * 60, false); } + CORO_GOSUB(GET_BADGES); + CORO_STOP(); /************************************************************************** @@ -3163,24 +3170,54 @@ static int cheevos_iterate(coro_t* coro) CORO_SUB(GET_BADGES) char badge_filename[16]; + char fullpath[PATH_MAX_LENGTH]; + FILE* file; cheevo_t *cheevo = cheevos_locals.core.cheevos; const cheevo_t *end = cheevos_locals.core.cheevos + cheevos_locals.core.count; for (unsigned i = 0; cheevo < end ; cheevo++) { - strcpy(badge_filename, cheevo->badge); - strcat(badge_filename, ".png"); - if (!download_badge(badge_filename)) - break; + for (unsigned j = 0; j < 2; j++) + { + strcpy(badge_filename, cheevo->badge); + if (j == 0) strcat(badge_filename, ".png"); + else strcat(badge_filename, "_lock.png"); - strcpy(badge_filename, cheevo->badge); - strcat(badge_filename, "_lock.png"); - if (!download_badge(badge_filename)) - break; + fill_pathname_application_special(fullpath, + PATH_MAX_LENGTH * sizeof(char), + APPLICATION_SPECIAL_DIRECTORY_THUMBNAILS_CHEEVOS_BADGES); + + if (!path_is_directory(fullpath)) + path_mkdir(fullpath); + + strcat(fullpath, badge_filename); + + if (!badge_exists(fullpath)) + { + snprintf( + CHEEVOS_VAR_URL, sizeof(CHEEVOS_VAR_URL), + "http://i.retroachievements.org/Badge/%s", + badge_filename + ); + + CORO_GOSUB(HTTP_GET); + + if (CHEEVOS_VAR_K > 5) + { + file = fopen (fullpath, "wb"); + fwrite(CHEEVOS_VAR_JSON, 1, CHEEVOS_VAR_K, file); + fclose(file); + #ifdef CHEEVOS_LOG_BADGES + RARCH_LOG("[CHEEVOS]: downloaded badge %s.\n", badge_filename); + #endif + } + } + + } } - CORO_RET(); + CORO_RET(); /************************************************************************** * Info Logs in the user at Retro Achievements @@ -3323,6 +3360,7 @@ static int cheevos_iterate(coro_t* coro) CHEEVOS_VAR_JSON[length] = 0; } + CHEEVOS_VAR_K = length; net_http_delete(CHEEVOS_VAR_HTTP); net_http_connection_free(CHEEVOS_VAR_CONN); CORO_RET(); diff --git a/file_path_special.c b/file_path_special.c index 3d5231a63f..b6ac69470e 100644 --- a/file_path_special.c +++ b/file_path_special.c @@ -1,6 +1,6 @@ /* RetroArch - A frontend for libretro. * Copyright (C) 2011-2017 - Daniel De Matteis - * + * * RetroArch is free software: you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Found- * ation, either version 3 of the License, or (at your option) any later version. @@ -119,7 +119,7 @@ void fill_pathname_abbreviate_special(char *out_path, * Keep application dir in front of home, moving app dir to a * new location inside home would break otherwise. */ - /* ugly hack - use application_dir pointer + /* ugly hack - use application_dir pointer * before filling it in. C89 reasons */ candidates[0] = application_dir; candidates[1] = home; @@ -129,23 +129,23 @@ void fill_pathname_abbreviate_special(char *out_path, notations [1] = "~"; notations [2] = NULL; - fill_pathname_application_path(application_dir, + fill_pathname_application_path(application_dir, PATH_MAX_LENGTH * sizeof(char)); path_basedir_wrapper(application_dir); - + for (i = 0; candidates[i]; i++) { - if (!string_is_empty(candidates[i]) && + if (!string_is_empty(candidates[i]) && strstr(in_path, candidates[i]) == in_path) { size_t src_size = strlcpy(out_path, notations[i], size); retro_assert(src_size < size); - + out_path += src_size; size -= src_size; in_path += strlen(candidates[i]); - + if (!path_char_is_slash(*in_path)) { retro_assert(strlcpy(out_path, @@ -242,7 +242,7 @@ void fill_pathname_application_path(char *s, size_t len) CFStringGetCString(bundle_path, s, len, kCFStringEncodingUTF8); CFRelease(bundle_path); CFRelease(bundle_url); - + retro_assert(strlcat(s, "nobin", len) < len); return; } @@ -269,7 +269,7 @@ void fill_pathname_application_path(char *s, size_t len) char link_path[255]; link_path[0] = *s = '\0'; - pid = getpid(); + pid = getpid(); /* Linux, BSD and Solaris paths. Not standardized. */ for (i = 0; i < ARRAY_SIZE(exts); i++) @@ -287,7 +287,7 @@ void fill_pathname_application_path(char *s, size_t len) } } } - + RARCH_ERR("Cannot resolve application path! This should not happen.\n"); #endif } @@ -335,7 +335,7 @@ void fill_pathname_application_special(char *s, char *s1 = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); s1[0] = '\0'; - fill_pathname_application_special(s1, + fill_pathname_application_special(s1, PATH_MAX_LENGTH * sizeof(char), APPLICATION_SPECIAL_DIRECTORY_ASSETS_ZARCH); fill_pathname_join(s, @@ -349,7 +349,7 @@ void fill_pathname_application_special(char *s, #ifdef HAVE_ZARCH { settings_t *settings = config_get_ptr(); - fill_pathname_join(s, + fill_pathname_join(s, settings->paths.directory_assets, "zarch", len); @@ -501,6 +501,31 @@ void fill_pathname_application_special(char *s, } #endif break; + case APPLICATION_SPECIAL_DIRECTORY_THUMBNAILS_CHEEVOS_BADGES: + { + char *s1 = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); + char *s2 = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); + settings_t *settings = config_get_ptr(); + + s1[0] = s2[0] = '\0'; + + fill_pathname_join(s1, + settings->paths.directory_thumbnails, + "cheevos", + len); + fill_pathname_join(s2, + s1, "badges", + PATH_MAX_LENGTH * sizeof(char) + ); + fill_pathname_slash(s2, + PATH_MAX_LENGTH * sizeof(char) + ); + strlcpy(s, s2, len); + free(s1); + free(s2); + } + break; + case APPLICATION_SPECIAL_NONE: default: break; diff --git a/file_path_special.h b/file_path_special.h index e763f78a7f..4d959e1899 100644 --- a/file_path_special.h +++ b/file_path_special.h @@ -1,7 +1,7 @@ /* RetroArch - A frontend for libretro. * Copyright (C) 2010-2014 - Hans-Kristian Arntzen * Copyright (C) 2011-2016 - Daniel De Matteis - * + * * RetroArch is free software: you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Found- * ation, either version 3 of the License, or (at your option) any later version. @@ -104,7 +104,8 @@ enum application_special_type APPLICATION_SPECIAL_DIRECTORY_ASSETS_XMB_FONT, APPLICATION_SPECIAL_DIRECTORY_ASSETS_ZARCH, APPLICATION_SPECIAL_DIRECTORY_ASSETS_ZARCH_FONT, - APPLICATION_SPECIAL_DIRECTORY_ASSETS_ZARCH_ICONS + APPLICATION_SPECIAL_DIRECTORY_ASSETS_ZARCH_ICONS, + APPLICATION_SPECIAL_DIRECTORY_THUMBNAILS_CHEEVOS_BADGES }; /** diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index c5bc6a2c47..7dc700b29e 100755 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -2245,9 +2245,11 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb, if ((type >= MENU_SETTINGS_CHEEVOS_START) && (type < MENU_SETTINGS_NETPLAY_ROOMS_START)) { - //return badges_ctx.menu_texture_list[type - MENU_SETTINGS_CHEEVOS_START]; int new_id = type - MENU_SETTINGS_CHEEVOS_START; - return get_badge_texture( new_id ); + if ( get_badge_texture(new_id) != 0 ) + return get_badge_texture( new_id ); + else + return xmb->textures.list[XMB_TEXTURE_SUBSETTING]; // Should be replaced with placeholder badge icon. } #endif From 4f9119d42e3940e9a5420d95acccf6108f236e0c Mon Sep 17 00:00:00 2001 From: GameDragon2k Date: Thu, 23 Nov 2017 08:06:33 -0500 Subject: [PATCH 049/183] Fix conflict --- Makefile.common | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Makefile.common b/Makefile.common index 737820a16c..7aeea49c68 100644 --- a/Makefile.common +++ b/Makefile.common @@ -1474,12 +1474,9 @@ ifeq ($(HAVE_NETWORKING), 1) ifeq ($(HAVE_CHEEVOS), 1) DEFINES += -DHAVE_CHEEVOS OBJ += cheevos/cheevos.o \ -<<<<<<< HEAD cheevos/var.o \ cheevos/cond.o \ -======= - cheevos/badges.o \ ->>>>>>> Add files to handle all cheevos badges. + cheevos/badges.o \ $(LIBRETRO_COMM_DIR)/utils/md5.o endif From c4dd3bbdce5a859b2e01edca5040c482f3c99ca1 Mon Sep 17 00:00:00 2001 From: orbea Date: Thu, 23 Nov 2017 07:17:04 -0800 Subject: [PATCH 050/183] qb: Fix undefined udev references without pkg-config --- qb/config.libs.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/qb/config.libs.sh b/qb/config.libs.sh index ffe90a5d66..0c8363a220 100644 --- a/qb/config.libs.sh +++ b/qb/config.libs.sh @@ -425,7 +425,10 @@ if [ "$HAVE_UDEV" != "no" ]; then check_pkgconf UDEV libudev if [ "$HAVE_UDEV" = "no" ]; then HAVE_UDEV=auto; check_lib '' UDEV "-ludev" - [ "$HAVE_UDEV" = "yes" ] && UDEV_LIBS=-ludev + if [ "$HAVE_UDEV" = "yes" ]; then + UDEV_LIBS='-ludev' + PKG_CONF_USED="$PKG_CONF_USED UDEV" + fi fi fi From 3bda00edaf26a5be94b654eee418e9489e1b86d8 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Thu, 23 Nov 2017 17:51:34 +0100 Subject: [PATCH 051/183] (libretro-common) Add strldup to compat/strl --- libretro-common/compat/compat_strl.c | 7 +++++++ libretro-common/include/compat/strl.h | 2 ++ 2 files changed, 9 insertions(+) diff --git a/libretro-common/compat/compat_strl.c b/libretro-common/compat/compat_strl.c index 668b3d9236..ffe078c368 100644 --- a/libretro-common/compat/compat_strl.c +++ b/libretro-common/compat/compat_strl.c @@ -60,3 +60,10 @@ size_t strlcat(char *dest, const char *source, size_t size) return len + strlcpy(dest, source, size); } #endif + +char *strldup(const char *s, size_t n) +{ + char *dst = malloc(sizeof(char) * (n + 1)); + strlcpy(dst, s, n); + return dst; +} diff --git a/libretro-common/include/compat/strl.h b/libretro-common/include/compat/strl.h index a68005ac2f..1b72f7db0a 100644 --- a/libretro-common/include/compat/strl.h +++ b/libretro-common/include/compat/strl.h @@ -52,6 +52,8 @@ size_t strlcat(char *dest, const char *source, size_t size); #endif +char *strldup(const char *s, size_t n); + RETRO_END_DECLS #endif From 2b9636d782f383008b7959fe7ec4c9848abeb291 Mon Sep 17 00:00:00 2001 From: GameDragon2k Date: Thu, 23 Nov 2017 11:55:53 -0500 Subject: [PATCH 052/183] Add xmb menu items --- cheevos/badges.c | 6 ++++++ cheevos/badges.h | 1 + cheevos/cheevos.c | 9 ++++++++- configuration.c | 5 ++++- configuration.h | 1 + intl/msg_hash_lbl.h | 2 ++ intl/msg_hash_us.h | 6 ++++++ menu/cbs/menu_cbs_sublabel.c | 4 ++++ menu/menu_displaylist.c | 18 ++++++++++++------ menu/menu_setting.c | 20 ++++++++++++++++++-- msg_hash.h | 1 + 11 files changed, 63 insertions(+), 10 deletions(-) diff --git a/cheevos/badges.c b/cheevos/badges.c index 922a1de22e..961fbc600e 100644 --- a/cheevos/badges.c +++ b/cheevos/badges.c @@ -1,7 +1,9 @@ #include +#include #include #include "../file_path_special.h" +#include "../configuration.h" #include "../verbosity.h" #include "../network/net_http_special.h" @@ -44,5 +46,9 @@ void set_badge_info (badges_ctx_t *badge_struct, int id, const char *badge_id, b menu_texture_item get_badge_texture (int id) { + settings_t *settings = config_get_ptr(); + if (!settings->bools.cheevos_badges_enable) + return (menu_texture_item)NULL; + return badges_ctx.menu_texture_list[id]; } diff --git a/cheevos/badges.h b/cheevos/badges.h index 863aa34e1a..57a8de6ed2 100644 --- a/cheevos/badges.h +++ b/cheevos/badges.h @@ -22,6 +22,7 @@ extern void set_badge_info (badges_ctx_t *badge_struct, int id, const char *badg extern menu_texture_item get_badge_texture(int id); extern badges_ctx_t badges_ctx; +static badges_ctx_t new_badges_ctx; RETRO_END_DECLS diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c index 1c5f57058d..914309a705 100644 --- a/cheevos/cheevos.c +++ b/cheevos/cheevos.c @@ -17,6 +17,7 @@ #include #include +#include #include #include #include @@ -3169,6 +3170,12 @@ static int cheevos_iterate(coro_t* coro) *************************************************************************/ CORO_SUB(GET_BADGES) + badges_ctx = new_badges_ctx; + + settings_t *settings = config_get_ptr(); + if (!string_is_equal_fast(settings->arrays.menu_driver, "xmb", 3) || !settings->bools.cheevos_badges_enable) + CORO_RET(); + char badge_filename[16]; char fullpath[PATH_MAX_LENGTH]; FILE* file; @@ -3176,7 +3183,7 @@ static int cheevos_iterate(coro_t* coro) const cheevo_t *end = cheevos_locals.core.cheevos + cheevos_locals.core.count; - for (unsigned i = 0; cheevo < end ; cheevo++) + for (; cheevo < end ; cheevo++) { for (unsigned j = 0; j < 2; j++) { diff --git a/configuration.c b/configuration.c index 21ce17f95d..513d9a6f0c 100644 --- a/configuration.c +++ b/configuration.c @@ -1255,6 +1255,9 @@ static struct config_bool_setting *populate_settings_bool(settings_t *settings, SETTING_BOOL("cheevos_test_unofficial", &settings->bools.cheevos_test_unofficial, true, false, false); SETTING_BOOL("cheevos_hardcore_mode_enable", &settings->bools.cheevos_hardcore_mode_enable, true, false, false); SETTING_BOOL("cheevos_leaderboards_enable", &settings->bools.cheevos_leaderboards_enable, true, false, false); +#ifdef HAVE_XMB + SETTING_BOOL("cheevos_badges_enable", &settings->bools.cheevos_badges_enable, true, false, false); +#endif SETTING_BOOL("cheevos_verbose_enable", &settings->bools.cheevos_verbose_enable, true, false, false); #endif #ifdef HAVE_OVERLAY @@ -1864,7 +1867,7 @@ static void config_set_defaults(void) temp_str[0] = '\0'; fill_pathname_expand_special(temp_str, - g_defaults.path.config, + g_defaults.path.config, PATH_MAX_LENGTH * sizeof(char)); path_set(RARCH_PATH_CONFIG, temp_str); free(temp_str); diff --git a/configuration.h b/configuration.h index ee2d29d5f7..7dd74b9282 100644 --- a/configuration.h +++ b/configuration.h @@ -184,6 +184,7 @@ typedef struct settings bool cheevos_test_unofficial; bool cheevos_hardcore_mode_enable; bool cheevos_leaderboards_enable; + bool cheevos_badges_enable; bool cheevos_verbose_enable; /* Camera */ diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index fbf28f4ca6..6cc3ee5313 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -136,6 +136,8 @@ MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_HARDCORE_MODE_ENABLE, "cheevos_hardcore_mode_enable") MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_LEADERBOARDS_ENABLE, "cheevos_leaderboards_enable") +MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_BADGES_ENABLE, + "cheevos_badges_enable") MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_LOCKED_ACHIEVEMENTS, "cheevos_locked_achievements") MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY, diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index a7f516c586..dbe83d50ba 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -434,6 +434,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_LEADERBOARDS_ENABLE, "Leaderboards" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_BADGES_ENABLE, + "Achievement Badges" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_LOCKED_ACHIEVEMENTS, "Locked Achievements:" @@ -1791,6 +1795,8 @@ MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_HARDCORE_MODE_ENABLE, "Enable or disable savestates, cheats, rewind, fast-forward, pause, and slow-motion for all games.") MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_LEADERBOARDS_ENABLE, "Enable or disable in-game leaderboards. Has no effect if Hardcore Mode is disabled.") +MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_BADGES_ENABLE, + "Enable or disable badge display in Achievement List.") MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_VERBOSE_ENABLE, "Enable or disable OSD verbosity for achievements.") MSG_HASH(MENU_ENUM_SUBLABEL_DRIVER_SETTINGS, diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 9b1013905a..db388d9def 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -63,6 +63,7 @@ default_sublabel_macro(action_bind_sublabel_cheevos_enable, MENU_ default_sublabel_macro(action_bind_sublabel_cheevos_test_unofficial, MENU_ENUM_SUBLABEL_CHEEVOS_TEST_UNOFFICIAL) default_sublabel_macro(action_bind_sublabel_cheevos_hardcore_mode_enable, MENU_ENUM_SUBLABEL_CHEEVOS_HARDCORE_MODE_ENABLE) default_sublabel_macro(action_bind_sublabel_cheevos_leaderboards_enable, MENU_ENUM_SUBLABEL_CHEEVOS_LEADERBOARDS_ENABLE) +default_sublabel_macro(action_bind_sublabel_cheevos_badges_enable, MENU_ENUM_SUBLABEL_CHEEVOS_BADGES_ENABLE) default_sublabel_macro(action_bind_sublabel_cheevos_verbose_enable, MENU_ENUM_SUBLABEL_CHEEVOS_VERBOSE_ENABLE) default_sublabel_macro(action_bind_sublabel_menu_views_settings_list, MENU_ENUM_SUBLABEL_MENU_VIEWS_SETTINGS) default_sublabel_macro(action_bind_sublabel_quick_menu_views_settings_list, MENU_ENUM_SUBLABEL_QUICK_MENU_VIEWS_SETTINGS) @@ -1266,6 +1267,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_CHEEVOS_LEADERBOARDS_ENABLE: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_cheevos_leaderboards_enable); break; + case MENU_ENUM_LABEL_CHEEVOS_BADGES_ENABLE: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_cheevos_badges_enable); + break; case MENU_ENUM_LABEL_CHEEVOS_VERBOSE_ENABLE: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_cheevos_verbose_enable); break; diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index e4dd8450d1..03290e1d8b 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -1572,7 +1572,7 @@ static int menu_displaylist_parse_playlist(menu_displaylist_info_t *info, free(tmp); } } - + free(path_short); } @@ -3495,7 +3495,7 @@ static int menu_displaylist_parse_options_remappings( } #ifdef HAVE_KEYMAPPER if (system) - { + { settings_t *settings = config_get_ptr(); unsigned device = settings->uints.input_libretro_device[settings->uints.keymapper_port]; @@ -3514,13 +3514,13 @@ static int menu_displaylist_parse_options_remappings( keybind = &input_config_binds[settings->uints.keymapper_port][retro_id]; auto_bind = (const struct retro_keybind*) input_config_get_bind_auto(settings->uints.keymapper_port, retro_id); - + input_config_get_bind_string(descriptor, keybind, auto_bind, sizeof(descriptor)); if(!strstr(descriptor, "Auto")) { - const struct retro_keybind *keyptr = + const struct retro_keybind *keyptr = &input_config_binds[settings->uints.keymapper_port][retro_id]; strlcpy(descriptor, msg_hash_to_str(keyptr->enum_idx), sizeof(descriptor)); @@ -3860,7 +3860,7 @@ static int menu_displaylist_parse_cores( malloc(PATH_MAX_LENGTH * sizeof(char)); char *display_name = (char*) malloc(PATH_MAX_LENGTH * sizeof(char)); - core_path[0] = + core_path[0] = display_name[0] = '\0'; fill_pathname_join(core_path, dir, path, @@ -4180,7 +4180,7 @@ static void menu_displaylist_parse_playlist_generic( { playlist_t *playlist = NULL; char *path_playlist = NULL; - + menu_displaylist_set_new_playlist(menu, playlist_path); menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &playlist); @@ -5615,6 +5615,12 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_CHEEVOS_LEADERBOARDS_ENABLE, PARSE_ONLY_BOOL, false); + if (string_is_equal_fast(settings->arrays.menu_driver, "xmb", 3)) + { + menu_displaylist_parse_settings_enum(menu, info, + MENU_ENUM_LABEL_CHEEVOS_BADGES_ENABLE, + PARSE_ONLY_BOOL, false); + } menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_CHEEVOS_TEST_UNOFFICIAL, PARSE_ONLY_BOOL, false); diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 168dd8bc5f..bb39557308 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -917,7 +917,7 @@ int menu_setting_set(unsigned type, const char *label, int ret = 0; file_list_t *selection_buf = menu_entries_get_selection_buf_ptr(0); size_t selection = menu_navigation_get_selection(); - menu_file_list_cbs_t *cbs = selection_buf ? + menu_file_list_cbs_t *cbs = selection_buf ? (menu_file_list_cbs_t*)file_list_get_actiondata_at_offset(selection_buf, selection) : NULL; if (!cbs) @@ -1446,7 +1446,7 @@ static int setting_action_ok_bind_defaults(void *data, bool wraparound) return 0; } -static void +static void setting_get_string_representation_st_float_video_refresh_rate_auto( void *data, char *s, size_t len) { @@ -6461,6 +6461,22 @@ static bool setting_append_list( SD_FLAG_NONE ); + CONFIG_BOOL( + list, list_info, + &settings->bools.cheevos_badges_enable, + MENU_ENUM_LABEL_CHEEVOS_BADGES_ENABLE, + MENU_ENUM_LABEL_VALUE_CHEEVOS_BADGES_ENABLE, + false, + MENU_ENUM_LABEL_VALUE_OFF, + MENU_ENUM_LABEL_VALUE_ON, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler, + SD_FLAG_NONE + ); + CONFIG_BOOL( list, list_info, &settings->bools.cheevos_verbose_enable, diff --git a/msg_hash.h b/msg_hash.h index 25f83229b8..b6a63286f0 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -853,6 +853,7 @@ enum msg_hash_enums MENU_LABEL(ACCOUNTS_CHEEVOS_USERNAME), MENU_LABEL(CHEEVOS_HARDCORE_MODE_ENABLE), MENU_LABEL(CHEEVOS_LEADERBOARDS_ENABLE), + MENU_LABEL(CHEEVOS_BADGES_ENABLE), MENU_LABEL(CHEEVOS_TEST_UNOFFICIAL), MENU_LABEL(CHEEVOS_VERBOSE_ENABLE), MENU_LABEL(CHEEVOS_ENABLE), From 096686140d875711755def8b09203eb5b5c1cc67 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Thu, 23 Nov 2017 18:07:28 +0100 Subject: [PATCH 053/183] Rewrite command_event_save_config --- command.c | 39 +++++++++++++++------------- libretro-common/compat/compat_strl.c | 1 + 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/command.c b/command.c index 2a6c9ad27e..97f580bc0f 100644 --- a/command.c +++ b/command.c @@ -1374,29 +1374,32 @@ error: return false; } -static bool command_event_save_config(const char *config_path, +static bool command_event_save_config( + const char *config_path, char *s, size_t len) { - if (string_is_empty(config_path) || !config_save_file(config_path)) + bool path_exists = !string_is_empty(config_path); + const char *str = path_exists ? config_path : + path_get(RARCH_PATH_CONFIG); + + if (path_exists && config_save_file(config_path)) { - const char *str = path_get(RARCH_PATH_CONFIG); - - if (!string_is_empty(str)) - { - snprintf(s, len, "%s \"%s\".", - msg_hash_to_str(MSG_FAILED_SAVING_CONFIG_TO), - str); - RARCH_ERR("%s\n", s); - } - - return false; + snprintf(s, len, "[Config]: %s \"%s\".", + msg_hash_to_str(MSG_SAVED_NEW_CONFIG_TO), + config_path); + RARCH_LOG("%s\n", s); + return true; } - snprintf(s, len, "[Config]: %s \"%s\".", - msg_hash_to_str(MSG_SAVED_NEW_CONFIG_TO), - config_path); - RARCH_LOG("%s\n", s); - return true; + if (!string_is_empty(str)) + { + snprintf(s, len, "%s \"%s\".", + msg_hash_to_str(MSG_FAILED_SAVING_CONFIG_TO), + str); + RARCH_ERR("%s\n", s); + } + + return false; } /** diff --git a/libretro-common/compat/compat_strl.c b/libretro-common/compat/compat_strl.c index ffe078c368..3473ba56d3 100644 --- a/libretro-common/compat/compat_strl.c +++ b/libretro-common/compat/compat_strl.c @@ -20,6 +20,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +#include #include #include From 18b2bd527c27a6fb2cea0f883983d3e04aff4b02 Mon Sep 17 00:00:00 2001 From: q3cpma Date: Thu, 23 Nov 2017 19:15:59 +0100 Subject: [PATCH 054/183] Set _NET_WM_PID Also set WM_CLIENT_MACHINE since https://specifications.freedesktop.org/wm-spec/1.3/ar01s05.html says you must do so if setting the first. --- gfx/common/x11_common.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/gfx/common/x11_common.c b/gfx/common/x11_common.c index a9d2fcb334..20eebf8da3 100644 --- a/gfx/common/x11_common.c +++ b/gfx/common/x11_common.c @@ -21,6 +21,8 @@ #include #include +#include + #include #ifdef HAVE_CONFIG_H @@ -155,9 +157,27 @@ static void x11_set_window_class(Display *dpy, Window win) XSetClassHint(dpy, win, &hint); } +static void x11_set_window_pid(Display *dpy, Window win) +{ + pid_t pid = getpid(); + char hostname[HOST_NAME_MAX + 1]; + + XChangeProperty(dpy, win, XInternAtom(dpy, "_NET_WM_PID", False), + XA_CARDINAL, 32, PropModeReplace, (unsigned char *)&pid, 1); + + if(gethostname(hostname, HOST_NAME_MAX + 1) == -1) + RARCH_WARN("Failed to get hostname.\n"); + else + { + XChangeProperty(dpy, win, XA_WM_CLIENT_MACHINE, XA_STRING, 8, + PropModeReplace, (unsigned char *)hostname, strlen(hostname)); + } +} + void x11_set_window_attr(Display *dpy, Window win) { x11_set_window_class(dpy, win); + x11_set_window_pid(dpy, win); } static void xdg_screensaver_inhibit(Window wnd) From d3139754bcbc5e9692b0b86d8101298955a3240a Mon Sep 17 00:00:00 2001 From: orbea Date: Thu, 23 Nov 2017 09:39:22 -0800 Subject: [PATCH 055/183] qb: Rewrite the create_config_make function to use printf instead of echo. --- qb/qb.libs.sh | 56 +++++++++++++++++++++++++-------------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/qb/qb.libs.sh b/qb/qb.libs.sh index 05935a4a4a..24a25ab1e6 100644 --- a/qb/qb.libs.sh +++ b/qb/qb.libs.sh @@ -214,46 +214,46 @@ create_config_header() create_config_make() { outfile="$1"; shift - echo "Creating make config: $outfile" + printf %s\\n "Creating make config: $outfile" - { if [ "$USE_LANG_C" = 'yes' ]; then - echo "CC = $CC" - echo "CFLAGS = $CFLAGS" - fi - if [ "$USE_LANG_CXX" = 'yes' ]; then - echo "CXX = $CXX" - echo "CXXFLAGS = $CXXFLAGS" - fi - echo "WINDRES = $WINDRES" - echo "ASFLAGS = $ASFLAGS" - echo "LDFLAGS = $LDFLAGS" - echo "INCLUDE_DIRS = $INCLUDE_DIRS" - echo "LIBRARY_DIRS = $LIBRARY_DIRS" - echo "PACKAGE_NAME = $PACKAGE_NAME" - echo "BUILD = $BUILD" - echo "PREFIX = $PREFIX" + { [ "$USE_LANG_C" = 'yes' ] && printf %s\\n "CC = $CC" "CFLAGS = $CFLAGS" + [ "$USE_LANG_CXX" = 'yes' ] && printf %s\\n "CXX = $CXX" "CXXFLAGS = $CXXFLAGS" + + printf %s\\n "WINDRES = $WINDRES" \ + "ASFLAGS = $ASFLAGS" \ + "LDFLAGS = $LDFLAGS" \ + "INCLUDE_DIRS = $INCLUDE_DIRS" \ + "LIBRARY_DIRS = $LIBRARY_DIRS" \ + "PACKAGE_NAME = $PACKAGE_NAME" \ + "BUILD = $BUILD" \ + "PREFIX = $PREFIX" while [ "$1" ]; do - case $(eval echo \$HAVE_$1) in + case "$(eval "printf %s \"\$HAVE_$1\"")" in 'yes') - if [ "$(eval echo \$C89_$1)" = "no" ]; then echo "ifneq (\$(C89_BUILD),1)"; fi - echo "HAVE_$1 = 1" - if [ "$(eval echo \$C89_$1)" = "no" ]; then echo "endif"; fi - ;; - 'no') echo "HAVE_$1 = 0";; + if [ "$(eval "printf %s \"\$C89_$1\"")" = 'no' ]; then + printf %s\\n "ifneq (\$(C89_BUILD),1)" \ + "HAVE_$1 = 1" 'endif' + else + printf %s\\n "HAVE_$1 = 1" + fi + ;; + 'no') printf %s\\n "HAVE_$1 = 0";; esac case "$PKG_CONF_USED" in *$1*) - FLAGS="$(eval echo \$$1_CFLAGS)" - LIBS="$(eval echo \$$1_LIBS)" - echo "$1_CFLAGS = ${FLAGS%"${FLAGS##*[! ]}"}" - echo "$1_LIBS = ${LIBS%"${LIBS##*[! ]}"}" + FLAGS="$(eval "printf %s \"\$$1_CFLAGS\"")" + LIBS="$(eval "printf %s \"\$$1_LIBS\"")" + printf %s\\n "$1_CFLAGS = ${FLAGS%"${FLAGS##*[! ]}"}" \ + "$1_LIBS = ${LIBS%"${LIBS##*[! ]}"}" ;; esac shift done - while IFS='=' read VAR VAL; do echo "$VAR = $VAL"; done < "$MAKEFILE_DEFINES" + while IFS='=' read -r VAR VAL; do + printf %s\\n "$VAR = $VAL" + done < "$MAKEFILE_DEFINES" } > "$outfile" } From 1c0e692070f87fffd697dc7a325a7a499568e956 Mon Sep 17 00:00:00 2001 From: radius Date: Thu, 23 Nov 2017 17:07:22 -0500 Subject: [PATCH 056/183] rewrite so the variables are not allocated on stack --- cheevos/cheevos.c | 121 +++++++++++++++++++++++----------------------- 1 file changed, 61 insertions(+), 60 deletions(-) diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c index 525061f1c5..4fe6910247 100644 --- a/cheevos/cheevos.c +++ b/cheevos/cheevos.c @@ -2528,7 +2528,12 @@ typedef struct char url[256]; \ struct http_connection_t *conn; \ struct http_t *http; \ - retro_time_t t0; + retro_time_t t0; \ + char badge_basepath[PATH_MAX_LENGTH]; \ + char badge_fullpath[PATH_MAX_LENGTH]; \ + char badge_name[16]; \ + cheevo_t *cheevo; \ + const cheevo_t *cheevo_end; #include "coro.h" @@ -2557,8 +2562,13 @@ typedef struct #define CHEEVOS_VAR_SIZE CORO_VAR(size) #define CHEEVOS_VAR_URL CORO_VAR(url) #define CHEEVOS_VAR_CONN CORO_VAR(conn) -#define CHEEVOS_VAR_HTTP CORO_VAR(http) -#define CHEEVOS_VAR_T0 CORO_VAR(t0) +#define CHEEVOS_VAR_HTTP CORO_VAR(http) +#define CHEEVOS_VAR_T0 CORO_VAR(t0) +#define CHEEVOS_VAR_BADGE_PATH CORO_VAR(badge_fullpath) +#define CHEEVOS_VAR_BADGE_BASE_PATH CORO_VAR(badge_fullpath) +#define CHEEVOS_VAR_BADGE_NAME CORO_VAR(badge_name) +#define CHEEVOS_VAR_CHEEVO_CURR CORO_VAR(cheevo) +#define CHEEVOS_VAR_CHEEVO_END CORO_VAR(cheevo_end) static int cheevos_iterate(coro_t* coro) { @@ -2786,7 +2796,7 @@ static int cheevos_iterate(coro_t* coro) FILE* file; size_t size; - file = fopen(CHEEVOS_JSON_OVERRIDE, "rb"); + file = filestream_open(CHEEVOS_JSON_OVERRIDE, RFILE_MODE_READ_WRITE, -1); fseek(file, 0, SEEK_END); size = ftell(file); fseek(file, 0, SEEK_SET); @@ -3143,14 +3153,12 @@ static int cheevos_iterate(coro_t* coro) *************************************************************************/ CORO_SUB(GET_CHEEVOS) - CORO_GOSUB(LOGIN); + CORO_GOSUB(LOGIN); - snprintf( - CHEEVOS_VAR_URL, sizeof(CHEEVOS_VAR_URL), - "http://retroachievements.org/dorequest.php?r=patch&u=%s&g=%u&f=3&l=1&t=%s", - CHEEVOS_VAR_SETTINGS->arrays.cheevos_username, - CHEEVOS_VAR_GAMEID, cheevos_locals.token - ); + snprintf(CHEEVOS_VAR_URL, sizeof(CHEEVOS_VAR_URL), + "http://retroachievements.org/dorequest.php?r=patch&u=%s&g=%u&f=3&l=1&t=%s", + CHEEVOS_VAR_SETTINGS->arrays.cheevos_username, + CHEEVOS_VAR_GAMEID, cheevos_locals.token); CHEEVOS_VAR_URL[sizeof(CHEEVOS_VAR_URL) - 1] = 0; @@ -3169,66 +3177,59 @@ static int cheevos_iterate(coro_t* coro) RARCH_LOG("[CHEEVOS]: got achievements for game id %u.\n", CHEEVOS_VAR_GAMEID); CORO_RET(); - /************************************************************************** - * Info Gets the achievements from Retro Achievements - * Inputs CHEEVOS_VAR_GAMEID - * Outputs CHEEVOS_VAR_JSON - *************************************************************************/ - CORO_SUB(GET_BADGES) + /************************************************************************** + * Info Gets the achievements from Retro Achievements + * Inputs CHEEVOS_VAR_GAMEID + * Outputs CHEEVOS_VAR_JSON + *************************************************************************/ + CORO_SUB(GET_BADGES) - badges_ctx = new_badges_ctx; + badges_ctx = new_badges_ctx; - settings_t *settings = config_get_ptr(); - if (!string_is_equal_fast(settings->arrays.menu_driver, "xmb", 3) || !settings->bools.cheevos_badges_enable) + settings_t *settings = config_get_ptr(); + if (!string_is_equal(settings->arrays.menu_driver, "xmb") || + !settings->bools.cheevos_badges_enable) CORO_RET(); - char badge_filename[16]; - char fullpath[PATH_MAX_LENGTH]; - FILE* file; - cheevo_t *cheevo = cheevos_locals.core.cheevos; - const cheevo_t *end = cheevos_locals.core.cheevos + - cheevos_locals.core.count; + FILE* file; + CHEEVOS_VAR_CHEEVO_CURR = cheevos_locals.core.cheevos; + CHEEVOS_VAR_CHEEVO_END = cheevos_locals.core.cheevos + cheevos_locals.core.count; - for (; cheevo < end ; cheevo++) - { - for (unsigned j = 0; j < 2; j++) + for (; CHEEVOS_VAR_CHEEVO_CURR < CHEEVOS_VAR_CHEEVO_END ; CHEEVOS_VAR_CHEEVO_CURR++) + { + for (CHEEVOS_VAR_J = 0 ; CHEEVOS_VAR_J < 2; CHEEVOS_VAR_J++) { - strcpy(badge_filename, cheevo->badge); - if (j == 0) strcat(badge_filename, ".png"); - else strcat(badge_filename, "_lock.png"); + CHEEVOS_VAR_BADGE_PATH[0] = '\0'; + fill_pathname_application_special(CHEEVOS_VAR_BADGE_BASE_PATH, sizeof(CHEEVOS_VAR_BADGE_BASE_PATH), + APPLICATION_SPECIAL_DIRECTORY_THUMBNAILS_CHEEVOS_BADGES); - fill_pathname_application_special(fullpath, - PATH_MAX_LENGTH * sizeof(char), - APPLICATION_SPECIAL_DIRECTORY_THUMBNAILS_CHEEVOS_BADGES); + if (!path_is_directory(CHEEVOS_VAR_BADGE_BASE_PATH)) + path_mkdir(CHEEVOS_VAR_BADGE_BASE_PATH); + CORO_YIELD(); + if (CHEEVOS_VAR_J == 0) + snprintf(CHEEVOS_VAR_BADGE_NAME, sizeof(CHEEVOS_VAR_BADGE_NAME), "%s.png", CHEEVOS_VAR_CHEEVO_CURR->badge); + else + snprintf(CHEEVOS_VAR_BADGE_NAME, sizeof(CHEEVOS_VAR_BADGE_NAME), "%s_lock.png", CHEEVOS_VAR_CHEEVO_CURR->badge); - if (!path_is_directory(fullpath)) - path_mkdir(fullpath); + fill_pathname_join(CHEEVOS_VAR_BADGE_PATH, CHEEVOS_VAR_BADGE_BASE_PATH, CHEEVOS_VAR_BADGE_NAME, sizeof(CHEEVOS_VAR_BADGE_PATH)); - strcat(fullpath, badge_filename); - - if (!badge_exists(fullpath)) - { - snprintf( - CHEEVOS_VAR_URL, sizeof(CHEEVOS_VAR_URL), - "http://i.retroachievements.org/Badge/%s", - badge_filename - ); - - CORO_GOSUB(HTTP_GET); - - if (CHEEVOS_VAR_K > 5) - { - file = fopen (fullpath, "wb"); - fwrite(CHEEVOS_VAR_JSON, 1, CHEEVOS_VAR_K, file); - fclose(file); - #ifdef CHEEVOS_LOG_BADGES - RARCH_LOG("[CHEEVOS]: downloaded badge %s.\n", badge_filename); - #endif - } - } + if (!badge_exists(CHEEVOS_VAR_BADGE_PATH)) + { + snprintf(CHEEVOS_VAR_URL, sizeof(CHEEVOS_VAR_URL), "http://i.retroachievements.org/Badge/%s", CHEEVOS_VAR_BADGE_NAME); + CORO_GOSUB(HTTP_GET); + if (CHEEVOS_VAR_JSON != NULL) + { + file = fopen (CHEEVOS_VAR_BADGE_PATH, "wb"); + fwrite(CHEEVOS_VAR_JSON, 1, CHEEVOS_VAR_K, file); + fclose(file); +#ifdef CHEEVOS_LOG_BADGES + RARCH_LOG("[CHEEVOS]: downloaded badge %s\n", CHEEVOS_VAR_BADGE_PATH); +#endif + } + } } - } + } CORO_RET(); From ca534ffa56b7be17e2f774d363b0d7e2f028d90a Mon Sep 17 00:00:00 2001 From: orbea Date: Thu, 23 Nov 2017 13:57:32 -0800 Subject: [PATCH 057/183] qb: Rewrite the create_config_header function to use printf instead of echo. --- qb/qb.libs.sh | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/qb/qb.libs.sh b/qb/qb.libs.sh index 24a25ab1e6..4f1274b277 100644 --- a/qb/qb.libs.sh +++ b/qb/qb.libs.sh @@ -186,28 +186,32 @@ check_switch_cxx() #$1 = HAVE_$1 $2 = switch $3 = critical error message [checke create_config_header() { outfile="$1"; shift - echo "Creating config header: $outfile" - name=$(echo "QB_${outfile}__" | tr '.[a-z]' '_[A-Z]') - { echo "#ifndef $name" - echo "#define $name" - echo "" - echo "#define PACKAGE_NAME \"$PACKAGE_NAME\"" + printf %s\\n "Creating config header: $outfile" + name="$(printf %s "QB_${outfile}__" | tr '.[a-z]' '_[A-Z]')" + + { printf %s\\n "#ifndef $name" "#define $name" '' \ + "#define PACKAGE_NAME \"$PACKAGE_NAME\"" while [ "$1" ]; do - case $(eval echo \$HAVE_$1) in + case "$(eval "printf %s \"\$HAVE_$1\"")" in 'yes') - if [ "$(eval echo \$C89_$1)" = "no" ]; then echo "#if __cplusplus || __STDC_VERSION__ >= 199901L"; fi - echo "#define HAVE_$1 1" - if [ "$(eval echo \$C89_$1)" = "no" ]; then echo "#endif"; fi - ;; - 'no') echo "/* #undef HAVE_$1 */";; + if [ "$(eval "printf %s \"\$C89_$1\"")" = 'no' ]; then + printf %s\\n '#if __cplusplus || __STDC_VERSION__ >= 199901L' \ + "#define HAVE_$1 1" '#endif' + else + printf %s\\n "#define HAVE_$1 1" + fi + ;; + 'no') printf %s\\n "/* #undef HAVE_$1 */";; esac shift done - while IFS='=' read VAR VAL; do echo "#define $VAR $VAL"; done < "$CONFIG_DEFINES" + while IFS='=' read -r VAR VAL; do + printf %s\\n "#define $VAR $VAL" + done < "$CONFIG_DEFINES" - echo "#endif" + printf %s\\n '#endif' } > "$outfile" } From a80fc4a762917a90ce767acd3da41067faf111e3 Mon Sep 17 00:00:00 2001 From: radius Date: Thu, 23 Nov 2017 17:33:26 -0500 Subject: [PATCH 058/183] revert this for now --- cheevos/cheevos.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c index 4fe6910247..c37ac68694 100644 --- a/cheevos/cheevos.c +++ b/cheevos/cheevos.c @@ -2796,7 +2796,7 @@ static int cheevos_iterate(coro_t* coro) FILE* file; size_t size; - file = filestream_open(CHEEVOS_JSON_OVERRIDE, RFILE_MODE_READ_WRITE, -1); + file = fopen(CHEEVOS_JSON_OVERRIDE, "rb"); fseek(file, 0, SEEK_END); size = ftell(file); fseek(file, 0, SEEK_SET); From 459b669798c7291e99947d43441482bcdaf72d20 Mon Sep 17 00:00:00 2001 From: radius Date: Thu, 23 Nov 2017 17:47:50 -0500 Subject: [PATCH 059/183] use filestream --- cheevos/cheevos.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c index c37ac68694..8674154611 100644 --- a/cheevos/cheevos.c +++ b/cheevos/cheevos.c @@ -2576,6 +2576,7 @@ static int cheevos_iterate(coro_t* coro) size_t to_read = 4096; uint8_t *buffer = NULL; const char *end = NULL; + RFILE* file; enum { @@ -3191,7 +3192,6 @@ static int cheevos_iterate(coro_t* coro) !settings->bools.cheevos_badges_enable) CORO_RET(); - FILE* file; CHEEVOS_VAR_CHEEVO_CURR = cheevos_locals.core.cheevos; CHEEVOS_VAR_CHEEVO_END = cheevos_locals.core.cheevos + cheevos_locals.core.count; @@ -3220,9 +3220,9 @@ static int cheevos_iterate(coro_t* coro) CORO_GOSUB(HTTP_GET); if (CHEEVOS_VAR_JSON != NULL) { - file = fopen (CHEEVOS_VAR_BADGE_PATH, "wb"); - fwrite(CHEEVOS_VAR_JSON, 1, CHEEVOS_VAR_K, file); - fclose(file); + file = filestream_open(CHEEVOS_VAR_BADGE_PATH, RFILE_MODE_WRITE, -1); + filestream_write(file, CHEEVOS_VAR_JSON, CHEEVOS_VAR_K); + filestream_close(file); #ifdef CHEEVOS_LOG_BADGES RARCH_LOG("[CHEEVOS]: downloaded badge %s\n", CHEEVOS_VAR_BADGE_PATH); #endif From a865720d258c519b0098578009cf054a02d4f15f Mon Sep 17 00:00:00 2001 From: radius Date: Thu, 23 Nov 2017 17:49:55 -0500 Subject: [PATCH 060/183] indentation --- cheevos/cheevos.c | 62 +++++++++++++++++++++++------------------------ 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c index 8674154611..7a1432535f 100644 --- a/cheevos/cheevos.c +++ b/cheevos/cheevos.c @@ -2537,38 +2537,38 @@ typedef struct #include "coro.h" -#define CHEEVOS_VAR_INFO CORO_VAR(info) -#define CHEEVOS_VAR_DATA CORO_VAR(data) -#define CHEEVOS_VAR_LEN CORO_VAR(len) -#define CHEEVOS_VAR_PATH CORO_VAR(path) -#define CHEEVOS_VAR_SETTINGS CORO_VAR(settings) -#define CHEEVOS_VAR_SYSINFO CORO_VAR(sysinfo) -#define CHEEVOS_VAR_I CORO_VAR(i) -#define CHEEVOS_VAR_J CORO_VAR(j) -#define CHEEVOS_VAR_K CORO_VAR(k) -#define CHEEVOS_VAR_EXT CORO_VAR(ext) -#define CHEEVOS_VAR_MD5 CORO_VAR(md5) -#define CHEEVOS_VAR_HASH CORO_VAR(hash) -#define CHEEVOS_VAR_GAMEID CORO_VAR(gameid) -#define CHEEVOS_VAR_JSON CORO_VAR(json) -#define CHEEVOS_VAR_COUNT CORO_VAR(count) -#define CHEEVOS_VAR_OFFSET CORO_VAR(offset) -#define CHEEVOS_VAR_HEADER CORO_VAR(header) -#define CHEEVOS_VAR_ROMSIZE CORO_VAR(romsize) -#define CHEEVOS_VAR_BYTES CORO_VAR(bytes) -#define CHEEVOS_VAR_MAPPER CORO_VAR(mapper) -#define CHEEVOS_VAR_ROUND CORO_VAR(round) -#define CHEEVOS_VAR_STREAM CORO_VAR(stream) -#define CHEEVOS_VAR_SIZE CORO_VAR(size) -#define CHEEVOS_VAR_URL CORO_VAR(url) -#define CHEEVOS_VAR_CONN CORO_VAR(conn) -#define CHEEVOS_VAR_HTTP CORO_VAR(http) -#define CHEEVOS_VAR_T0 CORO_VAR(t0) -#define CHEEVOS_VAR_BADGE_PATH CORO_VAR(badge_fullpath) +#define CHEEVOS_VAR_INFO CORO_VAR(info) +#define CHEEVOS_VAR_DATA CORO_VAR(data) +#define CHEEVOS_VAR_LEN CORO_VAR(len) +#define CHEEVOS_VAR_PATH CORO_VAR(path) +#define CHEEVOS_VAR_SETTINGS CORO_VAR(settings) +#define CHEEVOS_VAR_SYSINFO CORO_VAR(sysinfo) +#define CHEEVOS_VAR_I CORO_VAR(i) +#define CHEEVOS_VAR_J CORO_VAR(j) +#define CHEEVOS_VAR_K CORO_VAR(k) +#define CHEEVOS_VAR_EXT CORO_VAR(ext) +#define CHEEVOS_VAR_MD5 CORO_VAR(md5) +#define CHEEVOS_VAR_HASH CORO_VAR(hash) +#define CHEEVOS_VAR_GAMEID CORO_VAR(gameid) +#define CHEEVOS_VAR_JSON CORO_VAR(json) +#define CHEEVOS_VAR_COUNT CORO_VAR(count) +#define CHEEVOS_VAR_OFFSET CORO_VAR(offset) +#define CHEEVOS_VAR_HEADER CORO_VAR(header) +#define CHEEVOS_VAR_ROMSIZE CORO_VAR(romsize) +#define CHEEVOS_VAR_BYTES CORO_VAR(bytes) +#define CHEEVOS_VAR_MAPPER CORO_VAR(mapper) +#define CHEEVOS_VAR_ROUND CORO_VAR(round) +#define CHEEVOS_VAR_STREAM CORO_VAR(stream) +#define CHEEVOS_VAR_SIZE CORO_VAR(size) +#define CHEEVOS_VAR_URL CORO_VAR(url) +#define CHEEVOS_VAR_CONN CORO_VAR(conn) +#define CHEEVOS_VAR_HTTP CORO_VAR(http) +#define CHEEVOS_VAR_T0 CORO_VAR(t0) +#define CHEEVOS_VAR_BADGE_PATH CORO_VAR(badge_fullpath) #define CHEEVOS_VAR_BADGE_BASE_PATH CORO_VAR(badge_fullpath) -#define CHEEVOS_VAR_BADGE_NAME CORO_VAR(badge_name) -#define CHEEVOS_VAR_CHEEVO_CURR CORO_VAR(cheevo) -#define CHEEVOS_VAR_CHEEVO_END CORO_VAR(cheevo_end) +#define CHEEVOS_VAR_BADGE_NAME CORO_VAR(badge_name) +#define CHEEVOS_VAR_CHEEVO_CURR CORO_VAR(cheevo) +#define CHEEVOS_VAR_CHEEVO_END CORO_VAR(cheevo_end) static int cheevos_iterate(coro_t* coro) { From faef304755cd564e2c67816099b31e738696007f Mon Sep 17 00:00:00 2001 From: radius Date: Thu, 23 Nov 2017 17:53:28 -0500 Subject: [PATCH 061/183] use filestream_write_file instead --- cheevos/cheevos.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c index 7a1432535f..76dca89de7 100644 --- a/cheevos/cheevos.c +++ b/cheevos/cheevos.c @@ -2576,7 +2576,6 @@ static int cheevos_iterate(coro_t* coro) size_t to_read = 4096; uint8_t *buffer = NULL; const char *end = NULL; - RFILE* file; enum { @@ -3220,9 +3219,8 @@ static int cheevos_iterate(coro_t* coro) CORO_GOSUB(HTTP_GET); if (CHEEVOS_VAR_JSON != NULL) { - file = filestream_open(CHEEVOS_VAR_BADGE_PATH, RFILE_MODE_WRITE, -1); - filestream_write(file, CHEEVOS_VAR_JSON, CHEEVOS_VAR_K); - filestream_close(file); + if (filestream_write_file(CHEEVOS_VAR_BADGE_PATH, CHEEVOS_VAR_JSON, CHEEVOS_VAR_K)) + RARCH_ERR("[CHEEVOS]: error writing badge %s\n", CHEEVOS_VAR_BADGE_PATH); #ifdef CHEEVOS_LOG_BADGES RARCH_LOG("[CHEEVOS]: downloaded badge %s\n", CHEEVOS_VAR_BADGE_PATH); #endif From 2fb0cb79ecfef26624c4ed812f84d5ca1267fc00 Mon Sep 17 00:00:00 2001 From: orbea Date: Thu, 23 Nov 2017 14:48:02 -0800 Subject: [PATCH 062/183] qb: Turn $MAKEFILE_DEFINES from a temporary file into a variable. --- .gitignore | 1 - qb/qb.libs.sh | 17 +++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index 1a100e9fea..9052ed2ea4 100644 --- a/.gitignore +++ b/.gitignore @@ -95,7 +95,6 @@ pkg/apple/iOS/modules/ obj-unix/ .vagrant/ -.MAKEFILE_DEFINES .CONFIG_DEFINES /pkg/msvc/Release Cg/*.exe /pkg/msvc/Release Cg/*.iobj diff --git a/qb/qb.libs.sh b/qb/qb.libs.sh index 24a25ab1e6..761fd1f4ee 100644 --- a/qb/qb.libs.sh +++ b/qb/qb.libs.sh @@ -1,7 +1,7 @@ -MAKEFILE_DEFINES='.MAKEFILE_DEFINES' +MAKEFILE_DEFINES='' CONFIG_DEFINES='.CONFIG_DEFINES' -cat /dev/null > "$MAKEFILE_DEFINES" > "$CONFIG_DEFINES" -#cat /dev/null > "${MAKEFILE_DEFINES:=.MAKEFILE_DEFINES}" > "${CONFIG_DEFINES=.CONFIG_DEFINES}" +cat /dev/null > "$CONFIG_DEFINES" +#cat /dev/null > "${CONFIG_DEFINES=.CONFIG_DEFINES}" [ "$PREFIX" ] || PREFIX="/usr/local" @@ -9,7 +9,7 @@ add_define_header() { echo "$1=$2" >> "$CONFIG_DEFINES";} add_define_make() -{ echo "$1=$2" >> "$MAKEFILE_DEFINES";} +{ MAKEFILE_DEFINES="${MAKEFILE_DEFINES} $1=$2"; } add_include_dirs() { while [ "$1" ]; do INCLUDE_DIRS="$INCLUDE_DIRS -I$1"; shift; done @@ -251,13 +251,14 @@ create_config_make() esac shift done - while IFS='=' read -r VAR VAL; do - printf %s\\n "$VAR = $VAL" - done < "$MAKEFILE_DEFINES" + eval "set -- $MAKEFILE_DEFINES" + for VAR do + printf %s\\n "${VAR%%=*} = ${VAR#*=}" + done } > "$outfile" } . qb/config.libs.sh -rm -f -- "$MAKEFILE_DEFINES" "$CONFIG_DEFINES" +rm -f -- "$CONFIG_DEFINES" From b0e383d5f099f6809923f576dd0057b9692a2c1f Mon Sep 17 00:00:00 2001 From: David Walters Date: Thu, 23 Nov 2017 23:04:09 +0000 Subject: [PATCH 063/183] Extend input bind limit to 128 --- input/input_driver.c | 42 ++++++++++++++-------------------- input/input_driver.h | 18 +++++++++++++-- menu/menu_event.c | 54 ++++++++++++++++++++++---------------------- menu/menu_event.h | 2 +- retroarch.c | 54 ++++++++++++++++++++++++-------------------- retroarch.h | 2 +- 6 files changed, 92 insertions(+), 80 deletions(-) diff --git a/input/input_driver.c b/input/input_driver.c index a4af4525cb..42815ca326 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -778,17 +778,13 @@ void state_tracker_update_input(uint16_t *input1, uint16_t *input2) * Grab an input sample for this frame. We exclude * keyboard input here. * - * TODO: In case RARCH_BIND_LIST_END starts exceeding 64, - * and you need a bitmask of more than 64 entries, reimplement - * it to use something like rarch_bits_t. - * * Returns: Input sample containing a mask of all pressed keys. */ -uint64_t input_menu_keys_pressed(void *data, uint64_t last_input) +rarch_input_state_t input_menu_keys_pressed(void *data, rarch_input_state_t last_input) { unsigned i, port; rarch_joypad_info_t joypad_info; - uint64_t ret = 0; + rarch_input_state_t new_state = {0}; const struct retro_keybind *binds[MAX_USERS] = {NULL}; settings_t *settings = (settings_t*)data; const struct retro_keybind *binds_norm = NULL; @@ -898,7 +894,7 @@ uint64_t input_menu_keys_pressed(void *data, uint64_t last_input) if (pressed) { - BIT64_SET(ret, i); + RARCH_INPUT_STATE_BIT_SET(new_state, i); continue; } } @@ -908,7 +904,7 @@ uint64_t input_menu_keys_pressed(void *data, uint64_t last_input) { if (current_input->meta_key_pressed(current_input_data, i)) { - BIT64_SET(ret, i); + RARCH_INPUT_STATE_BIT_SET(new_state, i); continue; } } @@ -916,7 +912,7 @@ uint64_t input_menu_keys_pressed(void *data, uint64_t last_input) #ifdef HAVE_OVERLAY if (overlay_ptr && input_overlay_key_pressed(overlay_ptr, i)) { - BIT64_SET(ret, i); + RARCH_INPUT_STATE_BIT_SET(new_state, i); continue; } #endif @@ -931,7 +927,7 @@ uint64_t input_menu_keys_pressed(void *data, uint64_t last_input) if (command_get(&handle)) { - BIT64_SET(ret, i); + RARCH_INPUT_STATE_BIT_SET(new_state, i); continue; } } @@ -940,7 +936,7 @@ uint64_t input_menu_keys_pressed(void *data, uint64_t last_input) #ifdef HAVE_NETWORKGAMEPAD if (input_driver_remote && input_remote_key_pressed(i, 0)) { - BIT64_SET(ret, i); + RARCH_INPUT_STATE_BIT_SET(new_state, i); continue; } #endif @@ -995,11 +991,11 @@ uint64_t input_menu_keys_pressed(void *data, uint64_t last_input) { if (current_input->input_state(current_input_data, joypad_info, binds, 0, RETRO_DEVICE_KEYBOARD, 0, ids[i][0])) - BIT64_SET(ret, ids[i][1]); + RARCH_INPUT_STATE_BIT_SET(new_state, ids[i][1]); } } - return ret; + return new_state; } #endif @@ -1008,17 +1004,13 @@ uint64_t input_menu_keys_pressed(void *data, uint64_t last_input) * * Grab an input sample for this frame. * - * TODO: In case RARCH_BIND_LIST_END starts exceeding 64, - * and you need a bitmask of more than 64 entries, reimplement - * it to use something like rarch_bits_t. - * * Returns: Input sample containing a mask of all pressed keys. */ -uint64_t input_keys_pressed(void *data, uint64_t last_input) +rarch_input_state_t input_keys_pressed(void *data, rarch_input_state_t last_input) { unsigned i; rarch_joypad_info_t joypad_info; - uint64_t ret = 0; + rarch_input_state_t new_state = {0}; settings_t *settings = (settings_t*)data; const struct retro_keybind *binds = input_config_binds[0]; const struct retro_keybind *binds_auto = &input_autoconf_binds[0][RARCH_ENABLE_HOTKEY]; @@ -1073,7 +1065,7 @@ uint64_t input_keys_pressed(void *data, uint64_t last_input) 0, RETRO_DEVICE_JOYPAD, 0, i) ) { - BIT64_SET(ret, i); + RARCH_INPUT_STATE_BIT_SET(new_state, i); continue; } @@ -1081,7 +1073,7 @@ uint64_t input_keys_pressed(void *data, uint64_t last_input) current_input->meta_key_pressed(current_input_data, i) ) { - BIT64_SET(ret, i); + RARCH_INPUT_STATE_BIT_SET(new_state, i); continue; } @@ -1089,7 +1081,7 @@ uint64_t input_keys_pressed(void *data, uint64_t last_input) if (overlay_ptr && input_overlay_key_pressed(overlay_ptr, i)) { - BIT64_SET(ret, i); + RARCH_INPUT_STATE_BIT_SET(new_state, i); continue; } #endif @@ -1104,7 +1096,7 @@ uint64_t input_keys_pressed(void *data, uint64_t last_input) if (command_get(&handle)) { - BIT64_SET(ret, i); + RARCH_INPUT_STATE_BIT_SET(new_state, i); continue; } } @@ -1114,13 +1106,13 @@ uint64_t input_keys_pressed(void *data, uint64_t last_input) if (input_driver_remote && input_remote_key_pressed(i, 0)) { - BIT64_SET(ret, i); + RARCH_INPUT_STATE_BIT_SET(new_state, i); continue; } #endif } - return ret; + return new_state; } diff --git a/input/input_driver.h b/input/input_driver.h index 3267efeacd..3eb2aac36a 100644 --- a/input/input_driver.h +++ b/input/input_driver.h @@ -333,10 +333,24 @@ void input_poll(void); int16_t input_state(unsigned port, unsigned device, unsigned idx, unsigned id); -uint64_t input_keys_pressed(void *data, uint64_t last_input); +typedef struct { + uint32_t bank[ 4 ]; // 128 bits +} rarch_input_state_t; + +#define RARCH_INPUT_STATE_BIT_SET(a, bit) ((a).bank[((bit) >> 5)&3] |= (1 << ((bit) & 31))) +#define RARCH_INPUT_STATE_BIT_GET(a, bit) ((a).bank[((bit) >> 5)&3] & (1 << ((bit) & 31))) +#define RARCH_INPUT_STATE_CLEAR(a) memset(&(a), 0, sizeof(a)); +#define RARCH_INPUT_STATE_ANY_SET(a) (((a).bank[0])||((a).bank[1])||((a).bank[2])||((a).bank[3])) +#define RARCH_INPUT_STATE_CLEAR_BITS(a,b) \ + ((a).bank[0])&=(~((b).bank[0])); \ + ((a).bank[1])&=(~((b).bank[1])); \ + ((a).bank[2])&=(~((b).bank[2])); \ + ((a).bank[3])&=(~((b).bank[3])); + +rarch_input_state_t input_keys_pressed(void *data, rarch_input_state_t last_input); #ifdef HAVE_MENU -uint64_t input_menu_keys_pressed(void *data, uint64_t last_input); +rarch_input_state_t input_menu_keys_pressed(void *data, rarch_input_state_t last_input); #endif void *input_driver_get_data(void); diff --git a/menu/menu_event.c b/menu/menu_event.c index 8c5b321bd5..eea6d23866 100644 --- a/menu/menu_event.c +++ b/menu/menu_event.c @@ -137,7 +137,7 @@ void menu_event_kb_set(bool down, enum retro_key key) * entire button state either but do a separate event per button * state. */ -unsigned menu_event(uint64_t input, uint64_t trigger_input) +unsigned menu_event(rarch_input_state_t input, rarch_input_state_t trigger_input) { menu_animation_ctx_delta_t delta; float delta_time; @@ -160,12 +160,12 @@ unsigned menu_event(uint64_t input, uint64_t trigger_input) unsigned menu_cancel_btn = (!input_swap_override && settings->bools.input_menu_swap_ok_cancel_buttons) ? RETRO_DEVICE_ID_JOYPAD_A : RETRO_DEVICE_ID_JOYPAD_B; - unsigned ok_current = (unsigned)(input & UINT64_C(1) << menu_ok_btn); + unsigned ok_current = RARCH_INPUT_STATE_BIT_GET( input, menu_ok_btn ); unsigned ok_trigger = ok_current & ~ok_old; ok_old = ok_current; - if (input) + if (RARCH_INPUT_STATE_ANY_SET(input)) { if (!first_held) { @@ -179,7 +179,7 @@ unsigned menu_event(uint64_t input, uint64_t trigger_input) if (delay_count >= delay_timer) { - uint64_t input_repeat = 0; + uint32_t input_repeat = 0; BIT32_SET(input_repeat, RETRO_DEVICE_ID_JOYPAD_UP); BIT32_SET(input_repeat, RETRO_DEVICE_ID_JOYPAD_DOWN); BIT32_SET(input_repeat, RETRO_DEVICE_ID_JOYPAD_LEFT); @@ -189,7 +189,7 @@ unsigned menu_event(uint64_t input, uint64_t trigger_input) set_scroll = true; first_held = false; - trigger_input |= input & input_repeat; + trigger_input.bank[0] |= input.bank[0] & input_repeat; menu_driver_ctl(MENU_NAVIGATION_CTL_GET_SCROLL_ACCEL, &new_scroll_accel); @@ -221,31 +221,31 @@ unsigned menu_event(uint64_t input, uint64_t trigger_input) { menu_event_osk_iterate(); - if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_DOWN)) + if (RARCH_INPUT_STATE_BIT_GET(trigger_input, RETRO_DEVICE_ID_JOYPAD_DOWN)) { if (menu_event_get_osk_ptr() < 33) menu_event_set_osk_ptr(menu_event_get_osk_ptr() + OSK_CHARS_PER_LINE); } - if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_UP)) + if (RARCH_INPUT_STATE_BIT_GET(trigger_input, RETRO_DEVICE_ID_JOYPAD_UP)) { if (menu_event_get_osk_ptr() >= OSK_CHARS_PER_LINE) menu_event_set_osk_ptr(menu_event_get_osk_ptr() - OSK_CHARS_PER_LINE); } - if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_RIGHT)) + if (RARCH_INPUT_STATE_BIT_GET(trigger_input, RETRO_DEVICE_ID_JOYPAD_RIGHT)) { if (menu_event_get_osk_ptr() < 43) menu_event_set_osk_ptr(menu_event_get_osk_ptr() + 1); } - if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_LEFT)) + if (RARCH_INPUT_STATE_BIT_GET(trigger_input, RETRO_DEVICE_ID_JOYPAD_LEFT)) { if (menu_event_get_osk_ptr() >= 1) menu_event_set_osk_ptr(menu_event_get_osk_ptr() - 1); } - if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_L)) + if (RARCH_INPUT_STATE_BIT_GET(trigger_input, RETRO_DEVICE_ID_JOYPAD_L)) { if (menu_event_get_osk_idx() > OSK_TYPE_UNKNOWN + 1) menu_event_set_osk_idx((enum osk_type)(menu_event_get_osk_idx() - 1)); @@ -253,7 +253,7 @@ unsigned menu_event(uint64_t input, uint64_t trigger_input) menu_event_set_osk_idx((enum osk_type)(OSK_TYPE_LAST - 1)); } - if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_R)) + if (RARCH_INPUT_STATE_BIT_GET(trigger_input, RETRO_DEVICE_ID_JOYPAD_R)) { if (menu_event_get_osk_idx() < OSK_TYPE_LAST - 1) menu_event_set_osk_idx((enum osk_type)(menu_event_get_osk_idx() + 1)); @@ -261,50 +261,50 @@ unsigned menu_event(uint64_t input, uint64_t trigger_input) menu_event_set_osk_idx((enum osk_type)(OSK_TYPE_UNKNOWN + 1)); } - if (trigger_input & (UINT64_C(1) << menu_ok_btn)) + if (RARCH_INPUT_STATE_BIT_GET(trigger_input, menu_ok_btn)) { if (menu_event_get_osk_ptr() >= 0) menu_event_osk_append(menu_event_get_osk_ptr()); } - if (trigger_input & (UINT64_C(1) << menu_cancel_btn)) + if (RARCH_INPUT_STATE_BIT_GET(trigger_input, menu_cancel_btn)) { input_keyboard_event(true, '\x7f', '\x7f', 0, RETRO_DEVICE_KEYBOARD); } /* send return key to close keyboard input window */ - if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_START)) + if (RARCH_INPUT_STATE_BIT_GET(trigger_input, RETRO_DEVICE_ID_JOYPAD_START)) input_keyboard_event(true, '\n', '\n', 0, RETRO_DEVICE_KEYBOARD); - trigger_input = 0; + RARCH_INPUT_STATE_CLEAR(trigger_input); } else { - if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_UP)) + if (RARCH_INPUT_STATE_BIT_GET(trigger_input, RETRO_DEVICE_ID_JOYPAD_UP)) ret = MENU_ACTION_UP; - else if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_DOWN)) + else if (RARCH_INPUT_STATE_BIT_GET(trigger_input, RETRO_DEVICE_ID_JOYPAD_DOWN)) ret = MENU_ACTION_DOWN; - else if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_LEFT)) + else if (RARCH_INPUT_STATE_BIT_GET(trigger_input, RETRO_DEVICE_ID_JOYPAD_LEFT)) ret = MENU_ACTION_LEFT; - else if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_RIGHT)) + else if (RARCH_INPUT_STATE_BIT_GET(trigger_input, RETRO_DEVICE_ID_JOYPAD_RIGHT)) ret = MENU_ACTION_RIGHT; - else if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_L)) + else if (RARCH_INPUT_STATE_BIT_GET(trigger_input, RETRO_DEVICE_ID_JOYPAD_L)) ret = MENU_ACTION_SCROLL_UP; - else if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_R)) + else if (RARCH_INPUT_STATE_BIT_GET(trigger_input, RETRO_DEVICE_ID_JOYPAD_R)) ret = MENU_ACTION_SCROLL_DOWN; else if (ok_trigger) ret = MENU_ACTION_OK; - else if (trigger_input & (UINT64_C(1) << menu_cancel_btn)) + else if (RARCH_INPUT_STATE_BIT_GET(trigger_input, menu_cancel_btn)) ret = MENU_ACTION_CANCEL; - else if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_X)) + else if (RARCH_INPUT_STATE_BIT_GET(trigger_input, RETRO_DEVICE_ID_JOYPAD_X)) ret = MENU_ACTION_SEARCH; - else if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_Y)) + else if (RARCH_INPUT_STATE_BIT_GET(trigger_input, RETRO_DEVICE_ID_JOYPAD_Y)) ret = MENU_ACTION_SCAN; - else if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_START)) + else if (RARCH_INPUT_STATE_BIT_GET(trigger_input, RETRO_DEVICE_ID_JOYPAD_START)) ret = MENU_ACTION_START; - else if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_SELECT)) + else if (RARCH_INPUT_STATE_BIT_GET(trigger_input, RETRO_DEVICE_ID_JOYPAD_SELECT)) ret = MENU_ACTION_INFO; - else if (trigger_input & (UINT64_C(1) << RARCH_MENU_TOGGLE)) + else if (RARCH_INPUT_STATE_BIT_GET(trigger_input, RARCH_MENU_TOGGLE)) ret = MENU_ACTION_TOGGLE; } diff --git a/menu/menu_event.h b/menu/menu_event.h index 61e9f4b0e3..4d9535d16b 100644 --- a/menu/menu_event.h +++ b/menu/menu_event.h @@ -44,7 +44,7 @@ RETRO_BEGIN_DECLS * entire button state either but do a separate event per button * state. */ -unsigned menu_event(uint64_t input, uint64_t trigger_state); +unsigned menu_event(rarch_input_state_t input, rarch_input_state_t trigger_state); /* Set a specific keyboard key. * diff --git a/retroarch.c b/retroarch.c index 74fdac1479..3565f87b7a 100644 --- a/retroarch.c +++ b/retroarch.c @@ -2310,40 +2310,40 @@ bool runloop_msg_queue_pull(const char **ret) #ifdef HAVE_MENU static bool input_driver_toggle_button_combo( - unsigned mode, uint64_t input) + unsigned mode, rarch_input_state_t input) { switch (mode) { case INPUT_TOGGLE_DOWN_Y_L_R: - if (!BIT64_GET(input, RETRO_DEVICE_ID_JOYPAD_DOWN)) + if (!RARCH_INPUT_STATE_BIT_GET(input, RETRO_DEVICE_ID_JOYPAD_DOWN)) return false; - if (!BIT64_GET(input, RETRO_DEVICE_ID_JOYPAD_Y)) + if (!RARCH_INPUT_STATE_BIT_GET(input, RETRO_DEVICE_ID_JOYPAD_Y)) return false; - if (!BIT64_GET(input, RETRO_DEVICE_ID_JOYPAD_L)) + if (!RARCH_INPUT_STATE_BIT_GET(input, RETRO_DEVICE_ID_JOYPAD_L)) return false; - if (!BIT64_GET(input, RETRO_DEVICE_ID_JOYPAD_R)) + if (!RARCH_INPUT_STATE_BIT_GET(input, RETRO_DEVICE_ID_JOYPAD_R)) return false; break; case INPUT_TOGGLE_L3_R3: - if (!BIT64_GET(input, RETRO_DEVICE_ID_JOYPAD_L3)) + if (!RARCH_INPUT_STATE_BIT_GET(input, RETRO_DEVICE_ID_JOYPAD_L3)) return false; - if (!BIT64_GET(input, RETRO_DEVICE_ID_JOYPAD_R3)) + if (!RARCH_INPUT_STATE_BIT_GET(input, RETRO_DEVICE_ID_JOYPAD_R3)) return false; break; case INPUT_TOGGLE_L1_R1_START_SELECT: - if (!BIT64_GET(input, RETRO_DEVICE_ID_JOYPAD_START)) + if (!RARCH_INPUT_STATE_BIT_GET(input, RETRO_DEVICE_ID_JOYPAD_START)) return false; - if (!BIT64_GET(input, RETRO_DEVICE_ID_JOYPAD_SELECT)) + if (!RARCH_INPUT_STATE_BIT_GET(input, RETRO_DEVICE_ID_JOYPAD_SELECT)) return false; - if (!BIT64_GET(input, RETRO_DEVICE_ID_JOYPAD_L)) + if (!RARCH_INPUT_STATE_BIT_GET(input, RETRO_DEVICE_ID_JOYPAD_L)) return false; - if (!BIT64_GET(input, RETRO_DEVICE_ID_JOYPAD_R)) + if (!RARCH_INPUT_STATE_BIT_GET(input, RETRO_DEVICE_ID_JOYPAD_R)) return false; break; case INPUT_TOGGLE_START_SELECT: - if (!BIT64_GET(input, RETRO_DEVICE_ID_JOYPAD_START)) + if (!RARCH_INPUT_STATE_BIT_GET(input, RETRO_DEVICE_ID_JOYPAD_START)) return false; - if (!BIT64_GET(input, RETRO_DEVICE_ID_JOYPAD_SELECT)) + if (!RARCH_INPUT_STATE_BIT_GET(input, RETRO_DEVICE_ID_JOYPAD_SELECT)) return false; break; default: @@ -2360,7 +2360,7 @@ static enum runloop_state runloop_check_state( bool input_nonblock_state, unsigned *sleep_ms) { - static uint64_t last_input = 0; + static rarch_input_state_t last_input = {0}; static bool old_fs_toggle_pressed= false; static bool old_focus = true; bool is_focused = false; @@ -2372,7 +2372,7 @@ static enum runloop_state runloop_check_state( #ifdef HAVE_MENU bool menu_driver_binding_state = menu_driver_is_binding_state(); bool menu_is_alive = menu_driver_is_alive(); - uint64_t current_input = + rarch_input_state_t current_input = menu_is_alive && !(settings->bools.menu_unified_controls && !menu_input_dialog_get_display_kb())? input_menu_keys_pressed(settings, last_input) : input_keys_pressed(settings, last_input); @@ -2388,18 +2388,18 @@ static enum runloop_state runloop_check_state( input_driver_toggle_button_combo( settings->uints.input_menu_toggle_gamepad_combo, last_input))) { - BIT64_SET(current_input, RARCH_MENU_TOGGLE); + RARCH_INPUT_STATE_BIT_SET(current_input, RARCH_MENU_TOGGLE); } #endif if (input_driver_flushing_input) { input_driver_flushing_input = false; - if (current_input) + if (RARCH_INPUT_STATE_ANY_SET(current_input)) { - current_input = 0; + RARCH_INPUT_STATE_CLEAR( current_input ); if (runloop_paused) - BIT64_SET(current_input, RARCH_PAUSE_TOGGLE); + RARCH_INPUT_STATE_BIT_SET(current_input, RARCH_PAUSE_TOGGLE); input_driver_flushing_input = true; } } @@ -2408,7 +2408,7 @@ static enum runloop_state runloop_check_state( #ifdef HAVE_MENU if (menu_driver_binding_state) - current_input = 0; + RARCH_INPUT_STATE_CLEAR( current_input ); #endif #ifdef HAVE_OVERLAY @@ -2529,15 +2529,21 @@ static enum runloop_state runloop_check_state( #ifdef HAVE_MENU if (menu_is_alive) { - static uint64_t old_input = 0; + static rarch_input_state_t old_input = {0}; menu_ctx_iterate_t iter; retro_ctx.poll_cb(); { - uint64_t trigger_input = current_input & ~old_input; - enum menu_action action = (enum menu_action)menu_event(current_input, trigger_input); - bool focused = pause_nonactive ? is_focused : true; + rarch_input_state_t trigger_input; + enum menu_action action; + bool focused; + + trigger_input = current_input; + RARCH_INPUT_STATE_CLEAR_BITS( trigger_input, old_input ); + + action = (enum menu_action)menu_event(current_input, trigger_input); + focused = pause_nonactive ? is_focused : true; focused = focused && !ui_companion_is_on_foreground(); diff --git a/retroarch.h b/retroarch.h index a0e813c571..3cd1b742d3 100644 --- a/retroarch.h +++ b/retroarch.h @@ -27,7 +27,7 @@ #include "core_type.h" #include "core.h" -#define runloop_cmd_press(current_input, id) (BIT64_GET(current_input, id)) +#define runloop_cmd_press(current_input, id) (RARCH_INPUT_STATE_BIT_GET(current_input, id)) RETRO_BEGIN_DECLS From 556eba5e58876ac28ccf25851a923b45f292115c Mon Sep 17 00:00:00 2001 From: radius Date: Thu, 23 Nov 2017 18:26:46 -0500 Subject: [PATCH 064/183] update CHANGES.md --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index c825908cf1..17bb6ec41b 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,4 +1,5 @@ # 1.7.0 (future) +- CHEEVOS: Add badges # 1.6.9 - COMMON: Small memory leak. From f6419797698a7a65e6c9b9d4907a6e014dc66096 Mon Sep 17 00:00:00 2001 From: radius Date: Thu, 23 Nov 2017 19:37:47 -0500 Subject: [PATCH 065/183] add badges.c to griffin --- griffin/griffin.c | 1 + 1 file changed, 1 insertion(+) diff --git a/griffin/griffin.c b/griffin/griffin.c index 9b4a08f305..b65934f365 100644 --- a/griffin/griffin.c +++ b/griffin/griffin.c @@ -151,6 +151,7 @@ ACHIEVEMENTS #include "../libretro-common/formats/json/jsonsax.c" #include "../network/net_http_special.c" #include "../cheevos/cheevos.c" +#include "../cheevos/badges.c" #include "../cheevos/var.c" #include "../cheevos/cond.c" #endif From 64f927292fa750f0141f6a457e986877bef97a0a Mon Sep 17 00:00:00 2001 From: radius Date: Thu, 23 Nov 2017 20:35:54 -0500 Subject: [PATCH 066/183] use a single list for achievements --- cheevos/cheevos.c | 165 ++++++++++++++++++------------ cheevos/cheevos.h | 2 +- intl/msg_hash_lbl.h | 2 + intl/msg_hash_us.h | 4 + menu/cbs/menu_cbs_deferred_push.c | 11 -- menu/cbs/menu_cbs_get_value.c | 19 ++++ menu/cbs/menu_cbs_sublabel.c | 1 + menu/cbs/menu_cbs_title.c | 4 - menu/menu_displaylist.c | 15 +-- menu/menu_displaylist.h | 3 +- msg_hash.h | 2 +- 11 files changed, 130 insertions(+), 98 deletions(-) diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c index 575ac7d0b1..79f2562b42 100644 --- a/cheevos/cheevos.c +++ b/cheevos/cheevos.c @@ -2138,7 +2138,7 @@ void cheevos_reset_game(void) cheevo->last = 1; } -void cheevos_populate_menu(void *data, bool hardcore) +void cheevos_populate_menu(void *data) { #ifdef HAVE_MENU unsigned i; @@ -2151,39 +2151,30 @@ void cheevos_populate_menu(void *data, bool hardcore) for (i = 0; cheevo < end; i++, cheevo++) { - if (!hardcore) + + if (!(cheevo->active & CHEEVOS_ACTIVE_HARDCORE)) { - if (!(cheevo->active & CHEEVOS_ACTIVE_SOFTCORE)) - { - menu_entries_append_enum(info->list, cheevo->title, - cheevo->description, MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); - items_found++; - } - else - { - menu_entries_append_enum(info->list, cheevo->title, - cheevo->description, MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); - items_found++; - } + menu_entries_append_enum(info->list, cheevo->title, + cheevo->description, MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY_HARDCORE, + MENU_SETTINGS_CHEEVOS_START + i, 0, 0); + items_found++; + set_badge_info(&badges_ctx, i, cheevo->badge, (cheevo->active & CHEEVOS_ACTIVE_HARDCORE)); + } + else if (!(cheevo->active & CHEEVOS_ACTIVE_SOFTCORE)) + { + menu_entries_append_enum(info->list, cheevo->title, + cheevo->description, MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY, + MENU_SETTINGS_CHEEVOS_START + i, 0, 0); + items_found++; + set_badge_info(&badges_ctx, i, cheevo->badge, (cheevo->active & CHEEVOS_ACTIVE_SOFTCORE)); } else { - if (!(cheevo->active & CHEEVOS_ACTIVE_HARDCORE)) - { - menu_entries_append_enum(info->list, cheevo->title, - cheevo->description, MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); - items_found++; - } - else - { - menu_entries_append_enum(info->list, cheevo->title, - cheevo->description, MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); - items_found++; - } + menu_entries_append_enum(info->list, cheevo->title, + cheevo->description, MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY, + MENU_SETTINGS_CHEEVOS_START + i, 0, 0); + items_found++; + set_badge_info(&badges_ctx, i, cheevo->badge, (cheevo->active & CHEEVOS_ACTIVE_SOFTCORE)); } } @@ -2193,42 +2184,29 @@ void cheevos_populate_menu(void *data, bool hardcore) end = cheevos_locals.unofficial.cheevos + cheevos_locals.unofficial.count; - for (i = cheevos_locals.core.count; cheevo < end; i++, cheevo++) + if (!(cheevo->active & CHEEVOS_ACTIVE_HARDCORE)) { - if (!hardcore) - { - if (!(cheevo->active & CHEEVOS_ACTIVE_SOFTCORE)) - { - menu_entries_append_enum(info->list, cheevo->title, - cheevo->description, MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); - items_found++; - } - else - { - menu_entries_append_enum(info->list, cheevo->title, - cheevo->description, MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); - items_found++; - } - } - else - { - if (!(cheevo->active & CHEEVOS_ACTIVE_HARDCORE)) - { - menu_entries_append_enum(info->list, cheevo->title, - cheevo->description, MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); - items_found++; - } - else - { - menu_entries_append_enum(info->list, cheevo->title, - cheevo->description, MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); - items_found++; - } - } + menu_entries_append_enum(info->list, cheevo->title, + cheevo->description, MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY_HARDCORE, + MENU_SETTINGS_CHEEVOS_START + i, 0, 0); + items_found++; + set_badge_info(&badges_ctx, i, cheevo->badge, (cheevo->active & CHEEVOS_ACTIVE_HARDCORE)); + } + else if (!(cheevo->active & CHEEVOS_ACTIVE_SOFTCORE)) + { + menu_entries_append_enum(info->list, cheevo->title, + cheevo->description, MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY, + MENU_SETTINGS_CHEEVOS_START + i, 0, 0); + items_found++; + set_badge_info(&badges_ctx, i, cheevo->badge, (cheevo->active & CHEEVOS_ACTIVE_SOFTCORE)); + } + else + { + menu_entries_append_enum(info->list, cheevo->title, + cheevo->description, MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY, + MENU_SETTINGS_CHEEVOS_START + i, 0, 0); + items_found++; + set_badge_info(&badges_ctx, i, cheevo->badge, (cheevo->active & CHEEVOS_ACTIVE_SOFTCORE)); } } @@ -3157,6 +3135,63 @@ static int cheevos_iterate(coro_t* coro) CORO_RET(); /************************************************************************** +<<<<<<< Updated upstream +======= + * Info Gets the achievements from Retro Achievements + * Inputs CHEEVOS_VAR_GAMEID + * Outputs CHEEVOS_VAR_JSON + *************************************************************************/ + CORO_SUB(GET_BADGES) + + badges_ctx = new_badges_ctx; + + settings_t *settings = config_get_ptr(); + if (!string_is_equal(settings->arrays.menu_driver, "xmb") || + !settings->bools.cheevos_badges_enable) + CORO_RET(); + + CHEEVOS_VAR_CHEEVO_CURR = cheevos_locals.core.cheevos; + CHEEVOS_VAR_CHEEVO_END = cheevos_locals.core.cheevos + cheevos_locals.core.count; + + for (; CHEEVOS_VAR_CHEEVO_CURR < CHEEVOS_VAR_CHEEVO_END ; CHEEVOS_VAR_CHEEVO_CURR++) + { + for (CHEEVOS_VAR_J = 0 ; CHEEVOS_VAR_J < 2; CHEEVOS_VAR_J++) + { + CHEEVOS_VAR_BADGE_PATH[0] = '\0'; + fill_pathname_application_special(CHEEVOS_VAR_BADGE_BASE_PATH, sizeof(CHEEVOS_VAR_BADGE_BASE_PATH), + APPLICATION_SPECIAL_DIRECTORY_THUMBNAILS_CHEEVOS_BADGES); + + if (!path_is_directory(CHEEVOS_VAR_BADGE_BASE_PATH)) + path_mkdir(CHEEVOS_VAR_BADGE_BASE_PATH); + CORO_YIELD(); + if (CHEEVOS_VAR_J == 0) + snprintf(CHEEVOS_VAR_BADGE_NAME, sizeof(CHEEVOS_VAR_BADGE_NAME), "%s.png", CHEEVOS_VAR_CHEEVO_CURR->badge); + else + snprintf(CHEEVOS_VAR_BADGE_NAME, sizeof(CHEEVOS_VAR_BADGE_NAME), "%s_lock.png", CHEEVOS_VAR_CHEEVO_CURR->badge); + + fill_pathname_join(CHEEVOS_VAR_BADGE_PATH, CHEEVOS_VAR_BADGE_BASE_PATH, CHEEVOS_VAR_BADGE_NAME, sizeof(CHEEVOS_VAR_BADGE_PATH)); + + if (!badge_exists(CHEEVOS_VAR_BADGE_PATH)) + { + snprintf(CHEEVOS_VAR_URL, sizeof(CHEEVOS_VAR_URL), "http://i.retroachievements.org/Badge/%s", CHEEVOS_VAR_BADGE_NAME); + + CORO_GOSUB(HTTP_GET); + if (CHEEVOS_VAR_JSON != NULL) + { + if (filestream_write_file(CHEEVOS_VAR_BADGE_PATH, CHEEVOS_VAR_JSON, CHEEVOS_VAR_K)) + RARCH_ERR("[CHEEVOS]: error writing badge %s\n", CHEEVOS_VAR_BADGE_PATH); +#ifdef CHEEVOS_LOG_BADGES + RARCH_LOG("[CHEEVOS]: downloaded badge %s\n", CHEEVOS_VAR_BADGE_PATH); +#endif + } + } + } + } + + CORO_RET(); + + /************************************************************************** +>>>>>>> Stashed changes * Info Logs in the user at Retro Achievements *************************************************************************/ CORO_SUB(LOGIN) diff --git a/cheevos/cheevos.h b/cheevos/cheevos.h index dedc017ec3..cf2526e504 100644 --- a/cheevos/cheevos.h +++ b/cheevos/cheevos.h @@ -117,7 +117,7 @@ bool cheevos_load(const void *data); void cheevos_reset_game(void); -void cheevos_populate_menu(void *data, bool hardcore); +void cheevos_populate_menu(void *data); bool cheevos_get_description(cheevos_ctx_desc_t *desc); diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index fbf28f4ca6..2cf909eab3 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -148,6 +148,8 @@ MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ACHIEVEMENTS, "cheevos_unlocked_achievements") MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY, "cheevos_unlocked_entry") +MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY_HARDCORE, + "cheevos_unlocked_entry_hardcore") MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_USERNAME, "cheevos_username") MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_VERBOSE_ENABLE, diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index a7f516c586..deda2721b9 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -458,6 +458,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ENTRY, "Unlocked" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ENTRY_HARDCORE, + "Hardcore" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_VERBOSE_ENABLE, "Achievements Verbose Mode" diff --git a/menu/cbs/menu_cbs_deferred_push.c b/menu/cbs/menu_cbs_deferred_push.c index 8ab480aefd..538198987c 100644 --- a/menu/cbs/menu_cbs_deferred_push.c +++ b/menu/cbs/menu_cbs_deferred_push.c @@ -78,11 +78,6 @@ static int deferred_push_achievement_list(menu_displaylist_info_t *info) return deferred_push_dlist(info, DISPLAYLIST_ACHIEVEMENT_LIST); } -static int deferred_push_achievement_list_hardcore(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_ACHIEVEMENT_LIST_HARDCORE); -} - static int deferred_push_rdb_collection(menu_displaylist_info_t *info) { return deferred_push_dlist(info, DISPLAYLIST_PLAYLIST_COLLECTION); @@ -1533,9 +1528,6 @@ static int menu_cbs_init_bind_deferred_push_compare_label( case MENU_ENUM_LABEL_ACHIEVEMENT_LIST: BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_achievement_list); break; - case MENU_ENUM_LABEL_ACHIEVEMENT_LIST_HARDCORE: - BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_achievement_list_hardcore); - break; case MENU_ENUM_LABEL_CORE_COUNTERS: BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_core_counters); break; @@ -1768,9 +1760,6 @@ static int menu_cbs_init_bind_deferred_push_compare_label( case MENU_LABEL_ACHIEVEMENT_LIST: BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_achievement_list); break; - case MENU_LABEL_ACHIEVEMENT_LIST_HARDCORE: - BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_achievement_list_hardcore); - break; case MENU_LABEL_CORE_COUNTERS: BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_core_counters); break; diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index 183dfe2305..508121696a 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -94,6 +94,21 @@ static void menu_action_setting_disp_set_label_cheevos_unlocked_entry( msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ENTRY), len); } +static void menu_action_setting_disp_set_label_cheevos_unlocked_entry_hardcore( + file_list_t* list, + unsigned *w, unsigned type, unsigned i, + const char *label, + char *s, size_t len, + const char *entry_label, + const char *path, + char *s2, size_t len2) +{ + *w = 19; + strlcpy(s2, path, len2); + strlcpy(s, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ENTRY_HARDCORE), len); +} + static void menu_action_setting_disp_set_label_remap_file_load( file_list_t* list, unsigned *w, unsigned type, unsigned i, @@ -1976,6 +1991,10 @@ int menu_cbs_init_bind_get_string_representation(menu_file_list_cbs_t *cbs, BIND_ACTION_GET_VALUE(cbs, menu_action_setting_disp_set_label_cheevos_unlocked_entry); return 0; + case MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY_HARDCORE: + BIND_ACTION_GET_VALUE(cbs, + menu_action_setting_disp_set_label_cheevos_unlocked_entry_hardcore); + return 0; case MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY: BIND_ACTION_GET_VALUE(cbs, menu_action_setting_disp_set_label_cheevos_locked_entry); diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 9b1013905a..9367b4fb9c 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -1246,6 +1246,7 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_shared_context); break; case MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY: + case MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY_HARDCORE: case MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_cheevos_entry); break; diff --git a/menu/cbs/menu_cbs_title.c b/menu/cbs/menu_cbs_title.c index 7cb532788e..d01c701c23 100644 --- a/menu/cbs/menu_cbs_title.c +++ b/menu/cbs/menu_cbs_title.c @@ -189,7 +189,6 @@ default_fill_title_macro(action_get_title_collection, MENU_ENUM_LABE default_title_copy_macro(action_get_title_help, MENU_ENUM_LABEL_VALUE_HELP_LIST) default_title_copy_macro(action_get_title_input_settings, MENU_ENUM_LABEL_VALUE_INPUT_SETTINGS) default_title_copy_macro(action_get_title_cheevos_list, MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_LIST) -default_title_copy_macro(action_get_title_cheevos_list_hardcore, MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_LIST_HARDCORE) default_title_copy_macro(action_get_title_video_shader_parameters,MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PARAMETERS) default_title_copy_macro(action_get_title_video_shader_preset_parameters,MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_PARAMETERS) @@ -1018,9 +1017,6 @@ static int menu_cbs_init_bind_title_compare_label(menu_file_list_cbs_t *cbs, case MENU_LABEL_ACHIEVEMENT_LIST: BIND_ACTION_GET_TITLE(cbs, action_get_title_cheevos_list); break; - case MENU_LABEL_ACHIEVEMENT_LIST_HARDCORE: - BIND_ACTION_GET_TITLE(cbs, action_get_title_cheevos_list_hardcore); - break; case MENU_LABEL_VIDEO_SHADER_PARAMETERS: BIND_ACTION_GET_TITLE(cbs, action_get_title_video_shader_parameters); break; diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index e4dd8450d1..d97852b039 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -2954,11 +2954,6 @@ static int menu_displaylist_parse_load_content_settings( msg_hash_to_str(MENU_ENUM_LABEL_ACHIEVEMENT_LIST), MENU_ENUM_LABEL_ACHIEVEMENT_LIST, MENU_SETTING_ACTION, 0, 0); - menu_entries_append_enum(info->list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_LIST_HARDCORE), - msg_hash_to_str(MENU_ENUM_LABEL_ACHIEVEMENT_LIST_HARDCORE), - MENU_ENUM_LABEL_ACHIEVEMENT_LIST_HARDCORE, - MENU_SETTING_ACTION, 0, 0); } #endif } @@ -4740,15 +4735,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) case DISPLAYLIST_ACHIEVEMENT_LIST: #ifdef HAVE_CHEEVOS menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - cheevos_populate_menu(info, false); - info->need_push = true; - info->need_refresh = true; -#endif - break; - case DISPLAYLIST_ACHIEVEMENT_LIST_HARDCORE: -#ifdef HAVE_CHEEVOS - menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - cheevos_populate_menu(info, true); + cheevos_populate_menu(info); info->need_push = true; info->need_refresh = true; #endif diff --git a/menu/menu_displaylist.h b/menu/menu_displaylist.h index 9572d5ebf5..9e2294b687 100644 --- a/menu/menu_displaylist.h +++ b/menu/menu_displaylist.h @@ -108,8 +108,7 @@ enum menu_displaylist_ctl_state DISPLAYLIST_NETWORK_INFO, DISPLAYLIST_SYSTEM_INFO, DISPLAYLIST_ACHIEVEMENT_LIST, - DISPLAYLIST_ACHIEVEMENT_LIST_HARDCORE, - DISPLAYLIST_USER_BINDS_LIST, + DISPLAYLIST_USER_BINDS_LIST, DISPLAYLIST_ACCOUNTS_LIST, DISPLAYLIST_DRIVER_SETTINGS_LIST, DISPLAYLIST_VIDEO_SETTINGS_LIST, diff --git a/msg_hash.h b/msg_hash.h index 25f83229b8..c5a54a3418 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -463,6 +463,7 @@ enum msg_hash_enums MENU_ENUM_LABEL_PLAYLIST_COLLECTION_ENTRY, MENU_LABEL(CHEEVOS_UNLOCKED_ENTRY), + MENU_LABEL(CHEEVOS_UNLOCKED_ENTRY_HARDCORE), MENU_LABEL(CHEEVOS_LOCKED_ENTRY), MENU_ENUM_LABEL_SHADER_PARAMETERS_ENTRY, @@ -1855,7 +1856,6 @@ enum msg_hash_enums #define MENU_LABEL_FRONTEND_COUNTERS 0xe5696877U #define MENU_LABEL_CORE_COUNTERS 0x64cc83e0U #define MENU_LABEL_ACHIEVEMENT_LIST 0x7b90fc49U -#define MENU_LABEL_ACHIEVEMENT_LIST_HARDCORE 0x7c632930U #define MENU_LABEL_CORE_INFORMATION 0xb638e0d3U #define MENU_LABEL_CORE_OPTIONS 0xf65e60f9U #define MENU_LABEL_SHADER_OPTIONS 0x1f7d2fc7U From 7ac5eda1e1913df2424a9839a03415e301c52231 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Fri, 24 Nov 2017 02:37:53 +0100 Subject: [PATCH 067/183] Rewrite input_mapper code - no longer have an internal pointer inside input_mapper --- input/input_driver.c | 3 +- input/input_mapper.c | 67 ++++++++++++++++++++++++-------------------- input/input_mapper.h | 1 + 3 files changed, 40 insertions(+), 31 deletions(-) diff --git a/input/input_driver.c b/input/input_driver.c index a4af4525cb..77bd8eb43c 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -669,7 +669,8 @@ int16_t input_state(unsigned port, unsigned device, #ifdef HAVE_KEYMAPPER if (input_driver_mapper) - input_mapper_state(&res, port, device, idx, id); + input_mapper_state(input_driver_mapper, + &res, port, device, idx, id); #endif /* Don't allow turbo for D-pad. */ diff --git a/input/input_mapper.c b/input/input_mapper.c index 01b50fbdf7..0cfd365c30 100644 --- a/input/input_mapper.c +++ b/input/input_mapper.c @@ -56,82 +56,89 @@ struct input_mapper uint64_t buttons; }; -static input_mapper_t *mapper_ptr; - input_mapper_t *input_mapper_new(uint16_t port) { - settings_t *settings = config_get_ptr(); input_mapper_t* handle = (input_mapper_t*) calloc(1, sizeof(*handle)); + if (!handle) return NULL; handle->port = port; - mapper_ptr = handle; + return handle; } void input_mapper_free(input_mapper_t *handle) { + if (!handle) + return; free (handle); } void input_mapper_poll(input_mapper_t *handle) { + int i; settings_t *settings = config_get_ptr(); - unsigned device = settings->uints.input_libretro_device[handle->port]; - device &= RETRO_DEVICE_MASK; + unsigned device = settings->uints.input_libretro_device[handle->port]; + + device &= RETRO_DEVICE_MASK; /* for now we only handle keyboard inputs */ - if (device == RETRO_DEVICE_KEYBOARD) - { - int i; - memset(handle->keys, 0, sizeof(handle->keys)); + if (device != RETRO_DEVICE_KEYBOARD) + return; - for (i = 0; i < RARCH_CUSTOM_BIND_LIST_END; i++) + memset(handle->keys, 0, sizeof(handle->keys)); + + for (i = 0; i < RARCH_CUSTOM_BIND_LIST_END; i++) + { + if (i < RETROK_LAST) { - if (i < RETROK_LAST) + if (input_state(handle->port, RETRO_DEVICE_JOYPAD, 0, i)) { - if (input_state(handle->port, RETRO_DEVICE_JOYPAD, 0, i)) - { - 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); - } - else - input_keyboard_event(false, settings->uints.input_keymapper_ids[i], 0, 0, RETRO_DEVICE_KEYBOARD); + 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); } + else + input_keyboard_event(false, + settings->uints.input_keymapper_ids[i], + 0, 0, RETRO_DEVICE_KEYBOARD); } } - return; } void input_mapper_state( + input_mapper_t *handle, int16_t *ret, unsigned port, unsigned device, unsigned idx, unsigned id) { + if (!handle) + return; - settings_t *settings = config_get_ptr(); switch (device) { case RETRO_DEVICE_KEYBOARD: if (id < RETROK_LAST) { /* - RARCH_LOG("State: UDLR %u %u %u %u\n", - MAPPER_GET_KEY(mapper_ptr, RETROK_UP), - MAPPER_GET_KEY(mapper_ptr, RETROK_DOWN), - MAPPER_GET_KEY(mapper_ptr, RETROK_LEFT), - MAPPER_GET_KEY(mapper_ptr, RETROK_RIGHT) - );*/ + 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(mapper_ptr, id)) + if (MAPPER_GET_KEY(handle, id)) *ret |= 1; } break; + default: + break; } - - return; } diff --git a/input/input_mapper.h b/input/input_mapper.h index b23b37e6a1..500faab4a0 100644 --- a/input/input_mapper.h +++ b/input/input_mapper.h @@ -40,6 +40,7 @@ void input_mapper_poll(input_mapper_t *handle); bool input_mapper_key_pressed(int key); void input_mapper_state( + input_mapper_t *handle, int16_t *ret, unsigned port, unsigned device, From 6351e21d9e116db8700d1329991e6ca1dbab14e1 Mon Sep 17 00:00:00 2001 From: orbea Date: Thu, 23 Nov 2017 17:34:16 -0800 Subject: [PATCH 068/183] qb: Turn $CONFIG_DEFINES from a temporary file into a variable. --- .gitignore | 1 - qb/qb.libs.sh | 15 ++++++--------- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index 9052ed2ea4..ad6ea6ab19 100644 --- a/.gitignore +++ b/.gitignore @@ -95,7 +95,6 @@ pkg/apple/iOS/modules/ obj-unix/ .vagrant/ -.CONFIG_DEFINES /pkg/msvc/Release Cg/*.exe /pkg/msvc/Release Cg/*.iobj /pkg/msvc/Release Cg/*.ipdb diff --git a/qb/qb.libs.sh b/qb/qb.libs.sh index 2715c3e77e..e8dce8c14b 100644 --- a/qb/qb.libs.sh +++ b/qb/qb.libs.sh @@ -1,12 +1,10 @@ MAKEFILE_DEFINES='' -CONFIG_DEFINES='.CONFIG_DEFINES' -cat /dev/null > "$CONFIG_DEFINES" -#cat /dev/null > "${CONFIG_DEFINES=.CONFIG_DEFINES}" +CONFIG_DEFINES='' [ "$PREFIX" ] || PREFIX="/usr/local" add_define_header() -{ echo "$1=$2" >> "$CONFIG_DEFINES";} +{ CONFIG_DEFINES="${CONFIG_DEFINES} $1=$2"; } add_define_make() { MAKEFILE_DEFINES="${MAKEFILE_DEFINES} $1=$2"; } @@ -207,9 +205,10 @@ create_config_header() shift done - while IFS='=' read -r VAR VAL; do - printf %s\\n "#define $VAR $VAL" - done < "$CONFIG_DEFINES" + eval "set -- $CONFIG_DEFINES" + for VAR do + printf %s\\n "#define ${VAR%%=*} ${VAR#*=}" + done printf %s\\n '#endif' } > "$outfile" @@ -264,5 +263,3 @@ create_config_make() } . qb/config.libs.sh - -rm -f -- "$CONFIG_DEFINES" From 3744108790607cf20482b3967f82cd4eba7e7946 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s?= Date: Thu, 23 Nov 2017 20:49:42 -0500 Subject: [PATCH 069/183] Revert "use a single list for achievements" --- cheevos/cheevos.c | 165 ++++++++++++------------------ cheevos/cheevos.h | 2 +- intl/msg_hash_lbl.h | 2 - intl/msg_hash_us.h | 4 - menu/cbs/menu_cbs_deferred_push.c | 11 ++ menu/cbs/menu_cbs_get_value.c | 19 ---- menu/cbs/menu_cbs_sublabel.c | 1 - menu/cbs/menu_cbs_title.c | 4 + menu/menu_displaylist.c | 15 ++- menu/menu_displaylist.h | 3 +- msg_hash.h | 2 +- 11 files changed, 98 insertions(+), 130 deletions(-) diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c index 79f2562b42..575ac7d0b1 100644 --- a/cheevos/cheevos.c +++ b/cheevos/cheevos.c @@ -2138,7 +2138,7 @@ void cheevos_reset_game(void) cheevo->last = 1; } -void cheevos_populate_menu(void *data) +void cheevos_populate_menu(void *data, bool hardcore) { #ifdef HAVE_MENU unsigned i; @@ -2151,30 +2151,39 @@ void cheevos_populate_menu(void *data) for (i = 0; cheevo < end; i++, cheevo++) { - - if (!(cheevo->active & CHEEVOS_ACTIVE_HARDCORE)) + if (!hardcore) { - menu_entries_append_enum(info->list, cheevo->title, - cheevo->description, MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY_HARDCORE, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); - items_found++; - set_badge_info(&badges_ctx, i, cheevo->badge, (cheevo->active & CHEEVOS_ACTIVE_HARDCORE)); - } - else if (!(cheevo->active & CHEEVOS_ACTIVE_SOFTCORE)) - { - menu_entries_append_enum(info->list, cheevo->title, - cheevo->description, MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); - items_found++; - set_badge_info(&badges_ctx, i, cheevo->badge, (cheevo->active & CHEEVOS_ACTIVE_SOFTCORE)); + if (!(cheevo->active & CHEEVOS_ACTIVE_SOFTCORE)) + { + menu_entries_append_enum(info->list, cheevo->title, + cheevo->description, MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY, + MENU_SETTINGS_CHEEVOS_START + i, 0, 0); + items_found++; + } + else + { + menu_entries_append_enum(info->list, cheevo->title, + cheevo->description, MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY, + MENU_SETTINGS_CHEEVOS_START + i, 0, 0); + items_found++; + } } else { - menu_entries_append_enum(info->list, cheevo->title, - cheevo->description, MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); - items_found++; - set_badge_info(&badges_ctx, i, cheevo->badge, (cheevo->active & CHEEVOS_ACTIVE_SOFTCORE)); + if (!(cheevo->active & CHEEVOS_ACTIVE_HARDCORE)) + { + menu_entries_append_enum(info->list, cheevo->title, + cheevo->description, MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY, + MENU_SETTINGS_CHEEVOS_START + i, 0, 0); + items_found++; + } + else + { + menu_entries_append_enum(info->list, cheevo->title, + cheevo->description, MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY, + MENU_SETTINGS_CHEEVOS_START + i, 0, 0); + items_found++; + } } } @@ -2184,29 +2193,42 @@ void cheevos_populate_menu(void *data) end = cheevos_locals.unofficial.cheevos + cheevos_locals.unofficial.count; - if (!(cheevo->active & CHEEVOS_ACTIVE_HARDCORE)) + for (i = cheevos_locals.core.count; cheevo < end; i++, cheevo++) { - menu_entries_append_enum(info->list, cheevo->title, - cheevo->description, MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY_HARDCORE, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); - items_found++; - set_badge_info(&badges_ctx, i, cheevo->badge, (cheevo->active & CHEEVOS_ACTIVE_HARDCORE)); - } - else if (!(cheevo->active & CHEEVOS_ACTIVE_SOFTCORE)) - { - menu_entries_append_enum(info->list, cheevo->title, - cheevo->description, MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); - items_found++; - set_badge_info(&badges_ctx, i, cheevo->badge, (cheevo->active & CHEEVOS_ACTIVE_SOFTCORE)); - } - else - { - menu_entries_append_enum(info->list, cheevo->title, - cheevo->description, MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); - items_found++; - set_badge_info(&badges_ctx, i, cheevo->badge, (cheevo->active & CHEEVOS_ACTIVE_SOFTCORE)); + if (!hardcore) + { + if (!(cheevo->active & CHEEVOS_ACTIVE_SOFTCORE)) + { + menu_entries_append_enum(info->list, cheevo->title, + cheevo->description, MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY, + MENU_SETTINGS_CHEEVOS_START + i, 0, 0); + items_found++; + } + else + { + menu_entries_append_enum(info->list, cheevo->title, + cheevo->description, MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY, + MENU_SETTINGS_CHEEVOS_START + i, 0, 0); + items_found++; + } + } + else + { + if (!(cheevo->active & CHEEVOS_ACTIVE_HARDCORE)) + { + menu_entries_append_enum(info->list, cheevo->title, + cheevo->description, MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY, + MENU_SETTINGS_CHEEVOS_START + i, 0, 0); + items_found++; + } + else + { + menu_entries_append_enum(info->list, cheevo->title, + cheevo->description, MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY, + MENU_SETTINGS_CHEEVOS_START + i, 0, 0); + items_found++; + } + } } } @@ -3135,63 +3157,6 @@ static int cheevos_iterate(coro_t* coro) CORO_RET(); /************************************************************************** -<<<<<<< Updated upstream -======= - * Info Gets the achievements from Retro Achievements - * Inputs CHEEVOS_VAR_GAMEID - * Outputs CHEEVOS_VAR_JSON - *************************************************************************/ - CORO_SUB(GET_BADGES) - - badges_ctx = new_badges_ctx; - - settings_t *settings = config_get_ptr(); - if (!string_is_equal(settings->arrays.menu_driver, "xmb") || - !settings->bools.cheevos_badges_enable) - CORO_RET(); - - CHEEVOS_VAR_CHEEVO_CURR = cheevos_locals.core.cheevos; - CHEEVOS_VAR_CHEEVO_END = cheevos_locals.core.cheevos + cheevos_locals.core.count; - - for (; CHEEVOS_VAR_CHEEVO_CURR < CHEEVOS_VAR_CHEEVO_END ; CHEEVOS_VAR_CHEEVO_CURR++) - { - for (CHEEVOS_VAR_J = 0 ; CHEEVOS_VAR_J < 2; CHEEVOS_VAR_J++) - { - CHEEVOS_VAR_BADGE_PATH[0] = '\0'; - fill_pathname_application_special(CHEEVOS_VAR_BADGE_BASE_PATH, sizeof(CHEEVOS_VAR_BADGE_BASE_PATH), - APPLICATION_SPECIAL_DIRECTORY_THUMBNAILS_CHEEVOS_BADGES); - - if (!path_is_directory(CHEEVOS_VAR_BADGE_BASE_PATH)) - path_mkdir(CHEEVOS_VAR_BADGE_BASE_PATH); - CORO_YIELD(); - if (CHEEVOS_VAR_J == 0) - snprintf(CHEEVOS_VAR_BADGE_NAME, sizeof(CHEEVOS_VAR_BADGE_NAME), "%s.png", CHEEVOS_VAR_CHEEVO_CURR->badge); - else - snprintf(CHEEVOS_VAR_BADGE_NAME, sizeof(CHEEVOS_VAR_BADGE_NAME), "%s_lock.png", CHEEVOS_VAR_CHEEVO_CURR->badge); - - fill_pathname_join(CHEEVOS_VAR_BADGE_PATH, CHEEVOS_VAR_BADGE_BASE_PATH, CHEEVOS_VAR_BADGE_NAME, sizeof(CHEEVOS_VAR_BADGE_PATH)); - - if (!badge_exists(CHEEVOS_VAR_BADGE_PATH)) - { - snprintf(CHEEVOS_VAR_URL, sizeof(CHEEVOS_VAR_URL), "http://i.retroachievements.org/Badge/%s", CHEEVOS_VAR_BADGE_NAME); - - CORO_GOSUB(HTTP_GET); - if (CHEEVOS_VAR_JSON != NULL) - { - if (filestream_write_file(CHEEVOS_VAR_BADGE_PATH, CHEEVOS_VAR_JSON, CHEEVOS_VAR_K)) - RARCH_ERR("[CHEEVOS]: error writing badge %s\n", CHEEVOS_VAR_BADGE_PATH); -#ifdef CHEEVOS_LOG_BADGES - RARCH_LOG("[CHEEVOS]: downloaded badge %s\n", CHEEVOS_VAR_BADGE_PATH); -#endif - } - } - } - } - - CORO_RET(); - - /************************************************************************** ->>>>>>> Stashed changes * Info Logs in the user at Retro Achievements *************************************************************************/ CORO_SUB(LOGIN) diff --git a/cheevos/cheevos.h b/cheevos/cheevos.h index cf2526e504..dedc017ec3 100644 --- a/cheevos/cheevos.h +++ b/cheevos/cheevos.h @@ -117,7 +117,7 @@ bool cheevos_load(const void *data); void cheevos_reset_game(void); -void cheevos_populate_menu(void *data); +void cheevos_populate_menu(void *data, bool hardcore); bool cheevos_get_description(cheevos_ctx_desc_t *desc); diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index 2cf909eab3..fbf28f4ca6 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -148,8 +148,6 @@ MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ACHIEVEMENTS, "cheevos_unlocked_achievements") MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY, "cheevos_unlocked_entry") -MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY_HARDCORE, - "cheevos_unlocked_entry_hardcore") MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_USERNAME, "cheevos_username") MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_VERBOSE_ENABLE, diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index deda2721b9..a7f516c586 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -458,10 +458,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ENTRY, "Unlocked" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ENTRY_HARDCORE, - "Hardcore" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_VERBOSE_ENABLE, "Achievements Verbose Mode" diff --git a/menu/cbs/menu_cbs_deferred_push.c b/menu/cbs/menu_cbs_deferred_push.c index 538198987c..8ab480aefd 100644 --- a/menu/cbs/menu_cbs_deferred_push.c +++ b/menu/cbs/menu_cbs_deferred_push.c @@ -78,6 +78,11 @@ static int deferred_push_achievement_list(menu_displaylist_info_t *info) return deferred_push_dlist(info, DISPLAYLIST_ACHIEVEMENT_LIST); } +static int deferred_push_achievement_list_hardcore(menu_displaylist_info_t *info) +{ + return deferred_push_dlist(info, DISPLAYLIST_ACHIEVEMENT_LIST_HARDCORE); +} + static int deferred_push_rdb_collection(menu_displaylist_info_t *info) { return deferred_push_dlist(info, DISPLAYLIST_PLAYLIST_COLLECTION); @@ -1528,6 +1533,9 @@ static int menu_cbs_init_bind_deferred_push_compare_label( case MENU_ENUM_LABEL_ACHIEVEMENT_LIST: BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_achievement_list); break; + case MENU_ENUM_LABEL_ACHIEVEMENT_LIST_HARDCORE: + BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_achievement_list_hardcore); + break; case MENU_ENUM_LABEL_CORE_COUNTERS: BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_core_counters); break; @@ -1760,6 +1768,9 @@ static int menu_cbs_init_bind_deferred_push_compare_label( case MENU_LABEL_ACHIEVEMENT_LIST: BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_achievement_list); break; + case MENU_LABEL_ACHIEVEMENT_LIST_HARDCORE: + BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_achievement_list_hardcore); + break; case MENU_LABEL_CORE_COUNTERS: BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_core_counters); break; diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index 508121696a..183dfe2305 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -94,21 +94,6 @@ static void menu_action_setting_disp_set_label_cheevos_unlocked_entry( msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ENTRY), len); } -static void menu_action_setting_disp_set_label_cheevos_unlocked_entry_hardcore( - file_list_t* list, - unsigned *w, unsigned type, unsigned i, - const char *label, - char *s, size_t len, - const char *entry_label, - const char *path, - char *s2, size_t len2) -{ - *w = 19; - strlcpy(s2, path, len2); - strlcpy(s, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ENTRY_HARDCORE), len); -} - static void menu_action_setting_disp_set_label_remap_file_load( file_list_t* list, unsigned *w, unsigned type, unsigned i, @@ -1991,10 +1976,6 @@ int menu_cbs_init_bind_get_string_representation(menu_file_list_cbs_t *cbs, BIND_ACTION_GET_VALUE(cbs, menu_action_setting_disp_set_label_cheevos_unlocked_entry); return 0; - case MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY_HARDCORE: - BIND_ACTION_GET_VALUE(cbs, - menu_action_setting_disp_set_label_cheevos_unlocked_entry_hardcore); - return 0; case MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY: BIND_ACTION_GET_VALUE(cbs, menu_action_setting_disp_set_label_cheevos_locked_entry); diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 9367b4fb9c..9b1013905a 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -1246,7 +1246,6 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_shared_context); break; case MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY: - case MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY_HARDCORE: case MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_cheevos_entry); break; diff --git a/menu/cbs/menu_cbs_title.c b/menu/cbs/menu_cbs_title.c index d01c701c23..7cb532788e 100644 --- a/menu/cbs/menu_cbs_title.c +++ b/menu/cbs/menu_cbs_title.c @@ -189,6 +189,7 @@ default_fill_title_macro(action_get_title_collection, MENU_ENUM_LABE default_title_copy_macro(action_get_title_help, MENU_ENUM_LABEL_VALUE_HELP_LIST) default_title_copy_macro(action_get_title_input_settings, MENU_ENUM_LABEL_VALUE_INPUT_SETTINGS) default_title_copy_macro(action_get_title_cheevos_list, MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_LIST) +default_title_copy_macro(action_get_title_cheevos_list_hardcore, MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_LIST_HARDCORE) default_title_copy_macro(action_get_title_video_shader_parameters,MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PARAMETERS) default_title_copy_macro(action_get_title_video_shader_preset_parameters,MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_PARAMETERS) @@ -1017,6 +1018,9 @@ static int menu_cbs_init_bind_title_compare_label(menu_file_list_cbs_t *cbs, case MENU_LABEL_ACHIEVEMENT_LIST: BIND_ACTION_GET_TITLE(cbs, action_get_title_cheevos_list); break; + case MENU_LABEL_ACHIEVEMENT_LIST_HARDCORE: + BIND_ACTION_GET_TITLE(cbs, action_get_title_cheevos_list_hardcore); + break; case MENU_LABEL_VIDEO_SHADER_PARAMETERS: BIND_ACTION_GET_TITLE(cbs, action_get_title_video_shader_parameters); break; diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index d97852b039..e4dd8450d1 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -2954,6 +2954,11 @@ static int menu_displaylist_parse_load_content_settings( msg_hash_to_str(MENU_ENUM_LABEL_ACHIEVEMENT_LIST), MENU_ENUM_LABEL_ACHIEVEMENT_LIST, MENU_SETTING_ACTION, 0, 0); + menu_entries_append_enum(info->list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_LIST_HARDCORE), + msg_hash_to_str(MENU_ENUM_LABEL_ACHIEVEMENT_LIST_HARDCORE), + MENU_ENUM_LABEL_ACHIEVEMENT_LIST_HARDCORE, + MENU_SETTING_ACTION, 0, 0); } #endif } @@ -4735,7 +4740,15 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) case DISPLAYLIST_ACHIEVEMENT_LIST: #ifdef HAVE_CHEEVOS menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - cheevos_populate_menu(info); + cheevos_populate_menu(info, false); + info->need_push = true; + info->need_refresh = true; +#endif + break; + case DISPLAYLIST_ACHIEVEMENT_LIST_HARDCORE: +#ifdef HAVE_CHEEVOS + menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); + cheevos_populate_menu(info, true); info->need_push = true; info->need_refresh = true; #endif diff --git a/menu/menu_displaylist.h b/menu/menu_displaylist.h index 9e2294b687..9572d5ebf5 100644 --- a/menu/menu_displaylist.h +++ b/menu/menu_displaylist.h @@ -108,7 +108,8 @@ enum menu_displaylist_ctl_state DISPLAYLIST_NETWORK_INFO, DISPLAYLIST_SYSTEM_INFO, DISPLAYLIST_ACHIEVEMENT_LIST, - DISPLAYLIST_USER_BINDS_LIST, + DISPLAYLIST_ACHIEVEMENT_LIST_HARDCORE, + DISPLAYLIST_USER_BINDS_LIST, DISPLAYLIST_ACCOUNTS_LIST, DISPLAYLIST_DRIVER_SETTINGS_LIST, DISPLAYLIST_VIDEO_SETTINGS_LIST, diff --git a/msg_hash.h b/msg_hash.h index c5a54a3418..25f83229b8 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -463,7 +463,6 @@ enum msg_hash_enums MENU_ENUM_LABEL_PLAYLIST_COLLECTION_ENTRY, MENU_LABEL(CHEEVOS_UNLOCKED_ENTRY), - MENU_LABEL(CHEEVOS_UNLOCKED_ENTRY_HARDCORE), MENU_LABEL(CHEEVOS_LOCKED_ENTRY), MENU_ENUM_LABEL_SHADER_PARAMETERS_ENTRY, @@ -1856,6 +1855,7 @@ enum msg_hash_enums #define MENU_LABEL_FRONTEND_COUNTERS 0xe5696877U #define MENU_LABEL_CORE_COUNTERS 0x64cc83e0U #define MENU_LABEL_ACHIEVEMENT_LIST 0x7b90fc49U +#define MENU_LABEL_ACHIEVEMENT_LIST_HARDCORE 0x7c632930U #define MENU_LABEL_CORE_INFORMATION 0xb638e0d3U #define MENU_LABEL_CORE_OPTIONS 0xf65e60f9U #define MENU_LABEL_SHADER_OPTIONS 0x1f7d2fc7U From 36b9bd967527a5e7afe2d0367547a2d5f9ebdc5b Mon Sep 17 00:00:00 2001 From: radius Date: Thu, 23 Nov 2017 21:33:41 -0500 Subject: [PATCH 070/183] free CHEEVOS_VAR_JSON --- cheevos/cheevos.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c index 76dca89de7..27e0b042ab 100644 --- a/cheevos/cheevos.c +++ b/cheevos/cheevos.c @@ -81,7 +81,7 @@ #undef CHEEVOS_LOG_PASSWORD /* Define this macro to log downloaded badge images. */ -#undef CHEEVOS_LOG_BADGES +#define CHEEVOS_LOG_BADGES /* C89 wants only int values in enums. */ #define CHEEVOS_JSON_KEY_GAMEID 0xb4960eecU @@ -3214,16 +3214,18 @@ static int cheevos_iterate(coro_t* coro) if (!badge_exists(CHEEVOS_VAR_BADGE_PATH)) { +#ifdef CHEEVOS_LOG_BADGES + RARCH_LOG("[CHEEVOS]: downloading badge %s\n", CHEEVOS_VAR_BADGE_PATH); +#endif snprintf(CHEEVOS_VAR_URL, sizeof(CHEEVOS_VAR_URL), "http://i.retroachievements.org/Badge/%s", CHEEVOS_VAR_BADGE_NAME); CORO_GOSUB(HTTP_GET); if (CHEEVOS_VAR_JSON != NULL) { - if (filestream_write_file(CHEEVOS_VAR_BADGE_PATH, CHEEVOS_VAR_JSON, CHEEVOS_VAR_K)) + if (!filestream_write_file(CHEEVOS_VAR_BADGE_PATH, CHEEVOS_VAR_JSON, CHEEVOS_VAR_K)) RARCH_ERR("[CHEEVOS]: error writing badge %s\n", CHEEVOS_VAR_BADGE_PATH); -#ifdef CHEEVOS_LOG_BADGES - RARCH_LOG("[CHEEVOS]: downloaded badge %s\n", CHEEVOS_VAR_BADGE_PATH); -#endif + else + free(CHEEVOS_VAR_JSON); } } } From 1ca43bd81915db1dd80d965b8e2d74d1762c77e4 Mon Sep 17 00:00:00 2001 From: orbea Date: Thu, 23 Nov 2017 18:22:01 -0800 Subject: [PATCH 071/183] qb: Combine the add_define_header and add_define_make functions. --- qb/config.libs.sh | 26 +++++++++++++------------- qb/qb.libs.sh | 7 ++----- 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/qb/config.libs.sh b/qb/config.libs.sh index 0c8363a220..82698ce890 100644 --- a/qb/config.libs.sh +++ b/qb/config.libs.sh @@ -1,9 +1,9 @@ check_switch_c C99 -std=gnu99 "Cannot find C99 compatible compiler." check_switch_c NOUNUSED -Wno-unused-result -add_define_make NOUNUSED "$HAVE_NOUNUSED" +add_define MAKEFILE NOUNUSED "$HAVE_NOUNUSED" check_switch_c NOUNUSED_VARIABLE -Wno-unused-variable -add_define_make NOUNUSED_VARIABLE "$HAVE_NOUNUSED_VARIABLE" +add_define MAKEFILE NOUNUSED_VARIABLE "$HAVE_NOUNUSED_VARIABLE" # There are still broken 64-bit Linux distros out there. :) [ -z "$CROSS_COMPILE" ] && [ -d /usr/lib64 ] && add_library_dirs /usr/lib64 @@ -38,7 +38,7 @@ elif [ "$OS" = 'Cygwin' ]; then die 1 'Error: Cygwin is not a supported platform. See https://bot.libretro.com/docs/compilation/windows/' fi -add_define_make DYLIB_LIB "$DYLIB" +add_define MAKEFILE DYLIB_LIB "$DYLIB" check_lib '' SYSTEMD -lsystemd sd_get_machine_names @@ -79,7 +79,7 @@ fi if [ "$HAVE_PRESERVE_DYLIB" = "yes" ]; then die : 'Notice: Disabling dlclose() of shared objects for Valgrind support.' - add_define_make HAVE_PRESERVE_DYLIB "1" + add_define MAKEFILE HAVE_PRESERVE_DYLIB "1" fi if [ "$HAVE_FLOATHARD" = "yes" ]; then @@ -150,17 +150,17 @@ fi [ "$HAVE_DYNAMIC" = 'yes' ] || { #check_lib '' RETRO "$LIBRETRO" retro_init "$DYLIB" "Cannot find libretro, did you forget --with-libretro=\"-lretro\"?" check_lib '' RETRO "$LIBRETRO" "$DYLIB" "Cannot find libretro, did you forget --with-libretro=\"-lretro\"?" - add_define_make libretro "$LIBRETRO" + add_define MAKEFILE libretro "$LIBRETRO" } [ -z "$ASSETS_DIR" ] && ASSETS_DIR="${PREFIX}/share" -add_define_make ASSETS_DIR "$ASSETS_DIR" +add_define MAKEFILE ASSETS_DIR "$ASSETS_DIR" [ -z "$BIN_DIR" ] && BIN_DIR="${PREFIX}/bin" -add_define_make BIN_DIR "$BIN_DIR" +add_define MAKEFILE BIN_DIR "$BIN_DIR" [ -z "$MAN_DIR" ] && MAN_DIR="${PREFIX}/share/man" -add_define_make MAN_DIR "$MAN_DIR" +add_define MAKEFILE MAN_DIR "$MAN_DIR" if [ "$OS" = 'DOS' ]; then HAVE_SHADERPIPELINE=no @@ -377,13 +377,13 @@ if [ "$HAVE_EGL" = "yes" ]; then if [ "$HAVE_OPENGLES" != "no" ]; then if [ "$OPENGLES_LIBS" ] || [ "$OPENGLES_CFLAGS" ]; then die : "Notice: Using custom OpenGLES CFLAGS ($OPENGLES_CFLAGS) and LDFLAGS ($OPENGLES_LIBS)." - add_define_make OPENGLES_LIBS "$OPENGLES_LIBS" - add_define_make OPENGLES_CFLAGS "$OPENGLES_CFLAGS" + add_define MAKEFILE OPENGLES_LIBS "$OPENGLES_LIBS" + add_define MAKEFILE OPENGLES_CFLAGS "$OPENGLES_CFLAGS" else HAVE_OPENGLES=auto; check_pkgconf OPENGLES "$VC_PREFIX"glesv2 if [ "$HAVE_OPENGLES" = "no" ]; then HAVE_OPENGLES=auto; check_lib '' OPENGLES "-l${VC_PREFIX}GLESv2 $EXTRA_GL_LIBS" - add_define_make OPENGLES_LIBS "-l${VC_PREFIX}GLESv2 $EXTRA_GL_LIBS" + add_define MAKEFILE OPENGLES_LIBS "-l${VC_PREFIX}GLESv2 $EXTRA_GL_LIBS" fi fi fi @@ -470,7 +470,7 @@ fi check_macro NEON __ARM_NEON__ -add_define_make OS "$OS" +add_define MAKEFILE OS "$OS" if [ "$HAVE_ZLIB" = 'no' ] && [ "$HAVE_RPNG" != 'no' ]; then HAVE_RPNG=no @@ -487,7 +487,7 @@ if [ "$HAVE_V4L2" != 'no' ] && [ "$HAVE_VIDEOPROCESSOR" != 'no' ]; then fi # Creates config.mk and config.h. -add_define_make GLOBAL_CONFIG_DIR "$GLOBAL_CONFIG_DIR" +add_define MAKEFILE GLOBAL_CONFIG_DIR "$GLOBAL_CONFIG_DIR" set -- $(set | grep ^HAVE_) while [ $# -gt 0 ]; do tmpvar="${1%=*}" diff --git a/qb/qb.libs.sh b/qb/qb.libs.sh index e8dce8c14b..24edb84ef6 100644 --- a/qb/qb.libs.sh +++ b/qb/qb.libs.sh @@ -3,11 +3,8 @@ CONFIG_DEFINES='' [ "$PREFIX" ] || PREFIX="/usr/local" -add_define_header() -{ CONFIG_DEFINES="${CONFIG_DEFINES} $1=$2"; } - -add_define_make() -{ MAKEFILE_DEFINES="${MAKEFILE_DEFINES} $1=$2"; } +add_define() # $1 = MAKEFILE or CONFIG $2 = define $3 = value +{ eval "${1}_DEFINES=\"\${${1}_DEFINES} $2=$3\""; } add_include_dirs() { while [ "$1" ]; do INCLUDE_DIRS="$INCLUDE_DIRS -I$1"; shift; done From ca2d2e4ba5a825557841b1f6ee758b6fa2ea6a25 Mon Sep 17 00:00:00 2001 From: radius Date: Thu, 23 Nov 2017 21:43:08 -0500 Subject: [PATCH 072/183] undefine this --- cheevos/cheevos.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c index 27e0b042ab..167e5239f0 100644 --- a/cheevos/cheevos.c +++ b/cheevos/cheevos.c @@ -81,7 +81,7 @@ #undef CHEEVOS_LOG_PASSWORD /* Define this macro to log downloaded badge images. */ -#define CHEEVOS_LOG_BADGES +#undef CHEEVOS_LOG_BADGES /* C89 wants only int values in enums. */ #define CHEEVOS_JSON_KEY_GAMEID 0xb4960eecU From 8662d66f2ea724f7983a8bb72d5cea07fcd88dc4 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Fri, 24 Nov 2017 04:08:13 +0100 Subject: [PATCH 073/183] Try to be safer with calloc allocation --- cheevos/cheevos.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c index 575ac7d0b1..8e61133e59 100644 --- a/cheevos/cheevos.c +++ b/cheevos/cheevos.c @@ -878,24 +878,27 @@ static unsigned cheevos_count_cond_sets(const char *memaddr) static int cheevos_parse_condition(cheevos_condition_t *condition, const char* memaddr) { + if (!condition) + return 0; + condition->count = cheevos_count_cond_sets(memaddr); if (condition->count) { unsigned set = 0; - cheevos_condset_t *condset = NULL; - cheevos_condset_t *conds = NULL; const cheevos_condset_t* end = NULL; + cheevos_condset_t *conds = NULL; + cheevos_condset_t *condset = NULL; + cheevos_condset_t *condsets = (cheevos_condset_t*) + calloc(condition->count, sizeof(cheevos_condset_t)); (void)conds; - condition->condsets = (cheevos_condset_t*) - calloc(condition->count, sizeof(cheevos_condset_t)); - - if (!condition->condsets) + if (!condsets) return -1; - end = condition->condsets + condition->count; + condition->condsets = condsets; + end = condition->condsets + condition->count; for (condset = condition->condsets; condset < end; condset++, set++) { @@ -1047,10 +1050,10 @@ static int cheevos_parse_expression(cheevos_expr_t *expr, const char* mem) static int cheevos_parse_mem(cheevos_leaderboard_t *lb, const char* mem) { - lb->start.condsets = NULL; + lb->start.condsets = NULL; lb->cancel.condsets = NULL; lb->submit.condsets = NULL; - lb->value.terms = NULL; + lb->value.terms = NULL; for (;;) { From 9b19d334c71e9d08f0af11ac5d6120d729d35a39 Mon Sep 17 00:00:00 2001 From: radius Date: Thu, 23 Nov 2017 20:35:54 -0500 Subject: [PATCH 074/183] use a single list for achievements --- cheevos/cheevos.c | 108 ++++++++++++------------------ cheevos/cheevos.h | 2 +- intl/msg_hash_lbl.h | 2 + intl/msg_hash_us.h | 4 ++ menu/cbs/menu_cbs_deferred_push.c | 11 --- menu/cbs/menu_cbs_get_value.c | 19 ++++++ menu/cbs/menu_cbs_sublabel.c | 1 + menu/cbs/menu_cbs_title.c | 4 -- menu/menu_displaylist.c | 15 +---- menu/menu_displaylist.h | 3 +- msg_hash.h | 2 +- 11 files changed, 72 insertions(+), 99 deletions(-) diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c index 725c2b8edb..fc8a21ff1a 100644 --- a/cheevos/cheevos.c +++ b/cheevos/cheevos.c @@ -2148,7 +2148,7 @@ void cheevos_reset_game(void) cheevo->last = 1; } -void cheevos_populate_menu(void *data, bool hardcore) +void cheevos_populate_menu(void *data) { #ifdef HAVE_MENU unsigned i; @@ -2161,41 +2161,30 @@ void cheevos_populate_menu(void *data, bool hardcore) for (i = 0; cheevo < end; i++, cheevo++) { - if (!hardcore) + + if (!(cheevo->active & CHEEVOS_ACTIVE_HARDCORE)) { - if (!(cheevo->active & CHEEVOS_ACTIVE_SOFTCORE)) - { - menu_entries_append_enum(info->list, cheevo->title, - cheevo->description, MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); - items_found++; - } - else - { - menu_entries_append_enum(info->list, cheevo->title, - cheevo->description, MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); - items_found++; - } + menu_entries_append_enum(info->list, cheevo->title, + cheevo->description, MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY_HARDCORE, + MENU_SETTINGS_CHEEVOS_START + i, 0, 0); + items_found++; + set_badge_info(&badges_ctx, i, cheevo->badge, (cheevo->active & CHEEVOS_ACTIVE_HARDCORE)); + } + else if (!(cheevo->active & CHEEVOS_ACTIVE_SOFTCORE)) + { + menu_entries_append_enum(info->list, cheevo->title, + cheevo->description, MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY, + MENU_SETTINGS_CHEEVOS_START + i, 0, 0); + items_found++; set_badge_info(&badges_ctx, i, cheevo->badge, (cheevo->active & CHEEVOS_ACTIVE_SOFTCORE)); } else { - if (!(cheevo->active & CHEEVOS_ACTIVE_HARDCORE)) - { - menu_entries_append_enum(info->list, cheevo->title, - cheevo->description, MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); - items_found++; - } - else - { - menu_entries_append_enum(info->list, cheevo->title, - cheevo->description, MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); - items_found++; - } - set_badge_info(&badges_ctx, i, cheevo->badge, (cheevo->active & CHEEVOS_ACTIVE_HARDCORE)); + menu_entries_append_enum(info->list, cheevo->title, + cheevo->description, MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY, + MENU_SETTINGS_CHEEVOS_START + i, 0, 0); + items_found++; + set_badge_info(&badges_ctx, i, cheevo->badge, (cheevo->active & CHEEVOS_ACTIVE_SOFTCORE)); } } @@ -2205,42 +2194,29 @@ void cheevos_populate_menu(void *data, bool hardcore) end = cheevos_locals.unofficial.cheevos + cheevos_locals.unofficial.count; - for (i = cheevos_locals.core.count; cheevo < end; i++, cheevo++) + if (!(cheevo->active & CHEEVOS_ACTIVE_HARDCORE)) { - if (!hardcore) - { - if (!(cheevo->active & CHEEVOS_ACTIVE_SOFTCORE)) - { - menu_entries_append_enum(info->list, cheevo->title, - cheevo->description, MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); - items_found++; - } - else - { - menu_entries_append_enum(info->list, cheevo->title, - cheevo->description, MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); - items_found++; - } - } - else - { - if (!(cheevo->active & CHEEVOS_ACTIVE_HARDCORE)) - { - menu_entries_append_enum(info->list, cheevo->title, - cheevo->description, MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); - items_found++; - } - else - { - menu_entries_append_enum(info->list, cheevo->title, - cheevo->description, MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); - items_found++; - } - } + menu_entries_append_enum(info->list, cheevo->title, + cheevo->description, MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY_HARDCORE, + MENU_SETTINGS_CHEEVOS_START + i, 0, 0); + items_found++; + set_badge_info(&badges_ctx, i, cheevo->badge, (cheevo->active & CHEEVOS_ACTIVE_HARDCORE)); + } + else if (!(cheevo->active & CHEEVOS_ACTIVE_SOFTCORE)) + { + menu_entries_append_enum(info->list, cheevo->title, + cheevo->description, MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY, + MENU_SETTINGS_CHEEVOS_START + i, 0, 0); + items_found++; + set_badge_info(&badges_ctx, i, cheevo->badge, (cheevo->active & CHEEVOS_ACTIVE_SOFTCORE)); + } + else + { + menu_entries_append_enum(info->list, cheevo->title, + cheevo->description, MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY, + MENU_SETTINGS_CHEEVOS_START + i, 0, 0); + items_found++; + set_badge_info(&badges_ctx, i, cheevo->badge, (cheevo->active & CHEEVOS_ACTIVE_SOFTCORE)); } } diff --git a/cheevos/cheevos.h b/cheevos/cheevos.h index dedc017ec3..cf2526e504 100644 --- a/cheevos/cheevos.h +++ b/cheevos/cheevos.h @@ -117,7 +117,7 @@ bool cheevos_load(const void *data); void cheevos_reset_game(void); -void cheevos_populate_menu(void *data, bool hardcore); +void cheevos_populate_menu(void *data); bool cheevos_get_description(cheevos_ctx_desc_t *desc); diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index 6cc3ee5313..32cd47b828 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -150,6 +150,8 @@ MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ACHIEVEMENTS, "cheevos_unlocked_achievements") MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY, "cheevos_unlocked_entry") +MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY_HARDCORE, + "cheevos_unlocked_entry_hardcore") MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_USERNAME, "cheevos_username") MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_VERBOSE_ENABLE, diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index dbe83d50ba..1cbd3d133f 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -462,6 +462,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ENTRY, "Unlocked" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ENTRY_HARDCORE, + "Hardcore" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_VERBOSE_ENABLE, "Achievements Verbose Mode" diff --git a/menu/cbs/menu_cbs_deferred_push.c b/menu/cbs/menu_cbs_deferred_push.c index 8ab480aefd..538198987c 100644 --- a/menu/cbs/menu_cbs_deferred_push.c +++ b/menu/cbs/menu_cbs_deferred_push.c @@ -78,11 +78,6 @@ static int deferred_push_achievement_list(menu_displaylist_info_t *info) return deferred_push_dlist(info, DISPLAYLIST_ACHIEVEMENT_LIST); } -static int deferred_push_achievement_list_hardcore(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_ACHIEVEMENT_LIST_HARDCORE); -} - static int deferred_push_rdb_collection(menu_displaylist_info_t *info) { return deferred_push_dlist(info, DISPLAYLIST_PLAYLIST_COLLECTION); @@ -1533,9 +1528,6 @@ static int menu_cbs_init_bind_deferred_push_compare_label( case MENU_ENUM_LABEL_ACHIEVEMENT_LIST: BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_achievement_list); break; - case MENU_ENUM_LABEL_ACHIEVEMENT_LIST_HARDCORE: - BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_achievement_list_hardcore); - break; case MENU_ENUM_LABEL_CORE_COUNTERS: BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_core_counters); break; @@ -1768,9 +1760,6 @@ static int menu_cbs_init_bind_deferred_push_compare_label( case MENU_LABEL_ACHIEVEMENT_LIST: BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_achievement_list); break; - case MENU_LABEL_ACHIEVEMENT_LIST_HARDCORE: - BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_achievement_list_hardcore); - break; case MENU_LABEL_CORE_COUNTERS: BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_core_counters); break; diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index 183dfe2305..508121696a 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -94,6 +94,21 @@ static void menu_action_setting_disp_set_label_cheevos_unlocked_entry( msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ENTRY), len); } +static void menu_action_setting_disp_set_label_cheevos_unlocked_entry_hardcore( + file_list_t* list, + unsigned *w, unsigned type, unsigned i, + const char *label, + char *s, size_t len, + const char *entry_label, + const char *path, + char *s2, size_t len2) +{ + *w = 19; + strlcpy(s2, path, len2); + strlcpy(s, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ENTRY_HARDCORE), len); +} + static void menu_action_setting_disp_set_label_remap_file_load( file_list_t* list, unsigned *w, unsigned type, unsigned i, @@ -1976,6 +1991,10 @@ int menu_cbs_init_bind_get_string_representation(menu_file_list_cbs_t *cbs, BIND_ACTION_GET_VALUE(cbs, menu_action_setting_disp_set_label_cheevos_unlocked_entry); return 0; + case MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY_HARDCORE: + BIND_ACTION_GET_VALUE(cbs, + menu_action_setting_disp_set_label_cheevos_unlocked_entry_hardcore); + return 0; case MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY: BIND_ACTION_GET_VALUE(cbs, menu_action_setting_disp_set_label_cheevos_locked_entry); diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index db388d9def..06170be390 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -1247,6 +1247,7 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_shared_context); break; case MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY: + case MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY_HARDCORE: case MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_cheevos_entry); break; diff --git a/menu/cbs/menu_cbs_title.c b/menu/cbs/menu_cbs_title.c index 7cb532788e..d01c701c23 100644 --- a/menu/cbs/menu_cbs_title.c +++ b/menu/cbs/menu_cbs_title.c @@ -189,7 +189,6 @@ default_fill_title_macro(action_get_title_collection, MENU_ENUM_LABE default_title_copy_macro(action_get_title_help, MENU_ENUM_LABEL_VALUE_HELP_LIST) default_title_copy_macro(action_get_title_input_settings, MENU_ENUM_LABEL_VALUE_INPUT_SETTINGS) default_title_copy_macro(action_get_title_cheevos_list, MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_LIST) -default_title_copy_macro(action_get_title_cheevos_list_hardcore, MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_LIST_HARDCORE) default_title_copy_macro(action_get_title_video_shader_parameters,MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PARAMETERS) default_title_copy_macro(action_get_title_video_shader_preset_parameters,MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_PARAMETERS) @@ -1018,9 +1017,6 @@ static int menu_cbs_init_bind_title_compare_label(menu_file_list_cbs_t *cbs, case MENU_LABEL_ACHIEVEMENT_LIST: BIND_ACTION_GET_TITLE(cbs, action_get_title_cheevos_list); break; - case MENU_LABEL_ACHIEVEMENT_LIST_HARDCORE: - BIND_ACTION_GET_TITLE(cbs, action_get_title_cheevos_list_hardcore); - break; case MENU_LABEL_VIDEO_SHADER_PARAMETERS: BIND_ACTION_GET_TITLE(cbs, action_get_title_video_shader_parameters); break; diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 03290e1d8b..61d3ccc919 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -2954,11 +2954,6 @@ static int menu_displaylist_parse_load_content_settings( msg_hash_to_str(MENU_ENUM_LABEL_ACHIEVEMENT_LIST), MENU_ENUM_LABEL_ACHIEVEMENT_LIST, MENU_SETTING_ACTION, 0, 0); - menu_entries_append_enum(info->list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_LIST_HARDCORE), - msg_hash_to_str(MENU_ENUM_LABEL_ACHIEVEMENT_LIST_HARDCORE), - MENU_ENUM_LABEL_ACHIEVEMENT_LIST_HARDCORE, - MENU_SETTING_ACTION, 0, 0); } #endif } @@ -4740,15 +4735,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) case DISPLAYLIST_ACHIEVEMENT_LIST: #ifdef HAVE_CHEEVOS menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - cheevos_populate_menu(info, false); - info->need_push = true; - info->need_refresh = true; -#endif - break; - case DISPLAYLIST_ACHIEVEMENT_LIST_HARDCORE: -#ifdef HAVE_CHEEVOS - menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - cheevos_populate_menu(info, true); + cheevos_populate_menu(info); info->need_push = true; info->need_refresh = true; #endif diff --git a/menu/menu_displaylist.h b/menu/menu_displaylist.h index 9572d5ebf5..9e2294b687 100644 --- a/menu/menu_displaylist.h +++ b/menu/menu_displaylist.h @@ -108,8 +108,7 @@ enum menu_displaylist_ctl_state DISPLAYLIST_NETWORK_INFO, DISPLAYLIST_SYSTEM_INFO, DISPLAYLIST_ACHIEVEMENT_LIST, - DISPLAYLIST_ACHIEVEMENT_LIST_HARDCORE, - DISPLAYLIST_USER_BINDS_LIST, + DISPLAYLIST_USER_BINDS_LIST, DISPLAYLIST_ACCOUNTS_LIST, DISPLAYLIST_DRIVER_SETTINGS_LIST, DISPLAYLIST_VIDEO_SETTINGS_LIST, diff --git a/msg_hash.h b/msg_hash.h index b6a63286f0..8d43407884 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -463,6 +463,7 @@ enum msg_hash_enums MENU_ENUM_LABEL_PLAYLIST_COLLECTION_ENTRY, MENU_LABEL(CHEEVOS_UNLOCKED_ENTRY), + MENU_LABEL(CHEEVOS_UNLOCKED_ENTRY_HARDCORE), MENU_LABEL(CHEEVOS_LOCKED_ENTRY), MENU_ENUM_LABEL_SHADER_PARAMETERS_ENTRY, @@ -1856,7 +1857,6 @@ enum msg_hash_enums #define MENU_LABEL_FRONTEND_COUNTERS 0xe5696877U #define MENU_LABEL_CORE_COUNTERS 0x64cc83e0U #define MENU_LABEL_ACHIEVEMENT_LIST 0x7b90fc49U -#define MENU_LABEL_ACHIEVEMENT_LIST_HARDCORE 0x7c632930U #define MENU_LABEL_CORE_INFORMATION 0xb638e0d3U #define MENU_LABEL_CORE_OPTIONS 0xf65e60f9U #define MENU_LABEL_SHADER_OPTIONS 0x1f7d2fc7U From a6f2e46b6aa36e859045eb48c79d264038d4a9ee Mon Sep 17 00:00:00 2001 From: twinaphex Date: Fri, 24 Nov 2017 06:40:13 +0100 Subject: [PATCH 075/183] Cleanups - don't call path_get so often --- command.c | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/command.c b/command.c index 97f580bc0f..ef15a962cb 100644 --- a/command.c +++ b/command.c @@ -1308,14 +1308,18 @@ static void command_event_restore_default_shader_preset(void) if (!path_is_empty(RARCH_PATH_DEFAULT_SHADER_PRESET)) { /* auto shader preset: reload the original shader */ - settings_t *settings = config_get_ptr(); + settings_t *settings = config_get_ptr(); + const char *shader_preset = path_get(RARCH_PATH_DEFAULT_SHADER_PRESET); - RARCH_LOG("%s %s\n", - msg_hash_to_str(MSG_RESTORING_DEFAULT_SHADER_PRESET_TO), - path_get(RARCH_PATH_DEFAULT_SHADER_PRESET)); - strlcpy(settings->paths.path_shader, - path_get(RARCH_PATH_DEFAULT_SHADER_PRESET), - sizeof(settings->paths.path_shader)); + if (!string_is_empty(shader_preset)) + { + RARCH_LOG("%s %s\n", + msg_hash_to_str(MSG_RESTORING_DEFAULT_SHADER_PRESET_TO), + shader_preset); + strlcpy(settings->paths.path_shader, + shader_preset, + sizeof(settings->paths.path_shader)); + } } path_clear(RARCH_PATH_DEFAULT_SHADER_PRESET); @@ -1416,6 +1420,7 @@ static bool command_event_save_core_config(void) bool ret = false; bool found_path = false; bool overrides_active = false; + const char *core_path = NULL; char *config_dir = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); char *config_name = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); char *config_path = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); @@ -1438,8 +1443,10 @@ static bool command_event_save_core_config(void) goto error; } + core_path = path_get(RARCH_PATH_CORE); + /* Infer file name based on libretro core. */ - if (!string_is_empty(path_get(RARCH_PATH_CORE)) && path_file_exists(path_get(RARCH_PATH_CORE))) + if (!string_is_empty(core_path) && path_file_exists(core_path)) { unsigned i; RARCH_LOG("%s\n", msg_hash_to_str(MSG_USING_CORE_NAME_FOR_NEW_CONFIG)); @@ -1451,7 +1458,7 @@ static bool command_event_save_core_config(void) fill_pathname_base_noext( config_name, - path_get(RARCH_PATH_CORE), + core_path, config_size); fill_pathname_join(config_path, config_dir, config_name, @@ -1745,16 +1752,18 @@ bool command_event(enum event_command cmd, void *data) core_info_ctx_find_t info_find; rarch_system_info_t *system_info = runloop_get_system_info(); struct retro_system_info *system = &system_info->info; + const char *core_path = path_get(RARCH_PATH_CORE); #if defined(HAVE_DYNAMIC) - if (string_is_empty(path_get(RARCH_PATH_CORE))) + if (string_is_empty(core_path)) return false; #endif + libretro_get_system_info( - path_get(RARCH_PATH_CORE), + core_path, system, &system_info->load_no_content); - info_find.path = path_get(RARCH_PATH_CORE); + info_find.path = core_path; if (!core_info_load(&info_find)) { From 2916e6c7acf47d30c1d2ac3bf82e9c9d84b70fb3 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Fri, 24 Nov 2017 06:45:21 +0100 Subject: [PATCH 076/183] Cleanups --- configuration.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/configuration.c b/configuration.c index 513d9a6f0c..0154dcd8cc 100644 --- a/configuration.c +++ b/configuration.c @@ -2265,6 +2265,8 @@ static bool config_load_file(const char *path, bool set_defaults, #ifdef HAVE_NETWORKING char *override_netplay_ip_address = NULL; #endif + const char *path_core = NULL; + const char *path_config = NULL; int bool_settings_size = sizeof(settings->bools) / sizeof(settings->bools.placeholder); int float_settings_size = sizeof(settings->floats) / sizeof(settings->floats.placeholder); int int_settings_size = sizeof(settings->ints) / sizeof(settings->ints.placeholder); @@ -2537,13 +2539,16 @@ static bool config_load_file(const char *path, bool set_defaults, audio_set_float(AUDIO_ACTION_VOLUME_GAIN, settings->floats.audio_volume); audio_set_float(AUDIO_ACTION_MIXER_VOLUME_GAIN, settings->floats.audio_mixer_volume); + path_config = path_get(RARCH_PATH_CONFIG); + path_core = path_get(RARCH_PATH_CORE); + if (string_is_empty(settings->paths.path_content_history)) { if (string_is_empty(settings->paths.directory_content_history)) { fill_pathname_resolve_relative( settings->paths.path_content_history, - path_get(RARCH_PATH_CONFIG), + path_config, file_path_str(FILE_PATH_CONTENT_HISTORY), sizeof(settings->paths.path_content_history)); } @@ -2562,7 +2567,7 @@ static bool config_load_file(const char *path, bool set_defaults, { fill_pathname_resolve_relative( settings->paths.path_content_favorites, - path_get(RARCH_PATH_CONFIG), + path_config, file_path_str(FILE_PATH_CONTENT_FAVORITES), sizeof(settings->paths.path_content_favorites)); } @@ -2581,7 +2586,7 @@ static bool config_load_file(const char *path, bool set_defaults, { fill_pathname_resolve_relative( settings->paths.path_content_music_history, - path_get(RARCH_PATH_CONFIG), + path_config, file_path_str(FILE_PATH_CONTENT_MUSIC_HISTORY), sizeof(settings->paths.path_content_music_history)); } @@ -2600,7 +2605,7 @@ static bool config_load_file(const char *path, bool set_defaults, { fill_pathname_resolve_relative( settings->paths.path_content_video_history, - path_get(RARCH_PATH_CONFIG), + path_config, file_path_str(FILE_PATH_CONTENT_VIDEO_HISTORY), sizeof(settings->paths.path_content_video_history)); } @@ -2619,7 +2624,7 @@ static bool config_load_file(const char *path, bool set_defaults, { fill_pathname_resolve_relative( settings->paths.path_content_image_history, - path_get(RARCH_PATH_CONFIG), + path_config, file_path_str(FILE_PATH_CONTENT_IMAGE_HISTORY), sizeof(settings->paths.path_content_image_history)); } @@ -2645,14 +2650,14 @@ static bool config_load_file(const char *path, bool set_defaults, } #ifdef RARCH_CONSOLE - if (!string_is_empty(path_get(RARCH_PATH_CORE))) + if (!string_is_empty(path_core)) { #endif /* Safe-guard against older behavior. */ - if (path_is_directory(path_get(RARCH_PATH_CORE))) + if (path_is_directory(path_core)) { RARCH_WARN("\"libretro_path\" is a directory, using this for \"libretro_directory\" instead.\n"); - strlcpy(settings->paths.directory_libretro, path_get(RARCH_PATH_CORE), + strlcpy(settings->paths.directory_libretro, path_core, sizeof(settings->paths.directory_libretro)); path_clear(RARCH_PATH_CORE); } @@ -2693,9 +2698,7 @@ static bool config_load_file(const char *path, bool set_defaults, *settings->paths.directory_system = '\0'; if (settings->floats.slowmotion_ratio < 1.0f) - { configuration_set_float(settings, settings->floats.slowmotion_ratio, 1.0f); - } /* Sanitize fastforward_ratio value - previously range was -1 * and up (with 0 being skipped) */ From 5294d43bf14da5b928b99242ae26233525d76d46 Mon Sep 17 00:00:00 2001 From: David Walters Date: Fri, 24 Nov 2017 09:28:26 +0000 Subject: [PATCH 077/183] use C89 compatible comment style --- input/input_driver.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/input/input_driver.h b/input/input_driver.h index 3eb2aac36a..ad5f02a89a 100644 --- a/input/input_driver.h +++ b/input/input_driver.h @@ -334,7 +334,7 @@ int16_t input_state(unsigned port, unsigned device, unsigned idx, unsigned id); typedef struct { - uint32_t bank[ 4 ]; // 128 bits + uint32_t bank[ 4 ]; /* 128 bits */ } rarch_input_state_t; #define RARCH_INPUT_STATE_BIT_SET(a, bit) ((a).bank[((bit) >> 5)&3] |= (1 << ((bit) & 31))) From 5be79214458033be301e63a9243bff630826cf8d Mon Sep 17 00:00:00 2001 From: David Walters Date: Fri, 24 Nov 2017 11:19:17 +0000 Subject: [PATCH 078/183] reimplement using retro_bits_t; pass by ref; raise bind limit to 256 --- input/input_driver.c | 36 ++++++++++++++--------------- input/input_driver.h | 35 ++++++++++++++++------------ menu/menu_event.c | 54 ++++++++++++++++++++++---------------------- menu/menu_event.h | 2 +- retroarch.c | 52 ++++++++++++++++++++++-------------------- 5 files changed, 94 insertions(+), 85 deletions(-) diff --git a/input/input_driver.c b/input/input_driver.c index 42815ca326..bfe1a32c4c 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -780,11 +780,10 @@ void state_tracker_update_input(uint16_t *input1, uint16_t *input2) * * Returns: Input sample containing a mask of all pressed keys. */ -rarch_input_state_t input_menu_keys_pressed(void *data, rarch_input_state_t last_input) +void input_menu_keys_pressed(void *data, retro_bits_t* p_new_state) { unsigned i, port; rarch_joypad_info_t joypad_info; - rarch_input_state_t new_state = {0}; const struct retro_keybind *binds[MAX_USERS] = {NULL}; settings_t *settings = (settings_t*)data; const struct retro_keybind *binds_norm = NULL; @@ -794,6 +793,8 @@ rarch_input_state_t input_menu_keys_pressed(void *data, rarch_input_state_t last settings->bools.input_all_users_control_menu ? max_users : 1; + RARCH_INPUT_STATE_CLEAR_PTR( p_new_state ); + input_driver_block_libretro_input = false; input_driver_block_hotkey = false; @@ -894,7 +895,7 @@ rarch_input_state_t input_menu_keys_pressed(void *data, rarch_input_state_t last if (pressed) { - RARCH_INPUT_STATE_BIT_SET(new_state, i); + RARCH_INPUT_STATE_BIT_SET_PTR(p_new_state, i); continue; } } @@ -904,7 +905,7 @@ rarch_input_state_t input_menu_keys_pressed(void *data, rarch_input_state_t last { if (current_input->meta_key_pressed(current_input_data, i)) { - RARCH_INPUT_STATE_BIT_SET(new_state, i); + RARCH_INPUT_STATE_BIT_SET_PTR(p_new_state, i); continue; } } @@ -912,7 +913,7 @@ rarch_input_state_t input_menu_keys_pressed(void *data, rarch_input_state_t last #ifdef HAVE_OVERLAY if (overlay_ptr && input_overlay_key_pressed(overlay_ptr, i)) { - RARCH_INPUT_STATE_BIT_SET(new_state, i); + RARCH_INPUT_STATE_BIT_SET_PTR(p_new_state, i); continue; } #endif @@ -927,7 +928,7 @@ rarch_input_state_t input_menu_keys_pressed(void *data, rarch_input_state_t last if (command_get(&handle)) { - RARCH_INPUT_STATE_BIT_SET(new_state, i); + RARCH_INPUT_STATE_BIT_SET_PTR(p_new_state, i); continue; } } @@ -936,7 +937,7 @@ rarch_input_state_t input_menu_keys_pressed(void *data, rarch_input_state_t last #ifdef HAVE_NETWORKGAMEPAD if (input_driver_remote && input_remote_key_pressed(i, 0)) { - RARCH_INPUT_STATE_BIT_SET(new_state, i); + RARCH_INPUT_STATE_BIT_SET_PTR(p_new_state, i); continue; } #endif @@ -991,11 +992,9 @@ rarch_input_state_t input_menu_keys_pressed(void *data, rarch_input_state_t last { if (current_input->input_state(current_input_data, joypad_info, binds, 0, RETRO_DEVICE_KEYBOARD, 0, ids[i][0])) - RARCH_INPUT_STATE_BIT_SET(new_state, ids[i][1]); + RARCH_INPUT_STATE_BIT_SET_PTR(p_new_state, ids[i][1]); } } - - return new_state; } #endif @@ -1006,11 +1005,10 @@ rarch_input_state_t input_menu_keys_pressed(void *data, rarch_input_state_t last * * Returns: Input sample containing a mask of all pressed keys. */ -rarch_input_state_t input_keys_pressed(void *data, rarch_input_state_t last_input) +void input_keys_pressed(void *data, retro_bits_t* p_new_state) { unsigned i; rarch_joypad_info_t joypad_info; - rarch_input_state_t new_state = {0}; settings_t *settings = (settings_t*)data; const struct retro_keybind *binds = input_config_binds[0]; const struct retro_keybind *binds_auto = &input_autoconf_binds[0][RARCH_ENABLE_HOTKEY]; @@ -1021,6 +1019,8 @@ rarch_input_state_t input_keys_pressed(void *data, rarch_input_state_t last_inpu const struct retro_keybind *enable_hotkey = &input_config_binds[0][RARCH_ENABLE_HOTKEY]; bool game_focus_toggle_valid = false; + RARCH_INPUT_STATE_CLEAR_PTR( p_new_state ); + joypad_info.joy_idx = settings->uints.input_joypad_map[0]; joypad_info.auto_binds = input_autoconf_binds[joypad_info.joy_idx]; joypad_info.axis_threshold = input_driver_axis_threshold; @@ -1065,7 +1065,7 @@ rarch_input_state_t input_keys_pressed(void *data, rarch_input_state_t last_inpu 0, RETRO_DEVICE_JOYPAD, 0, i) ) { - RARCH_INPUT_STATE_BIT_SET(new_state, i); + RARCH_INPUT_STATE_BIT_SET_PTR(p_new_state, i); continue; } @@ -1073,7 +1073,7 @@ rarch_input_state_t input_keys_pressed(void *data, rarch_input_state_t last_inpu current_input->meta_key_pressed(current_input_data, i) ) { - RARCH_INPUT_STATE_BIT_SET(new_state, i); + RARCH_INPUT_STATE_BIT_SET_PTR(p_new_state, i); continue; } @@ -1081,7 +1081,7 @@ rarch_input_state_t input_keys_pressed(void *data, rarch_input_state_t last_inpu if (overlay_ptr && input_overlay_key_pressed(overlay_ptr, i)) { - RARCH_INPUT_STATE_BIT_SET(new_state, i); + RARCH_INPUT_STATE_BIT_SET_PTR(p_new_state, i); continue; } #endif @@ -1096,7 +1096,7 @@ rarch_input_state_t input_keys_pressed(void *data, rarch_input_state_t last_inpu if (command_get(&handle)) { - RARCH_INPUT_STATE_BIT_SET(new_state, i); + RARCH_INPUT_STATE_BIT_SET_PTR(p_new_state, i); continue; } } @@ -1106,13 +1106,11 @@ rarch_input_state_t input_keys_pressed(void *data, rarch_input_state_t last_inpu if (input_driver_remote && input_remote_key_pressed(i, 0)) { - RARCH_INPUT_STATE_BIT_SET(new_state, i); + RARCH_INPUT_STATE_BIT_SET_PTR(p_new_state, i); continue; } #endif } - - return new_state; } diff --git a/input/input_driver.h b/input/input_driver.h index ad5f02a89a..d760e6fe43 100644 --- a/input/input_driver.h +++ b/input/input_driver.h @@ -30,6 +30,7 @@ #include #include #include +#include #include "input_defines.h" @@ -333,24 +334,30 @@ void input_poll(void); int16_t input_state(unsigned port, unsigned device, unsigned idx, unsigned id); -typedef struct { - uint32_t bank[ 4 ]; /* 128 bits */ -} rarch_input_state_t; - -#define RARCH_INPUT_STATE_BIT_SET(a, bit) ((a).bank[((bit) >> 5)&3] |= (1 << ((bit) & 31))) -#define RARCH_INPUT_STATE_BIT_GET(a, bit) ((a).bank[((bit) >> 5)&3] & (1 << ((bit) & 31))) -#define RARCH_INPUT_STATE_CLEAR(a) memset(&(a), 0, sizeof(a)); -#define RARCH_INPUT_STATE_ANY_SET(a) (((a).bank[0])||((a).bank[1])||((a).bank[2])||((a).bank[3])) +#define RARCH_INPUT_STATE_BIT_SET(a,bit) ((a).data [((bit) >> 5)] |= (1 << ((bit) & 31))) +#define RARCH_INPUT_STATE_BIT_SET_PTR(a,bit) ((a)->data[((bit) >> 5)] |= (1 << ((bit) & 31))) +#define RARCH_INPUT_STATE_BIT_GET(a,bit) ((a).data [((bit) >> 5)] & (1 << ((bit) & 31))) +#define RARCH_INPUT_STATE_BIT_GET_PTR(a,bit) ((a)->data[((bit) >> 5)] & (1 << ((bit) & 31))) +#define RARCH_INPUT_STATE_CLEAR(a) memset(&a, 0, sizeof(a)); +#define RARCH_INPUT_STATE_CLEAR_PTR(a) memset(a, 0, sizeof(retro_bits_t)); +#define RARCH_INPUT_STATE_ANY_SET(a) ( ((a).data[0])||((a).data[1])||((a).data[2])||((a).data[3])|| \ + ((a).data[4])||((a).data[5])||((a).data[6])||((a).data[7]) ) +#define RARCH_INPUT_STATE_ANY_SET_PTR(a) ( ((a)->data[0])||((a)->data[1])||((a)->data[2])||((a)->data[3])|| \ + ((a)->data[4])||((a)->data[5])||((a)->data[6])||((a)->data[7]) ) #define RARCH_INPUT_STATE_CLEAR_BITS(a,b) \ - ((a).bank[0])&=(~((b).bank[0])); \ - ((a).bank[1])&=(~((b).bank[1])); \ - ((a).bank[2])&=(~((b).bank[2])); \ - ((a).bank[3])&=(~((b).bank[3])); + ((a).data[0])&=(~((b).data[0])); \ + ((a).data[1])&=(~((b).data[1])); \ + ((a).data[2])&=(~((b).data[2])); \ + ((a).data[3])&=(~((b).data[3])); \ + ((a).data[4])&=(~((b).data[4])); \ + ((a).data[5])&=(~((b).data[5])); \ + ((a).data[6])&=(~((b).data[6])); \ + ((a).data[7])&=(~((b).data[7])); -rarch_input_state_t input_keys_pressed(void *data, rarch_input_state_t last_input); +void input_keys_pressed(void *data, retro_bits_t* new_state); #ifdef HAVE_MENU -rarch_input_state_t input_menu_keys_pressed(void *data, rarch_input_state_t last_input); +void input_menu_keys_pressed(void *data, retro_bits_t* new_state); #endif void *input_driver_get_data(void); diff --git a/menu/menu_event.c b/menu/menu_event.c index eea6d23866..c8fe862dbb 100644 --- a/menu/menu_event.c +++ b/menu/menu_event.c @@ -137,7 +137,7 @@ void menu_event_kb_set(bool down, enum retro_key key) * entire button state either but do a separate event per button * state. */ -unsigned menu_event(rarch_input_state_t input, rarch_input_state_t trigger_input) +unsigned menu_event(retro_bits_t* p_input, retro_bits_t* p_trigger_input) { menu_animation_ctx_delta_t delta; float delta_time; @@ -160,12 +160,12 @@ unsigned menu_event(rarch_input_state_t input, rarch_input_state_t trigger_input unsigned menu_cancel_btn = (!input_swap_override && settings->bools.input_menu_swap_ok_cancel_buttons) ? RETRO_DEVICE_ID_JOYPAD_A : RETRO_DEVICE_ID_JOYPAD_B; - unsigned ok_current = RARCH_INPUT_STATE_BIT_GET( input, menu_ok_btn ); + unsigned ok_current = RARCH_INPUT_STATE_BIT_GET_PTR(p_input, menu_ok_btn ); unsigned ok_trigger = ok_current & ~ok_old; ok_old = ok_current; - if (RARCH_INPUT_STATE_ANY_SET(input)) + if (RARCH_INPUT_STATE_ANY_SET_PTR(p_input)) { if (!first_held) { @@ -189,7 +189,7 @@ unsigned menu_event(rarch_input_state_t input, rarch_input_state_t trigger_input set_scroll = true; first_held = false; - trigger_input.bank[0] |= input.bank[0] & input_repeat; + p_trigger_input->data[0] |= p_input->data[0] & input_repeat; menu_driver_ctl(MENU_NAVIGATION_CTL_GET_SCROLL_ACCEL, &new_scroll_accel); @@ -221,31 +221,31 @@ unsigned menu_event(rarch_input_state_t input, rarch_input_state_t trigger_input { menu_event_osk_iterate(); - if (RARCH_INPUT_STATE_BIT_GET(trigger_input, RETRO_DEVICE_ID_JOYPAD_DOWN)) + if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_DOWN)) { if (menu_event_get_osk_ptr() < 33) menu_event_set_osk_ptr(menu_event_get_osk_ptr() + OSK_CHARS_PER_LINE); } - if (RARCH_INPUT_STATE_BIT_GET(trigger_input, RETRO_DEVICE_ID_JOYPAD_UP)) + if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_UP)) { if (menu_event_get_osk_ptr() >= OSK_CHARS_PER_LINE) menu_event_set_osk_ptr(menu_event_get_osk_ptr() - OSK_CHARS_PER_LINE); } - if (RARCH_INPUT_STATE_BIT_GET(trigger_input, RETRO_DEVICE_ID_JOYPAD_RIGHT)) + if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_RIGHT)) { if (menu_event_get_osk_ptr() < 43) menu_event_set_osk_ptr(menu_event_get_osk_ptr() + 1); } - if (RARCH_INPUT_STATE_BIT_GET(trigger_input, RETRO_DEVICE_ID_JOYPAD_LEFT)) + if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_LEFT)) { if (menu_event_get_osk_ptr() >= 1) menu_event_set_osk_ptr(menu_event_get_osk_ptr() - 1); } - if (RARCH_INPUT_STATE_BIT_GET(trigger_input, RETRO_DEVICE_ID_JOYPAD_L)) + if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_L)) { if (menu_event_get_osk_idx() > OSK_TYPE_UNKNOWN + 1) menu_event_set_osk_idx((enum osk_type)(menu_event_get_osk_idx() - 1)); @@ -253,7 +253,7 @@ unsigned menu_event(rarch_input_state_t input, rarch_input_state_t trigger_input menu_event_set_osk_idx((enum osk_type)(OSK_TYPE_LAST - 1)); } - if (RARCH_INPUT_STATE_BIT_GET(trigger_input, RETRO_DEVICE_ID_JOYPAD_R)) + if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_R)) { if (menu_event_get_osk_idx() < OSK_TYPE_LAST - 1) menu_event_set_osk_idx((enum osk_type)(menu_event_get_osk_idx() + 1)); @@ -261,50 +261,50 @@ unsigned menu_event(rarch_input_state_t input, rarch_input_state_t trigger_input menu_event_set_osk_idx((enum osk_type)(OSK_TYPE_UNKNOWN + 1)); } - if (RARCH_INPUT_STATE_BIT_GET(trigger_input, menu_ok_btn)) + if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, menu_ok_btn)) { if (menu_event_get_osk_ptr() >= 0) menu_event_osk_append(menu_event_get_osk_ptr()); } - if (RARCH_INPUT_STATE_BIT_GET(trigger_input, menu_cancel_btn)) + if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, menu_cancel_btn)) { input_keyboard_event(true, '\x7f', '\x7f', 0, RETRO_DEVICE_KEYBOARD); } /* send return key to close keyboard input window */ - if (RARCH_INPUT_STATE_BIT_GET(trigger_input, RETRO_DEVICE_ID_JOYPAD_START)) + if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_START)) input_keyboard_event(true, '\n', '\n', 0, RETRO_DEVICE_KEYBOARD); - RARCH_INPUT_STATE_CLEAR(trigger_input); + RARCH_INPUT_STATE_CLEAR_PTR(p_trigger_input); } else { - if (RARCH_INPUT_STATE_BIT_GET(trigger_input, RETRO_DEVICE_ID_JOYPAD_UP)) + if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_UP)) ret = MENU_ACTION_UP; - else if (RARCH_INPUT_STATE_BIT_GET(trigger_input, RETRO_DEVICE_ID_JOYPAD_DOWN)) + else if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_DOWN)) ret = MENU_ACTION_DOWN; - else if (RARCH_INPUT_STATE_BIT_GET(trigger_input, RETRO_DEVICE_ID_JOYPAD_LEFT)) + else if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_LEFT)) ret = MENU_ACTION_LEFT; - else if (RARCH_INPUT_STATE_BIT_GET(trigger_input, RETRO_DEVICE_ID_JOYPAD_RIGHT)) + else if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_RIGHT)) ret = MENU_ACTION_RIGHT; - else if (RARCH_INPUT_STATE_BIT_GET(trigger_input, RETRO_DEVICE_ID_JOYPAD_L)) + else if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_L)) ret = MENU_ACTION_SCROLL_UP; - else if (RARCH_INPUT_STATE_BIT_GET(trigger_input, RETRO_DEVICE_ID_JOYPAD_R)) + else if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_R)) ret = MENU_ACTION_SCROLL_DOWN; else if (ok_trigger) ret = MENU_ACTION_OK; - else if (RARCH_INPUT_STATE_BIT_GET(trigger_input, menu_cancel_btn)) + else if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, menu_cancel_btn)) ret = MENU_ACTION_CANCEL; - else if (RARCH_INPUT_STATE_BIT_GET(trigger_input, RETRO_DEVICE_ID_JOYPAD_X)) + else if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_X)) ret = MENU_ACTION_SEARCH; - else if (RARCH_INPUT_STATE_BIT_GET(trigger_input, RETRO_DEVICE_ID_JOYPAD_Y)) + else if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_Y)) ret = MENU_ACTION_SCAN; - else if (RARCH_INPUT_STATE_BIT_GET(trigger_input, RETRO_DEVICE_ID_JOYPAD_START)) + else if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_START)) ret = MENU_ACTION_START; - else if (RARCH_INPUT_STATE_BIT_GET(trigger_input, RETRO_DEVICE_ID_JOYPAD_SELECT)) + else if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_SELECT)) ret = MENU_ACTION_INFO; - else if (RARCH_INPUT_STATE_BIT_GET(trigger_input, RARCH_MENU_TOGGLE)) + else if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RARCH_MENU_TOGGLE)) ret = MENU_ACTION_TOGGLE; } @@ -314,7 +314,7 @@ unsigned menu_event(rarch_input_state_t input, rarch_input_state_t trigger_input menu_event_kb_set_internal(RETROK_F11, 0); } - if (runloop_cmd_press(trigger_input, RARCH_QUIT_KEY)) + if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RARCH_QUIT_KEY)) return MENU_ACTION_QUIT; mouse_enabled = settings->bools.menu_mouse_enable; diff --git a/menu/menu_event.h b/menu/menu_event.h index 4d9535d16b..25d59c0991 100644 --- a/menu/menu_event.h +++ b/menu/menu_event.h @@ -44,7 +44,7 @@ RETRO_BEGIN_DECLS * entire button state either but do a separate event per button * state. */ -unsigned menu_event(rarch_input_state_t input, rarch_input_state_t trigger_state); +unsigned menu_event(retro_bits_t* p_input, retro_bits_t* p_trigger_state); /* Set a specific keyboard key. * diff --git a/retroarch.c b/retroarch.c index 3565f87b7a..4158adbbca 100644 --- a/retroarch.c +++ b/retroarch.c @@ -2310,40 +2310,40 @@ bool runloop_msg_queue_pull(const char **ret) #ifdef HAVE_MENU static bool input_driver_toggle_button_combo( - unsigned mode, rarch_input_state_t input) + unsigned mode, retro_bits_t* p_input) { switch (mode) { case INPUT_TOGGLE_DOWN_Y_L_R: - if (!RARCH_INPUT_STATE_BIT_GET(input, RETRO_DEVICE_ID_JOYPAD_DOWN)) + if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_DOWN)) return false; - if (!RARCH_INPUT_STATE_BIT_GET(input, RETRO_DEVICE_ID_JOYPAD_Y)) + if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_Y)) return false; - if (!RARCH_INPUT_STATE_BIT_GET(input, RETRO_DEVICE_ID_JOYPAD_L)) + if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_L)) return false; - if (!RARCH_INPUT_STATE_BIT_GET(input, RETRO_DEVICE_ID_JOYPAD_R)) + if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_R)) return false; break; case INPUT_TOGGLE_L3_R3: - if (!RARCH_INPUT_STATE_BIT_GET(input, RETRO_DEVICE_ID_JOYPAD_L3)) + if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_L3)) return false; - if (!RARCH_INPUT_STATE_BIT_GET(input, RETRO_DEVICE_ID_JOYPAD_R3)) + if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_R3)) return false; break; case INPUT_TOGGLE_L1_R1_START_SELECT: - if (!RARCH_INPUT_STATE_BIT_GET(input, RETRO_DEVICE_ID_JOYPAD_START)) + if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_START)) return false; - if (!RARCH_INPUT_STATE_BIT_GET(input, RETRO_DEVICE_ID_JOYPAD_SELECT)) + if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_SELECT)) return false; - if (!RARCH_INPUT_STATE_BIT_GET(input, RETRO_DEVICE_ID_JOYPAD_L)) + if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_L)) return false; - if (!RARCH_INPUT_STATE_BIT_GET(input, RETRO_DEVICE_ID_JOYPAD_R)) + if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_R)) return false; break; case INPUT_TOGGLE_START_SELECT: - if (!RARCH_INPUT_STATE_BIT_GET(input, RETRO_DEVICE_ID_JOYPAD_START)) + if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_START)) return false; - if (!RARCH_INPUT_STATE_BIT_GET(input, RETRO_DEVICE_ID_JOYPAD_SELECT)) + if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_SELECT)) return false; break; default: @@ -2360,7 +2360,7 @@ static enum runloop_state runloop_check_state( bool input_nonblock_state, unsigned *sleep_ms) { - static rarch_input_state_t last_input = {0}; + static retro_bits_t last_input = {0}; static bool old_fs_toggle_pressed= false; static bool old_focus = true; bool is_focused = false; @@ -2372,13 +2372,17 @@ static enum runloop_state runloop_check_state( #ifdef HAVE_MENU bool menu_driver_binding_state = menu_driver_is_binding_state(); bool menu_is_alive = menu_driver_is_alive(); - rarch_input_state_t current_input = - menu_is_alive && !(settings->bools.menu_unified_controls && !menu_input_dialog_get_display_kb())? - input_menu_keys_pressed(settings, last_input) : - input_keys_pressed(settings, last_input); + + retro_bits_t current_input; + + if ( menu_is_alive && !(settings->bools.menu_unified_controls && !menu_input_dialog_get_display_kb()) ) + input_menu_keys_pressed(settings, ¤t_input); + else + input_keys_pressed(settings, ¤t_input); + #else - uint64_t current_input = - input_keys_pressed(settings, last_input); + retro_bits_t current_input; + input_keys_pressed(settings, ¤t_input); #endif last_input = current_input; @@ -2386,7 +2390,7 @@ static enum runloop_state runloop_check_state( if ( ((settings->uints.input_menu_toggle_gamepad_combo != INPUT_TOGGLE_NONE) && input_driver_toggle_button_combo( - settings->uints.input_menu_toggle_gamepad_combo, last_input))) + settings->uints.input_menu_toggle_gamepad_combo, &last_input))) { RARCH_INPUT_STATE_BIT_SET(current_input, RARCH_MENU_TOGGLE); } @@ -2529,20 +2533,20 @@ static enum runloop_state runloop_check_state( #ifdef HAVE_MENU if (menu_is_alive) { - static rarch_input_state_t old_input = {0}; + static retro_bits_t old_input = {0}; menu_ctx_iterate_t iter; retro_ctx.poll_cb(); { - rarch_input_state_t trigger_input; + retro_bits_t trigger_input; enum menu_action action; bool focused; trigger_input = current_input; RARCH_INPUT_STATE_CLEAR_BITS( trigger_input, old_input ); - action = (enum menu_action)menu_event(current_input, trigger_input); + action = (enum menu_action)menu_event(¤t_input, &trigger_input); focused = pause_nonactive ? is_focused : true; focused = focused && !ui_companion_is_on_foreground(); From 88e84d1c7953a8c8f84ad670e81634f4ff99c884 Mon Sep 17 00:00:00 2001 From: radius Date: Fri, 24 Nov 2017 08:40:29 -0500 Subject: [PATCH 079/183] fix a mistake I made when rewriting this code --- cheevos/cheevos.c | 47 +++++++++++++++++++++++++---------------------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c index fc8a21ff1a..b2cf87154b 100644 --- a/cheevos/cheevos.c +++ b/cheevos/cheevos.c @@ -2194,29 +2194,32 @@ void cheevos_populate_menu(void *data) end = cheevos_locals.unofficial.cheevos + cheevos_locals.unofficial.count; - if (!(cheevo->active & CHEEVOS_ACTIVE_HARDCORE)) + for (i = cheevos_locals.core.count; cheevo < end; i++, cheevo++) { - menu_entries_append_enum(info->list, cheevo->title, - cheevo->description, MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY_HARDCORE, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); - items_found++; - set_badge_info(&badges_ctx, i, cheevo->badge, (cheevo->active & CHEEVOS_ACTIVE_HARDCORE)); - } - else if (!(cheevo->active & CHEEVOS_ACTIVE_SOFTCORE)) - { - menu_entries_append_enum(info->list, cheevo->title, - cheevo->description, MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); - items_found++; - set_badge_info(&badges_ctx, i, cheevo->badge, (cheevo->active & CHEEVOS_ACTIVE_SOFTCORE)); - } - else - { - menu_entries_append_enum(info->list, cheevo->title, - cheevo->description, MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); - items_found++; - set_badge_info(&badges_ctx, i, cheevo->badge, (cheevo->active & CHEEVOS_ACTIVE_SOFTCORE)); + if (!(cheevo->active & CHEEVOS_ACTIVE_HARDCORE)) + { + menu_entries_append_enum(info->list, cheevo->title, + cheevo->description, MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY_HARDCORE, + MENU_SETTINGS_CHEEVOS_START + i, 0, 0); + items_found++; + set_badge_info(&badges_ctx, i, cheevo->badge, (cheevo->active & CHEEVOS_ACTIVE_HARDCORE)); + } + else if (!(cheevo->active & CHEEVOS_ACTIVE_SOFTCORE)) + { + menu_entries_append_enum(info->list, cheevo->title, + cheevo->description, MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY, + MENU_SETTINGS_CHEEVOS_START + i, 0, 0); + items_found++; + set_badge_info(&badges_ctx, i, cheevo->badge, (cheevo->active & CHEEVOS_ACTIVE_SOFTCORE)); + } + else + { + menu_entries_append_enum(info->list, cheevo->title, + cheevo->description, MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY, + MENU_SETTINGS_CHEEVOS_START + i, 0, 0); + items_found++; + set_badge_info(&badges_ctx, i, cheevo->badge, (cheevo->active & CHEEVOS_ACTIVE_SOFTCORE)); + } } } From f952f392b8cab4418ec5971064c6475856a4f9f5 Mon Sep 17 00:00:00 2001 From: orbea Date: Fri, 24 Nov 2017 07:14:38 -0800 Subject: [PATCH 080/183] qb: Use printf and better quoting in the check_lib function. --- qb/qb.libs.sh | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/qb/qb.libs.sh b/qb/qb.libs.sh index 24edb84ef6..f6073981da 100644 --- a/qb/qb.libs.sh +++ b/qb/qb.libs.sh @@ -17,7 +17,7 @@ add_library_dirs() } check_lib() # $1 = language $2 = HAVE_$2 $3 = lib $4 = function in lib $5 = extralibs $6 = headers $7 = critical error message [checked only if non-empty] -{ tmpval="$(eval echo \$HAVE_$2)" +{ tmpval="$(eval "printf %s \"\$HAVE_$2\"")" [ "$tmpval" = 'no' ] && return 0 if [ "$1" = cxx ]; then @@ -35,11 +35,11 @@ check_lib() # $1 = language $2 = HAVE_$2 $3 = lib $4 = function in lib $5 = if [ "$6" ]; then printf %s\\n "$6" "int main(void) { void *p = (void*)$4; return 0; }" > "$TEMP_CODE" else - echo "$TEST_C" > "$TEMP_CODE" + printf %s\\n "$TEST_C" > "$TEMP_CODE" fi else ECHOBUF="Checking existence of ${3% }" - echo "int main(void) { return 0; }" > "$TEMP_CODE" + printf %s\\n 'int main(void) { return 0; }' > "$TEMP_CODE" fi answer='no' "$COMPILER" -o \ @@ -51,7 +51,8 @@ check_lib() # $1 = language $2 = HAVE_$2 $3 = lib $4 = function in lib $5 = $CFLAGS \ $LDFLAGS \ $(printf %s "$3") >>config.log 2>&1 && answer='yes' - eval HAVE_$2="$answer"; echo "$ECHOBUF ... $answer" + eval "HAVE_$2=\"$answer\"" + printf %s\\n "$ECHOBUF ... $answer" rm -f -- "$TEMP_CODE" "$TEMP_EXE" [ "$answer" = 'no' ] && { From fbbaf7d5b1af0271bcf5784949058fd57ed4322d Mon Sep 17 00:00:00 2001 From: orbea Date: Fri, 24 Nov 2017 07:20:42 -0800 Subject: [PATCH 081/183] qb: Check which c language is being used in its own function. --- qb/qb.libs.sh | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/qb/qb.libs.sh b/qb/qb.libs.sh index f6073981da..29154de188 100644 --- a/qb/qb.libs.sh +++ b/qb/qb.libs.sh @@ -16,19 +16,23 @@ add_library_dirs() LIBRARY_DIRS="${LIBRARY_DIRS# }" } +check_compiler() # $1 = language $2 = function in lib +{ if [ "$1" = cxx ]; then + COMPILER="$CXX" + TEMP_CODE="$TEMP_CXX" + TEST_C="extern \"C\" { void $2(void); } int main() { $2(); }" + else + COMPILER="$CC" + TEMP_CODE="$TEMP_C" + TEST_C="void $2(void); int main(void) { $2(); return 0; }" + fi +} + check_lib() # $1 = language $2 = HAVE_$2 $3 = lib $4 = function in lib $5 = extralibs $6 = headers $7 = critical error message [checked only if non-empty] { tmpval="$(eval "printf %s \"\$HAVE_$2\"")" [ "$tmpval" = 'no' ] && return 0 - if [ "$1" = cxx ]; then - COMPILER="$CXX" - TEMP_CODE="$TEMP_CXX" - TEST_C="extern \"C\" { void $4(void); } int main() { $4(); }" - else - COMPILER="$CC" - TEMP_CODE="$TEMP_C" - TEST_C="void $4(void); int main(void) { $4(); return 0; }" - fi + check_compiler "$1" "$4" if [ "$4" ]; then ECHOBUF="Checking function $4 in ${3% }" From 0c9308cd87681076a472ff0b83a682a9d51bfad4 Mon Sep 17 00:00:00 2001 From: orbea Date: Fri, 24 Nov 2017 08:00:34 -0800 Subject: [PATCH 082/183] qb: Remove unused and redundant check_code_c and check_code_cxx functions. --- qb/qb.libs.sh | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/qb/qb.libs.sh b/qb/qb.libs.sh index 29154de188..831b9491a4 100644 --- a/qb/qb.libs.sh +++ b/qb/qb.libs.sh @@ -70,28 +70,6 @@ check_lib() # $1 = language $2 = HAVE_$2 $3 = lib $4 = function in lib $5 = return 0 } -check_code_c() -{ tmpval="$(eval echo \$HAVE_$1)" - [ "$tmpval" = 'no' ] && return 0 - - ECHOBUF="Checking C code snippet \"$3\"" - answer='no' - "$CC" -o "$TEMP_EXE" "$TEMP_C" $INCLUDE_DIRS $LIBRARY_DIRS $2 $CFLAGS $LDFLAGS >>config.log 2>&1 && answer='yes' - eval HAVE_$1="$answer"; echo "$ECHOBUF ... $answer" - rm -f -- "$TEMP_C" "$TEMP_EXE" -} - -check_code_cxx() -{ tmpval="$(eval echo \$HAVE_$1)" - [ "$tmpval" = 'no' ] && return 0 - - ECHOBUF="Checking C++ code snippet \"$3\"" - answer='no' - "$CXX" -o "$TEMP_EXE" "$TEMP_CXX" $INCLUDE_DIRS $LIBRARY_DIRS $2 $CXXFLAGS $LDFLAGS >>config.log 2>&1 && answer='yes' - eval HAVE_$1="$answer"; echo "$ECHOBUF ... $answer" - rm -f -- "$TEMP_CXX" "$TEMP_EXE" -} - check_pkgconf() #$1 = HAVE_$1 $2 = package $3 = version $4 = critical error message [checked only if non-empty] { tmpval="$(eval echo \$HAVE_$1)" [ "$tmpval" = 'no' ] && return 0 From cf45945aa8c1613531e7a53fb5acf810378c7b73 Mon Sep 17 00:00:00 2001 From: orbea Date: Fri, 24 Nov 2017 08:09:14 -0800 Subject: [PATCH 083/183] qb: Combine the check_switch_c and check_switch_cxx functions. --- qb/config.libs.sh | 7 +++---- qb/qb.libs.sh | 27 +++++++++------------------ 2 files changed, 12 insertions(+), 22 deletions(-) diff --git a/qb/config.libs.sh b/qb/config.libs.sh index 82698ce890..18842f2877 100644 --- a/qb/config.libs.sh +++ b/qb/config.libs.sh @@ -1,8 +1,7 @@ -check_switch_c C99 -std=gnu99 "Cannot find C99 compatible compiler." - -check_switch_c NOUNUSED -Wno-unused-result +check_switch '' C99 -std=gnu99 "Cannot find C99 compatible compiler." +check_switch '' NOUNUSED -Wno-unused-result add_define MAKEFILE NOUNUSED "$HAVE_NOUNUSED" -check_switch_c NOUNUSED_VARIABLE -Wno-unused-variable +check_switch '' NOUNUSED_VARIABLE -Wno-unused-variable add_define MAKEFILE NOUNUSED_VARIABLE "$HAVE_NOUNUSED_VARIABLE" # There are still broken 64-bit Linux distros out there. :) diff --git a/qb/qb.libs.sh b/qb/qb.libs.sh index 831b9491a4..79278a1595 100644 --- a/qb/qb.libs.sh +++ b/qb/qb.libs.sh @@ -137,27 +137,18 @@ EOF die 1 "Build assumed that $2 is defined, but it's not. Exiting ..." } -check_switch_c() #$1 = HAVE_$1 $2 = switch $3 = critical error message [checked only if non-empty] -{ ECHOBUF="Checking for availability of switch $2 in $CC" - echo "int main(void) { return 0; }" > $TEMP_C - answer='no' - "$CC" -o "$TEMP_EXE" "$TEMP_C" $2 >>config.log 2>&1 && answer='yes' - eval HAVE_$1="$answer"; echo "$ECHOBUF ... $answer" - rm -f -- "$TEMP_C" "$TEMP_EXE" - [ "$answer" = 'no' ] && { - [ "$3" ] && die 1 "$3" - } -} +check_switch() # $1 = language $2 = HAVE_$2 $3 = switch $4 = critical error message [checked only if non-empty] +{ check_compiler "$1" '' -check_switch_cxx() #$1 = HAVE_$1 $2 = switch $3 = critical error message [checked only if non-empty] -{ ECHOBUF="Checking for availability of switch $2 in $CXX" - echo "int main() { return 0; }" > $TEMP_CXX + ECHOBUF="Checking for availability of switch $3 in $COMPILER" + printf %s\\n 'int main(void) { return 0; }' > "$TEMP_CODE" answer='no' - "$CXX" -o "$TEMP_EXE" "$TEMP_CXX" "$2" >>config.log 2>&1 && answer='yes' - eval HAVE_$1="$answer"; echo "$ECHOBUF ... $answer" - rm -f -- "$TEMP_CXX" "$TEMP_EXE" + "$COMPILER" -o "$TEMP_EXE" "$TEMP_CODE" "$3" >>config.log 2>&1 && answer='yes' + eval "HAVE_$2=\"$answer\"" + printf %s\\n "$ECHOBUF ... $answer" + rm -f -- "$TEMP_CODE" "$TEMP_EXE" [ "$answer" = 'no' ] && { - [ "$3" ] && die 1 "$3" + [ "$4" ] && die 1 "$4" } } From fdf79e2e9b698924c89487ff65ad1a2b5d53d030 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Fri, 24 Nov 2017 17:30:08 +0100 Subject: [PATCH 084/183] Invoke MAPPER_INIT after CONTROLLERS_INIT --- command.c | 6 +++--- retroarch.c | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/command.c b/command.c index ef15a962cb..f6fbf16c75 100644 --- a/command.c +++ b/command.c @@ -2540,14 +2540,14 @@ TODO: Add a setting for these tweaks */ command_event(CMD_EVENT_REMOTE_DEINIT, NULL); input_driver_init_remote(); break; - case CMD_EVENT_MAPPER_DEINIT: input_driver_deinit_mapper(); break; case CMD_EVENT_MAPPER_INIT: command_event(CMD_EVENT_MAPPER_DEINIT, NULL); - input_driver_init_mapper(); - break; + if (!input_driver_init_mapper()) + return false; + break; case CMD_EVENT_LOG_FILE_DEINIT: retro_main_log_file_deinit(); break; diff --git a/retroarch.c b/retroarch.c index 4158adbbca..26a27dc40b 100644 --- a/retroarch.c +++ b/retroarch.c @@ -1302,9 +1302,9 @@ bool retroarch_main_init(int argc, char *argv[]) drivers_init(DRIVERS_CMD_ALL); command_event(CMD_EVENT_COMMAND_INIT, NULL); command_event(CMD_EVENT_REMOTE_INIT, NULL); - command_event(CMD_EVENT_MAPPER_INIT, NULL); command_event(CMD_EVENT_REWIND_INIT, NULL); command_event(CMD_EVENT_CONTROLLERS_INIT, NULL); + command_event(CMD_EVENT_MAPPER_INIT, NULL); command_event(CMD_EVENT_RECORD_INIT, NULL); command_event(CMD_EVENT_CHEATS_INIT, NULL); From 03f2a325fb265cc537592c9d2807b3548092d688 Mon Sep 17 00:00:00 2001 From: meepingsnesroms Date: Fri, 24 Nov 2017 09:28:47 -0800 Subject: [PATCH 085/183] Add 3ds assets, move assets from ctr to pkg/ctr NOTE: I do not have the 3ds version of devkitARM installed so I could not test it if moving the assets to pkg/ctr broke compiling but I did change the assets paths in Makefile.ctr and Makefile.ctr.salimander so it should compile. --- Makefile.ctr | 24 +-- Makefile.ctr.salamander | 22 +-- libretro-db/c_converter | Bin 0 -> 69288 bytes libretro-db/libretrodb_tool | Bin 0 -> 58068 bytes libretro-db/rmsgpack_test | Bin 0 -> 25792 bytes {ctr => pkg/ctr}/Makefile.cores | 140 +++++++++++------- {ctr => pkg/ctr}/assets/2048.png | Bin {ctr => pkg/ctr}/assets/2048_banner.png | Bin {ctr => pkg/ctr}/assets/4do.png | Bin {ctr => pkg/ctr}/assets/4do_banner.png | Bin pkg/ctr/assets/81.png | Bin 0 -> 1671 bytes pkg/ctr/assets/81_banner.png | Bin 0 -> 15100 bytes {ctr => pkg/ctr}/assets/assets.7z | Bin {ctr => pkg/ctr}/assets/atari800.png | Bin {ctr => pkg/ctr}/assets/atari800_banner.png | Bin {ctr => pkg/ctr}/assets/default.png | Bin {ctr => pkg/ctr}/assets/dosbox.png | Bin {ctr => pkg/ctr}/assets/dosbox_banner.png | Bin {ctr => pkg/ctr}/assets/fbalpha2012.png | Bin .../ctr}/assets/fbalpha2012_banner.png | Bin {ctr => pkg/ctr}/assets/fbalpha2012_cps1.png | Bin .../ctr}/assets/fbalpha2012_cps1_banner.png | Bin {ctr => pkg/ctr}/assets/fbalpha2012_cps2.png | Bin .../ctr}/assets/fbalpha2012_cps2_banner.png | Bin {ctr => pkg/ctr}/assets/fbalpha2012_cps3.png | Bin .../ctr}/assets/fbalpha2012_cps3_banner.png | Bin .../ctr}/assets/fbalpha2012_neogeo.png | Bin .../ctr}/assets/fbalpha2012_neogeo_banner.png | Bin {ctr => pkg/ctr}/assets/fceumm.png | Bin {ctr => pkg/ctr}/assets/fceumm_banner.png | Bin {ctr => pkg/ctr}/assets/fmsx.png | Bin {ctr => pkg/ctr}/assets/fmsx_banner.png | Bin {ctr => pkg/ctr}/assets/fuse.png | Bin {ctr => pkg/ctr}/assets/fuse_banner.png | Bin {ctr => pkg/ctr}/assets/gambatte.png | Bin {ctr => pkg/ctr}/assets/gambatte_banner.png | Bin {ctr => pkg/ctr}/assets/genesis_plus_gx.png | Bin .../ctr}/assets/genesis_plus_gx_banner.png | Bin {ctr => pkg/ctr}/assets/gpsp.png | Bin {ctr => pkg/ctr}/assets/gpsp_banner.png | Bin {ctr => pkg/ctr}/assets/gw.png | Bin {ctr => pkg/ctr}/assets/gw_banner.png | Bin {ctr => pkg/ctr}/assets/handy.png | Bin {ctr => pkg/ctr}/assets/handy_banner.png | Bin {ctr => pkg/ctr}/assets/libretro_banner.png | Bin .../assets/libretro_neutral_shaded_banner.png | Bin 0 -> 13743 bytes {ctr => pkg/ctr}/assets/mame2000.png | Bin {ctr => pkg/ctr}/assets/mame2000_banner.png | Bin {ctr => pkg/ctr}/assets/mame2003.png | Bin {ctr => pkg/ctr}/assets/mame2003_banner.png | Bin {ctr => pkg/ctr}/assets/mednafen_ngp.png | Bin .../ctr}/assets/mednafen_ngp_banner.png | Bin {ctr => pkg/ctr}/assets/mednafen_pce_fast.png | Bin .../ctr}/assets/mednafen_pce_fast_banner.png | Bin {ctr => pkg/ctr}/assets/mednafen_vb.png | Bin .../ctr}/assets/mednafen_vb_banner.png | Bin {ctr => pkg/ctr}/assets/mednafen_wswan.png | Bin .../ctr}/assets/mednafen_wswan_banner.png | Bin {ctr => pkg/ctr}/assets/mgba.png | Bin {ctr => pkg/ctr}/assets/mgba_banner.png | Bin {ctr => pkg/ctr}/assets/nestopia.png | Bin {ctr => pkg/ctr}/assets/nestopia_banner.png | Bin pkg/ctr/assets/np2.png | Bin 0 -> 3795 bytes pkg/ctr/assets/np2_banner.png | Bin 0 -> 18686 bytes pkg/ctr/assets/np2kai.png | Bin 0 -> 3795 bytes pkg/ctr/assets/np2kai_banner.png | Bin 0 -> 19566 bytes {ctr => pkg/ctr}/assets/nxengine.png | Bin {ctr => pkg/ctr}/assets/nxengine_banner.png | Bin {ctr => pkg/ctr}/assets/o2em.png | Bin {ctr => pkg/ctr}/assets/o2em_banner.png | Bin {ctr => pkg/ctr}/assets/pcsx_rearmed.png | Bin .../ctr}/assets/pcsx_rearmed_banner.png | Bin {ctr => pkg/ctr}/assets/picodrive.png | Bin {ctr => pkg/ctr}/assets/picodrive_banner.png | Bin {ctr => pkg/ctr}/assets/prosystem.png | Bin {ctr => pkg/ctr}/assets/prosystem_banner.png | Bin {ctr => pkg/ctr}/assets/quicknes.png | Bin {ctr => pkg/ctr}/assets/quicknes_banner.png | Bin {ctr => pkg/ctr}/assets/silent.wav | Bin {ctr => pkg/ctr}/assets/snes9x2002.png | Bin {ctr => pkg/ctr}/assets/snes9x2002_banner.png | Bin {ctr => pkg/ctr}/assets/snes9x2005.png | Bin {ctr => pkg/ctr}/assets/snes9x2005_banner.png | Bin {ctr => pkg/ctr}/assets/snes9x2005_plus.png | Bin .../ctr}/assets/snes9x2005_plus_banner.png | Bin {ctr => pkg/ctr}/assets/snes9x2010.png | Bin {ctr => pkg/ctr}/assets/snes9x2010_banner.png | Bin {ctr => pkg/ctr}/assets/stella.png | Bin {ctr => pkg/ctr}/assets/stella_banner.png | Bin {ctr => pkg/ctr}/assets/vecx.png | Bin {ctr => pkg/ctr}/assets/vecx_banner.png | Bin {ctr => pkg/ctr}/assets/virtualjaguar.png | Bin .../ctr}/assets/virtualjaguar_banner.png | Bin {ctr => pkg/ctr}/assets/yabause.png | Bin {ctr => pkg/ctr}/assets/yabause_banner.png | Bin {ctr => pkg/ctr}/big_text_section.xml | 0 {ctr => pkg/ctr}/tools/bannertool-linux | Bin {ctr => pkg/ctr}/tools/bannertool-mac | Bin {ctr => pkg/ctr}/tools/bannertool.exe | Bin {ctr => pkg/ctr}/tools/makerom-linux | Bin {ctr => pkg/ctr}/tools/makerom-mac | Bin {ctr => pkg/ctr}/tools/makerom.exe | Bin {ctr => pkg/ctr}/tools/template.rsf | 0 103 files changed, 109 insertions(+), 77 deletions(-) create mode 100755 libretro-db/c_converter create mode 100755 libretro-db/libretrodb_tool create mode 100755 libretro-db/rmsgpack_test rename {ctr => pkg/ctr}/Makefile.cores (52%) rename {ctr => pkg/ctr}/assets/2048.png (100%) rename {ctr => pkg/ctr}/assets/2048_banner.png (100%) rename {ctr => pkg/ctr}/assets/4do.png (100%) rename {ctr => pkg/ctr}/assets/4do_banner.png (100%) create mode 100644 pkg/ctr/assets/81.png create mode 100644 pkg/ctr/assets/81_banner.png rename {ctr => pkg/ctr}/assets/assets.7z (100%) rename {ctr => pkg/ctr}/assets/atari800.png (100%) rename {ctr => pkg/ctr}/assets/atari800_banner.png (100%) rename {ctr => pkg/ctr}/assets/default.png (100%) rename {ctr => pkg/ctr}/assets/dosbox.png (100%) rename {ctr => pkg/ctr}/assets/dosbox_banner.png (100%) rename {ctr => pkg/ctr}/assets/fbalpha2012.png (100%) rename {ctr => pkg/ctr}/assets/fbalpha2012_banner.png (100%) rename {ctr => pkg/ctr}/assets/fbalpha2012_cps1.png (100%) rename {ctr => pkg/ctr}/assets/fbalpha2012_cps1_banner.png (100%) rename {ctr => pkg/ctr}/assets/fbalpha2012_cps2.png (100%) rename {ctr => pkg/ctr}/assets/fbalpha2012_cps2_banner.png (100%) rename {ctr => pkg/ctr}/assets/fbalpha2012_cps3.png (100%) rename {ctr => pkg/ctr}/assets/fbalpha2012_cps3_banner.png (100%) rename {ctr => pkg/ctr}/assets/fbalpha2012_neogeo.png (100%) rename {ctr => pkg/ctr}/assets/fbalpha2012_neogeo_banner.png (100%) rename {ctr => pkg/ctr}/assets/fceumm.png (100%) rename {ctr => pkg/ctr}/assets/fceumm_banner.png (100%) rename {ctr => pkg/ctr}/assets/fmsx.png (100%) rename {ctr => pkg/ctr}/assets/fmsx_banner.png (100%) rename {ctr => pkg/ctr}/assets/fuse.png (100%) rename {ctr => pkg/ctr}/assets/fuse_banner.png (100%) rename {ctr => pkg/ctr}/assets/gambatte.png (100%) rename {ctr => pkg/ctr}/assets/gambatte_banner.png (100%) rename {ctr => pkg/ctr}/assets/genesis_plus_gx.png (100%) rename {ctr => pkg/ctr}/assets/genesis_plus_gx_banner.png (100%) rename {ctr => pkg/ctr}/assets/gpsp.png (100%) rename {ctr => pkg/ctr}/assets/gpsp_banner.png (100%) rename {ctr => pkg/ctr}/assets/gw.png (100%) rename {ctr => pkg/ctr}/assets/gw_banner.png (100%) rename {ctr => pkg/ctr}/assets/handy.png (100%) rename {ctr => pkg/ctr}/assets/handy_banner.png (100%) rename {ctr => pkg/ctr}/assets/libretro_banner.png (100%) create mode 100644 pkg/ctr/assets/libretro_neutral_shaded_banner.png rename {ctr => pkg/ctr}/assets/mame2000.png (100%) rename {ctr => pkg/ctr}/assets/mame2000_banner.png (100%) rename {ctr => pkg/ctr}/assets/mame2003.png (100%) rename {ctr => pkg/ctr}/assets/mame2003_banner.png (100%) rename {ctr => pkg/ctr}/assets/mednafen_ngp.png (100%) rename {ctr => pkg/ctr}/assets/mednafen_ngp_banner.png (100%) rename {ctr => pkg/ctr}/assets/mednafen_pce_fast.png (100%) rename {ctr => pkg/ctr}/assets/mednafen_pce_fast_banner.png (100%) rename {ctr => pkg/ctr}/assets/mednafen_vb.png (100%) rename {ctr => pkg/ctr}/assets/mednafen_vb_banner.png (100%) rename {ctr => pkg/ctr}/assets/mednafen_wswan.png (100%) rename {ctr => pkg/ctr}/assets/mednafen_wswan_banner.png (100%) rename {ctr => pkg/ctr}/assets/mgba.png (100%) rename {ctr => pkg/ctr}/assets/mgba_banner.png (100%) rename {ctr => pkg/ctr}/assets/nestopia.png (100%) rename {ctr => pkg/ctr}/assets/nestopia_banner.png (100%) create mode 100644 pkg/ctr/assets/np2.png create mode 100644 pkg/ctr/assets/np2_banner.png create mode 100644 pkg/ctr/assets/np2kai.png create mode 100644 pkg/ctr/assets/np2kai_banner.png rename {ctr => pkg/ctr}/assets/nxengine.png (100%) rename {ctr => pkg/ctr}/assets/nxengine_banner.png (100%) rename {ctr => pkg/ctr}/assets/o2em.png (100%) rename {ctr => pkg/ctr}/assets/o2em_banner.png (100%) rename {ctr => pkg/ctr}/assets/pcsx_rearmed.png (100%) rename {ctr => pkg/ctr}/assets/pcsx_rearmed_banner.png (100%) rename {ctr => pkg/ctr}/assets/picodrive.png (100%) rename {ctr => pkg/ctr}/assets/picodrive_banner.png (100%) rename {ctr => pkg/ctr}/assets/prosystem.png (100%) rename {ctr => pkg/ctr}/assets/prosystem_banner.png (100%) rename {ctr => pkg/ctr}/assets/quicknes.png (100%) rename {ctr => pkg/ctr}/assets/quicknes_banner.png (100%) rename {ctr => pkg/ctr}/assets/silent.wav (100%) rename {ctr => pkg/ctr}/assets/snes9x2002.png (100%) rename {ctr => pkg/ctr}/assets/snes9x2002_banner.png (100%) rename {ctr => pkg/ctr}/assets/snes9x2005.png (100%) rename {ctr => pkg/ctr}/assets/snes9x2005_banner.png (100%) rename {ctr => pkg/ctr}/assets/snes9x2005_plus.png (100%) rename {ctr => pkg/ctr}/assets/snes9x2005_plus_banner.png (100%) rename {ctr => pkg/ctr}/assets/snes9x2010.png (100%) rename {ctr => pkg/ctr}/assets/snes9x2010_banner.png (100%) rename {ctr => pkg/ctr}/assets/stella.png (100%) rename {ctr => pkg/ctr}/assets/stella_banner.png (100%) rename {ctr => pkg/ctr}/assets/vecx.png (100%) rename {ctr => pkg/ctr}/assets/vecx_banner.png (100%) rename {ctr => pkg/ctr}/assets/virtualjaguar.png (100%) rename {ctr => pkg/ctr}/assets/virtualjaguar_banner.png (100%) rename {ctr => pkg/ctr}/assets/yabause.png (100%) rename {ctr => pkg/ctr}/assets/yabause_banner.png (100%) rename {ctr => pkg/ctr}/big_text_section.xml (100%) rename {ctr => pkg/ctr}/tools/bannertool-linux (100%) rename {ctr => pkg/ctr}/tools/bannertool-mac (100%) rename {ctr => pkg/ctr}/tools/bannertool.exe (100%) rename {ctr => pkg/ctr}/tools/makerom-linux (100%) rename {ctr => pkg/ctr}/tools/makerom-mac (100%) rename {ctr => pkg/ctr}/tools/makerom.exe (100%) rename {ctr => pkg/ctr}/tools/template.rsf (100%) diff --git a/Makefile.ctr b/Makefile.ctr index 308c5bf62f..91feeb4406 100644 --- a/Makefile.ctr +++ b/Makefile.ctr @@ -14,16 +14,16 @@ APP_DESCRIPTION = Retroarch 3DS APP_AUTHOR = Team Libretro APP_PRODUCT_CODE = RETROARCH-3DS APP_UNIQUE_ID = 0xBAC00 -APP_ICON = ctr/assets/default.png -APP_BANNER = ctr/assets/libretro_banner.png -APP_AUDIO = ctr/assets/silent.wav -APP_RSF = ctr/tools/template.rsf +APP_ICON = pkg/ctr/assets/default.png +APP_BANNER = pkg/ctr/assets/libretro_banner.png +APP_AUDIO = pkg/ctr/assets/silent.wav +APP_RSF = pkg/ctr/tools/template.rsf APP_SYSTEM_MODE = 64MB APP_SYSTEM_MODE_EXT = 124MB APP_BIG_TEXT_SECTION = 0 APP_USE_SVCHAX = 0 -include ctr/Makefile.cores +include pkg/ctr/Makefile.cores OBJ := OBJ += gfx/drivers/ctr_shaders/ctr_sprite.o @@ -190,14 +190,14 @@ NM := $(PREFIX)nm LD := $(CXX) ifneq ($(findstring Linux,$(shell uname -a)),) - MAKEROM = ctr/tools/makerom-linux - BANNERTOOL = ctr/tools/bannertool-linux + MAKEROM = pkg/ctr/tools/makerom-linux + BANNERTOOL = pkg/ctr/tools/bannertool-linux else ifneq ($(findstring Darwin,$(shell uname -a)),) - MAKEROM = ctr/tools/makerom-mac - BANNERTOOL = ctr/tools/bannertool-mac + MAKEROM = pkg/ctr/tools/makerom-mac + BANNERTOOL = pkg/ctr/tools/bannertool-mac else - MAKEROM = ctr/tools/makerom.exe - BANNERTOOL = ctr/tools/bannertool.exe + MAKEROM = pkg/ctr/tools/makerom.exe + BANNERTOOL = pkg/ctr/tools/bannertool.exe endif %.o: %.vsh %.gsh @@ -232,7 +232,7 @@ $(TARGET).smdh: $(APP_ICON) $(TARGET).3dsx: $(TARGET).elf ifeq ($(APP_BIG_TEXT_SECTION), 1) - cp ctr/big_text_section.xml $(TARGET).xml + cp pkg/ctr/big_text_section.xml $(TARGET).xml else rm -f $(TARGET).xml endif diff --git a/Makefile.ctr.salamander b/Makefile.ctr.salamander index b53a31ff43..60ab600a2e 100644 --- a/Makefile.ctr.salamander +++ b/Makefile.ctr.salamander @@ -11,10 +11,10 @@ APP_DESCRIPTION = Retroarch 3DS APP_AUTHOR = Team Libretro APP_PRODUCT_CODE = RETROARCH-3DS APP_UNIQUE_ID = 0xBAC00 -APP_ICON = ctr/assets/default.png -APP_BANNER = ctr/assets/libretro_banner.png -APP_AUDIO = ctr/assets/silent.wav -APP_RSF = ctr/tools/template.rsf +APP_ICON = pkg/ctr/assets/default.png +APP_BANNER = pkg/ctr/assets/libretro_banner.png +APP_AUDIO = pkg/ctr/assets/silent.wav +APP_RSF = pkg/ctr/tools/template.rsf APP_SYSTEM_MODE = 64MB APP_SYSTEM_MODE_EXT = 124MB @@ -122,14 +122,14 @@ NM := $(PREFIX)nm LD := $(CXX) ifneq ($(findstring Linux,$(shell uname -a)),) - MAKEROM = ctr/tools/makerom-linux - BANNERTOOL = ctr/tools/bannertool-linux + MAKEROM = pkg/ctr/tools/makerom-linux + BANNERTOOL = pkg/ctr/tools/bannertool-linux else ifneq ($(findstring Darwin,$(shell uname -a)),) - MAKEROM = ctr/tools/makerom-mac - BANNERTOOL = ctr/tools/bannertool-mac + MAKEROM = pkg/ctr/tools/makerom-mac + BANNERTOOL = pkg/ctr/tools/bannertool-mac else - MAKEROM = ctr/tools/makerom.exe - BANNERTOOL = ctr/tools/bannertool.exe + MAKEROM = pkg/ctr/tools/makerom.exe + BANNERTOOL = pkg/ctr/tools/bannertool.exe endif %.o: %.vsh %.gsh @@ -164,7 +164,7 @@ $(TARGET).smdh: $(APP_ICON) $(TARGET).3dsx: $(TARGET).elf ifeq ($(APP_BIG_TEXT_SECTION), 1) - cp ctr/big_text_section.xml $(TARGET).xml + cp pkg/ctr/big_text_section.xml $(TARGET).xml else rm -f $(TARGET).xml endif diff --git a/libretro-db/c_converter b/libretro-db/c_converter new file mode 100755 index 0000000000000000000000000000000000000000..3887af551f1c685a4f6c022f8b6cb2908f140de1 GIT binary patch literal 69288 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 literal 0 HcmV?d00001 diff --git a/libretro-db/libretrodb_tool b/libretro-db/libretrodb_tool new file mode 100755 index 0000000000000000000000000000000000000000..6103a09b3cd9a6444fa398e76a366952b602b812 GIT binary patch literal 58068 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 X-0;ldjy|L_eufK%Xu1fQPpA14D$>%5 literal 0 HcmV?d00001 diff --git a/libretro-db/rmsgpack_test b/libretro-db/rmsgpack_test new file mode 100755 index 0000000000000000000000000000000000000000..2f694d014fcb9fb954d818043fcfea173e95e8da GIT binary patch literal 25792 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 literal 0 HcmV?d00001 diff --git a/ctr/Makefile.cores b/pkg/ctr/Makefile.cores similarity index 52% rename from ctr/Makefile.cores rename to pkg/ctr/Makefile.cores index de64f12c4f..fbb51d464d 100644 --- a/ctr/Makefile.cores +++ b/pkg/ctr/Makefile.cores @@ -3,79 +3,79 @@ ifeq ($(LIBRETRO), gambatte) APP_TITLE = Gambatte Libretro APP_PRODUCT_CODE = RARCH-GAMBATTE APP_UNIQUE_ID = 0xBAC01 - APP_ICON = ctr/assets/gambatte.png - APP_BANNER = ctr/assets/gambatte_banner.png + APP_ICON = pkg/ctr/assets/gambatte.png + APP_BANNER = pkg/ctr/assets/gambatte_banner.png else ifeq ($(LIBRETRO), gpsp) APP_TITLE = gpSP Libretro APP_PRODUCT_CODE = RARCH-GPSP APP_UNIQUE_ID = 0xBAC02 - APP_ICON = ctr/assets/gpsp.png - APP_BANNER = ctr/assets/gpsp_banner.png + APP_ICON = pkg/ctr/assets/gpsp.png + APP_BANNER = pkg/ctr/assets/gpsp_banner.png APP_USE_SVCHAX = 1 else ifeq ($(LIBRETRO), fceumm) APP_TITLE = FCeumm Libretro APP_PRODUCT_CODE = RARCH-FCEUMM APP_UNIQUE_ID = 0xBAC03 - APP_ICON = ctr/assets/fceumm.png - APP_BANNER = ctr/assets/fceumm_banner.png + APP_ICON = pkg/ctr/assets/fceumm.png + APP_BANNER = pkg/ctr/assets/fceumm_banner.png else ifeq ($(LIBRETRO), nestopia) APP_TITLE = Nestopia Libretro APP_PRODUCT_CODE = RARCH-NESTOPIA APP_UNIQUE_ID = 0xBAC04 - APP_ICON = ctr/assets/nestopia.png - APP_BANNER = ctr/assets/nestopia_banner.png + APP_ICON = pkg/ctr/assets/nestopia.png + APP_BANNER = pkg/ctr/assets/nestopia_banner.png else ifeq ($(LIBRETRO), nxengine) APP_TITLE = NXengine Libretro APP_PRODUCT_CODE = RARCH-NXENGINE APP_UNIQUE_ID = 0xBAC05 - APP_ICON = ctr/assets/nxengine.png - APP_BANNER = ctr/assets/nxengine_banner.png + APP_ICON = pkg/ctr/assets/nxengine.png + APP_BANNER = pkg/ctr/assets/nxengine_banner.png else ifeq ($(LIBRETRO), genesis_plus_gx) APP_TITLE = Genesis Plus GX Libretro APP_PRODUCT_CODE = RARCH-GENPLUSGX APP_UNIQUE_ID = 0xBAC06 - APP_ICON = ctr/assets/genesis_plus_gx.png - APP_BANNER = ctr/assets/genesis_plus_gx_banner.png + APP_ICON = pkg/ctr/assets/genesis_plus_gx.png + APP_BANNER = pkg/ctr/assets/genesis_plus_gx_banner.png else ifeq ($(LIBRETRO), mednafen_wswan) APP_TITLE = Mednafen wswan Libretro APP_PRODUCT_CODE = RARCH-M-WSWAN APP_UNIQUE_ID = 0xBAC08 - APP_ICON = ctr/assets/mednafen_wswan.png - APP_BANNER = ctr/assets/mednafen_wswan_banner.png + APP_ICON = pkg/ctr/assets/mednafen_wswan.png + APP_BANNER = pkg/ctr/assets/mednafen_wswan_banner.png else ifeq ($(LIBRETRO), mednafen_vb) APP_TITLE = Mednafen VB Libretro APP_PRODUCT_CODE = RARCH-M-VB APP_UNIQUE_ID = 0xBAC09 - APP_ICON = ctr/assets/mednafen_vb.png - APP_BANNER = ctr/assets/mednafen_vb_banner.png + APP_ICON = pkg/ctr/assets/mednafen_vb.png + APP_BANNER = pkg/ctr/assets/mednafen_vb_banner.png else ifeq ($(LIBRETRO), mednafen_ngp) APP_TITLE = Mednafen NGP Libretro APP_PRODUCT_CODE = RARCH-M-NGP APP_UNIQUE_ID = 0xBAC0A - APP_ICON = ctr/assets/mednafen_ngp.png - APP_BANNER = ctr/assets/mednafen_ngp_banner.png + APP_ICON = pkg/ctr/assets/mednafen_ngp.png + APP_BANNER = pkg/ctr/assets/mednafen_ngp_banner.png else ifeq ($(LIBRETRO), 2048) APP_TITLE = 2048 Libretro APP_PRODUCT_CODE = RARCH-2048 APP_UNIQUE_ID = 0xBAC0B - APP_ICON = ctr/assets/2048.png - APP_BANNER = ctr/assets/2048_banner.png + APP_ICON = pkg/ctr/assets/2048.png + APP_BANNER = pkg/ctr/assets/2048_banner.png else ifeq ($(LIBRETRO), picodrive) APP_TITLE = Picodrive Libretro APP_PRODUCT_CODE = RARCH-PICODRIVE APP_UNIQUE_ID = 0xBAC0C - APP_ICON = ctr/assets/picodrive.png - APP_BANNER = ctr/assets/picodrive_banner.png + APP_ICON = pkg/ctr/assets/picodrive.png + APP_BANNER = pkg/ctr/assets/picodrive_banner.png APP_USE_SVCHAX = 1 @@ -84,16 +84,16 @@ else ifeq ($(LIBRETRO), mgba) APP_AUTHOR = Jeffrey Pfau APP_PRODUCT_CODE = RARCH-MGBA APP_UNIQUE_ID = 0xBAC0E - APP_ICON = ctr/assets/mgba.png - APP_BANNER = ctr/assets/mgba_banner.png + APP_ICON = pkg/ctr/assets/mgba.png + APP_BANNER = pkg/ctr/assets/mgba_banner.png else ifeq ($(LIBRETRO), quicknes) APP_TITLE = QuickNES Libretro APP_AUTHOR = blargg, kode54 APP_PRODUCT_CODE = RARCH-QUICKNES APP_UNIQUE_ID = 0xBAC0F - APP_ICON = ctr/assets/quicknes.png - APP_BANNER = ctr/assets/quicknes_banner.png + APP_ICON = pkg/ctr/assets/quicknes.png + APP_BANNER = pkg/ctr/assets/quicknes_banner.png else ifeq ($(LIBRETRO), fbalpha2012) APP_TITLE = Final Burn Alpha 2012 @@ -101,16 +101,16 @@ else ifeq ($(LIBRETRO), fbalpha2012) APP_PRODUCT_CODE = RARCH-FBA APP_UNIQUE_ID = 0xBAC17 APP_BIG_TEXT_SECTION = 1 - APP_ICON = ctr/assets/fbalpha2012.png - APP_BANNER = ctr/assets/fbalpha2012_banner.png + APP_ICON = pkg/ctr/assets/fbalpha2012.png + APP_BANNER = pkg/ctr/assets/fbalpha2012_banner.png else ifeq ($(LIBRETRO), fbalpha2012_neogeo) APP_TITLE = Final Burn Alpha 2012 - NeoGeo APP_AUTHOR = Team FB Alpha APP_PRODUCT_CODE = RARCH-FBANEOGEO APP_UNIQUE_ID = 0xBAC10 - APP_ICON = ctr/assets/fbalpha2012_neogeo.png - APP_BANNER = ctr/assets/fbalpha2012_neogeo_banner.png + APP_ICON = pkg/ctr/assets/fbalpha2012_neogeo.png + APP_BANNER = pkg/ctr/assets/fbalpha2012_neogeo_banner.png APP_SYSTEM_MODE = 80MB else ifeq ($(LIBRETRO), fbalpha2012_cps1) @@ -118,16 +118,16 @@ else ifeq ($(LIBRETRO), fbalpha2012_cps1) APP_AUTHOR = Team FB Alpha APP_PRODUCT_CODE = RARCH-FBACPS1 APP_UNIQUE_ID = 0xBAC11 - APP_ICON = ctr/assets/fbalpha2012_cps1.png - APP_BANNER = ctr/assets/fbalpha2012_cps1_banner.png + APP_ICON = pkg/ctr/assets/fbalpha2012_cps1.png + APP_BANNER = pkg/ctr/assets/fbalpha2012_cps1_banner.png else ifeq ($(LIBRETRO), fbalpha2012_cps2) APP_TITLE = Final Burn Alpha 2012 - CPS-2 APP_AUTHOR = Team FB Alpha APP_PRODUCT_CODE = RARCH-FBACPS2 APP_UNIQUE_ID = 0xBAC12 - APP_ICON = ctr/assets/fbalpha2012_cps2.png - APP_BANNER = ctr/assets/fbalpha2012_cps2_banner.png + APP_ICON = pkg/ctr/assets/fbalpha2012_cps2.png + APP_BANNER = pkg/ctr/assets/fbalpha2012_cps2_banner.png APP_SYSTEM_MODE = 80MB @@ -136,16 +136,16 @@ else ifeq ($(LIBRETRO), mednafen_pce_fast) APP_AUTHOR = Ryphecha APP_PRODUCT_CODE = RARCH-M-PCE-FAST APP_UNIQUE_ID = 0xBAC14 - APP_ICON = ctr/assets/mednafen_pce_fast.png - APP_BANNER = ctr/assets/mednafen_pce_fast_banner.png + APP_ICON = pkg/ctr/assets/mednafen_pce_fast.png + APP_BANNER = pkg/ctr/assets/mednafen_pce_fast_banner.png else ifeq ($(LIBRETRO), pcsx_rearmed) APP_TITLE = PCSX ReARMed APP_AUTHOR = PCSX Team, notaz, Exophase APP_PRODUCT_CODE = RARCH-PCSXRARMD APP_UNIQUE_ID = 0xBAC15 - APP_ICON = ctr/assets/pcsx_rearmed.png - APP_BANNER = ctr/assets/pcsx_rearmed_banner.png + APP_ICON = pkg/ctr/assets/pcsx_rearmed.png + APP_BANNER = pkg/ctr/assets/pcsx_rearmed_banner.png APP_USE_SVCHAX = 1 else ifeq ($(LIBRETRO), fmsx) @@ -153,23 +153,23 @@ else ifeq ($(LIBRETRO), fmsx) APP_AUTHOR = Marat Fayzullin APP_PRODUCT_CODE = RARCH-FMSX APP_UNIQUE_ID = 0xBAC16 - APP_ICON = ctr/assets/fmsx.png - APP_BANNER = ctr/assets/fmsx_banner.png + APP_ICON = pkg/ctr/assets/fmsx.png + APP_BANNER = pkg/ctr/assets/fmsx_banner.png else ifeq ($(LIBRETRO), mame2000) APP_TITLE = MAME-2000 APP_PRODUCT_CODE = RARCH-MAME2000 APP_UNIQUE_ID = 0xBAC19 - APP_ICON = ctr/assets/mame2000.png - APP_BANNER = ctr/assets/mame2000_banner.png + APP_ICON = pkg/ctr/assets/mame2000.png + APP_BANNER = pkg/ctr/assets/mame2000_banner.png APP_BIG_TEXT_SECTION = 1 else ifeq ($(LIBRETRO), mame2003) APP_TITLE = MAME-2003 APP_PRODUCT_CODE = RARCH-MAME2003 APP_UNIQUE_ID = 0xBAC18 - APP_ICON = ctr/assets/mame2003.png - APP_BANNER = ctr/assets/mame2003_banner.png + APP_ICON = pkg/ctr/assets/mame2003.png + APP_BANNER = pkg/ctr/assets/mame2003_banner.png APP_BIG_TEXT_SECTION = 1 @@ -178,36 +178,68 @@ else ifeq ($(LIBRETRO), snes9x2002) APP_AUTHOR = various APP_PRODUCT_CODE = RARCH-POCKETSNES APP_UNIQUE_ID = 0xBAC1A - APP_ICON = ctr/assets/snes9x2002.png - APP_BANNER = ctr/assets/snes9x2002_banner.png + APP_ICON = pkg/ctr/assets/snes9x2002.png + APP_BANNER = pkg/ctr/assets/snes9x2002_banner.png else ifeq ($(LIBRETRO), snes9x2005) APP_TITLE = Snes9x 2005 APP_PRODUCT_CODE = RARCH-CATSFC APP_UNIQUE_ID = 0xBAC07 - APP_ICON = ctr/assets/snes9x2005.png - APP_BANNER = ctr/assets/snes9x2005_banner.png + APP_ICON = pkg/ctr/assets/snes9x2005.png + APP_BANNER = pkg/ctr/assets/snes9x2005_banner.png else ifeq ($(LIBRETRO), snes9x2005_plus) APP_TITLE = Snes9x 2005 Plus APP_PRODUCT_CODE = RARCH-CATSFCPLUS APP_UNIQUE_ID = 0xBAC13 - APP_ICON = ctr/assets/snes9x2005_plus.png - APP_BANNER = ctr/assets/snes9x2005_plus_banner.png + APP_ICON = pkg/ctr/assets/snes9x2005_plus.png + APP_BANNER = pkg/ctr/assets/snes9x2005_plus_banner.png else ifeq ($(LIBRETRO), snes9x2010) APP_TITLE = Snes9x 2010 APP_PRODUCT_CODE = RARCH-SNES9XNEXT APP_UNIQUE_ID = 0xBAC0D - APP_ICON = ctr/assets/snes9x2010.png - APP_BANNER = ctr/assets/snes9x2010_banner.png + APP_ICON = pkg/ctr/assets/snes9x2010.png + APP_BANNER = pkg/ctr/assets/snes9x2010_banner.png else ifeq ($(LIBRETRO), dosbox) APP_TITLE = DosBox APP_AUTHOR = various APP_PRODUCT_CODE = RARCH-DOSBOX APP_UNIQUE_ID = 0xBAC1B - APP_ICON = ctr/assets/dosbox.png - APP_BANNER = ctr/assets/dosbox_banner.png + APP_ICON = pkg/ctr/assets/dosbox.png + APP_BANNER = pkg/ctr/assets/dosbox_banner.png + +else ifeq ($(LIBRETRO), np2) + APP_TITLE = Neko Project 2 + APP_AUTHOR = various + APP_PRODUCT_CODE = RARCH-NP2 + APP_UNIQUE_ID = 0xBAC1C + APP_ICON = pkg/ctr/assets/np2.png + APP_BANNER = pkg/ctr/assets/np2_banner.png + +else ifeq ($(LIBRETRO), np2kai) + APP_TITLE = Neko Project 2 Kai + APP_AUTHOR = various + APP_PRODUCT_CODE = RARCH-NP2KAI + APP_UNIQUE_ID = 0xBAC1D + APP_ICON = pkg/ctr/assets/np2kai.png + APP_BANNER = pkg/ctr/assets/np2kai_banner.png + +else ifeq ($(LIBRETRO), 81) + APP_TITLE = lr-81 + APP_AUTHOR = various + APP_PRODUCT_CODE = RARCH-81 + APP_UNIQUE_ID = 0xBAC1E + APP_ICON = pkg/ctr/assets/81.png + APP_BANNER = pkg/ctr/assets/81_banner.png + +else ifeq ($(LIBRETRO), fuse) + APP_TITLE = Fuse + APP_AUTHOR = various + APP_PRODUCT_CODE = RARCH-FUSE + APP_UNIQUE_ID = 0xBAC1F + APP_ICON = pkg/ctr/assets/fuse.png + APP_BANNER = pkg/ctr/assets/fuse_banner.png endif diff --git a/ctr/assets/2048.png b/pkg/ctr/assets/2048.png similarity index 100% rename from ctr/assets/2048.png rename to pkg/ctr/assets/2048.png diff --git a/ctr/assets/2048_banner.png b/pkg/ctr/assets/2048_banner.png similarity index 100% rename from ctr/assets/2048_banner.png rename to pkg/ctr/assets/2048_banner.png diff --git a/ctr/assets/4do.png b/pkg/ctr/assets/4do.png similarity index 100% rename from ctr/assets/4do.png rename to pkg/ctr/assets/4do.png diff --git a/ctr/assets/4do_banner.png b/pkg/ctr/assets/4do_banner.png similarity index 100% rename from ctr/assets/4do_banner.png rename to pkg/ctr/assets/4do_banner.png diff --git a/pkg/ctr/assets/81.png b/pkg/ctr/assets/81.png new file mode 100644 index 0000000000000000000000000000000000000000..b0404d6731dd0d4497e1d23d2058933c660702cb GIT binary patch literal 1671 zcmV;226*|2P)7ILMjG`#0s>D(Q3@ zMNtTc!vLgGDQw#&7!2a``Ksors*0}bFetQ;Nr!L6pKZAdV1KsdpG%fzC6z` z3>q35n3|embaa%3g@xJxcsw53+S=&t?Zq@rGMP--qAe{gRTgb(YARb)(=^;}H@dEq zN~O?sovyAf0A^=ru`G-3?ru6dIxtO>VzG#-suT(Zve|6?DC9I%RdKuBq|<3GU%rg4 z>m(8h0EUN$u`G*tJWePSDl3%F=LrUb#N%-kMZxFu0dU~Jfii{i`Fs`Nxw$#6UcJiX zY<#J3;PL_E+Ha5o1n>W!kt?YptH*QcY772&LSe8{q30>FAlp7x(ucBNs znY@Q`1N|KnD0z`uk+w9iRk+0k^CHpaE&%FG+pR z%EQNGow@+%1l|Ys%Y7bLleW!`r(??vD#ASViYfMMWWF~B>3 zA2weIwXNTR1xGaix>9*FGw8u zC5ZO`{|Id?=?mP?g0*I$Llv?Qg+gv1DO~mgZwi>xGVTM32d|7ZfCk`G=?_+<;06KQ zP;UU1TvHY4GbqZGq^}?u={E2O@Rf`^B*AIP+;4!W&=6oysF;!Uew5E-J-5@EP$eKP zwgsUkmdjS8(iV9!-In_f0eeS4G*);6SuZ8V0eD8%{JX|LRsh@WcGK9{i0bu{E|thT zhZ0Rg*LARM3YLXt+xT5B6jfzaz&RF9iFbUmXs+Td>@-6_+A`jjdrz$t3Iqb|+qaKh z(I_jXiD_AsN+rBrFM&V++qOxk(_q_#0s*{UF9iWvX<@q}tCZF`DXH=ncg8zg6s=w{ zpo*0=QNSyglecYo;Cc^zSSxy{PphJk*XyNJDwWTwno!8LZ7j>ewryN4SNXiV721Cb`2Bv`+uQN`{Wx`^R4N5PI2^{~@oZVS4$$7-PJe$td-v`IU}k29fq?-45{U$@ zt*u*Dt^+hRHF5axVWQD!xftctE{`2MR#l|hYVyY;2IlAIId|?{6@^AdM%ECjD$UK! z<%;vr&``Nd=+sR&Q?3B^{esvuO>|vHQIxgKo@KGRx(a~L=UdxmY_ePjSYBS{+O=!z zy2$xGU|W<`?ry!ky_`CAidZaGcG=+I;MyVn;K3?aZkGIk03wkHM~@z@%1%zH{KSb9 z>z2?Twfym_%-!9b>=cW|C=?1LlSu{!22d0QUDs)CZKYT&GCe)LY4Qhd=A7(g7zUY4 zhNYz?78e)MG>u3kg2&?_o6WMava)IN4ev(7;V{8q5U1hA}002ovPDHLkV1kbL3I+fG literal 0 HcmV?d00001 diff --git a/pkg/ctr/assets/81_banner.png b/pkg/ctr/assets/81_banner.png new file mode 100644 index 0000000000000000000000000000000000000000..76697a38e1506ca60b348493c6c0b4a7c012e338 GIT binary patch literal 15100 zcmai*byQSe^yu%GQTCOCLi)F%mI;Bwy{r_xTUrzLsRGN|55Zn;a1Q5FPvCb9DO) zVnft^6(I@XWesGI;{_P2RKb*+o8;w^sn?S)&KrlWZx^yuVON+`RDLR>B?FN;kISg654-2(UhqGxzcL$B!Rt{7<(O z&gUj4DG8O3ah$5Lj7>UWTuBnH9nf zCjDY?l8n5)tn425lXM`;W~s`eWmIe!Yern_5ddgS)U>uTK>+X*KNS=d)VQAJLD>}c zO22$5Yz;W4Rxma+)CKQuU~H_v6NrmU#I&ppZhvNn={GcR{Ohm=N3aPJ;R)(O6Jo;jA8QSGfA9@;nG5u> zClCy+z2c+)C^A=1$1Z}f&-RK!_8%!u`=qdXQ$R-ip7KAcVC{k38+r>mcMbd_J#pqL%37kw*Pvmq|3v@TVh~-fQm1YgLa?EM>Rb%3- zw##*~sq(@vkI_kseiSfV(R=5vkOzzK-`5ZG+S6}}ooYduF!n7+*$8P(q@(?^y+$IS z^F9{6($BNK*8ho94y7L!TDASzh87w~QtJ3S5tNGuW698Si|GMR#!;V~e#x)W=u5Xe zWCT=iLX4*pUy~XcRm`zml%nmhobI*HSe^(!Hciu;<4-E%wnVvo{i&E!BP4hG}+~owp%oVSW+uVjUARd zU@vAdEp7M2F2-|_eo0SLplB87h(eS|8*YD!eF zLMO$v)Ok1o0@N`M+FYntuFo^V!88}`7lVwjp(tIW)mO#!pXE2@&SC$HsoH z5-Qv)Hz76_#~HdJ6+i6Qc`WxH!Ct8PSHf+cz{kg@^P9~Mk87j7V;K^TW=tC3aDMTk zBQ=$JgjQd^#gR73ajt%^xvFZrdEGB}M0y%r4xJr6%qiPz&o8%^b_M8wCR~3v{spX8 zla%+c#p^{;D1ix+3lsMor%O;S`Z!lf&?ShM2edi_g_PCu4vI z%f0sY_Epem+0p8t0-t6O%P&{Dc%L;2gH9> zFHo?PvkwM7F;8TNqvwl55D8pNF0JOuC*1>@Y=mMAgFLQU;dA5TJxr4 zF=;U^P7Ippw(2vh+dkn<-z-&DH2s7Rzl8r2vtbSH*FdO1#Hj3abv0_&KZKP{2oZI7 zxMF78N2)`_Mr%iWyV9``7CJCexG*#3x6zAF*Rj+YE}B`qYwVNiEmP_1?Y+UV5szdP zDKwE=2c^9e<&+YTg^Fcx-_lQ@a!L86Xn; z$>(d;9Yr!1e9YeCcEnf&x?~=m{+SCiLKGpiA~wBs}mFYjIW8&s?Ejp79(&oQN|yQ(8^PKi|uzmy5sn}r=`egcuAg_ z_wdoQW%G8JPSBP+{QLFZ7v2YY#Fc`W_7d#%Y&)(bn*{X;>DcZ!%=AEMX*($(bJX#h ziT!i&CSa|>qXh^FW7^3upPjhajV?ax5)f$e1b9Pe(eG6Jtz|OG-z+zwxnddp=9`fY z(TVR_*B?kt7@URB4Dbe3X_*WP+r`RU!`{P&`6 zN~mva6a;} z*!IIKL!hQp@|vH$7AlMdzyKtxoyFP5>@1|8K1%Y^)Ve|bUWbjSlJ)uCpTpDb>8Us- zNh7@8zyP9rCqcRME_KxLh0T2+o1yL0@CXxdrC@1#FYo#WZ9S&{VX2i#wwZ#C?s<#~ zO!wjbg~_VN03IigC-_$HPpR9JnBwg}d#5XLaE0=sB2K(_WG`i9W%m3xI`OO1;UU42 zL@B52K)LVsnHg7-Qb;{iad-YBxR9Oune)Aj%jYe_-2;>801oe?E#2ODkgcHFG zDML!Af1xZltZil<3yK%&m%VZCBLZ}J98OrO+l(*^BTR3&)pc~3B~V&k z9>#zk4iCwYB-;yE3Qm{t;axp8YBup>gjT*fTiZuPbU$GFetCPoQr&tsJNkFU+eP+l z>uBxNBVCEW4?NVbFV&}-_Vs~5Psk(=3r~^e&e%=5q5^g33uuB8qL>^DAqHv5q)F%g zRz&?%lJWym(=FoNH(jw1s0Ek+1X+2(dlx1-AKD7fOzgXVKU57oULXG2z1s-Wz5iKV8Y39r{u!$c)6LS6E$zih zdoCZmW74=XBDdV>G4hCkiD7b&Vp?x<0F61 zGPO%)y85U|`M4{-Ha9;rznek5ej>eDxYOx^8GB!PV)0F{vO~G0j7|v1^}BL>-c*_C*0Y|x;`|n5e!+f+<_G5L!NjOMJE!ZLWr!+EQf?m`ru7+F z0^4ywY@nvc(s^6_%h{JM*WF=Thl`C(6Qxy&EX~AgxQWEwJ#T%mhsZyIugg(>$1?7% zm)okmDZHC+jQPxTJ+FRd?By$k6Mi(;ycZI5b7(S@EB}n{BXe<{f4ThiPt|Fmm~bW` zKIdzt!#|e`0X4_1=bBbjPX$9l@*$}UOC%QWApc>%;iG=|frG{}P}glcl|P}M2GEAi*euMGa@*`BIhF^E^d(&eET6U+iJ87sY>ev*=h zxykYp`0g?Fw_T9A{wBrPF>rJ~&{lf-t0Yl5N>xjRx8PL*?GS3-u$tFPM{8?<#bk{1 zc+nYAh#hKF4%UKpf{wLBr)OVYeZ>h!665eSz-&Bj_0qtMemB`^LQ@;!dY5k+uyQ(G zpf}hhQSUZGA9T59JSaj|`65|6LqTifa$LA~`I~hH4rvqv!Qdhbu(f7C%!+mYb8WSm zt1Ew=lvAQ{`F~Rjzj|{6|3+WD>odKokzw!3c%Jvi@6U8wX1aL5>)9BD!OPZlA`Kh* z*8OM4<>kElM@?zfn62ryvyPsDBo@1vnQJCMprzvA@#~hV3RNtFF73ASv_uFiHZ^Ob zReXQmP4{h*eW$F%YIdE7o%{DTubq$6+Y*g~E-+aQSDiaGsJ0WS!O=gCxx34$_ zMV|*LZ}>YImF5gBGgKI5fklSqeKY4FOF!xHU%!lg9sZi09va}zR=ky85C2{hObA>} zv=7a)9GAqf>;w!;Pdkc_Q2$7Ew|aB6|KWbX*^cmyYcgL9+R8)e>VwstUf*aG-jM|_ z3DB5at9Z5a7t;$(_{apWTItPNzxCN^{2CH^^Q7|*AOEU|KIW5CX8h2akjY5J5;+cG z!0J9eV9jRI4++KBl0igdCKWf5Kxtq&8K^TpZcA-j@alTgOIx$#RFT9Z0Q zEsbjqc9ZWfbXUtOs$Xlu07L{2cixU=;7pMzJOqyw&W61H+ixgG0vK4!TRo;oNJ3Sb z@Nrc&Uv2$>-wuQjySq9`*THlAX0V`>)_tBwBHL;Egv#qfK|U=!cTYdDi0!B@g-Ml` z#i`I_QaRwH26Sz>x4Re^8h1w=QfyQXyT3j79%KfoCwZ94KVAGJ11okrf2Gj@R{ZJH zTkTwbk(2W`Ln>-&vH|XWXW_Ze-O;Zaou@|rvV~@v&;P)5J zTk7q{EZg0fz-3MO51R0+YH5+=_}=+xgTJp3+y_J}4{ERTG6vrp3QHhxGRT_mv;Xba zEl5OX2aJTlFH;qclyOT;SPfBHQZ5664ThnIc4 z=hUqfrcVRURzi`G!o3&sC4XRq@PON`|7zy(4tuw&SHjO1tp-paJM_4YVFABYtBGLC z4At$inB%NPTagStKe#Adm|{d8BX|17`{cH``)i?T-gGTHb+}pEX32SGD_SW>Y7NnN zHS64*aTg;jbsICWte=-VfmVuP6enyu?`G+85_LRrTw8%iwFe0Vyx#AG-!1DJscK_C z$&sOIJ17!V7Nh4c(*n~L#*E@i8*VkqFM*LK%jhm~;xn;wyItzP7{rNXU+t zcm9ww4H4@S^Qy|{td9#n<~N6D2|hn@F6whViQ+e_UkX#Bu{K+Rja+vX4kRsu=S@_3 zc{!P6PfcF$pptD+-1J)?=?*aFzvv_j0lca&b`(gyE*b=X}z;pbVLL}2Tzgx{A4SSZ}Kdg?R z(8<(0YtCU}l8@^5znY)(ZSAD6{0>KV$2vl4_=t*8Qm*awu(-bEfB&3t%{rJ6m6j?H zIp=;IQsXzVu7GLSSxZ~49G1tFa3+LuW6ltH+Z3?*^OnU<%*|QDD2%ng^WVmNYA$YG z+|DY#m)Cy9d(rbn=cGce^UQUwIkzSG7M}4L?O2>tX7>oPq4x9d1dSy@A2GwizN`5$ zYPxHnx&W4h1)$o zv4|!xsxrT)rKPoWB1}9xKTn+3bfTC3M~Wd99?Vy$$MeQ%Q}0bfSs7{n_FfqGx9YKQ|vKbedcy1eQy>*RR0( z@ZK>z*0sA%2ab(WxP3A(=j!Bi*^gTLmxJwiq24aSFP@s_^du)0D;oNo2Jd579van5 zprn||v_lb^Gm}hw>HL{oqUQjF8Lkn#5_RxjDS*vqVOU zzX!PNT}|j*e7nAn5B-=>$JVD?Q}F_x2Bj#ejs{9}(I|%@-=_I1-Tw5m!5D$`f&=C;n3L@DfvD zR2gBM#xEEE?~Y?4Md$h|m~h6XmU1sKzd(E;2)t~r?r3QDVMtC~)vI)6#qGn0Pc8VYr|%<6pK2W4ge$zr%}g^|NB(d%eKck2i=-S|YdNK4rd|^M%9wqN< zM^xBy_hU5b%4gepZ7>Dj9wS@7Z{2?Nqm>E;KR4&d8t@J|GK@cXdp`3-HQ?Y5zZi2k zhHK^K>@0ilOf*t}GL#)`iNZ!OtGJvPIOx9r-F(CDHyf#3ES&@~7!nxPF11t<#ogV( z)H(IR&u0;ntox@eKU&XkKCkaKEbdJ#vhgf`oT?_fyt`>pIG-0qnNN+436qm5-nndG zoj^IRCbOjv))}1rbAA}@G*ns~bGgjdz_hbGXM^GG%9{5uEeATB*8|r?BhuM&r>lE@ z7o4^`jh;gL#ePCx-sOsA4R>{u$>ZqUoVveTYjuq2oIz(}4_R8`X_+-7f74b|!KM`UH_3$ytdM9l$BDs=1+^Saog?L z92J9v%ZoQ5eIuW6@axr|JOJb`%f-b#_Ab%g1#vf!+LwnMR8(z0wXpc(4gn8yN0WmMEHMAy_a2D)Stxq2giY4*_;D)puk+bjKG3~ZEL(+m z`wsZAR#%xoN=DKlU=?8JsI@82Gv8HfU$tJm)r<_lzuHvpp_TbW^i;K4>h_zy%}M$g zXZ7)!nR}-fN+H0&vijda>%Mq~v98M_e}eG91f6&8D}px%&Iz zkNI1ra6Be$9ii>NtuKndKBNp4d8)6Eo!7R}m8c(Blzh+!mm`dpk1ja!=XX7N3IOy$ z|5$*sZ_8l+xKke9j(>NIhQB+DV{JWGYzji>hA6~H?KLLupALq6*^!9m1508BYAmT< z%85x_I+k@I0su^ki3u(5JA$io9k*xOFFwx8`+8bC>*@&k5VN`4KT5_=GvBBG>H{{T z*?z$2@2>|TkegYinRPOuno75BRu)|CY!O_?;auFumgahT^{HsTnuEBI2*KdBA+?hl z>kx~y6pYEeY4g*NrEoHZi~jKdGD@&L3V>^4mb>W)2Xm>jOUx54k`KB5qz7F>d;yp$!sr}6FoHg zKD*XJp)Ch-4E{^;ZfI3#ys`exuP>te`={T@;%}UpvLy3PJL^y%4O&BXza=fkO_I&j zElT!^+4MJ|Lro|m^wq7=#)DCGf^KNZygr-?OBP2sU0qWZCUcinwqent?Yhy?+pL%z1~BV(WS`&1;F zHBdJXZfPW)#kSs6JU)S7%RF5fuMW9et{2xX-Hwdhl%W)qqmN9Ow$$niJ`?SDPk=<` zYjUL2?&x@|gW*F&QgN>NQLs_9xncUfccC4Fa=+qU@wEJX4X+BaS^i?BZw-UhdLkIux*xb+=fy@I9ctBe9UAY?@&N}R14L3C zZm0dwxyLCi^S9j!6@O0XuxW+PE}lb|iOV+Uk%k_QrkR$osWCC1*3VtmsZ?Wp54$Rn zKZqyZ$H})1*}Z>RqVxD?E4^q|7)!#b5zX$H(k?J2=xUjE+(&s`oMdnudl{=H7=tJa&*U*6-tibLIkhc5W*C z>C(>BjPTbxHqKYE(sviNzodhAe%DsDcEw*^1+Sfx(Tfo%T$bsitY%>Y#LRMU+KYFC z_sUU^92~x{_9=qt?jx?GO})D(lHQGhd*&}(Tnhhlp60qIoWDxtE#oO&8lP#`*4CDZiV7}RG{`ctu&BJpCWa6*pB5L_5-m!mW> zlZAUth+!)TO7726?7hebQAlB+6bO9)Q;B}iMJvh%Pf$9~iy92qA=AT!-QvHGAn@!_ z(k!!&ptaLme|%M*JNpQsqq%uOcJ&RyN(9gW>J+;4Fnu5%E0hDq8T}vQ5 zDTJ3dJHF+6fCY%-&Fspr<;9!4A^E}DlMt&YyEnctRq=9Li5Vw&zgLi5CjXe2G#wyd z3l%nE6|?|7O%k2nI^-PB;b+k9aPbnb^S>UJq2dT0w+Nr@mH z7BqZA>})umBO01B|7Dg{hj!-5mwLR-Z5z7o*ta1f^z3o&cqdn4Ip;r0NP2X?CirU& zWxf;r>9oq|RoP39BCxOBfBan_LePk}$bPhY6&KE_hZTxIl;uVb$gC|;y6t=+fHoRoeQ~hty;+ntNF>l0`hIvsjU_1g_B;e52|^;Q5uv&Ts$=fK z#|*lrrgWA+*{ez$kPo8Oi?C=cu{S#{E?_&C;n~LD^$!+({jB?yC_;0a9Y&<@u@OcX z=V5bK-ehAfPuU|s?~l?zIC)Fgu_LrLmp&C0;a0a@z2r|&U;5g|{8;q)NOHYvH-r24 z&bI46`$y07f{gA~x#5Rl?AE5#lT%Y{XvWuj^U)v&)%j1!>7Hk^bw8Z_gLNR=>9%@K z<3L5(c8rEnwvjbY1%IXbn@s`Jt+{xgoX9uy`3aYoHEw=wZQ`?M&zetgw({jr*o(Li z7+sbk2nS2J9$l=aAs---50#!$hgRFKQoz3fq#}E*=awLywIn`mzVgSTo206FKH~`< zXd5!eDaMvIA7})lbV9BsB2!-vaHb(23pDlM0vElKZ8m%s&B?N{_hGsb#^0V3)Zp?T5f@ zteJ3b3Mr*e)a{)@fHlPU?IrieK|+G8@y_n6(`^_4re0Mw;jX{HXkj(+@jO`2%XDwM zVO zfkn-K3%KS7Kw>BVd9EMc$mhC zQ;B5v*>A@vwA@{7+kwp7$alZvSO5L@->d7hUA_eM{^sUp0UT`(a(bYn<1IGsYDvu* zClGXtF0BWWi5QU(f(s9snghQj+(@<;R3KFY{cNp-Lo@BuDMUQD_R2cbk>+^OlW|rM z@`n2$`#YHQYnDt{XL8NdlQdU7q~cA#P|@TH!>hgL^Dro^^^gaE z3i5}o$CwI@gRG2%M8jg1__2`9{y&6{$v-8IjxNcPtVW6%}jG6^=8$ zEi#-=_B$v7^9Oq;E|AjP`F&a{vPp6MJSsK9n|mg>xD~UQCxD_~b!I>KVD=)c5&716 zGid}TJV29qEOB>-A~9h5l@{C|MX;2Teiy8$Ovo12_CZewCS@9jl*2^O1=6l@!#CKV z2^0yh?y<%|PKYh0Z5F=!S!kl}j?&s=8oqrqse6tZu?#%?k%J^yyxsF%o?E;-3!QUo z;lJy@AGhOo(22jYJzYJmBfI-;{=aFhPJim|h#mN#fS2 z4>>7d`R|e%*m(q)BfPs>CY*^`X$dGH<1HXh*MwNrW>y@89Yb#?`7o=7xO9mSQ6vk)~Y57 zbA>s6Odhw3!PU__)?nuNkDO#L>+UDbTOqus>~}Y4c;8+-=57!?vZNQU7tUW-)cfu= zp=Gip-Fx3L`V6F79R(*0}wVSpjXk98|u*9wbcr(WCHf zDN+e>@r>jZ4X=!?$IUeijtG5Wk--+n8wx#pzbO4!jANo2FypAd;MG&GzX zAICa;lWh=J>GbT=G#QRS1k04csxS7cuR({-=}nty!F4NKpR+Rz(lLs)0k$D3Ywu32 zFh16XhAHP0d3WAwV)VPVQC13EE!kWp~7@?M!9T;4htgfTG# zFM^-Opc3SB!&dPps(Fb3c9UUFrb$c#C*XD)R9_Hq8Tlh|=BefjC z2XqVxwwwQ1Sg0CK7cRK{Qa7SW*+M6|7M`fx(Jhovmm;nrZ z0KoeH@DE2g)*uQa%fIAhBnf%2|}0C~S0a8ov5GMmqRu++!Z;!1UkP zD!ip2Hg{zAZXShieTVogMDUwPuZ*&NvpB2w_3PJL4fC&t=D<4J;}h%L?uPc;T~Dxc zognSC{=MCMbG$k4cISCFh~C!tju&ds&DB4=!T7}ss+!J+>Slbc+Fti3Ji5mwhnd=Q zVz7bMI1_iE5_m375R^N7u0Tz=awyX6tN4=dH)R4gh~ieWfW`D~BF-dOV*&sQZtcQX z762BI4YvASf7d{K_vY_`{2eH2MbH=F0EOEi$fn5_0g|2cQOi{L;(=5vFHKO~ZS?GX z@mBnu%k8260XD?>vJucXL;MZdjdp#ppigSF9ilQeKXlXa;tsyuwqj|q{qg?oN?)9N zE9en^>10W`F5O%n>)icnXcIq6P-FJO(BGeme)#`s5ip~uXcy%`OoF@0xaRYpZxo<7$pC9|Rt&OA=YkP7gRmFv zbwPY9O2$nK_1fdDFe4!o=`BQQ=%sdyetJ{}Mgd0EmLvdhj7Gf!;Sl`+>JE_i&j0!~ zfjk;#YI1UPp*28BQ)BFf0eQkVSF@LyT(ow%$$CU5cbWS`9u6bdZGl3BTbD&0;=mGw zMkxjRd5kbYBQYD+#qEAb$WFOo1(-1jv4T3O{m%)c{k@wg(OCo`?s&hYxA?uiw!+tY zE&IV*6W``R5I}DzO|beOIH0;1e7)PZ7_i^^u)1Zhc{=2@!b+=kw|-6=d~~~6d=mQP z*A{8}zrPlg7Zh}Z#N?iZ@1Ik8pfCVdkdF%`R3yU!RLBmV+THL%H}G%eMw0N5h}L2#t{vs6wn_5qJ&T?YqFt!$|TY60`# zbsxsV+i7k{jH@k&&vs_IxwJBSzkQ|)^kv&;bcOk{r!@d2 zCZ|>fZk|tng0g=Dlo`jAI;^KyLa6gHv8q+aCQaH)eg?sjd(edYMc<O-O^mu za@nM4$;J%;gsma^`bmS>8=_Q=YPK-gNFJPpTRR&Go*?P!93~bPOdtAI_{gJc5bU2+ z3Uo;Ue-837mpKVQ@mvmN9Yfb##h^^^KP;*N3MD-q36%jhVuZC3k)Pn4j8JtDxua1z{3$8eCa_=GwNhb^9}^b2I9so)Ei6)_|GD{l)y96Yb4Y?`<}FiN`* zBKiIHBDJ-(daJLbGi7{U+T4ZeaPsmH5IpTC;1FjrnGmbxd;BalG8cVs+Gh-P@+d{( z%jaBP{ZW?kr`#o?y^~&ehT~*Odgaqg7jSi+Lnz!)8i5RcWVoffc4)B1H+7A#l3()4 zJH%eG3AgG!HtT25s$Ax%LDMiv<#d_jqN+IN-U8wB9gKZ`lNUOX1wT}DL@FG7N1W=n zCnHb9)8p$%r_2{~67*4@2x;^Zy8M(0K6>qebggjjq&+L?+es@pfV}(h5UKb(S($M_ zAao0wqPv7fQRYIwM4cpO?HvD@5UXUxL6)u)G$K~P;1-1P8$i1;wXooKolE^{^2AYu zZqTug*Bu{JUji@m2tNwQTS0;L zC{?x;OM+#d4;^uJeo;1!u`8uEigCj0Ypwj7!l3@=9LLeFZdF+8N<2#0^PW`fEM_N4N)pOj?$2{V>ae@Zz3vxkzdvxsm!l0?wf!Snty^*f>Jo*8gei!?=eDDbZkIZoewAmtLCj{ zKkiKj$2Pz?RSFHBv^Q_Eo))+@R}uXKoSQ|+qY38f9k`Mbu<=Qgoqv7#1X}XU@87?l z?^`7TIF+HCk5ehl-yW{?*@1I2pj3Ve5!VNtySdTg9m~am<21t4K7I;nZ$;T~K({j@ zJ>*!Iz4kU2O@-5eiD|A1NBddy-aUd5cydr!wHo&rr-l|gtxAzz=x;@P3AoO2jWj*& z^h(*PaLQEYN*dR>g2k?=&(*Ji>~?cJm^pz-l!4~{VhQ*pPng4uLRr*1z}cl*6TT=V zn0k@kKTY|c*%eS1*8P~l9RlYfq|iUXX${&(Bhrr$V5s153t|7f-3(3;G**28z=rq;B-ZqSlNym$x8+a!bW)B9--l|}i)!g>@_-W?;Pi@% zt1BmXOFrr(kZ6~QeH3(ZV{v;cf}8*NrN>tSF$syTt*Hu6RIdEbT0Su?3X<*)aF`8D zAi_XC*>fbpD|W^u)pJBx{mw<=L-ui(dB|M-SS??TYfFvJP;J+*R}o7+6gu;Mto6t1 zS?YP28+Q;Sw~c|M#e9yzdbllSjBb5DIsL%t1&7sPt07WvE$ zOiaNrxtTzTgZvXnMls605qgnnBy<@~Af~m=j@9N=h{I+-sY@8*cGEX=v#;F$MvioM zcNe&n#!^HSZp(l}1Yz6F24Ecm6e(lhr>iUf*?Lz7`#Mv4g+M9r9I55|kT}4>L4FSl z$dvUJNY=d5;|o>bhX5OnU^E9>_xx8o{8(mr`efP*1u`tfw>MxEO8`VBssNY%=W3=| zaZE+#@bVH85X7J%NKxk?Bs=`w8X!6O>(@BQ>AgUYsnki46D6uOH<5f|uuNz!hbftr7vV zH&p4Z)cejyG^~jDB^5@(w*5o++gEf35^u?tq)Q3g94aX(qYEh2w&ULsJ1t6nz2-2> zkiS)91Fq-Qn*MquFTJ4Zs1e@DT3S9O{QnPg{@({aWBqSJ&bi{Tuu((4Ae#tisAwaq Il&!=57eox}sjgB106=?B17!dJMBrNhO+g0! zUH;hc?+Y@!`|2p*^4}}(b4e0-h0!db=T?d18-$-5;|thvLV%A9w6`r!vXXKh%Ed)CjYigzw_T~X=XJT4 zik1E8K6G)>=+loaYd`82PyKWH!FVI?R_@&PpU=Yz&467e2F80g7LNRXzddiFLhK%0Iq`L2i+KCYNraDS3;X^%+AyCimt@rzwEDJ_F}r4iiWHOVo#Kz>Z)h? z8kH}t0(icD{i@ECd3bm@aTDV)n)mUe4-hsrHI?`2(+Oq~${dM)A!UwitL6$ptW8f% zK>?eu8Mj_wW~Qd7GVi!?c(k&!vsXhqrMQuShktk(B(rr4-|N+V{HWZ9h@twTcSVI? z1#Pc(Cb)KMp{%T|V^e_P<<5DIe4zW*uTKll4>zapEP4!P+`92h8hM@X`R0^Q=cQJz zLN)+A|1$v|s)XYZAAtVwupufO#!PyX!ki|GA>309h>tqcU%YesHXYaJ>n+Y1@9rr) z{VDwW&mXoOc|b{5mtH4Z=GL>DNFAX+bFG|LuU;jC4)|C?0H-HU3M`wSx9_iwIrqe| zi+QbTjfUrS&1gW=Xh~Q@-euoMyC-TF>S`9&FSb=hsZ}PDqH{>3ZZA0 zi2$XJmiF8DILot#mjZWV8QE{$y5+qy-@fDJ>U#5Fe_zSclHJG0M>#lH{sgCM&Xkdn z(Yx28M?)0}`B+z{7Z^wYxZfF(xJxd_AD)hI%t>lX(h$qa%IYUsFgj&nA&h zL&ic}GwIUEd7cYL>PTuJ$lp|#md2bC2;3=}`qtK*MFxmOgTyNob4Pu9a--q%O(N29 zswY7?bx@~Qd1Ymlw6>7ow)B&BE!oF1I>iw#G>S7 zf&$h6u|fzDBuNs`eNeGMS49@Z7-maq)A%s_&tHls!Np5TYFUzCUCqim#ZD50cG zt`sb9udmysI@pS*KT6k%nyh~vsS?J|K>0wB$rQX4w%5XkN z*4{hw?gz@Tl$1l#Df?$O8P_Sf(a5`TO8`t?D8)b%VHcZ_Y`{!Ks(C$0Q}eyc^aI>> z*(34ykhuJ9LY)_0r@W%#LG9zO208dOePZ_97ayOF8+`L0t71Q=U=1>zB0SA)O+HI? zsCKzMU@^W@>@3brvKO4|HI$y57?{%|g^%?b3Yw#jY�RN%7mCBcqsdWE}IP`zE40 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 T$e|eoX@GlbI;aX2oACbv)ITaC literal 0 HcmV?d00001 diff --git a/ctr/assets/mame2000.png b/pkg/ctr/assets/mame2000.png similarity index 100% rename from ctr/assets/mame2000.png rename to pkg/ctr/assets/mame2000.png diff --git a/ctr/assets/mame2000_banner.png b/pkg/ctr/assets/mame2000_banner.png similarity index 100% rename from ctr/assets/mame2000_banner.png rename to pkg/ctr/assets/mame2000_banner.png diff --git a/ctr/assets/mame2003.png b/pkg/ctr/assets/mame2003.png similarity index 100% rename from ctr/assets/mame2003.png rename to pkg/ctr/assets/mame2003.png diff --git a/ctr/assets/mame2003_banner.png b/pkg/ctr/assets/mame2003_banner.png similarity index 100% rename from ctr/assets/mame2003_banner.png rename to pkg/ctr/assets/mame2003_banner.png diff --git a/ctr/assets/mednafen_ngp.png b/pkg/ctr/assets/mednafen_ngp.png similarity index 100% rename from ctr/assets/mednafen_ngp.png rename to pkg/ctr/assets/mednafen_ngp.png diff --git a/ctr/assets/mednafen_ngp_banner.png b/pkg/ctr/assets/mednafen_ngp_banner.png similarity index 100% rename from ctr/assets/mednafen_ngp_banner.png rename to pkg/ctr/assets/mednafen_ngp_banner.png diff --git a/ctr/assets/mednafen_pce_fast.png b/pkg/ctr/assets/mednafen_pce_fast.png similarity index 100% rename from ctr/assets/mednafen_pce_fast.png rename to pkg/ctr/assets/mednafen_pce_fast.png diff --git a/ctr/assets/mednafen_pce_fast_banner.png b/pkg/ctr/assets/mednafen_pce_fast_banner.png similarity index 100% rename from ctr/assets/mednafen_pce_fast_banner.png rename to pkg/ctr/assets/mednafen_pce_fast_banner.png diff --git a/ctr/assets/mednafen_vb.png b/pkg/ctr/assets/mednafen_vb.png similarity index 100% rename from ctr/assets/mednafen_vb.png rename to pkg/ctr/assets/mednafen_vb.png diff --git a/ctr/assets/mednafen_vb_banner.png b/pkg/ctr/assets/mednafen_vb_banner.png similarity index 100% rename from ctr/assets/mednafen_vb_banner.png rename to pkg/ctr/assets/mednafen_vb_banner.png diff --git a/ctr/assets/mednafen_wswan.png b/pkg/ctr/assets/mednafen_wswan.png similarity index 100% rename from ctr/assets/mednafen_wswan.png rename to pkg/ctr/assets/mednafen_wswan.png diff --git a/ctr/assets/mednafen_wswan_banner.png b/pkg/ctr/assets/mednafen_wswan_banner.png similarity index 100% rename from ctr/assets/mednafen_wswan_banner.png rename to pkg/ctr/assets/mednafen_wswan_banner.png diff --git a/ctr/assets/mgba.png b/pkg/ctr/assets/mgba.png similarity index 100% rename from ctr/assets/mgba.png rename to pkg/ctr/assets/mgba.png diff --git a/ctr/assets/mgba_banner.png b/pkg/ctr/assets/mgba_banner.png similarity index 100% rename from ctr/assets/mgba_banner.png rename to pkg/ctr/assets/mgba_banner.png diff --git a/ctr/assets/nestopia.png b/pkg/ctr/assets/nestopia.png similarity index 100% rename from ctr/assets/nestopia.png rename to pkg/ctr/assets/nestopia.png diff --git a/ctr/assets/nestopia_banner.png b/pkg/ctr/assets/nestopia_banner.png similarity index 100% rename from ctr/assets/nestopia_banner.png rename to pkg/ctr/assets/nestopia_banner.png diff --git a/pkg/ctr/assets/np2.png b/pkg/ctr/assets/np2.png new file mode 100644 index 0000000000000000000000000000000000000000..d7695ba10ecf0fa564f0b4a50b2c19241b9e7ba2 GIT binary patch literal 3795 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 B7vBH? literal 0 HcmV?d00001 diff --git a/pkg/ctr/assets/np2_banner.png b/pkg/ctr/assets/np2_banner.png new file mode 100644 index 0000000000000000000000000000000000000000..c97662eb6ecc45eb7a401fe637660ad03fc4d4d4 GIT binary patch literal 18686 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 literal 0 HcmV?d00001 diff --git a/pkg/ctr/assets/np2kai.png b/pkg/ctr/assets/np2kai.png new file mode 100644 index 0000000000000000000000000000000000000000..d7695ba10ecf0fa564f0b4a50b2c19241b9e7ba2 GIT binary patch literal 3795 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 B7vBH? literal 0 HcmV?d00001 diff --git a/pkg/ctr/assets/np2kai_banner.png b/pkg/ctr/assets/np2kai_banner.png new file mode 100644 index 0000000000000000000000000000000000000000..83a82db0f6faaf5436c1350a4f4816e33e18acc4 GIT binary patch literal 19566 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

88Zln3|JUYJ#6F4=ZV-0dufAIBz$Vp3L(HTd@C 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

N~;FmV2P?Y98CWZjI4k?)1M^<1Ni^FpgnwNeVF z>0*0;>F-Ypda2WK*7N+Ii=N%1gXm@eaJrLp+cVfq(lLs&7|QtU`|k&fhJpev;7zOJ z`VN1}8rCSq<2^xdBS8`ry;_im9Brnj;~A3po<)OHp-fTnzgj?ujvfnoi!a|?V`kTJxDta1bvZa5 zb^(z1j-DC)__0{JKRNDbmhXii4mwyQK)h10liNNgM`jQ8J0YljSn^Jp zMJ>y=yu6%+K`wFxo9Iz#xqe-=O16aIRIS}d*9D(5tS2Z1d;-XAXHwds?Z(v$P|}9g zc%^!e77QH1ScL>;VQ}gSz%_h&PfEIgAlkgo znIRP<1%6fL3@rT@XV4M-w=Q`%B?k)#3`AFD3kEmfz3gh-*f!Wp|LvzYAT=}ocAai= z-2AJ@Z*oW+xJTh~vCBtNTLHgKG3`ym|HdR~j3wU{Uwj?@39RkQ6s|z_m9)ptStuS)1MI6aC46 zKH9TwUER(xSZNg$#ws<+y>xSC_wECEU*)vk)+7F(G@1s~GB>^@uDe^G-ES{cY|rey zwlvjFs*{qKJg!b=j4lqkJ`m)RkE?ySi2>%%t|eF+Hc0P)u7>p~L%;}KZ}p3w+l?34 z7XLE{6NX|0b-X6+!zy_Biq9Y3l!hJ?mI2SBiYnF7){c*&68sq;C8esM5bm*_>Gm2Z z{O+vn z?#a!rgWpl;5eKc$aa{G=KP9nMf?zvaTeE#BF3t%L4>tuDW@P4!F8fk>cPp6O=-?Rm z6v9u*Oj=TdkLlkQrSV$!0?{rsF?^`qsRJwNG>P5NdbH^5 zQ+h81nQE60J?{>V9qQ9=1N-w?(!Kl5#tQf6SGXf;Wv&E=l%9a8j zTRPc1AsG3%b!oK%PmCPth?KXwsrvQ36kwXY&d$!9T*`^Pxh6r6P89C9o6D0R;B5!C z5)~481GhOBZogY^DOn0WD>xlJaE89J{j_pQ(NxE2)J*Z1oqg%{YTqGjB&+%%W;>b` zm7smbDZuzYJ_^{yFLq? z7#&)SU@tp31M7_2A*;vrK|DIHT2ob3)$!ur-}fM2pWoLpAa0D|=m+Upjn=5nKGXL2 zVTA!LB*lw)ZnZx-wp#yA^+Vq@oquem*-XnvbCoP=J)5lK-%6(#!xCQgY2|omP-3>P z>E>u5le`fZf$LtWme|Fc;A#ijxGyDdAph5{wRI*tlQJ|#%525A{l?=35{I&WkiXQ~ zo_V3i>r^y^-L!L=;A76Ph`gNPb&Mflz3q_)xYY{(0SYiT@PHPoH{dKSFUJABBaIt^ zP}E|Ez8(2!+0ujD31W3Y%CzyZvF{%R9cs07bY?&ezn?uE`X4mR@K{S*JiC$}<%?y+ z?TwG?3f*{a+(Ng?8J^L*= zE$uVN>-u0|W(_2XYpdb+`z>dWvbaqG1!r-|Apg!zq$EN`Fy88Ui}F{b>~B?2hU6fB zFqy)zmk<|+2C6eb^>X5P=eLDmc;R&U$KlD}-^O1rGz-7E(@{y&=o58@v#E(EeW#=> zHtQo4-a8sLA1+Ao{CdJrQ^U7%dzFwnq0}(SMtJ|emSd>Qp!-^yDk3mbtRdq?361w* z&mWpB@26Che=OCH)+NiiSDE>8(lMSCyyVlP=XgT`Vr9&QCjDcW&( awU45A_T^0 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 literal 0 HcmV?d00001 diff --git a/ctr/assets/nxengine.png b/pkg/ctr/assets/nxengine.png similarity index 100% rename from ctr/assets/nxengine.png rename to pkg/ctr/assets/nxengine.png diff --git a/ctr/assets/nxengine_banner.png b/pkg/ctr/assets/nxengine_banner.png similarity index 100% rename from ctr/assets/nxengine_banner.png rename to pkg/ctr/assets/nxengine_banner.png diff --git a/ctr/assets/o2em.png b/pkg/ctr/assets/o2em.png similarity index 100% rename from ctr/assets/o2em.png rename to pkg/ctr/assets/o2em.png diff --git a/ctr/assets/o2em_banner.png b/pkg/ctr/assets/o2em_banner.png similarity index 100% rename from ctr/assets/o2em_banner.png rename to pkg/ctr/assets/o2em_banner.png diff --git a/ctr/assets/pcsx_rearmed.png b/pkg/ctr/assets/pcsx_rearmed.png similarity index 100% rename from ctr/assets/pcsx_rearmed.png rename to pkg/ctr/assets/pcsx_rearmed.png diff --git a/ctr/assets/pcsx_rearmed_banner.png b/pkg/ctr/assets/pcsx_rearmed_banner.png similarity index 100% rename from ctr/assets/pcsx_rearmed_banner.png rename to pkg/ctr/assets/pcsx_rearmed_banner.png diff --git a/ctr/assets/picodrive.png b/pkg/ctr/assets/picodrive.png similarity index 100% rename from ctr/assets/picodrive.png rename to pkg/ctr/assets/picodrive.png diff --git a/ctr/assets/picodrive_banner.png b/pkg/ctr/assets/picodrive_banner.png similarity index 100% rename from ctr/assets/picodrive_banner.png rename to pkg/ctr/assets/picodrive_banner.png diff --git a/ctr/assets/prosystem.png b/pkg/ctr/assets/prosystem.png similarity index 100% rename from ctr/assets/prosystem.png rename to pkg/ctr/assets/prosystem.png diff --git a/ctr/assets/prosystem_banner.png b/pkg/ctr/assets/prosystem_banner.png similarity index 100% rename from ctr/assets/prosystem_banner.png rename to pkg/ctr/assets/prosystem_banner.png diff --git a/ctr/assets/quicknes.png b/pkg/ctr/assets/quicknes.png similarity index 100% rename from ctr/assets/quicknes.png rename to pkg/ctr/assets/quicknes.png diff --git a/ctr/assets/quicknes_banner.png b/pkg/ctr/assets/quicknes_banner.png similarity index 100% rename from ctr/assets/quicknes_banner.png rename to pkg/ctr/assets/quicknes_banner.png diff --git a/ctr/assets/silent.wav b/pkg/ctr/assets/silent.wav similarity index 100% rename from ctr/assets/silent.wav rename to pkg/ctr/assets/silent.wav diff --git a/ctr/assets/snes9x2002.png b/pkg/ctr/assets/snes9x2002.png similarity index 100% rename from ctr/assets/snes9x2002.png rename to pkg/ctr/assets/snes9x2002.png diff --git a/ctr/assets/snes9x2002_banner.png b/pkg/ctr/assets/snes9x2002_banner.png similarity index 100% rename from ctr/assets/snes9x2002_banner.png rename to pkg/ctr/assets/snes9x2002_banner.png diff --git a/ctr/assets/snes9x2005.png b/pkg/ctr/assets/snes9x2005.png similarity index 100% rename from ctr/assets/snes9x2005.png rename to pkg/ctr/assets/snes9x2005.png diff --git a/ctr/assets/snes9x2005_banner.png b/pkg/ctr/assets/snes9x2005_banner.png similarity index 100% rename from ctr/assets/snes9x2005_banner.png rename to pkg/ctr/assets/snes9x2005_banner.png diff --git a/ctr/assets/snes9x2005_plus.png b/pkg/ctr/assets/snes9x2005_plus.png similarity index 100% rename from ctr/assets/snes9x2005_plus.png rename to pkg/ctr/assets/snes9x2005_plus.png diff --git a/ctr/assets/snes9x2005_plus_banner.png b/pkg/ctr/assets/snes9x2005_plus_banner.png similarity index 100% rename from ctr/assets/snes9x2005_plus_banner.png rename to pkg/ctr/assets/snes9x2005_plus_banner.png diff --git a/ctr/assets/snes9x2010.png b/pkg/ctr/assets/snes9x2010.png similarity index 100% rename from ctr/assets/snes9x2010.png rename to pkg/ctr/assets/snes9x2010.png diff --git a/ctr/assets/snes9x2010_banner.png b/pkg/ctr/assets/snes9x2010_banner.png similarity index 100% rename from ctr/assets/snes9x2010_banner.png rename to pkg/ctr/assets/snes9x2010_banner.png diff --git a/ctr/assets/stella.png b/pkg/ctr/assets/stella.png similarity index 100% rename from ctr/assets/stella.png rename to pkg/ctr/assets/stella.png diff --git a/ctr/assets/stella_banner.png b/pkg/ctr/assets/stella_banner.png similarity index 100% rename from ctr/assets/stella_banner.png rename to pkg/ctr/assets/stella_banner.png diff --git a/ctr/assets/vecx.png b/pkg/ctr/assets/vecx.png similarity index 100% rename from ctr/assets/vecx.png rename to pkg/ctr/assets/vecx.png diff --git a/ctr/assets/vecx_banner.png b/pkg/ctr/assets/vecx_banner.png similarity index 100% rename from ctr/assets/vecx_banner.png rename to pkg/ctr/assets/vecx_banner.png diff --git a/ctr/assets/virtualjaguar.png b/pkg/ctr/assets/virtualjaguar.png similarity index 100% rename from ctr/assets/virtualjaguar.png rename to pkg/ctr/assets/virtualjaguar.png diff --git a/ctr/assets/virtualjaguar_banner.png b/pkg/ctr/assets/virtualjaguar_banner.png similarity index 100% rename from ctr/assets/virtualjaguar_banner.png rename to pkg/ctr/assets/virtualjaguar_banner.png diff --git a/ctr/assets/yabause.png b/pkg/ctr/assets/yabause.png similarity index 100% rename from ctr/assets/yabause.png rename to pkg/ctr/assets/yabause.png diff --git a/ctr/assets/yabause_banner.png b/pkg/ctr/assets/yabause_banner.png similarity index 100% rename from ctr/assets/yabause_banner.png rename to pkg/ctr/assets/yabause_banner.png diff --git a/ctr/big_text_section.xml b/pkg/ctr/big_text_section.xml similarity index 100% rename from ctr/big_text_section.xml rename to pkg/ctr/big_text_section.xml diff --git a/ctr/tools/bannertool-linux b/pkg/ctr/tools/bannertool-linux similarity index 100% rename from ctr/tools/bannertool-linux rename to pkg/ctr/tools/bannertool-linux diff --git a/ctr/tools/bannertool-mac b/pkg/ctr/tools/bannertool-mac similarity index 100% rename from ctr/tools/bannertool-mac rename to pkg/ctr/tools/bannertool-mac diff --git a/ctr/tools/bannertool.exe b/pkg/ctr/tools/bannertool.exe similarity index 100% rename from ctr/tools/bannertool.exe rename to pkg/ctr/tools/bannertool.exe diff --git a/ctr/tools/makerom-linux b/pkg/ctr/tools/makerom-linux similarity index 100% rename from ctr/tools/makerom-linux rename to pkg/ctr/tools/makerom-linux diff --git a/ctr/tools/makerom-mac b/pkg/ctr/tools/makerom-mac similarity index 100% rename from ctr/tools/makerom-mac rename to pkg/ctr/tools/makerom-mac diff --git a/ctr/tools/makerom.exe b/pkg/ctr/tools/makerom.exe similarity index 100% rename from ctr/tools/makerom.exe rename to pkg/ctr/tools/makerom.exe diff --git a/ctr/tools/template.rsf b/pkg/ctr/tools/template.rsf similarity index 100% rename from ctr/tools/template.rsf rename to pkg/ctr/tools/template.rsf From 892c6b864a6290f010cd7984c9e004f579bb3199 Mon Sep 17 00:00:00 2001 From: orbea Date: Fri, 24 Nov 2017 09:57:07 -0800 Subject: [PATCH 086/183] qb: Combine the add_include_dirs and add_library_dirs functions --- qb/config.libs.sh | 14 +++++++------- qb/qb.libs.sh | 15 +++++++-------- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/qb/config.libs.sh b/qb/config.libs.sh index 18842f2877..f456f6445e 100644 --- a/qb/config.libs.sh +++ b/qb/config.libs.sh @@ -5,9 +5,9 @@ check_switch '' NOUNUSED_VARIABLE -Wno-unused-variable add_define MAKEFILE NOUNUSED_VARIABLE "$HAVE_NOUNUSED_VARIABLE" # There are still broken 64-bit Linux distros out there. :) -[ -z "$CROSS_COMPILE" ] && [ -d /usr/lib64 ] && add_library_dirs /usr/lib64 +[ -z "$CROSS_COMPILE" ] && [ -d /usr/lib64 ] && add_dirs LIBRARY /usr/lib64 -[ -z "$CROSS_COMPILE" ] && [ -d /opt/local/lib ] && add_library_dirs /opt/local/lib +[ -z "$CROSS_COMPILE" ] && [ -d /opt/local/lib ] && add_dirs LIBRARY /opt/local/lib [ "$GLOBAL_CONFIG_DIR" ] || \ { case "$PREFIX" in @@ -46,7 +46,7 @@ if [ "$HAVE_VIDEOCORE" != "no" ]; then # use fallback if pkgconfig is not available if [ ! "$VC_TEST_LIBS" ]; then - [ -d /opt/vc/lib ] && add_library_dirs /opt/vc/lib && add_library_dirs /opt/vc/lib/GL + [ -d /opt/vc/lib ] && add_dirs LIBRARY /opt/vc/lib /opt/vc/lib/GL check_lib '' VIDEOCORE -lbcm_host bcm_host_init "-lvcos -lvchiq_arm" else HAVE_VIDEOCORE="$HAVE_VC_TEST" @@ -59,9 +59,9 @@ if [ "$HAVE_VIDEOCORE" = 'yes' ]; then # use fallback if pkgconfig is not available if [ ! "$VC_TEST_LIBS" ]; then - [ -d /opt/vc/include ] && add_include_dirs /opt/vc/include - [ -d /opt/vc/include/interface/vcos/pthreads ] && add_include_dirs /opt/vc/include/interface/vcos/pthreads - [ -d /opt/vc/include/interface/vmcs_host/linux ] && add_include_dirs /opt/vc/include/interface/vmcs_host/linux + [ -d /opt/vc/include ] && add_dirs INCLUDE /opt/vc/include + [ -d /opt/vc/include/interface/vcos/pthreads ] && add_dirs INCLUDE /opt/vc/include/interface/vcos/pthreads + [ -d /opt/vc/include/interface/vmcs_host/linux ] && add_dirs INCLUDE /opt/vc/include/interface/vmcs_host/linux EXTRA_GL_LIBS="-lbrcmEGL -lbrcmGLESv2 -lbcm_host -lvcos -lvchiq_arm" fi fi @@ -73,7 +73,7 @@ if [ "$HAVE_NEON" = "yes" ]; then fi if [ "$HAVE_7ZIP" = "yes" ]; then - add_include_dirs ./deps/7zip/ + add_dirs INCLUDE ./deps/7zip fi if [ "$HAVE_PRESERVE_DYLIB" = "yes" ]; then diff --git a/qb/qb.libs.sh b/qb/qb.libs.sh index 79278a1595..b641ec561a 100644 --- a/qb/qb.libs.sh +++ b/qb/qb.libs.sh @@ -6,14 +6,13 @@ CONFIG_DEFINES='' add_define() # $1 = MAKEFILE or CONFIG $2 = define $3 = value { eval "${1}_DEFINES=\"\${${1}_DEFINES} $2=$3\""; } -add_include_dirs() -{ while [ "$1" ]; do INCLUDE_DIRS="$INCLUDE_DIRS -I$1"; shift; done - INCLUDE_DIRS="${INCLUDE_DIRS# }" -} - -add_library_dirs() -{ while [ "$1" ]; do LIBRARY_DIRS="$LIBRARY_DIRS -L$1"; shift; done - LIBRARY_DIRS="${LIBRARY_DIRS# }" +add_dirs() # $1 = INCLUDE or LIBRARY $@ = include or library paths +{ ADD="$1"; LINK="${1%"${1#?}"}"; shift + while [ "$1" ]; do + eval "${ADD}_DIRS=\"\${${ADD}_DIRS} -${LINK}${1}\"" + shift + done + eval "${ADD}_DIRS=\"\${${ADD}_DIRS# }\"" } check_compiler() # $1 = language $2 = function in lib From 06f10d13685b2ebcd5f93cccc4ea6a5ae7dbd48b Mon Sep 17 00:00:00 2001 From: orbea Date: Tue, 21 Nov 2017 08:42:48 -0800 Subject: [PATCH 087/183] qb: Clean up qb.comp.sh --- qb/qb.comp.sh | 41 +++++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/qb/qb.comp.sh b/qb/qb.comp.sh index eaec4be124..f99c1fc124 100644 --- a/qb/qb.comp.sh +++ b/qb/qb.comp.sh @@ -14,12 +14,17 @@ cc_works=0 if [ "$CC" ]; then "$CC" -o "$TEMP_EXE" "$TEMP_C" >/dev/null 2>&1 && cc_works=1 else - for CC in $(exists ${CROSS_COMPILE}gcc ${CROSS_COMPILE}cc ${CROSS_COMPILE}clang) ''; do - "$CC" -o "$TEMP_EXE" "$TEMP_C" >/dev/null 2>&1 && cc_works=1 && break + for cc in gcc cc clang; do + CC="$(exists "${CROSS_COMPILE}${cc}")" || CC="" + if [ "$CC" ]; then + "$CC" -o "$TEMP_EXE" "$TEMP_C" >/dev/null 2>&1 && { + cc_works=1; break + } + fi done fi -rm -f "$TEMP_C" "$TEMP_EXE" +rm -f -- "$TEMP_C" "$TEMP_EXE" cc_status='does not work' if [ "$cc_works" = '1' ]; then @@ -44,12 +49,17 @@ cxx_works=0 if [ "$CXX" ]; then "$CXX" -o "$TEMP_EXE" "$TEMP_CXX" >/dev/null 2>&1 && cxx_works=1 else - for CXX in $(exists ${CROSS_COMPILE}g++ ${CROSS_COMPILE}c++ ${CROSS_COMPILE}clang++) ''; do - "$CXX" -o "$TEMP_EXE" "$TEMP_CXX" >/dev/null 2>&1 && cxx_works=1 && break + for cxx in g++ c++ clang++; do + CXX="$(exists "${CROSS_COMPILE}${cxx}")" || CXX="" + if [ "$CXX" ]; then + "$CXX" -o "$TEMP_EXE" "$TEMP_CXX" >/dev/null 2>&1 && { + cxx_works=1; break + } + fi done fi -rm -f "$TEMP_CXX" "$TEMP_EXE" +rm -f -- "$TEMP_CXX" "$TEMP_EXE" cxx_status='does not work' if [ "$cxx_works" = '1' ]; then @@ -67,23 +77,22 @@ fi if [ "$OS" = "Win32" ]; then echobuf="Checking for windres" if [ -z "$WINDRES" ]; then - WINDRES=$(exists ${CROSS_COMPILE}windres) - [ "$WINDRES" ] || die 1 "$echobuf ... Not found. Exiting." + WINDRES="$(exists "${CROSS_COMPILE}windres")" || WINDRES="" + [ -z "$WINDRES" ] && die 1 "$echobuf ... Not found. Exiting." fi echo "$echobuf ... $WINDRES" fi -[ -n "$PKG_CONF_PATH" ] || { +if [ -z "$PKG_CONF_PATH" ]; then PKG_CONF_PATH="none" - - for p in $(exists "${CROSS_COMPILE}pkg-config") ''; do - [ -n "$p" ] && { - PKG_CONF_PATH=$p; - break; + for pkgconf in pkg-config; do + PKGCONF="$(exists "${CROSS_COMPILE}${pkgconf}")" || PKGCONF="" + [ "$PKGCONF" ] && { + PKG_CONF_PATH="$PKGCONF" + break } done - -} +fi echo "Checking for pkg-config ... $PKG_CONF_PATH" From 51dfbd98b1f7f6b55792e45236c934bcad6e2474 Mon Sep 17 00:00:00 2001 From: orbea Date: Tue, 21 Nov 2017 09:04:55 -0800 Subject: [PATCH 088/183] qb: Prefer pkgconf over the legacy GNU pkg-config. --- qb/qb.comp.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qb/qb.comp.sh b/qb/qb.comp.sh index f99c1fc124..147715443d 100644 --- a/qb/qb.comp.sh +++ b/qb/qb.comp.sh @@ -85,7 +85,7 @@ fi if [ -z "$PKG_CONF_PATH" ]; then PKG_CONF_PATH="none" - for pkgconf in pkg-config; do + for pkgconf in pkgconf pkg-config; do PKGCONF="$(exists "${CROSS_COMPILE}${pkgconf}")" || PKGCONF="" [ "$PKGCONF" ] && { PKG_CONF_PATH="$PKGCONF" From 92ea40d96ec3ff6b298b77bc381fd40dd4c3c721 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Fri, 24 Nov 2017 21:39:10 +0100 Subject: [PATCH 089/183] Fix edge case when file is empty --- libretro-common/file/nbio/nbio_stdio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libretro-common/file/nbio/nbio_stdio.c b/libretro-common/file/nbio/nbio_stdio.c index f7c46a48e5..41f7cae867 100644 --- a/libretro-common/file/nbio/nbio_stdio.c +++ b/libretro-common/file/nbio/nbio_stdio.c @@ -75,7 +75,7 @@ struct nbio_t* nbio_open(const char * filename, unsigned mode) if (len) buf = malloc(len); - if (!buf) + if (len && !buf) goto error; handle->data = buf; From 053fbd6f27e38b8b7d095b8a2d84f974b114e762 Mon Sep 17 00:00:00 2001 From: Alcaro Date: Fri, 24 Nov 2017 22:08:03 +0100 Subject: [PATCH 090/183] Add mmap-based nbio implementation (which is too fast for the tests but otherwise passes) --- libretro-common/file/nbio/nbio_unixmmap.c | 102 ++++++++++++++++++ libretro-common/include/file/nbio.h | 5 +- libretro-common/samples/file/nbio/nbio_test.c | 4 + 3 files changed, 109 insertions(+), 2 deletions(-) create mode 100644 libretro-common/file/nbio/nbio_unixmmap.c diff --git a/libretro-common/file/nbio/nbio_unixmmap.c b/libretro-common/file/nbio/nbio_unixmmap.c new file mode 100644 index 0000000000..0decab5aac --- /dev/null +++ b/libretro-common/file/nbio/nbio_unixmmap.c @@ -0,0 +1,102 @@ +#include +#include + +#include + +#include +#include +#include + +struct nbio_t +{ + int fd; + int map_flags; + size_t len; + void* ptr; +}; + +struct nbio_t* nbio_open(const char * filename, unsigned mode) +{ + static const int o_flags[] = { O_RDONLY, O_RDWR|O_CREAT|O_TRUNC, O_RDWR, O_RDONLY, O_RDWR|O_CREAT|O_TRUNC }; + static const int map_flags[] = { PROT_READ, PROT_WRITE|PROT_READ, PROT_WRITE|PROT_READ, PROT_READ, PROT_WRITE|PROT_READ }; + + int fd; + size_t len; + void* ptr; + struct nbio_t* handle; + + fd = open(filename, o_flags[mode]|O_CLOEXEC, 0644); + if (fd < 0) return NULL; + + len = lseek(fd, 0, SEEK_END); + if (len != 0) + { + ptr = mmap(NULL, len, map_flags[mode], MAP_SHARED, fd, 0); + } + else + { + ptr = NULL; + } + if (ptr == MAP_FAILED) + { + close(fd); + return NULL; + } + + handle = malloc(sizeof(struct nbio_t)); + handle->fd = fd; + handle->map_flags = map_flags[mode]; + handle->len = len; + handle->ptr = ptr; + return handle; +} + +void nbio_begin_read(struct nbio_t* handle) +{ + /* not needed */ +} + +void nbio_begin_write(struct nbio_t* handle) +{ + /* not needed */ +} + +bool nbio_iterate(struct nbio_t* handle) +{ + return true; /* not needed */ +} + +void nbio_resize(struct nbio_t* handle, size_t len) +{ + if (ftruncate(handle->fd, len) != 0) + { + puts("ERROR - couldn't resize file (ftruncate)"); + abort(); /* this one returns void and I can't find any other way for it to report failure */ + } + munmap(handle->ptr, handle->len); + handle->ptr = mmap(NULL, len, handle->map_flags, MAP_SHARED, handle->fd, 0); + handle->len = len; + if (handle->ptr == MAP_FAILED) + { + puts("ERROR - couldn't resize file (mmap)"); + abort(); + } +} + +void* nbio_get_ptr(struct nbio_t* handle, size_t* len) +{ + if (len) *len = handle->len; + return handle->ptr; +} + +void nbio_cancel(struct nbio_t* handle) +{ + /* not needed */ +} + +void nbio_free(struct nbio_t* handle) +{ + close(handle->fd); + munmap(handle->ptr, handle->len); + free(handle); +} diff --git a/libretro-common/include/file/nbio.h b/libretro-common/include/file/nbio.h index 011eef55e6..45a3f7d347 100644 --- a/libretro-common/include/file/nbio.h +++ b/libretro-common/include/file/nbio.h @@ -42,6 +42,7 @@ RETRO_BEGIN_DECLS #define NBIO_UPDATE 2 #endif +/* these two are blocking; nbio_iterate always returns true, but that operation (or something earlier) may take arbitrarily long */ #ifndef BIO_READ #define BIO_READ 3 #endif @@ -59,13 +60,13 @@ struct nbio_t* nbio_open(const char * filename, unsigned mode); /* * Starts reading the given file. When done, it will be available in nbio_get_ptr. - * Can not be done if the structure was created with nbio_write. + * Can not be done if the structure was created with {N,}BIO_WRITE. */ void nbio_begin_read(struct nbio_t* handle); /* * Starts writing to the given file. Before this, you should've copied the data to nbio_get_ptr. - * Can not be done if the structure was created with nbio_read. + * Can not be done if the structure was created with {N,}BIO_READ. */ void nbio_begin_write(struct nbio_t* handle); diff --git a/libretro-common/samples/file/nbio/nbio_test.c b/libretro-common/samples/file/nbio/nbio_test.c index 3fadf8f888..c7163536c4 100644 --- a/libretro-common/samples/file/nbio/nbio_test.c +++ b/libretro-common/samples/file/nbio/nbio_test.c @@ -9,6 +9,8 @@ static void nbio_write_test(void) bool looped = false; void* ptr = NULL; struct nbio_t* write = nbio_open("test.bin", NBIO_WRITE); + if (!write) + puts("ERROR: nbio_open failed (1)"); nbio_resize(write, 1024*1024); @@ -33,6 +35,8 @@ static void nbio_read_test(void) bool looped = false; struct nbio_t* read = nbio_open("test.bin", NBIO_READ); void* ptr = nbio_get_ptr(read, &size); + if (!read) + puts("ERROR: nbio_open failed (2)"); if (size != 1024*1024) puts("ERROR: wrong size (2)"); From 7817ba2340e11894c91f74d97114175ae705e28a Mon Sep 17 00:00:00 2001 From: Alcaro Date: Fri, 24 Nov 2017 22:14:03 +0100 Subject: [PATCH 091/183] Add ugly check --- libretro-common/file/nbio/nbio_unixmmap.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/libretro-common/file/nbio/nbio_unixmmap.c b/libretro-common/file/nbio/nbio_unixmmap.c index 0decab5aac..8e1f5af5b3 100644 --- a/libretro-common/file/nbio/nbio_unixmmap.c +++ b/libretro-common/file/nbio/nbio_unixmmap.c @@ -68,6 +68,13 @@ bool nbio_iterate(struct nbio_t* handle) void nbio_resize(struct nbio_t* handle, size_t len) { + if (len < handle->len) + { + /* this works perfectly fine if this check is removed, but it won't work on other nbio implementations */ + /* therefore, it's blocked so nobody accidentally relies on it */ + puts("ERROR - attempted file shrink operation, not implemented"); + abort(); + } if (ftruncate(handle->fd, len) != 0) { puts("ERROR - couldn't resize file (ftruncate)"); From cb16aac7ceb419d52e77204d2ab6db7c61e43e5d Mon Sep 17 00:00:00 2001 From: twinaphex Date: Fri, 24 Nov 2017 22:18:08 +0100 Subject: [PATCH 092/183] Revert "Invoke MAPPER_INIT after CONTROLLERS_INIT" This reverts commit fdf79e2e9b698924c89487ff65ad1a2b5d53d030. --- command.c | 6 +++--- retroarch.c | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/command.c b/command.c index f6fbf16c75..ef15a962cb 100644 --- a/command.c +++ b/command.c @@ -2540,14 +2540,14 @@ TODO: Add a setting for these tweaks */ command_event(CMD_EVENT_REMOTE_DEINIT, NULL); input_driver_init_remote(); break; + case CMD_EVENT_MAPPER_DEINIT: input_driver_deinit_mapper(); break; case CMD_EVENT_MAPPER_INIT: command_event(CMD_EVENT_MAPPER_DEINIT, NULL); - if (!input_driver_init_mapper()) - return false; - break; + input_driver_init_mapper(); + break; case CMD_EVENT_LOG_FILE_DEINIT: retro_main_log_file_deinit(); break; diff --git a/retroarch.c b/retroarch.c index 26a27dc40b..4158adbbca 100644 --- a/retroarch.c +++ b/retroarch.c @@ -1302,9 +1302,9 @@ bool retroarch_main_init(int argc, char *argv[]) drivers_init(DRIVERS_CMD_ALL); command_event(CMD_EVENT_COMMAND_INIT, NULL); command_event(CMD_EVENT_REMOTE_INIT, NULL); + command_event(CMD_EVENT_MAPPER_INIT, NULL); command_event(CMD_EVENT_REWIND_INIT, NULL); command_event(CMD_EVENT_CONTROLLERS_INIT, NULL); - command_event(CMD_EVENT_MAPPER_INIT, NULL); command_event(CMD_EVENT_RECORD_INIT, NULL); command_event(CMD_EVENT_CHEATS_INIT, NULL); From b3a53ac8caa76f0439c3ee1540232e6ca018904e Mon Sep 17 00:00:00 2001 From: David Walters Date: Fri, 24 Nov 2017 21:36:49 +0000 Subject: [PATCH 093/183] Show "---" for unbound controls, not "(Key: )" --- input/input_driver.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/input/input_driver.c b/input/input_driver.c index 04b3d36238..522f6caab8 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -2511,10 +2511,17 @@ void input_config_get_bind_string(char *buf, const struct retro_keybind *bind, input_keymaps_translate_rk_to_str(bind->key, key, sizeof(key)); if (string_is_equal(key, file_path_str(FILE_PATH_NUL))) *key = '\0'; - - snprintf(keybuf, sizeof(keybuf), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_KEY), key); - strlcat(buf, keybuf, size); + /*empty?*/ + if ( *key != '\0' ) { + snprintf(keybuf, sizeof(keybuf), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_KEY), key); + strlcat(buf, keybuf, size); + } #endif + + /*completely empty?*/ + if ( *buf == '\0' ) { + strlcat(buf, "---", size); + } } const char *input_config_get_device_name(unsigned port) From 5a6aad3dc79061f612b628a6c16d7b52e635ed61 Mon Sep 17 00:00:00 2001 From: Alcaro Date: Fri, 24 Nov 2017 22:42:21 +0100 Subject: [PATCH 094/183] Add mmap nbio for Windows too --- libretro-common/file/nbio/nbio_windowsmmap.c | 113 +++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 libretro-common/file/nbio/nbio_windowsmmap.c diff --git a/libretro-common/file/nbio/nbio_windowsmmap.c b/libretro-common/file/nbio/nbio_windowsmmap.c new file mode 100644 index 0000000000..458e3b1d9e --- /dev/null +++ b/libretro-common/file/nbio/nbio_windowsmmap.c @@ -0,0 +1,113 @@ +#include +#include + +#include + +#include + +struct nbio_t +{ + HANDLE file; + bool is_write; + size_t len; + void* ptr; +}; + +#define FILE_SHARE_ALL (FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE) +struct nbio_t* nbio_open(const char * filename, unsigned mode) +{ + static const DWORD dispositions[] = { OPEN_EXISTING, CREATE_ALWAYS, OPEN_ALWAYS, OPEN_EXISTING, CREATE_ALWAYS }; + + bool is_write = (mode == NBIO_WRITE || mode == NBIO_UPDATE || mode == BIO_WRITE); + DWORD access = (is_write ? GENERIC_READ|GENERIC_WRITE : GENERIC_READ); + HANDLE file = CreateFile(filename, access, FILE_SHARE_ALL, NULL, dispositions[mode], FILE_ATTRIBUTE_NORMAL, NULL); + + HANDLE mem; + + void* ptr; + LARGE_INTEGER len; + struct nbio_t* handle; + + if (file == INVALID_HANDLE_VALUE) return NULL; + + GetFileSizeEx(file, &len); + + mem = CreateFileMapping(file, NULL, is_write ? PAGE_READWRITE : PAGE_READONLY, 0, 0, NULL); + ptr = MapViewOfFile(mem, is_write ? (FILE_MAP_READ|FILE_MAP_WRITE) : FILE_MAP_READ, 0, 0, len.QuadPart); + CloseHandle(mem); + + handle = malloc(sizeof(struct nbio_t)); + handle->file = file; + handle->is_write = is_write; + handle->len = len.QuadPart; + handle->ptr = ptr; + return handle; +} + +void nbio_begin_read(struct nbio_t* handle) +{ + /* not needed */ +} + +void nbio_begin_write(struct nbio_t* handle) +{ + /* not needed */ +} + +bool nbio_iterate(struct nbio_t* handle) +{ + return true; /* not needed */ +} + +void nbio_resize(struct nbio_t* handle, size_t len) +{ + LARGE_INTEGER len_li; + HANDLE mem; + + if (len < handle->len) + { + /* this works perfectly fine if this check is removed, but it won't work on other nbio implementations */ + /* therefore, it's blocked so nobody accidentally relies on it */ + puts("ERROR - attempted file shrink operation, not implemented"); + abort(); + } + + len_li.QuadPart = len; + SetFilePointerEx(handle->file, len_li, NULL, FILE_BEGIN); + + if (!SetEndOfFile(handle->file)) + { + puts("ERROR - couldn't resize file (SetEndOfFile)"); + abort(); /* this one returns void and I can't find any other way for it to report failure */ + } + handle->len = len; + + UnmapViewOfFile(handle->ptr); + mem = CreateFileMapping(handle->file, NULL, handle->is_write ? PAGE_READWRITE : PAGE_READONLY, 0, 0, NULL); + handle->ptr = MapViewOfFile(mem, handle->is_write ? (FILE_MAP_READ|FILE_MAP_WRITE) : FILE_MAP_READ, 0, 0, len); + CloseHandle(mem); + + if (handle->ptr == NULL) + { + puts("ERROR - couldn't resize file (MapViewOfFile)"); + abort(); + } +} + +void* nbio_get_ptr(struct nbio_t* handle, size_t* len) +{ + if (len) *len = handle->len; + return handle->ptr; +} + +void nbio_cancel(struct nbio_t* handle) +{ + /* not needed */ +} + +void nbio_free(struct nbio_t* handle) +{ + CloseHandle(handle->file); + UnmapViewOfFile(handle->ptr); + free(handle); +} From 5999999cd315b2ff78140e077dd2a454b41d6ce6 Mon Sep 17 00:00:00 2001 From: Alcaro Date: Fri, 24 Nov 2017 23:53:09 +0100 Subject: [PATCH 095/183] Add Linux-native nbio too --- libretro-common/file/nbio/nbio_linux.c | 165 +++++++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 libretro-common/file/nbio/nbio_linux.c diff --git a/libretro-common/file/nbio/nbio_linux.c b/libretro-common/file/nbio/nbio_linux.c new file mode 100644 index 0000000000..e42f7cdd40 --- /dev/null +++ b/libretro-common/file/nbio/nbio_linux.c @@ -0,0 +1,165 @@ +#define _GNU_SOURCE +#include +#include +#include +#include + +#include + +#include +#include +#include +#include + +/* there's also a Unix AIO thingy, but it's not in glibc and we don't want more dependencies */ + +static int io_setup(unsigned nr, aio_context_t * ctxp) +{ + return syscall(__NR_io_setup, nr, ctxp); +} + +static int io_destroy(aio_context_t ctx) +{ + return syscall(__NR_io_destroy, ctx); +} + +static int io_submit(aio_context_t ctx, long nr, struct iocb ** cbp) +{ + return syscall(__NR_io_submit, ctx, nr, cbp); +} + +static int io_cancel(aio_context_t ctx, struct iocb * iocb, struct io_event * result) +{ + return syscall(__NR_io_cancel, ctx, iocb, result); +} + +static int io_getevents(aio_context_t ctx, long min_nr, long nr, + struct io_event * events, struct timespec * timeout) +{ + return syscall(__NR_io_getevents, ctx, min_nr, nr, events, timeout); +} + +struct nbio_t +{ + int fd; + bool busy; + + aio_context_t ctx; + struct iocb cb; + + void* ptr; + size_t len; +}; + +struct nbio_t* nbio_open(const char * filename, unsigned mode) +{ + static const int o_flags[] = { O_RDONLY, O_RDWR|O_CREAT|O_TRUNC, O_RDWR, O_RDONLY, O_RDWR|O_CREAT|O_TRUNC }; + + aio_context_t ctx = 0; + struct nbio_t* handle; + int fd; + + fd = open(filename, o_flags[mode]|O_CLOEXEC, 0644); + if (fd < 0) return NULL; + + if (io_setup(128, &ctx) < 0) + { + close(fd); + return NULL; + } + + handle = malloc(sizeof(struct nbio_t)); + handle->fd = fd; + handle->ctx = ctx; + handle->len = lseek(fd, 0, SEEK_END); + handle->ptr = malloc(handle->len); + handle->busy = false; + return handle; +} + +static void nbio_begin_op(struct nbio_t* handle, uint16_t op) +{ + struct iocb * cbp = &handle->cb; + + memset(&handle->cb, 0, sizeof(handle->cb)); + handle->cb.aio_fildes = handle->fd; + handle->cb.aio_lio_opcode = op; + + handle->cb.aio_buf = (uint64_t)(uintptr_t)handle->ptr; + handle->cb.aio_offset = 0; + handle->cb.aio_nbytes = handle->len; + + if (io_submit(handle->ctx, 1, &cbp) != 1) + { + puts("ERROR - io_submit() failed"); + abort(); + } + + handle->busy = true; +} + +void nbio_begin_read(struct nbio_t* handle) +{ + nbio_begin_op(handle, IOCB_CMD_PREAD); +} + +void nbio_begin_write(struct nbio_t* handle) +{ + nbio_begin_op(handle, IOCB_CMD_PWRITE); +} + +bool nbio_iterate(struct nbio_t* handle) +{ + if (handle->busy) + { + struct io_event ev; + if (io_getevents(handle->ctx, 0, 1, &ev, NULL) == 1) + { + handle->busy = false; + } + } + return !handle->busy; +} + +void nbio_resize(struct nbio_t* handle, size_t len) +{ + if (len < handle->len) + { + /* this works perfectly fine if this check is removed, but it won't work on other nbio implementations */ + /* therefore, it's blocked so nobody accidentally relies on it */ + puts("ERROR - attempted file shrink operation, not implemented"); + abort(); + } + if (ftruncate(handle->fd, len) != 0) + { + puts("ERROR - couldn't resize file (ftruncate)"); + abort(); /* this one returns void and I can't find any other way for it to report failure */ + } + handle->ptr = realloc(handle->ptr, len); + handle->len = len; +} + +void* nbio_get_ptr(struct nbio_t* handle, size_t* len) +{ + if (len) *len = handle->len; + if (!handle->busy) return handle->ptr; + else return NULL; +} + +void nbio_cancel(struct nbio_t* handle) +{ + if (handle->busy) + { + struct io_event ev; + io_cancel(handle->ctx, &handle->cb, &ev); + handle->busy = false; + } +} + +void nbio_free(struct nbio_t* handle) +{ + io_destroy(handle->ctx); + close(handle->fd); + free(handle->ptr); + free(handle); +} From b5722127c7f820a8611077b73128f73159d46eb1 Mon Sep 17 00:00:00 2001 From: Alcaro Date: Sat, 25 Nov 2017 00:26:13 +0100 Subject: [PATCH 096/183] Fix docs --- libretro-common/include/file/nbio.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libretro-common/include/file/nbio.h b/libretro-common/include/file/nbio.h index 45a3f7d347..2d81b702b8 100644 --- a/libretro-common/include/file/nbio.h +++ b/libretro-common/include/file/nbio.h @@ -78,12 +78,12 @@ bool nbio_iterate(struct nbio_t* handle); /* * Resizes the file up to the given size; cannot shrink. - * Can not be done if the structure was created with nbio_read. + * Can not be done if the structure was created with {N,}BIO_READ. */ void nbio_resize(struct nbio_t* handle, size_t len); /* - * Returns a pointer to the file data. Writable only if structure was not created with nbio_read. + * Returns a pointer to the file data. Writable only if structure was not created with {N,}BIO_READ. * If any operation is in progress, the pointer will be NULL, but len will still be correct. */ void* nbio_get_ptr(struct nbio_t* handle, size_t* len); From d0eef2579ec2f23edbbe4c9b4d9b38629e16cdfc Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 25 Nov 2017 00:54:34 +0100 Subject: [PATCH 097/183] remove this - shouldn't be necessary --- libretro-common/formats/png/rpng.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/libretro-common/formats/png/rpng.c b/libretro-common/formats/png/rpng.c index 794f229006..e6d4f49b6e 100644 --- a/libretro-common/formats/png/rpng.c +++ b/libretro-common/formats/png/rpng.c @@ -999,8 +999,6 @@ bool rpng_iterate_image(rpng_t *rpng) if (!read_chunk_header(buf, &chunk)) return false; - *buf += 8; - #if 0 for (i = 0; i < 4; i++) { From 0868c4e346920ce3706cf8d0d74ae47ffdeea17f Mon Sep 17 00:00:00 2001 From: Alcaro Date: Sat, 25 Nov 2017 01:52:52 +0100 Subject: [PATCH 098/183] Fix build --- libretro-common/samples/formats/png/Makefile | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/libretro-common/samples/formats/png/Makefile b/libretro-common/samples/formats/png/Makefile index 43e127041a..f1213e48ea 100644 --- a/libretro-common/samples/formats/png/Makefile +++ b/libretro-common/samples/formats/png/Makefile @@ -18,14 +18,18 @@ SOURCES_C := \ $(LIBRETRO_PNG_DIR)/rpng.c \ $(LIBRETRO_PNG_DIR)/rpng_encode.c \ $(LIBRETRO_COMM_DIR)/encodings/encoding_crc32.c \ + $(LIBRETRO_COMM_DIR)/encodings/encoding_utf.c \ $(LIBRETRO_COMM_DIR)/string/stdstring.c \ $(LIBRETRO_COMM_DIR)/compat/compat_strl.c \ + $(LIBRETRO_COMM_DIR)/compat/compat_strcasestr.c \ $(LIBRETRO_COMM_DIR)/file/nbio/nbio_stdio.c \ $(LIBRETRO_COMM_DIR)/file/archive_file.c \ $(LIBRETRO_COMM_DIR)/file/archive_file_zlib.c \ - $(LIBRETRO_COMM_DIR)//file/file_path.c \ - $(LIBRETRO_COMM_DIR)//file/retro_stat.c \ + $(LIBRETRO_COMM_DIR)/file/file_path.c \ $(LIBRETRO_COMM_DIR)/streams/file_stream.c \ + $(LIBRETRO_COMM_DIR)/streams/trans_stream.c \ + $(LIBRETRO_COMM_DIR)/streams/trans_stream_zlib.c \ + $(LIBRETRO_COMM_DIR)/streams/trans_stream_pipe.c \ $(LIBRETRO_COMM_DIR)/lists/string_list.c OBJS := $(SOURCES_C:.c=.o) From 0f6c453428ee53b0dbff647b9bdb896f9a0570fa Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 25 Nov 2017 02:10:04 +0100 Subject: [PATCH 099/183] Cleanups --- libretro-common/file/nbio/nbio_windowsmmap.c | 41 +++++++++------ libretro-common/memmap/memmap.c | 55 ++++++++++---------- 2 files changed, 52 insertions(+), 44 deletions(-) diff --git a/libretro-common/file/nbio/nbio_windowsmmap.c b/libretro-common/file/nbio/nbio_windowsmmap.c index 458e3b1d9e..bb682a8ecf 100644 --- a/libretro-common/file/nbio/nbio_windowsmmap.c +++ b/libretro-common/file/nbio/nbio_windowsmmap.c @@ -17,18 +17,16 @@ struct nbio_t struct nbio_t* nbio_open(const char * filename, unsigned mode) { static const DWORD dispositions[] = { OPEN_EXISTING, CREATE_ALWAYS, OPEN_ALWAYS, OPEN_EXISTING, CREATE_ALWAYS }; - - bool is_write = (mode == NBIO_WRITE || mode == NBIO_UPDATE || mode == BIO_WRITE); - DWORD access = (is_write ? GENERIC_READ|GENERIC_WRITE : GENERIC_READ); - HANDLE file = CreateFile(filename, access, FILE_SHARE_ALL, NULL, dispositions[mode], FILE_ATTRIBUTE_NORMAL, NULL); - HANDLE mem; - - void* ptr; LARGE_INTEGER len; - struct nbio_t* handle; + struct nbio_t* handle = NULL; + void* ptr = NULL; + bool is_write = (mode == NBIO_WRITE || mode == NBIO_UPDATE || mode == BIO_WRITE); + DWORD access = (is_write ? GENERIC_READ|GENERIC_WRITE : GENERIC_READ); + HANDLE file = CreateFile(filename, access, FILE_SHARE_ALL, NULL, dispositions[mode], FILE_ATTRIBUTE_NORMAL, NULL); - if (file == INVALID_HANDLE_VALUE) return NULL; + if (file == INVALID_HANDLE_VALUE) + return NULL; GetFileSizeEx(file, &len); @@ -36,11 +34,13 @@ struct nbio_t* nbio_open(const char * filename, unsigned mode) ptr = MapViewOfFile(mem, is_write ? (FILE_MAP_READ|FILE_MAP_WRITE) : FILE_MAP_READ, 0, 0, len.QuadPart); CloseHandle(mem); - handle = malloc(sizeof(struct nbio_t)); - handle->file = file; + handle = malloc(sizeof(struct nbio_t)); + + handle->file = file; handle->is_write = is_write; - handle->len = len.QuadPart; - handle->ptr = ptr; + handle->len = len.QuadPart; + handle->ptr = ptr; + return handle; } @@ -66,8 +66,10 @@ void nbio_resize(struct nbio_t* handle, size_t len) if (len < handle->len) { - /* this works perfectly fine if this check is removed, but it won't work on other nbio implementations */ - /* therefore, it's blocked so nobody accidentally relies on it */ + /* this works perfectly fine if this check is removed, + * but it won't work on other nbio implementations */ + /* therefore, it's blocked so nobody accidentally + * relies on it. */ puts("ERROR - attempted file shrink operation, not implemented"); abort(); } @@ -87,7 +89,7 @@ void nbio_resize(struct nbio_t* handle, size_t len) handle->ptr = MapViewOfFile(mem, handle->is_write ? (FILE_MAP_READ|FILE_MAP_WRITE) : FILE_MAP_READ, 0, 0, len); CloseHandle(mem); - if (handle->ptr == NULL) + if (!handle->ptr) { puts("ERROR - couldn't resize file (MapViewOfFile)"); abort(); @@ -96,7 +98,10 @@ void nbio_resize(struct nbio_t* handle, size_t len) void* nbio_get_ptr(struct nbio_t* handle, size_t* len) { - if (len) *len = handle->len; + if (!handle) + return NULL; + if (len) + *len = handle->len; return handle->ptr; } @@ -107,6 +112,8 @@ void nbio_cancel(struct nbio_t* handle) void nbio_free(struct nbio_t* handle) { + if (!handle) + return; CloseHandle(handle->file); UnmapViewOfFile(handle->ptr); free(handle); diff --git a/libretro-common/memmap/memmap.c b/libretro-common/memmap/memmap.c index a2b56d7070..f1e16b374c 100644 --- a/libretro-common/memmap/memmap.c +++ b/libretro-common/memmap/memmap.c @@ -48,7 +48,8 @@ #endif #ifdef _WIN32 -void* mmap(void *addr, size_t len, int prot, int flags, int fildes, size_t offset) +void* mmap(void *addr, size_t len, int prot, int flags, + int fildes, size_t offset) { void *map = (void*)NULL; HANDLE handle = INVALID_HANDLE_VALUE; @@ -57,36 +58,34 @@ void* mmap(void *addr, size_t len, int prot, int flags, int fildes, size_t offse { case PROT_READ: default: - { - handle = CreateFileMapping((HANDLE) _get_osfhandle(fildes), 0, PAGE_READONLY, 0, - len, 0); - if (!handle) - break; - map = (void*)MapViewOfFile(handle, FILE_MAP_READ, 0, 0, len); - CloseHandle(handle); + handle = CreateFileMapping((HANDLE) + _get_osfhandle(fildes), 0, PAGE_READONLY, 0, + len, 0); + if (!handle) break; - } + map = (void*)MapViewOfFile(handle, FILE_MAP_READ, 0, 0, len); + CloseHandle(handle); + break; case PROT_WRITE: - { - handle = CreateFileMapping((HANDLE) _get_osfhandle(fildes),0,PAGE_READWRITE,0, - len, 0); - if (!handle) - break; - map = (void*)MapViewOfFile(handle, FILE_MAP_WRITE, 0, 0, len); - CloseHandle(handle); + handle = CreateFileMapping((HANDLE) + _get_osfhandle(fildes),0,PAGE_READWRITE,0, + len, 0); + if (!handle) break; - } + map = (void*)MapViewOfFile(handle, FILE_MAP_WRITE, 0, 0, len); + CloseHandle(handle); + break; case PROT_READWRITE: - { - handle = CreateFileMapping((HANDLE) _get_osfhandle(fildes),0,PAGE_READWRITE,0, - len, 0); - if (!handle) - break; - map = (void*)MapViewOfFile(handle, FILE_MAP_ALL_ACCESS, 0, 0, len); - CloseHandle(handle); + handle = CreateFileMapping((HANDLE) + _get_osfhandle(fildes),0,PAGE_READWRITE,0, + len, 0); + if (!handle) break; - } + map = (void*)MapViewOfFile(handle, FILE_MAP_ALL_ACCESS, 0, 0, len); + CloseHandle(handle); + break; } + if (map == (void*)NULL) return((void*)MAP_FAILED); return((void*) ((int8_t*)map + offset)); @@ -110,7 +109,8 @@ int mprotect(void *addr, size_t len, int prot) } #elif !defined(HAVE_MMAN) -void* mmap(void *addr, size_t len, int prot, int flags, int fildes, size_t offset) +void* mmap(void *addr, size_t len, int prot, int flags, + int fildes, size_t offset) { return malloc(len); } @@ -123,7 +123,8 @@ int munmap(void *addr, size_t len) int mprotect(void *addr, size_t len, int prot) { - /* stub - not really needed at this point since this codepath has no dynarecs */ + /* stub - not really needed at this point + * since this codepath has no dynarecs. */ return 0; } From ac651b75812259387c8ba33e04e74ad35f1487d4 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 25 Nov 2017 02:12:15 +0100 Subject: [PATCH 100/183] Cleanups --- libretro-common/file/nbio/nbio_unixmmap.c | 40 +++++++++++++---------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/libretro-common/file/nbio/nbio_unixmmap.c b/libretro-common/file/nbio/nbio_unixmmap.c index 8e1f5af5b3..a6a4e41a31 100644 --- a/libretro-common/file/nbio/nbio_unixmmap.c +++ b/libretro-common/file/nbio/nbio_unixmmap.c @@ -3,7 +3,11 @@ #include +#ifdef _WIN32 +#include +#else #include +#endif #include #include @@ -20,34 +24,28 @@ struct nbio_t* nbio_open(const char * filename, unsigned mode) static const int o_flags[] = { O_RDONLY, O_RDWR|O_CREAT|O_TRUNC, O_RDWR, O_RDONLY, O_RDWR|O_CREAT|O_TRUNC }; static const int map_flags[] = { PROT_READ, PROT_WRITE|PROT_READ, PROT_WRITE|PROT_READ, PROT_READ, PROT_WRITE|PROT_READ }; - int fd; size_t len; - void* ptr; - struct nbio_t* handle; - - fd = open(filename, o_flags[mode]|O_CLOEXEC, 0644); - if (fd < 0) return NULL; + void* ptr = NULL; + struct nbio_t* handle = NULL; + int fd = open(filename, o_flags[mode]|O_CLOEXEC, 0644); + if (fd < 0) + return NULL; len = lseek(fd, 0, SEEK_END); if (len != 0) - { ptr = mmap(NULL, len, map_flags[mode], MAP_SHARED, fd, 0); - } - else - { - ptr = NULL; - } + if (ptr == MAP_FAILED) { close(fd); return NULL; } - handle = malloc(sizeof(struct nbio_t)); - handle->fd = fd; + handle = malloc(sizeof(struct nbio_t)); + handle->fd = fd; handle->map_flags = map_flags[mode]; - handle->len = len; - handle->ptr = ptr; + handle->len = len; + handle->ptr = ptr; return handle; } @@ -70,19 +68,25 @@ void nbio_resize(struct nbio_t* handle, size_t len) { if (len < handle->len) { - /* this works perfectly fine if this check is removed, but it won't work on other nbio implementations */ + /* this works perfectly fine if this check is removed, but it + * won't work on other nbio implementations */ /* therefore, it's blocked so nobody accidentally relies on it */ puts("ERROR - attempted file shrink operation, not implemented"); abort(); } + if (ftruncate(handle->fd, len) != 0) { puts("ERROR - couldn't resize file (ftruncate)"); - abort(); /* this one returns void and I can't find any other way for it to report failure */ + abort(); /* this one returns void and I can't find any other + way for it to report failure */ } + munmap(handle->ptr, handle->len); + handle->ptr = mmap(NULL, len, handle->map_flags, MAP_SHARED, handle->fd, 0); handle->len = len; + if (handle->ptr == MAP_FAILED) { puts("ERROR - couldn't resize file (mmap)"); From 395e84ede2887ff5867ad6bf21e6c10e3853dcad Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 25 Nov 2017 02:18:24 +0100 Subject: [PATCH 101/183] Style nits --- libretro-common/file/nbio/nbio_linux.c | 204 +++++++++++++------------ 1 file changed, 108 insertions(+), 96 deletions(-) diff --git a/libretro-common/file/nbio/nbio_linux.c b/libretro-common/file/nbio/nbio_linux.c index e42f7cdd40..66455fedf2 100644 --- a/libretro-common/file/nbio/nbio_linux.c +++ b/libretro-common/file/nbio/nbio_linux.c @@ -11,155 +11,167 @@ #include #include -/* there's also a Unix AIO thingy, but it's not in glibc and we don't want more dependencies */ +struct nbio_t +{ + int fd; + bool busy; + + aio_context_t ctx; + struct iocb cb; + + void* ptr; + size_t len; +}; + + +/* there's also a Unix AIO thingy, but it's not in glibc + * and we don't want more dependencies */ static int io_setup(unsigned nr, aio_context_t * ctxp) { - return syscall(__NR_io_setup, nr, ctxp); + return syscall(__NR_io_setup, nr, ctxp); } static int io_destroy(aio_context_t ctx) { - return syscall(__NR_io_destroy, ctx); + return syscall(__NR_io_destroy, ctx); } static int io_submit(aio_context_t ctx, long nr, struct iocb ** cbp) { - return syscall(__NR_io_submit, ctx, nr, cbp); + return syscall(__NR_io_submit, ctx, nr, cbp); } static int io_cancel(aio_context_t ctx, struct iocb * iocb, struct io_event * result) { - return syscall(__NR_io_cancel, ctx, iocb, result); + return syscall(__NR_io_cancel, ctx, iocb, result); } static int io_getevents(aio_context_t ctx, long min_nr, long nr, - struct io_event * events, struct timespec * timeout) + struct io_event * events, struct timespec * timeout) { - return syscall(__NR_io_getevents, ctx, min_nr, nr, events, timeout); + return syscall(__NR_io_getevents, ctx, min_nr, nr, events, timeout); } -struct nbio_t -{ - int fd; - bool busy; - - aio_context_t ctx; - struct iocb cb; - - void* ptr; - size_t len; -}; - struct nbio_t* nbio_open(const char * filename, unsigned mode) { - static const int o_flags[] = { O_RDONLY, O_RDWR|O_CREAT|O_TRUNC, O_RDWR, O_RDONLY, O_RDWR|O_CREAT|O_TRUNC }; - - aio_context_t ctx = 0; - struct nbio_t* handle; - int fd; - - fd = open(filename, o_flags[mode]|O_CLOEXEC, 0644); - if (fd < 0) return NULL; - - if (io_setup(128, &ctx) < 0) - { - close(fd); - return NULL; - } - - handle = malloc(sizeof(struct nbio_t)); - handle->fd = fd; - handle->ctx = ctx; - handle->len = lseek(fd, 0, SEEK_END); - handle->ptr = malloc(handle->len); - handle->busy = false; - return handle; + static const int o_flags[] = { O_RDONLY, O_RDWR|O_CREAT|O_TRUNC, O_RDWR, O_RDONLY, O_RDWR|O_CREAT|O_TRUNC }; + + aio_context_t ctx = 0; + struct nbio_t* handle = NULL; + int fd = open(filename, o_flags[mode]|O_CLOEXEC, 0644); + if (fd < 0) + return NULL; + + if (io_setup(128, &ctx) < 0) + { + close(fd); + return NULL; + } + + handle = malloc(sizeof(struct nbio_t)); + handle->fd = fd; + handle->ctx = ctx; + handle->len = lseek(fd, 0, SEEK_END); + handle->ptr = malloc(handle->len); + handle->busy = false; + + return handle; } static void nbio_begin_op(struct nbio_t* handle, uint16_t op) { - struct iocb * cbp = &handle->cb; - - memset(&handle->cb, 0, sizeof(handle->cb)); - handle->cb.aio_fildes = handle->fd; - handle->cb.aio_lio_opcode = op; - - handle->cb.aio_buf = (uint64_t)(uintptr_t)handle->ptr; - handle->cb.aio_offset = 0; - handle->cb.aio_nbytes = handle->len; - - if (io_submit(handle->ctx, 1, &cbp) != 1) - { - puts("ERROR - io_submit() failed"); - abort(); - } - - handle->busy = true; + struct iocb * cbp = &handle->cb; + + memset(&handle->cb, 0, sizeof(handle->cb)); + handle->cb.aio_fildes = handle->fd; + handle->cb.aio_lio_opcode = op; + + handle->cb.aio_buf = (uint64_t)(uintptr_t)handle->ptr; + handle->cb.aio_offset = 0; + handle->cb.aio_nbytes = handle->len; + + if (io_submit(handle->ctx, 1, &cbp) != 1) + { + puts("ERROR - io_submit() failed"); + abort(); + } + + handle->busy = true; } void nbio_begin_read(struct nbio_t* handle) { - nbio_begin_op(handle, IOCB_CMD_PREAD); + nbio_begin_op(handle, IOCB_CMD_PREAD); } void nbio_begin_write(struct nbio_t* handle) { - nbio_begin_op(handle, IOCB_CMD_PWRITE); + nbio_begin_op(handle, IOCB_CMD_PWRITE); } bool nbio_iterate(struct nbio_t* handle) { - if (handle->busy) - { - struct io_event ev; - if (io_getevents(handle->ctx, 0, 1, &ev, NULL) == 1) - { - handle->busy = false; - } - } - return !handle->busy; + if (handle->busy) + { + struct io_event ev; + if (io_getevents(handle->ctx, 0, 1, &ev, NULL) == 1) + handle->busy = false; + } + return !handle->busy; } void nbio_resize(struct nbio_t* handle, size_t len) { - if (len < handle->len) - { - /* this works perfectly fine if this check is removed, but it won't work on other nbio implementations */ - /* therefore, it's blocked so nobody accidentally relies on it */ - puts("ERROR - attempted file shrink operation, not implemented"); - abort(); - } - if (ftruncate(handle->fd, len) != 0) - { - puts("ERROR - couldn't resize file (ftruncate)"); - abort(); /* this one returns void and I can't find any other way for it to report failure */ - } - handle->ptr = realloc(handle->ptr, len); - handle->len = len; + if (len < handle->len) + { + /* this works perfectly fine if this check is removed, but it + * won't work on other nbio implementations */ + /* therefore, it's blocked so nobody accidentally relies on it */ + puts("ERROR - attempted file shrink operation, not implemented"); + abort(); + } + if (ftruncate(handle->fd, len) != 0) + { + puts("ERROR - couldn't resize file (ftruncate)"); + abort(); /* this one returns void and I can't find any other way + for it to report failure */ + } + handle->ptr = realloc(handle->ptr, len); + handle->len = len; } void* nbio_get_ptr(struct nbio_t* handle, size_t* len) { - if (len) *len = handle->len; - if (!handle->busy) return handle->ptr; - else return NULL; + if (!handle) + return NULL; + if (len) + *len = handle->len; + if (!handle->busy) + return handle->ptr; + return NULL; } void nbio_cancel(struct nbio_t* handle) { - if (handle->busy) - { - struct io_event ev; - io_cancel(handle->ctx, &handle->cb, &ev); - handle->busy = false; - } + if (!handle) + return; + + if (handle->busy) + { + struct io_event ev; + io_cancel(handle->ctx, &handle->cb, &ev); + handle->busy = false; + } } void nbio_free(struct nbio_t* handle) { - io_destroy(handle->ctx); - close(handle->fd); - free(handle->ptr); - free(handle); + if (!handle) + return; + + io_destroy(handle->ctx); + close(handle->fd); + free(handle->ptr); + free(handle); } From fb5e788c1ee54a9409710c9c64f5b785b70b2d0c Mon Sep 17 00:00:00 2001 From: Brian Koropoff Date: Fri, 24 Nov 2017 18:09:29 -0800 Subject: [PATCH 102/183] task_database: fix crash from Windows-incomptabile format string --- tasks/task_database.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/task_database.c b/tasks/task_database.c index 3f3b158bc7..ddb079077d 100644 --- a/tasks/task_database.c +++ b/tasks/task_database.c @@ -505,7 +505,7 @@ static int task_database_cue_get_crc(const char *name, uint32_t *crc) return 0; } - RARCH_LOG("CUE '%s' primary track: %s\n (%Zu, %Zu)", name, track_path, offset, size); + RARCH_LOG("CUE '%s' primary track: %s\n (%lu, %lu)\n", name, track_path, (unsigned long) offset, (unsigned long) size); RARCH_LOG("%s\n", msg_hash_to_str(MSG_READING_FIRST_DATA_TRACK)); From 64a6d6f18426ec205cd0cb24a231e43853f1e862 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 25 Nov 2017 05:18:30 +0100 Subject: [PATCH 103/183] Turn nbio_windowsmmap.c Unicode compatible --- libretro-common/file/nbio/nbio_windowsmmap.c | 28 ++++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/libretro-common/file/nbio/nbio_windowsmmap.c b/libretro-common/file/nbio/nbio_windowsmmap.c index bb682a8ecf..1a573d3166 100644 --- a/libretro-common/file/nbio/nbio_windowsmmap.c +++ b/libretro-common/file/nbio/nbio_windowsmmap.c @@ -2,9 +2,19 @@ #include #include +#include #include +/* Assume W-functions do not work below VC2005 and Xbox platforms */ +#if defined(_MSC_VER) && _MSC_VER < 1400 || defined(_XBOX) + +#ifndef LEGACY_WIN32 +#define LEGACY_WIN32 +#endif + +#endif + struct nbio_t { HANDLE file; @@ -19,11 +29,19 @@ struct nbio_t* nbio_open(const char * filename, unsigned mode) static const DWORD dispositions[] = { OPEN_EXISTING, CREATE_ALWAYS, OPEN_ALWAYS, OPEN_EXISTING, CREATE_ALWAYS }; HANDLE mem; LARGE_INTEGER len; - struct nbio_t* handle = NULL; - void* ptr = NULL; - bool is_write = (mode == NBIO_WRITE || mode == NBIO_UPDATE || mode == BIO_WRITE); - DWORD access = (is_write ? GENERIC_READ|GENERIC_WRITE : GENERIC_READ); - HANDLE file = CreateFile(filename, access, FILE_SHARE_ALL, NULL, dispositions[mode], FILE_ATTRIBUTE_NORMAL, NULL); + struct nbio_t* handle = NULL; + void* ptr = NULL; + bool is_write = (mode == NBIO_WRITE || mode == NBIO_UPDATE || mode == BIO_WRITE); + DWORD access = (is_write ? GENERIC_READ|GENERIC_WRITE : GENERIC_READ); +#if !defined(_WIN32) || defined(LEGACY_WIN32) + HANDLE file = CreateFile(filename, access, FILE_SHARE_ALL, NULL, dispositions[mode], FILE_ATTRIBUTE_NORMAL, NULL); +#else + wchar_t *filename_wide = utf8_to_utf16_string_alloc(filename); + HANDLE file = CreateFileW(filename_wide, access, FILE_SHARE_ALL, NULL, dispositions[mode], FILE_ATTRIBUTE_NORMAL, NULL); + + if (filename_wide) + free(filename_wide); +#endif if (file == INVALID_HANDLE_VALUE) return NULL; From 81e543a4c9e07c212dd3c80649fa2efb71dd4207 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 25 Nov 2017 05:21:35 +0100 Subject: [PATCH 104/183] Cleanups --- libretro-common/file/nbio/nbio_linux.c | 15 ++++++++++----- libretro-common/file/nbio/nbio_unixmmap.c | 7 ++++++- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/libretro-common/file/nbio/nbio_linux.c b/libretro-common/file/nbio/nbio_linux.c index 66455fedf2..45fefab2e7 100644 --- a/libretro-common/file/nbio/nbio_linux.c +++ b/libretro-common/file/nbio/nbio_linux.c @@ -81,15 +81,16 @@ struct nbio_t* nbio_open(const char * filename, unsigned mode) static void nbio_begin_op(struct nbio_t* handle, uint16_t op) { - struct iocb * cbp = &handle->cb; + struct iocb * cbp = &handle->cb; memset(&handle->cb, 0, sizeof(handle->cb)); - handle->cb.aio_fildes = handle->fd; + + handle->cb.aio_fildes = handle->fd; handle->cb.aio_lio_opcode = op; - handle->cb.aio_buf = (uint64_t)(uintptr_t)handle->ptr; - handle->cb.aio_offset = 0; - handle->cb.aio_nbytes = handle->len; + handle->cb.aio_buf = (uint64_t)(uintptr_t)handle->ptr; + handle->cb.aio_offset = 0; + handle->cb.aio_nbytes = handle->len; if (io_submit(handle->ctx, 1, &cbp) != 1) { @@ -123,6 +124,9 @@ bool nbio_iterate(struct nbio_t* handle) void nbio_resize(struct nbio_t* handle, size_t len) { + if (!handle) + return; + if (len < handle->len) { /* this works perfectly fine if this check is removed, but it @@ -131,6 +135,7 @@ void nbio_resize(struct nbio_t* handle, size_t len) puts("ERROR - attempted file shrink operation, not implemented"); abort(); } + if (ftruncate(handle->fd, len) != 0) { puts("ERROR - couldn't resize file (ftruncate)"); diff --git a/libretro-common/file/nbio/nbio_unixmmap.c b/libretro-common/file/nbio/nbio_unixmmap.c index a6a4e41a31..a484e01eeb 100644 --- a/libretro-common/file/nbio/nbio_unixmmap.c +++ b/libretro-common/file/nbio/nbio_unixmmap.c @@ -96,7 +96,10 @@ void nbio_resize(struct nbio_t* handle, size_t len) void* nbio_get_ptr(struct nbio_t* handle, size_t* len) { - if (len) *len = handle->len; + if (!handle) + return NULL; + if (len) + *len = handle->len; return handle->ptr; } @@ -107,6 +110,8 @@ void nbio_cancel(struct nbio_t* handle) void nbio_free(struct nbio_t* handle) { + if (!handle) + return; close(handle->fd); munmap(handle->ptr, handle->len); free(handle); From 7a772b9cd43e6c39db46f6f70f6a9c72b7df7f2d Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 25 Nov 2017 05:35:55 +0100 Subject: [PATCH 105/183] Create nbio_intf.c --- Makefile.common | 1 + griffin/griffin.c | 1 + libretro-common/file/nbio/nbio_intf.c | 48 ++++++++++++++++++++++++++ libretro-common/file/nbio/nbio_stdio.c | 28 ++++++++++----- libretro-common/include/file/nbio.h | 22 ++++++++++++ 5 files changed, 92 insertions(+), 8 deletions(-) create mode 100644 libretro-common/file/nbio/nbio_intf.c diff --git a/Makefile.common b/Makefile.common index 7aeea49c68..e2ab3361ac 100644 --- a/Makefile.common +++ b/Makefile.common @@ -184,6 +184,7 @@ OBJ += frontend/frontend.o \ setting_list.o \ list_special.o \ $(LIBRETRO_COMM_DIR)/file/nbio/nbio_stdio.o \ + $(LIBRETRO_COMM_DIR)/file/nbio/nbio_intf.o \ $(LIBRETRO_COMM_DIR)/file/file_path.o \ file_path_special.o \ file_path_str.o \ diff --git a/griffin/griffin.c b/griffin/griffin.c index b65934f365..e781217661 100644 --- a/griffin/griffin.c +++ b/griffin/griffin.c @@ -822,6 +822,7 @@ FILE #include "../list_special.c" #include "../libretro-common/string/stdstring.c" #include "../libretro-common/file/nbio/nbio_stdio.c" +#include "../libretro-common/file/nbio/nbio_intf.c" /*============================================================ MESSAGE diff --git a/libretro-common/file/nbio/nbio_intf.c b/libretro-common/file/nbio/nbio_intf.c new file mode 100644 index 0000000000..b38e322a4d --- /dev/null +++ b/libretro-common/file/nbio/nbio_intf.c @@ -0,0 +1,48 @@ +#include +#include + +#include + +extern nbio_intf_t nbio_stdio; + +static nbio_intf_t *internal_nbio = &nbio_stdio; + +struct nbio_t* nbio_open(const char * filename, unsigned mode) +{ + return internal_nbio->open(filename, mode); +} + +void nbio_begin_read(struct nbio_t* handle) +{ + internal_nbio->begin_read(handle); +} + +void nbio_begin_write(struct nbio_t* handle) +{ + internal_nbio->begin_write(handle); +} + +bool nbio_iterate(struct nbio_t* handle) +{ + return internal_nbio->iterate(handle); +} + +void nbio_resize(struct nbio_t* handle, size_t len) +{ + internal_nbio->resize(handle, len); +} + +void *nbio_get_ptr(struct nbio_t* handle, size_t* len) +{ + return internal_nbio->get_ptr(handle, len); +} + +void nbio_cancel(struct nbio_t* handle) +{ + internal_nbio->cancel(handle); +} + +void nbio_free(struct nbio_t* handle) +{ + internal_nbio->free(handle); +} diff --git a/libretro-common/file/nbio/nbio_stdio.c b/libretro-common/file/nbio/nbio_stdio.c index 41f7cae867..8aee8cee43 100644 --- a/libretro-common/file/nbio/nbio_stdio.c +++ b/libretro-common/file/nbio/nbio_stdio.c @@ -35,7 +35,7 @@ static const char * modes[]={ "rb", "wb", "r+b", "rb", "wb", "r+b" }; static const wchar_t * modes[]={ L"rb", L"wb", L"r+b", L"rb", L"wb", L"r+b" }; #endif -struct nbio_t* nbio_open(const char * filename, unsigned mode) +static struct nbio_t* nbio_stdio_open(const char * filename, unsigned mode) { void *buf = NULL; struct nbio_t* handle = NULL; @@ -92,7 +92,7 @@ error: return NULL; } -void nbio_begin_read(struct nbio_t* handle) +static void nbio_stdio_begin_read(struct nbio_t* handle) { if (!handle) return; @@ -109,7 +109,7 @@ void nbio_begin_read(struct nbio_t* handle) handle->progress = 0; } -void nbio_begin_write(struct nbio_t* handle) +static void nbio_stdio_begin_write(struct nbio_t* handle) { if (!handle) return; @@ -125,7 +125,7 @@ void nbio_begin_write(struct nbio_t* handle) handle->progress = 0; } -bool nbio_iterate(struct nbio_t* handle) +static bool nbio_stdio_iterate(struct nbio_t* handle) { size_t amount = 65536; @@ -167,7 +167,7 @@ bool nbio_iterate(struct nbio_t* handle) return (handle->op < 0); } -void nbio_resize(struct nbio_t* handle, size_t len) +static void nbio_stdio_resize(struct nbio_t* handle, size_t len) { if (!handle) return; @@ -189,7 +189,7 @@ void nbio_resize(struct nbio_t* handle, size_t len) handle->progress = handle->len; } -void* nbio_get_ptr(struct nbio_t* handle, size_t* len) +static void *nbio_stdio_get_ptr(struct nbio_t* handle, size_t* len) { if (!handle) return NULL; @@ -200,7 +200,7 @@ void* nbio_get_ptr(struct nbio_t* handle, size_t* len) return NULL; } -void nbio_cancel(struct nbio_t* handle) +static void nbio_stdio_cancel(struct nbio_t* handle) { if (!handle) return; @@ -209,7 +209,7 @@ void nbio_cancel(struct nbio_t* handle) handle->progress = handle->len; } -void nbio_free(struct nbio_t* handle) +static void nbio_stdio_free(struct nbio_t* handle) { if (!handle) return; @@ -225,3 +225,15 @@ void nbio_free(struct nbio_t* handle) handle->data = NULL; free(handle); } + +nbio_intf_t nbio_stdio = { + nbio_stdio_open, + nbio_stdio_begin_read, + nbio_stdio_begin_write, + nbio_stdio_iterate, + nbio_stdio_resize, + nbio_stdio_get_ptr, + nbio_stdio_cancel, + nbio_stdio_free, + "nbio_stdio", +}; diff --git a/libretro-common/include/file/nbio.h b/libretro-common/include/file/nbio.h index 2d81b702b8..86b74098d6 100644 --- a/libretro-common/include/file/nbio.h +++ b/libretro-common/include/file/nbio.h @@ -53,6 +53,28 @@ RETRO_BEGIN_DECLS struct nbio_t; +typedef struct nbio_intf +{ + struct nbio_t* (*open)(const char * filename, unsigned mode); + + void (*begin_read)(struct nbio_t* handle); + + void (*begin_write)(struct nbio_t* handle); + + bool (*iterate)(struct nbio_t* handle); + + void (*resize)(struct nbio_t* handle, size_t len); + + void *(*get_ptr)(struct nbio_t* handle, size_t* len); + + void (*cancel)(struct nbio_t* handle); + + void (*free)(struct nbio_t* handle); + + /* Human readable string. */ + const char *ident; +} nbio_intf_t; + /* * Creates an nbio structure for performing the given operation on the given file. */ From d4c3108b88f08c174e18b0eed6c57c80379d5990 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 25 Nov 2017 05:51:33 +0100 Subject: [PATCH 106/183] Implement new nbio interface implementations --- Makefile.common | 3 + griffin/griffin.c | 3 + libretro-common/file/nbio/nbio_intf.c | 33 ++ libretro-common/file/nbio/nbio_linux.c | 55 +- libretro-common/file/nbio/nbio_stdio.c | 500 ++++++++++--------- libretro-common/file/nbio/nbio_unixmmap.c | 54 +- libretro-common/file/nbio/nbio_windowsmmap.c | 281 ++++++++--- 7 files changed, 596 insertions(+), 333 deletions(-) diff --git a/Makefile.common b/Makefile.common index e2ab3361ac..54f09bb7ae 100644 --- a/Makefile.common +++ b/Makefile.common @@ -184,6 +184,9 @@ OBJ += frontend/frontend.o \ setting_list.o \ list_special.o \ $(LIBRETRO_COMM_DIR)/file/nbio/nbio_stdio.o \ + $(LIBRETRO_COMM_DIR)/file/nbio/nbio_linux.o \ + $(LIBRETRO_COMM_DIR)/file/nbio/nbio_unixmmap.o \ + $(LIBRETRO_COMM_DIR)/file/nbio/nbio_windowsmmap.o \ $(LIBRETRO_COMM_DIR)/file/nbio/nbio_intf.o \ $(LIBRETRO_COMM_DIR)/file/file_path.o \ file_path_special.o \ diff --git a/griffin/griffin.c b/griffin/griffin.c index e781217661..2bbb31a47b 100644 --- a/griffin/griffin.c +++ b/griffin/griffin.c @@ -822,6 +822,9 @@ FILE #include "../list_special.c" #include "../libretro-common/string/stdstring.c" #include "../libretro-common/file/nbio/nbio_stdio.c" +#include "../libretro-common/file/nbio/nbio_linux.c" +#include "../libretro-common/file/nbio/nbio_unixmmap.c" +#include "../libretro-common/file/nbio/nbio_windowsmmap.c" #include "../libretro-common/file/nbio/nbio_intf.c" /*============================================================ diff --git a/libretro-common/file/nbio/nbio_intf.c b/libretro-common/file/nbio/nbio_intf.c index b38e322a4d..a0ccf9975d 100644 --- a/libretro-common/file/nbio/nbio_intf.c +++ b/libretro-common/file/nbio/nbio_intf.c @@ -1,11 +1,44 @@ +/* Copyright (C) 2010-2017 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (nbio_intf.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + #include #include #include +extern nbio_intf_t nbio_linux; +extern nbio_intf_t nbio_mmap_unix; +extern nbio_intf_t nbio_mmap_win32; extern nbio_intf_t nbio_stdio; +#if defined(HAVE_MMAP) && defined(_linux__) +static nbio_intf_t *internal_nbio = &nbio_linux; +#elif defined(HAVE_MMAP) && defined(BSD) && !defined(__MACH__) +static nbio_intf_t *internal_nbio = &nbio_mmap_unix; +#elif defined(HAVE_MMAP) && defined(_WIN32) +static nbio_intf_t *internal_nbio = &nbio_mmap_win32; +#else static nbio_intf_t *internal_nbio = &nbio_stdio; +#endif struct nbio_t* nbio_open(const char * filename, unsigned mode) { diff --git a/libretro-common/file/nbio/nbio_linux.c b/libretro-common/file/nbio/nbio_linux.c index 45fefab2e7..8c64bf73ea 100644 --- a/libretro-common/file/nbio/nbio_linux.c +++ b/libretro-common/file/nbio/nbio_linux.c @@ -1,3 +1,27 @@ +/* Copyright (C) 2010-2017 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (nbio_linux.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#if defined(__linux__) + #define _GNU_SOURCE #include #include @@ -23,7 +47,6 @@ struct nbio_t size_t len; }; - /* there's also a Unix AIO thingy, but it's not in glibc * and we don't want more dependencies */ @@ -53,7 +76,7 @@ static int io_getevents(aio_context_t ctx, long min_nr, long nr, return syscall(__NR_io_getevents, ctx, min_nr, nr, events, timeout); } -struct nbio_t* nbio_open(const char * filename, unsigned mode) +static struct nbio_t* nbio_linux_open(const char * filename, unsigned mode) { static const int o_flags[] = { O_RDONLY, O_RDWR|O_CREAT|O_TRUNC, O_RDWR, O_RDONLY, O_RDWR|O_CREAT|O_TRUNC }; @@ -101,17 +124,17 @@ static void nbio_begin_op(struct nbio_t* handle, uint16_t op) handle->busy = true; } -void nbio_begin_read(struct nbio_t* handle) +static void nbio_linux_begin_read(struct nbio_t* handle) { nbio_begin_op(handle, IOCB_CMD_PREAD); } -void nbio_begin_write(struct nbio_t* handle) +static void nbio_linux_begin_write(struct nbio_t* handle) { nbio_begin_op(handle, IOCB_CMD_PWRITE); } -bool nbio_iterate(struct nbio_t* handle) +static bool nbio_linux_iterate(struct nbio_t* handle) { if (handle->busy) { @@ -122,7 +145,7 @@ bool nbio_iterate(struct nbio_t* handle) return !handle->busy; } -void nbio_resize(struct nbio_t* handle, size_t len) +static void nbio_linux_resize(struct nbio_t* handle, size_t len) { if (!handle) return; @@ -146,7 +169,7 @@ void nbio_resize(struct nbio_t* handle, size_t len) handle->len = len; } -void* nbio_get_ptr(struct nbio_t* handle, size_t* len) +static void *nbio_linux_get_ptr(struct nbio_t* handle, size_t* len) { if (!handle) return NULL; @@ -157,7 +180,7 @@ void* nbio_get_ptr(struct nbio_t* handle, size_t* len) return NULL; } -void nbio_cancel(struct nbio_t* handle) +static void nbio_linux_cancel(struct nbio_t* handle) { if (!handle) return; @@ -170,7 +193,7 @@ void nbio_cancel(struct nbio_t* handle) } } -void nbio_free(struct nbio_t* handle) +static void nbio_linux_free(struct nbio_t* handle) { if (!handle) return; @@ -180,3 +203,17 @@ void nbio_free(struct nbio_t* handle) free(handle->ptr); free(handle); } + +nbio_intf_t nbio_linux = { + nbio_linux_open, + nbio_linux_begin_read, + nbio_linux_begin_write, + nbio_linux_iterate, + nbio_linux_resize, + nbio_linux_get_ptr, + nbio_linux_cancel, + nbio_linux_free, + "nbio_linux", +}; + +#endif diff --git a/libretro-common/file/nbio/nbio_stdio.c b/libretro-common/file/nbio/nbio_stdio.c index 8aee8cee43..1a97be6551 100644 --- a/libretro-common/file/nbio/nbio_stdio.c +++ b/libretro-common/file/nbio/nbio_stdio.c @@ -1,239 +1,261 @@ -#include -#include - -#include -#include - -/* Assume W-functions do not work below VC2005 and Xbox platforms */ -#if defined(_MSC_VER) && _MSC_VER < 1400 || defined(_XBOX) - -#ifndef LEGACY_WIN32 -#define LEGACY_WIN32 -#endif - -#endif - -struct nbio_t -{ - FILE* f; - void* data; - size_t progress; - size_t len; - /* - * possible values: - * NBIO_READ, NBIO_WRITE - obvious - * -1 - currently doing nothing - * -2 - the pointer was reallocated since the last operation - */ - signed char op; - signed char mode; -}; - -#if !defined(_WIN32) || defined(LEGACY_WIN32) -static const char * modes[]={ "rb", "wb", "r+b", "rb", "wb", "r+b" }; -#else -static const wchar_t * modes[]={ L"rb", L"wb", L"r+b", L"rb", L"wb", L"r+b" }; -#endif - -static struct nbio_t* nbio_stdio_open(const char * filename, unsigned mode) -{ - void *buf = NULL; - struct nbio_t* handle = NULL; - size_t len = 0; -#if !defined(_WIN32) || defined(LEGACY_WIN32) - FILE* f = fopen(filename, modes[mode]); -#else - wchar_t *filename_wide = utf8_to_utf16_string_alloc(filename); - FILE* f = _wfopen(filename_wide, modes[mode]); - - if (filename_wide) - free(filename_wide); -#endif - if (!f) - return NULL; - - handle = (struct nbio_t*)malloc(sizeof(struct nbio_t)); - - if (!handle) - goto error; - - handle->f = f; - - switch (mode) - { - case NBIO_WRITE: - case BIO_WRITE: - break; - default: - fseek(handle->f, 0, SEEK_END); - len = ftell(handle->f); - break; - } - - handle->mode = mode; - - if (len) - buf = malloc(len); - - if (len && !buf) - goto error; - - handle->data = buf; - handle->len = len; - handle->progress = handle->len; - handle->op = -2; - - return handle; - -error: - if (handle) - free(handle); - fclose(f); - return NULL; -} - -static void nbio_stdio_begin_read(struct nbio_t* handle) -{ - if (!handle) - return; - - if (handle->op >= 0) - { - puts("ERROR - attempted file read operation while busy"); - abort(); - } - - fseek(handle->f, 0, SEEK_SET); - - handle->op = NBIO_READ; - handle->progress = 0; -} - -static void nbio_stdio_begin_write(struct nbio_t* handle) -{ - if (!handle) - return; - - if (handle->op >= 0) - { - puts("ERROR - attempted file write operation while busy"); - abort(); - } - - fseek(handle->f, 0, SEEK_SET); - handle->op = NBIO_WRITE; - handle->progress = 0; -} - -static bool nbio_stdio_iterate(struct nbio_t* handle) -{ - size_t amount = 65536; - - if (!handle) - return false; - - if (amount > handle->len - handle->progress) - amount = handle->len - handle->progress; - - switch (handle->op) - { - case NBIO_READ: - if (handle->mode == BIO_READ) - { - amount = handle->len; - fread((char*)handle->data, 1, amount, handle->f); - } - else - fread((char*)handle->data + handle->progress, 1, amount, handle->f); - break; - case NBIO_WRITE: - if (handle->mode == BIO_WRITE) - { - size_t written = 0; - amount = handle->len; - written = fwrite((char*)handle->data, 1, amount, handle->f); - if (written != amount) - return false; - } - else - fwrite((char*)handle->data + handle->progress, 1, amount, handle->f); - break; - } - - handle->progress += amount; - - if (handle->progress == handle->len) - handle->op = -1; - return (handle->op < 0); -} - -static void nbio_stdio_resize(struct nbio_t* handle, size_t len) -{ - if (!handle) - return; - - if (handle->op >= 0) - { - puts("ERROR - attempted file resize operation while busy"); - abort(); - } - if (len < handle->len) - { - puts("ERROR - attempted file shrink operation, not implemented"); - abort(); - } - - handle->len = len; - handle->data = realloc(handle->data, handle->len); - handle->op = -1; - handle->progress = handle->len; -} - -static void *nbio_stdio_get_ptr(struct nbio_t* handle, size_t* len) -{ - if (!handle) - return NULL; - if (len) - *len = handle->len; - if (handle->op == -1) - return handle->data; - return NULL; -} - -static void nbio_stdio_cancel(struct nbio_t* handle) -{ - if (!handle) - return; - - handle->op = -1; - handle->progress = handle->len; -} - -static void nbio_stdio_free(struct nbio_t* handle) -{ - if (!handle) - return; - if (handle->op >= 0) - { - puts("ERROR - attempted free() while busy"); - abort(); - } - fclose(handle->f); - free(handle->data); - - handle->f = NULL; - handle->data = NULL; - free(handle); -} - -nbio_intf_t nbio_stdio = { - nbio_stdio_open, - nbio_stdio_begin_read, - nbio_stdio_begin_write, - nbio_stdio_iterate, - nbio_stdio_resize, - nbio_stdio_get_ptr, - nbio_stdio_cancel, - nbio_stdio_free, - "nbio_stdio", -}; +/* Copyright (C) 2010-2017 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (nbio_stdio.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include +#include + +#include +#include + +/* Assume W-functions do not work below VC2005 and Xbox platforms */ +#if defined(_MSC_VER) && _MSC_VER < 1400 || defined(_XBOX) + +#ifndef LEGACY_WIN32 +#define LEGACY_WIN32 +#endif + +#endif + +struct nbio_t +{ + FILE* f; + void* data; + size_t progress; + size_t len; + /* + * possible values: + * NBIO_READ, NBIO_WRITE - obvious + * -1 - currently doing nothing + * -2 - the pointer was reallocated since the last operation + */ + signed char op; + signed char mode; +}; + +#if !defined(_WIN32) || defined(LEGACY_WIN32) +static const char *stdio_modes[]={ "rb", "wb", "r+b", "rb", "wb", "r+b" }; +#else +static const wchar_t *stdio_modes[]={ L"rb", L"wb", L"r+b", L"rb", L"wb", L"r+b" }; +#endif + +static struct nbio_t* nbio_stdio_open(const char * filename, unsigned mode) +{ + void *buf = NULL; + struct nbio_t* handle = NULL; + size_t len = 0; +#if !defined(_WIN32) || defined(LEGACY_WIN32) + FILE* f = fopen(filename, stdio_modes[mode]); +#else + wchar_t *filename_wide = utf8_to_utf16_string_alloc(filename); + FILE* f = _wfopen(filename_wide, stdio_modes[mode]); + + if (filename_wide) + free(filename_wide); +#endif + if (!f) + return NULL; + + handle = (struct nbio_t*)malloc(sizeof(struct nbio_t)); + + if (!handle) + goto error; + + handle->f = f; + + switch (mode) + { + case NBIO_WRITE: + case BIO_WRITE: + break; + default: + fseek(handle->f, 0, SEEK_END); + len = ftell(handle->f); + break; + } + + handle->mode = mode; + + if (len) + buf = malloc(len); + + if (len && !buf) + goto error; + + handle->data = buf; + handle->len = len; + handle->progress = handle->len; + handle->op = -2; + + return handle; + +error: + if (handle) + free(handle); + fclose(f); + return NULL; +} + +static void nbio_stdio_begin_read(struct nbio_t* handle) +{ + if (!handle) + return; + + if (handle->op >= 0) + { + puts("ERROR - attempted file read operation while busy"); + abort(); + } + + fseek(handle->f, 0, SEEK_SET); + + handle->op = NBIO_READ; + handle->progress = 0; +} + +static void nbio_stdio_begin_write(struct nbio_t* handle) +{ + if (!handle) + return; + + if (handle->op >= 0) + { + puts("ERROR - attempted file write operation while busy"); + abort(); + } + + fseek(handle->f, 0, SEEK_SET); + handle->op = NBIO_WRITE; + handle->progress = 0; +} + +static bool nbio_stdio_iterate(struct nbio_t* handle) +{ + size_t amount = 65536; + + if (!handle) + return false; + + if (amount > handle->len - handle->progress) + amount = handle->len - handle->progress; + + switch (handle->op) + { + case NBIO_READ: + if (handle->mode == BIO_READ) + { + amount = handle->len; + fread((char*)handle->data, 1, amount, handle->f); + } + else + fread((char*)handle->data + handle->progress, 1, amount, handle->f); + break; + case NBIO_WRITE: + if (handle->mode == BIO_WRITE) + { + size_t written = 0; + amount = handle->len; + written = fwrite((char*)handle->data, 1, amount, handle->f); + if (written != amount) + return false; + } + else + fwrite((char*)handle->data + handle->progress, 1, amount, handle->f); + break; + } + + handle->progress += amount; + + if (handle->progress == handle->len) + handle->op = -1; + return (handle->op < 0); +} + +static void nbio_stdio_resize(struct nbio_t* handle, size_t len) +{ + if (!handle) + return; + + if (handle->op >= 0) + { + puts("ERROR - attempted file resize operation while busy"); + abort(); + } + if (len < handle->len) + { + puts("ERROR - attempted file shrink operation, not implemented"); + abort(); + } + + handle->len = len; + handle->data = realloc(handle->data, handle->len); + handle->op = -1; + handle->progress = handle->len; +} + +static void *nbio_stdio_get_ptr(struct nbio_t* handle, size_t* len) +{ + if (!handle) + return NULL; + if (len) + *len = handle->len; + if (handle->op == -1) + return handle->data; + return NULL; +} + +static void nbio_stdio_cancel(struct nbio_t* handle) +{ + if (!handle) + return; + + handle->op = -1; + handle->progress = handle->len; +} + +static void nbio_stdio_free(struct nbio_t* handle) +{ + if (!handle) + return; + if (handle->op >= 0) + { + puts("ERROR - attempted free() while busy"); + abort(); + } + fclose(handle->f); + free(handle->data); + + handle->f = NULL; + handle->data = NULL; + free(handle); +} + +nbio_intf_t nbio_stdio = { + nbio_stdio_open, + nbio_stdio_begin_read, + nbio_stdio_begin_write, + nbio_stdio_iterate, + nbio_stdio_resize, + nbio_stdio_get_ptr, + nbio_stdio_cancel, + nbio_stdio_free, + "nbio_stdio", +}; diff --git a/libretro-common/file/nbio/nbio_unixmmap.c b/libretro-common/file/nbio/nbio_unixmmap.c index a484e01eeb..0dd0cd239f 100644 --- a/libretro-common/file/nbio/nbio_unixmmap.c +++ b/libretro-common/file/nbio/nbio_unixmmap.c @@ -1,3 +1,27 @@ +/* Copyright (C) 2010-2017 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (nbio_unixmmap.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#if defined(HAVE_MMAP) && defined(__linux__) + #include #include @@ -19,7 +43,7 @@ struct nbio_t void* ptr; }; -struct nbio_t* nbio_open(const char * filename, unsigned mode) +static struct nbio_t* nbio_mmap_unix_open(const char * filename, unsigned mode) { static const int o_flags[] = { O_RDONLY, O_RDWR|O_CREAT|O_TRUNC, O_RDWR, O_RDONLY, O_RDWR|O_CREAT|O_TRUNC }; static const int map_flags[] = { PROT_READ, PROT_WRITE|PROT_READ, PROT_WRITE|PROT_READ, PROT_READ, PROT_WRITE|PROT_READ }; @@ -49,22 +73,22 @@ struct nbio_t* nbio_open(const char * filename, unsigned mode) return handle; } -void nbio_begin_read(struct nbio_t* handle) +static void nbio_mmap_unix_begin_read(struct nbio_t* handle) { /* not needed */ } -void nbio_begin_write(struct nbio_t* handle) +static void nbio_mmap_unix_begin_write(struct nbio_t* handle) { /* not needed */ } -bool nbio_iterate(struct nbio_t* handle) +static bool nbio_mmap_unix_iterate(struct nbio_t* handle) { return true; /* not needed */ } -void nbio_resize(struct nbio_t* handle, size_t len) +static void nbio_mmap_unix_resize(struct nbio_t* handle, size_t len) { if (len < handle->len) { @@ -94,7 +118,7 @@ void nbio_resize(struct nbio_t* handle, size_t len) } } -void* nbio_get_ptr(struct nbio_t* handle, size_t* len) +static void *nbio_mmap_unix_get_ptr(struct nbio_t* handle, size_t* len) { if (!handle) return NULL; @@ -103,12 +127,12 @@ void* nbio_get_ptr(struct nbio_t* handle, size_t* len) return handle->ptr; } -void nbio_cancel(struct nbio_t* handle) +static void nbio_mmap_unix_cancel(struct nbio_t* handle) { /* not needed */ } -void nbio_free(struct nbio_t* handle) +static void nbio_mmap_unix_free(struct nbio_t* handle) { if (!handle) return; @@ -116,3 +140,17 @@ void nbio_free(struct nbio_t* handle) munmap(handle->ptr, handle->len); free(handle); } + +nbio_intf_t nbio_mmap_unix = { + nbio_mmap_unix_open, + nbio_mmap_unix_begin_read, + nbio_mmap_unix_begin_write, + nbio_mmap_unix_iterate, + nbio_mmap_unix_resize, + nbio_mmap_unix_get_ptr, + nbio_mmap_unix_cancel, + nbio_mmap_unix_free, + "nbio_mmap_unix", +}; + +#endif diff --git a/libretro-common/file/nbio/nbio_windowsmmap.c b/libretro-common/file/nbio/nbio_windowsmmap.c index 1a573d3166..33b573dfd4 100644 --- a/libretro-common/file/nbio/nbio_windowsmmap.c +++ b/libretro-common/file/nbio/nbio_windowsmmap.c @@ -1,10 +1,32 @@ +/* Copyright (C) 2010-2017 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (nbio_windowsmmap.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#if defined(HAVE_MMAP) && defined(_WIN32) + #include #include #include -#include - -#include +#include /* Assume W-functions do not work below VC2005 and Xbox platforms */ #if defined(_MSC_VER) && _MSC_VER < 1400 || defined(_XBOX) @@ -17,122 +39,227 @@ struct nbio_t { - HANDLE file; - bool is_write; + FILE* f; + void* data; + size_t progress; size_t len; - void* ptr; + /* + * possible values: + * NBIO_READ, NBIO_WRITE - obvious + * -1 - currently doing nothing + * -2 - the pointer was reallocated since the last operation + */ + signed char op; + signed char mode; }; -#define FILE_SHARE_ALL (FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE) -struct nbio_t* nbio_open(const char * filename, unsigned mode) -{ - static const DWORD dispositions[] = { OPEN_EXISTING, CREATE_ALWAYS, OPEN_ALWAYS, OPEN_EXISTING, CREATE_ALWAYS }; - HANDLE mem; - LARGE_INTEGER len; - struct nbio_t* handle = NULL; - void* ptr = NULL; - bool is_write = (mode == NBIO_WRITE || mode == NBIO_UPDATE || mode == BIO_WRITE); - DWORD access = (is_write ? GENERIC_READ|GENERIC_WRITE : GENERIC_READ); #if !defined(_WIN32) || defined(LEGACY_WIN32) - HANDLE file = CreateFile(filename, access, FILE_SHARE_ALL, NULL, dispositions[mode], FILE_ATTRIBUTE_NORMAL, NULL); +static const char * modes[]={ "rb", "wb", "r+b", "rb", "wb", "r+b" }; +#else +static const wchar_t * modes[]={ L"rb", L"wb", L"r+b", L"rb", L"wb", L"r+b" }; +#endif + +static struct nbio_t* nbio_mmap_win32_open(const char * filename, unsigned mode) +{ + void *buf = NULL; + struct nbio_t* handle = NULL; + size_t len = 0; +#if !defined(_WIN32) || defined(LEGACY_WIN32) + FILE* f = fopen(filename, modes[mode]); #else wchar_t *filename_wide = utf8_to_utf16_string_alloc(filename); - HANDLE file = CreateFileW(filename_wide, access, FILE_SHARE_ALL, NULL, dispositions[mode], FILE_ATTRIBUTE_NORMAL, NULL); + FILE* f = _wfopen(filename_wide, modes[mode]); if (filename_wide) free(filename_wide); #endif - - if (file == INVALID_HANDLE_VALUE) + if (!f) return NULL; - - GetFileSizeEx(file, &len); - - mem = CreateFileMapping(file, NULL, is_write ? PAGE_READWRITE : PAGE_READONLY, 0, 0, NULL); - ptr = MapViewOfFile(mem, is_write ? (FILE_MAP_READ|FILE_MAP_WRITE) : FILE_MAP_READ, 0, 0, len.QuadPart); - CloseHandle(mem); - - handle = malloc(sizeof(struct nbio_t)); - handle->file = file; - handle->is_write = is_write; - handle->len = len.QuadPart; - handle->ptr = ptr; + handle = (struct nbio_t*)malloc(sizeof(struct nbio_t)); + + if (!handle) + goto error; + + handle->f = f; + + switch (mode) + { + case NBIO_WRITE: + case BIO_WRITE: + break; + default: + fseek(handle->f, 0, SEEK_END); + len = ftell(handle->f); + break; + } + + handle->mode = mode; + + if (len) + buf = malloc(len); + + if (len && !buf) + goto error; + + handle->data = buf; + handle->len = len; + handle->progress = handle->len; + handle->op = -2; return handle; + +error: + if (handle) + free(handle); + fclose(f); + return NULL; } -void nbio_begin_read(struct nbio_t* handle) +static void nbio_mmap_win32_begin_read(struct nbio_t* handle) { - /* not needed */ + if (!handle) + return; + + if (handle->op >= 0) + { + puts("ERROR - attempted file read operation while busy"); + abort(); + } + + fseek(handle->f, 0, SEEK_SET); + + handle->op = NBIO_READ; + handle->progress = 0; } -void nbio_begin_write(struct nbio_t* handle) +static void nbio_mmap_win32_begin_write(struct nbio_t* handle) { - /* not needed */ + if (!handle) + return; + + if (handle->op >= 0) + { + puts("ERROR - attempted file write operation while busy"); + abort(); + } + + fseek(handle->f, 0, SEEK_SET); + handle->op = NBIO_WRITE; + handle->progress = 0; } -bool nbio_iterate(struct nbio_t* handle) +static bool nbio_mmap_win32_iterate(struct nbio_t* handle) { - return true; /* not needed */ + size_t amount = 65536; + + if (!handle) + return false; + + if (amount > handle->len - handle->progress) + amount = handle->len - handle->progress; + + switch (handle->op) + { + case NBIO_READ: + if (handle->mode == BIO_READ) + { + amount = handle->len; + fread((char*)handle->data, 1, amount, handle->f); + } + else + fread((char*)handle->data + handle->progress, 1, amount, handle->f); + break; + case NBIO_WRITE: + if (handle->mode == BIO_WRITE) + { + size_t written = 0; + amount = handle->len; + written = fwrite((char*)handle->data, 1, amount, handle->f); + if (written != amount) + return false; + } + else + fwrite((char*)handle->data + handle->progress, 1, amount, handle->f); + break; + } + + handle->progress += amount; + + if (handle->progress == handle->len) + handle->op = -1; + return (handle->op < 0); } -void nbio_resize(struct nbio_t* handle, size_t len) +static void nbio_mmap_win32_resize(struct nbio_t* handle, size_t len) { - LARGE_INTEGER len_li; - HANDLE mem; - + if (!handle) + return; + + if (handle->op >= 0) + { + puts("ERROR - attempted file resize operation while busy"); + abort(); + } if (len < handle->len) { - /* this works perfectly fine if this check is removed, - * but it won't work on other nbio implementations */ - /* therefore, it's blocked so nobody accidentally - * relies on it. */ puts("ERROR - attempted file shrink operation, not implemented"); abort(); } - - len_li.QuadPart = len; - SetFilePointerEx(handle->file, len_li, NULL, FILE_BEGIN); - - if (!SetEndOfFile(handle->file)) - { - puts("ERROR - couldn't resize file (SetEndOfFile)"); - abort(); /* this one returns void and I can't find any other way for it to report failure */ - } - handle->len = len; - - UnmapViewOfFile(handle->ptr); - mem = CreateFileMapping(handle->file, NULL, handle->is_write ? PAGE_READWRITE : PAGE_READONLY, 0, 0, NULL); - handle->ptr = MapViewOfFile(mem, handle->is_write ? (FILE_MAP_READ|FILE_MAP_WRITE) : FILE_MAP_READ, 0, 0, len); - CloseHandle(mem); - - if (!handle->ptr) - { - puts("ERROR - couldn't resize file (MapViewOfFile)"); - abort(); - } + + handle->len = len; + handle->data = realloc(handle->data, handle->len); + handle->op = -1; + handle->progress = handle->len; } -void* nbio_get_ptr(struct nbio_t* handle, size_t* len) +static void *nbio_mmap_win32_get_ptr(struct nbio_t* handle, size_t* len) { if (!handle) return NULL; if (len) *len = handle->len; - return handle->ptr; + if (handle->op == -1) + return handle->data; + return NULL; } -void nbio_cancel(struct nbio_t* handle) -{ - /* not needed */ -} - -void nbio_free(struct nbio_t* handle) +static void nbio_mmap_win32_cancel(struct nbio_t* handle) { if (!handle) return; - CloseHandle(handle->file); - UnmapViewOfFile(handle->ptr); + + handle->op = -1; + handle->progress = handle->len; +} + +static void nbio_mmap_win32_free(struct nbio_t* handle) +{ + if (!handle) + return; + if (handle->op >= 0) + { + puts("ERROR - attempted free() while busy"); + abort(); + } + fclose(handle->f); + free(handle->data); + + handle->f = NULL; + handle->data = NULL; free(handle); } + +nbio_intf_t nbio_mmap_win32 = { + nbio_mmap_win32_open, + nbio_mmap_win32_begin_read, + nbio_mmap_win32_begin_write, + nbio_mmap_win32_iterate, + nbio_mmap_win32_resize, + nbio_mmap_win32_get_ptr, + nbio_mmap_win32_cancel, + nbio_mmap_win32_free, + "nbio_mmap_win32", +}; + +#endif From 3902d4c1cf5eb680c2a7bf43b37bcc027eed33d3 Mon Sep 17 00:00:00 2001 From: Twinaphex Date: Sat, 25 Nov 2017 05:53:56 +0100 Subject: [PATCH 107/183] Fix warning --- menu/cbs/menu_cbs_ok.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 1a32f07b2f..9677500317 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -3768,13 +3768,9 @@ static void netplay_refresh_rooms_cb(void *task_data, void *user_data, const cha if (lan_room_count != 0) { - struct netplay_host *host = NULL; - for (i = netplay_room_count; i < netplay_room_count + lan_room_count; i++) { - struct netplay_host *host = NULL; - host = &lan_hosts->hosts[j++]; - + struct netplay_host *host = &lan_hosts->hosts[j++]; strlcpy(netplay_room_list[i].nickname, host->nick, From 679275857fd42a2a383c7c0a634709831e15a8d4 Mon Sep 17 00:00:00 2001 From: Twinaphex Date: Sat, 25 Nov 2017 05:55:48 +0100 Subject: [PATCH 108/183] Fix warnings --- retroarch.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/retroarch.c b/retroarch.c index 4158adbbca..f6f4061846 100644 --- a/retroarch.c +++ b/retroarch.c @@ -2360,7 +2360,7 @@ static enum runloop_state runloop_check_state( bool input_nonblock_state, unsigned *sleep_ms) { - static retro_bits_t last_input = {0}; + static retro_bits_t last_input = {{0}}; static bool old_fs_toggle_pressed= false; static bool old_focus = true; bool is_focused = false; @@ -2533,7 +2533,7 @@ static enum runloop_state runloop_check_state( #ifdef HAVE_MENU if (menu_is_alive) { - static retro_bits_t old_input = {0}; + static retro_bits_t old_input = {{0}}; menu_ctx_iterate_t iter; retro_ctx.poll_cb(); From 0485bab0efa7363ebbd508d92ede015436d9718b Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 25 Nov 2017 06:15:30 +0100 Subject: [PATCH 109/183] Add HAVE_CONFIG_H to nbio_intf.c --- libretro-common/file/nbio/nbio_intf.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libretro-common/file/nbio/nbio_intf.c b/libretro-common/file/nbio/nbio_intf.c index a0ccf9975d..ee9a9f6af3 100644 --- a/libretro-common/file/nbio/nbio_intf.c +++ b/libretro-common/file/nbio/nbio_intf.c @@ -23,6 +23,10 @@ #include #include +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + #include extern nbio_intf_t nbio_linux; From 72fdfb1edd4ce50c158a16b6c14bb4dc18978d9c Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 25 Nov 2017 06:17:19 +0100 Subject: [PATCH 110/183] Add HAVE_CONFIG_H to file_stream.c --- libretro-common/streams/file_stream.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libretro-common/streams/file_stream.c b/libretro-common/streams/file_stream.c index ff077b7c56..9f6ad73437 100644 --- a/libretro-common/streams/file_stream.c +++ b/libretro-common/streams/file_stream.c @@ -25,6 +25,10 @@ #include #include +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + #if defined(_WIN32) # ifdef _MSC_VER # define setmode _setmode From 72b157bfcdd981ed52a2f19277c944ca51e3b559 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 25 Nov 2017 07:26:06 +0100 Subject: [PATCH 111/183] DOn't rely on HASVE_MMAP for nbio_windowsmmap.c --- libretro-common/file/nbio/nbio_intf.c | 2 +- libretro-common/file/nbio/nbio_windowsmmap.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libretro-common/file/nbio/nbio_intf.c b/libretro-common/file/nbio/nbio_intf.c index ee9a9f6af3..4b7872c01d 100644 --- a/libretro-common/file/nbio/nbio_intf.c +++ b/libretro-common/file/nbio/nbio_intf.c @@ -38,7 +38,7 @@ extern nbio_intf_t nbio_stdio; static nbio_intf_t *internal_nbio = &nbio_linux; #elif defined(HAVE_MMAP) && defined(BSD) && !defined(__MACH__) static nbio_intf_t *internal_nbio = &nbio_mmap_unix; -#elif defined(HAVE_MMAP) && defined(_WIN32) +#elif defined(_WIN32) && !defined(_XBOX) static nbio_intf_t *internal_nbio = &nbio_mmap_win32; #else static nbio_intf_t *internal_nbio = &nbio_stdio; diff --git a/libretro-common/file/nbio/nbio_windowsmmap.c b/libretro-common/file/nbio/nbio_windowsmmap.c index 33b573dfd4..58329ad078 100644 --- a/libretro-common/file/nbio/nbio_windowsmmap.c +++ b/libretro-common/file/nbio/nbio_windowsmmap.c @@ -20,7 +20,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#if defined(HAVE_MMAP) && defined(_WIN32) +#if defined(_WIN32) && !defined(_XBOX) #include #include From fe12e079bb3991a5fcd3745a4d44406533e0e25e Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 25 Nov 2017 17:38:37 +0100 Subject: [PATCH 112/183] Reimplement NBIO windows mmap --- libretro-common/file/nbio/nbio_windowsmmap.c | 210 ++++++------------- 1 file changed, 64 insertions(+), 146 deletions(-) diff --git a/libretro-common/file/nbio/nbio_windowsmmap.c b/libretro-common/file/nbio/nbio_windowsmmap.c index 58329ad078..350b6a5275 100644 --- a/libretro-common/file/nbio/nbio_windowsmmap.c +++ b/libretro-common/file/nbio/nbio_windowsmmap.c @@ -28,6 +28,8 @@ #include #include +#include + /* Assume W-functions do not work below VC2005 and Xbox platforms */ #if defined(_MSC_VER) && _MSC_VER < 1400 || defined(_XBOX) @@ -37,180 +39,110 @@ #endif +#ifndef FILE_SHARE_ALL +#define FILE_SHARE_ALL (FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE) +#endif + struct nbio_t { - FILE* f; - void* data; - size_t progress; + HANDLE file; + bool is_write; size_t len; - /* - * possible values: - * NBIO_READ, NBIO_WRITE - obvious - * -1 - currently doing nothing - * -2 - the pointer was reallocated since the last operation - */ - signed char op; - signed char mode; + void* ptr; }; -#if !defined(_WIN32) || defined(LEGACY_WIN32) -static const char * modes[]={ "rb", "wb", "r+b", "rb", "wb", "r+b" }; -#else -static const wchar_t * modes[]={ L"rb", L"wb", L"r+b", L"rb", L"wb", L"r+b" }; -#endif - static struct nbio_t* nbio_mmap_win32_open(const char * filename, unsigned mode) { - void *buf = NULL; - struct nbio_t* handle = NULL; - size_t len = 0; + static const DWORD dispositions[] = { OPEN_EXISTING, CREATE_ALWAYS, OPEN_ALWAYS, OPEN_EXISTING, CREATE_ALWAYS }; + HANDLE mem; + LARGE_INTEGER len; + struct nbio_t* handle = NULL; + void* ptr = NULL; + bool is_write = (mode == NBIO_WRITE || mode == NBIO_UPDATE || mode == BIO_WRITE); + DWORD access = (is_write ? GENERIC_READ|GENERIC_WRITE : GENERIC_READ); #if !defined(_WIN32) || defined(LEGACY_WIN32) - FILE* f = fopen(filename, modes[mode]); + HANDLE file = CreateFile(filename, access, FILE_SHARE_ALL, NULL, dispositions[mode], FILE_ATTRIBUTE_NORMAL, NULL); #else wchar_t *filename_wide = utf8_to_utf16_string_alloc(filename); - FILE* f = _wfopen(filename_wide, modes[mode]); + HANDLE file = CreateFileW(filename_wide, access, FILE_SHARE_ALL, NULL, dispositions[mode], FILE_ATTRIBUTE_NORMAL, NULL); if (filename_wide) free(filename_wide); #endif - if (!f) + + if (file == INVALID_HANDLE_VALUE) return NULL; - handle = (struct nbio_t*)malloc(sizeof(struct nbio_t)); + GetFileSizeEx(file, &len); - if (!handle) - goto error; + mem = CreateFileMapping(file, NULL, is_write ? PAGE_READWRITE : PAGE_READONLY, 0, 0, NULL); + ptr = MapViewOfFile(mem, is_write ? (FILE_MAP_READ|FILE_MAP_WRITE) : FILE_MAP_READ, 0, 0, len.QuadPart); + CloseHandle(mem); - handle->f = f; + handle = malloc(sizeof(struct nbio_t)); - switch (mode) - { - case NBIO_WRITE: - case BIO_WRITE: - break; - default: - fseek(handle->f, 0, SEEK_END); - len = ftell(handle->f); - break; - } - - handle->mode = mode; - - if (len) - buf = malloc(len); - - if (len && !buf) - goto error; - - handle->data = buf; - handle->len = len; - handle->progress = handle->len; - handle->op = -2; + handle->file = file; + handle->is_write = is_write; + handle->len = len.QuadPart; + handle->ptr = ptr; return handle; - -error: - if (handle) - free(handle); - fclose(f); - return NULL; } static void nbio_mmap_win32_begin_read(struct nbio_t* handle) { - if (!handle) - return; - - if (handle->op >= 0) - { - puts("ERROR - attempted file read operation while busy"); - abort(); - } - - fseek(handle->f, 0, SEEK_SET); - - handle->op = NBIO_READ; - handle->progress = 0; + /* not needed */ } static void nbio_mmap_win32_begin_write(struct nbio_t* handle) { - if (!handle) - return; - - if (handle->op >= 0) - { - puts("ERROR - attempted file write operation while busy"); - abort(); - } - - fseek(handle->f, 0, SEEK_SET); - handle->op = NBIO_WRITE; - handle->progress = 0; + /* not needed */ } static bool nbio_mmap_win32_iterate(struct nbio_t* handle) { - size_t amount = 65536; - - if (!handle) - return false; - - if (amount > handle->len - handle->progress) - amount = handle->len - handle->progress; - - switch (handle->op) - { - case NBIO_READ: - if (handle->mode == BIO_READ) - { - amount = handle->len; - fread((char*)handle->data, 1, amount, handle->f); - } - else - fread((char*)handle->data + handle->progress, 1, amount, handle->f); - break; - case NBIO_WRITE: - if (handle->mode == BIO_WRITE) - { - size_t written = 0; - amount = handle->len; - written = fwrite((char*)handle->data, 1, amount, handle->f); - if (written != amount) - return false; - } - else - fwrite((char*)handle->data + handle->progress, 1, amount, handle->f); - break; - } - - handle->progress += amount; - - if (handle->progress == handle->len) - handle->op = -1; - return (handle->op < 0); + /* not needed */ + return true; } static void nbio_mmap_win32_resize(struct nbio_t* handle, size_t len) { + LARGE_INTEGER len_li; + HANDLE mem; + if (!handle) return; - if (handle->op >= 0) - { - puts("ERROR - attempted file resize operation while busy"); - abort(); - } if (len < handle->len) { + /* this works perfectly fine if this check is removed, + * but it won't work on other nbio implementations */ + /* therefore, it's blocked so nobody accidentally + * relies on it. */ puts("ERROR - attempted file shrink operation, not implemented"); abort(); } - handle->len = len; - handle->data = realloc(handle->data, handle->len); - handle->op = -1; - handle->progress = handle->len; + len_li.QuadPart = len; + SetFilePointerEx(handle->file, len_li, NULL, FILE_BEGIN); + + if (!SetEndOfFile(handle->file)) + { + puts("ERROR - couldn't resize file (SetEndOfFile)"); + abort(); /* this one returns void and I can't find any other way for it to report failure */ + } + handle->len = len; + + UnmapViewOfFile(handle->ptr); + mem = CreateFileMapping(handle->file, NULL, handle->is_write ? PAGE_READWRITE : PAGE_READONLY, 0, 0, NULL); + handle->ptr = MapViewOfFile(mem, handle->is_write ? (FILE_MAP_READ|FILE_MAP_WRITE) : FILE_MAP_READ, 0, 0, len); + CloseHandle(mem); + + if (!handle->ptr) + { + puts("ERROR - couldn't resize file (MapViewOfFile)"); + abort(); + } } static void *nbio_mmap_win32_get_ptr(struct nbio_t* handle, size_t* len) @@ -219,34 +151,20 @@ static void *nbio_mmap_win32_get_ptr(struct nbio_t* handle, size_t* len) return NULL; if (len) *len = handle->len; - if (handle->op == -1) - return handle->data; - return NULL; + return handle->ptr; } static void nbio_mmap_win32_cancel(struct nbio_t* handle) { - if (!handle) - return; - - handle->op = -1; - handle->progress = handle->len; + /* not needed */ } static void nbio_mmap_win32_free(struct nbio_t* handle) { if (!handle) return; - if (handle->op >= 0) - { - puts("ERROR - attempted free() while busy"); - abort(); - } - fclose(handle->f); - free(handle->data); - - handle->f = NULL; - handle->data = NULL; + CloseHandle(handle->file); + UnmapViewOfFile(handle->ptr); free(handle); } From e78ec12973fe3a42377c9e1619b9a06909c45827 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 25 Nov 2017 18:33:22 +0100 Subject: [PATCH 113/183] Can't have redefinitions of nbio_t in Griffin --- libretro-common/file/nbio/nbio_intf.c | 30 +++---- libretro-common/file/nbio/nbio_linux.c | 85 +++++++++++--------- libretro-common/file/nbio/nbio_stdio.c | 45 ++++++----- libretro-common/file/nbio/nbio_unixmmap.c | 31 ++++--- libretro-common/file/nbio/nbio_windowsmmap.c | 37 +++++---- libretro-common/include/file/nbio.h | 37 +++++---- 6 files changed, 145 insertions(+), 120 deletions(-) diff --git a/libretro-common/file/nbio/nbio_intf.c b/libretro-common/file/nbio/nbio_intf.c index 4b7872c01d..1f123723b8 100644 --- a/libretro-common/file/nbio/nbio_intf.c +++ b/libretro-common/file/nbio/nbio_intf.c @@ -44,42 +44,42 @@ static nbio_intf_t *internal_nbio = &nbio_mmap_win32; static nbio_intf_t *internal_nbio = &nbio_stdio; #endif -struct nbio_t* nbio_open(const char * filename, unsigned mode) +void *nbio_open(const char * filename, unsigned mode) { return internal_nbio->open(filename, mode); } -void nbio_begin_read(struct nbio_t* handle) +void nbio_begin_read(void *data) { - internal_nbio->begin_read(handle); + internal_nbio->begin_read(data); } -void nbio_begin_write(struct nbio_t* handle) +void nbio_begin_write(void *data) { - internal_nbio->begin_write(handle); + internal_nbio->begin_write(data); } -bool nbio_iterate(struct nbio_t* handle) +bool nbio_iterate(void *data) { - return internal_nbio->iterate(handle); + return internal_nbio->iterate(data); } -void nbio_resize(struct nbio_t* handle, size_t len) +void nbio_resize(void *data, size_t len) { - internal_nbio->resize(handle, len); + internal_nbio->resize(data, len); } -void *nbio_get_ptr(struct nbio_t* handle, size_t* len) +void *nbio_get_ptr(void *data, size_t* len) { - return internal_nbio->get_ptr(handle, len); + return internal_nbio->get_ptr(data, len); } -void nbio_cancel(struct nbio_t* handle) +void nbio_cancel(void *data) { - internal_nbio->cancel(handle); + internal_nbio->cancel(data); } -void nbio_free(struct nbio_t* handle) +void nbio_free(void *data) { - internal_nbio->free(handle); + internal_nbio->free(data); } diff --git a/libretro-common/file/nbio/nbio_linux.c b/libretro-common/file/nbio/nbio_linux.c index 8c64bf73ea..e6eba48620 100644 --- a/libretro-common/file/nbio/nbio_linux.c +++ b/libretro-common/file/nbio/nbio_linux.c @@ -35,7 +35,7 @@ #include #include -struct nbio_t +struct nbio_linux_t { int fd; bool busy; @@ -76,33 +76,7 @@ static int io_getevents(aio_context_t ctx, long min_nr, long nr, return syscall(__NR_io_getevents, ctx, min_nr, nr, events, timeout); } -static struct nbio_t* nbio_linux_open(const char * filename, unsigned mode) -{ - static const int o_flags[] = { O_RDONLY, O_RDWR|O_CREAT|O_TRUNC, O_RDWR, O_RDONLY, O_RDWR|O_CREAT|O_TRUNC }; - - aio_context_t ctx = 0; - struct nbio_t* handle = NULL; - int fd = open(filename, o_flags[mode]|O_CLOEXEC, 0644); - if (fd < 0) - return NULL; - - if (io_setup(128, &ctx) < 0) - { - close(fd); - return NULL; - } - - handle = malloc(sizeof(struct nbio_t)); - handle->fd = fd; - handle->ctx = ctx; - handle->len = lseek(fd, 0, SEEK_END); - handle->ptr = malloc(handle->len); - handle->busy = false; - - return handle; -} - -static void nbio_begin_op(struct nbio_t* handle, uint16_t op) +static void nbio_begin_op(struct nbio_linux_t* handle, uint16_t op) { struct iocb * cbp = &handle->cb; @@ -124,18 +98,51 @@ static void nbio_begin_op(struct nbio_t* handle, uint16_t op) handle->busy = true; } -static void nbio_linux_begin_read(struct nbio_t* handle) +static void *nbio_linux_open(const char * filename, unsigned mode) { - nbio_begin_op(handle, IOCB_CMD_PREAD); + static const int o_flags[] = { O_RDONLY, O_RDWR|O_CREAT|O_TRUNC, O_RDWR, O_RDONLY, O_RDWR|O_CREAT|O_TRUNC }; + + aio_context_t ctx = 0; + struct nbio_linux_t* handle = NULL; + int fd = open(filename, o_flags[mode]|O_CLOEXEC, 0644); + if (fd < 0) + return NULL; + + if (io_setup(128, &ctx) < 0) + { + close(fd); + return NULL; + } + + handle = malloc(sizeof(struct nbio_linux_t)); + handle->fd = fd; + handle->ctx = ctx; + handle->len = lseek(fd, 0, SEEK_END); + handle->ptr = malloc(handle->len); + handle->busy = false; + + return handle; } -static void nbio_linux_begin_write(struct nbio_t* handle) +static void nbio_linux_begin_read(void *data) { - nbio_begin_op(handle, IOCB_CMD_PWRITE); + struct nbio_linux_t* handle = (struct nbio_linux_t*)data; + if (handle) + nbio_begin_op(handle, IOCB_CMD_PREAD); } -static bool nbio_linux_iterate(struct nbio_t* handle) +static void nbio_linux_begin_write(void *data) { + struct nbio_linux_t* handle = (struct nbio_linux_t*)data; + if (handle) + nbio_begin_op(handle, IOCB_CMD_PWRITE); +} + +static bool nbio_linux_iterate(void *data) +{ + struct nbio_linux_t* handle = (struct nbio_linux_t*)data; + if (!handle) + return false; if (handle->busy) { struct io_event ev; @@ -145,8 +152,9 @@ static bool nbio_linux_iterate(struct nbio_t* handle) return !handle->busy; } -static void nbio_linux_resize(struct nbio_t* handle, size_t len) +static void nbio_linux_resize(void *data, size_t len) { + struct nbio_linux_t* handle = (struct nbio_linux_t*)data; if (!handle) return; @@ -169,8 +177,9 @@ static void nbio_linux_resize(struct nbio_t* handle, size_t len) handle->len = len; } -static void *nbio_linux_get_ptr(struct nbio_t* handle, size_t* len) +static void *nbio_linux_get_ptr(void *data, size_t* len) { + struct nbio_linux_t* handle = (struct nbio_linux_t*)data; if (!handle) return NULL; if (len) @@ -180,8 +189,9 @@ static void *nbio_linux_get_ptr(struct nbio_t* handle, size_t* len) return NULL; } -static void nbio_linux_cancel(struct nbio_t* handle) +static void nbio_linux_cancel(void *data) { + struct nbio_linux_t* handle = (struct nbio_linux_t*)data; if (!handle) return; @@ -193,8 +203,9 @@ static void nbio_linux_cancel(struct nbio_t* handle) } } -static void nbio_linux_free(struct nbio_t* handle) +static void nbio_linux_free(void *data) { + struct nbio_linux_t* handle = (struct nbio_linux_t*)data; if (!handle) return; diff --git a/libretro-common/file/nbio/nbio_stdio.c b/libretro-common/file/nbio/nbio_stdio.c index 1a97be6551..3e6f4094f1 100644 --- a/libretro-common/file/nbio/nbio_stdio.c +++ b/libretro-common/file/nbio/nbio_stdio.c @@ -35,7 +35,7 @@ #endif -struct nbio_t +struct nbio_stdio_t { FILE* f; void* data; @@ -52,21 +52,21 @@ struct nbio_t }; #if !defined(_WIN32) || defined(LEGACY_WIN32) -static const char *stdio_modes[]={ "rb", "wb", "r+b", "rb", "wb", "r+b" }; +static const char *stdio_modes[] = { "rb", "wb", "r+b", "rb", "wb", "r+b" }; #else -static const wchar_t *stdio_modes[]={ L"rb", L"wb", L"r+b", L"rb", L"wb", L"r+b" }; +static const wchar_t *stdio_modes[] = { L"rb", L"wb", L"r+b", L"rb", L"wb", L"r+b" }; #endif -static struct nbio_t* nbio_stdio_open(const char * filename, unsigned mode) +static void *nbio_stdio_open(const char * filename, unsigned mode) { - void *buf = NULL; - struct nbio_t* handle = NULL; - size_t len = 0; + void *buf = NULL; + struct nbio_stdio_t* handle = NULL; + size_t len = 0; #if !defined(_WIN32) || defined(LEGACY_WIN32) - FILE* f = fopen(filename, stdio_modes[mode]); + FILE* f = fopen(filename, stdio_modes[mode]); #else - wchar_t *filename_wide = utf8_to_utf16_string_alloc(filename); - FILE* f = _wfopen(filename_wide, stdio_modes[mode]); + wchar_t *filename_wide = utf8_to_utf16_string_alloc(filename); + FILE* f = _wfopen(filename_wide, stdio_modes[mode]); if (filename_wide) free(filename_wide); @@ -74,7 +74,7 @@ static struct nbio_t* nbio_stdio_open(const char * filename, unsigned mode) if (!f) return NULL; - handle = (struct nbio_t*)malloc(sizeof(struct nbio_t)); + handle = (struct nbio_stdio_t*)malloc(sizeof(struct nbio_stdio_t)); if (!handle) goto error; @@ -114,8 +114,9 @@ error: return NULL; } -static void nbio_stdio_begin_read(struct nbio_t* handle) +static void nbio_stdio_begin_read(void *data) { + struct nbio_stdio_t *handle = (struct nbio_stdio_t*)data; if (!handle) return; @@ -131,8 +132,9 @@ static void nbio_stdio_begin_read(struct nbio_t* handle) handle->progress = 0; } -static void nbio_stdio_begin_write(struct nbio_t* handle) +static void nbio_stdio_begin_write(void *data) { + struct nbio_stdio_t *handle = (struct nbio_stdio_t*)data; if (!handle) return; @@ -147,9 +149,10 @@ static void nbio_stdio_begin_write(struct nbio_t* handle) handle->progress = 0; } -static bool nbio_stdio_iterate(struct nbio_t* handle) +static bool nbio_stdio_iterate(void *data) { - size_t amount = 65536; + size_t amount = 65536; + struct nbio_stdio_t *handle = (struct nbio_stdio_t*)data; if (!handle) return false; @@ -189,8 +192,9 @@ static bool nbio_stdio_iterate(struct nbio_t* handle) return (handle->op < 0); } -static void nbio_stdio_resize(struct nbio_t* handle, size_t len) +static void nbio_stdio_resize(void *data, size_t len) { + struct nbio_stdio_t *handle = (struct nbio_stdio_t*)data; if (!handle) return; @@ -211,8 +215,9 @@ static void nbio_stdio_resize(struct nbio_t* handle, size_t len) handle->progress = handle->len; } -static void *nbio_stdio_get_ptr(struct nbio_t* handle, size_t* len) +static void *nbio_stdio_get_ptr(void *data, size_t* len) { + struct nbio_stdio_t *handle = (struct nbio_stdio_t*)data; if (!handle) return NULL; if (len) @@ -222,8 +227,9 @@ static void *nbio_stdio_get_ptr(struct nbio_t* handle, size_t* len) return NULL; } -static void nbio_stdio_cancel(struct nbio_t* handle) +static void nbio_stdio_cancel(void *data) { + struct nbio_stdio_t *handle = (struct nbio_stdio_t*)data; if (!handle) return; @@ -231,8 +237,9 @@ static void nbio_stdio_cancel(struct nbio_t* handle) handle->progress = handle->len; } -static void nbio_stdio_free(struct nbio_t* handle) +static void nbio_stdio_free(void *data) { + struct nbio_stdio_t *handle = (struct nbio_stdio_t*)data; if (!handle) return; if (handle->op >= 0) diff --git a/libretro-common/file/nbio/nbio_unixmmap.c b/libretro-common/file/nbio/nbio_unixmmap.c index 0dd0cd239f..e06e9a1d2f 100644 --- a/libretro-common/file/nbio/nbio_unixmmap.c +++ b/libretro-common/file/nbio/nbio_unixmmap.c @@ -35,7 +35,7 @@ #include #include -struct nbio_t +struct nbio_mmap_unix_t { int fd; int map_flags; @@ -43,15 +43,15 @@ struct nbio_t void* ptr; }; -static struct nbio_t* nbio_mmap_unix_open(const char * filename, unsigned mode) +static void *nbio_mmap_unix_open(const char * filename, unsigned mode) { static const int o_flags[] = { O_RDONLY, O_RDWR|O_CREAT|O_TRUNC, O_RDWR, O_RDONLY, O_RDWR|O_CREAT|O_TRUNC }; static const int map_flags[] = { PROT_READ, PROT_WRITE|PROT_READ, PROT_WRITE|PROT_READ, PROT_READ, PROT_WRITE|PROT_READ }; size_t len; - void* ptr = NULL; - struct nbio_t* handle = NULL; - int fd = open(filename, o_flags[mode]|O_CLOEXEC, 0644); + void* ptr = NULL; + struct nbio_mmap_unix_t* handle = NULL; + int fd = open(filename, o_flags[mode]|O_CLOEXEC, 0644); if (fd < 0) return NULL; @@ -65,7 +65,7 @@ static struct nbio_t* nbio_mmap_unix_open(const char * filename, unsigned mode) return NULL; } - handle = malloc(sizeof(struct nbio_t)); + handle = malloc(sizeof(struct nbio_mmap_unix_t)); handle->fd = fd; handle->map_flags = map_flags[mode]; handle->len = len; @@ -73,23 +73,26 @@ static struct nbio_t* nbio_mmap_unix_open(const char * filename, unsigned mode) return handle; } -static void nbio_mmap_unix_begin_read(struct nbio_t* handle) +static void nbio_mmap_unix_begin_read(void *data) { /* not needed */ } -static void nbio_mmap_unix_begin_write(struct nbio_t* handle) +static void nbio_mmap_unix_begin_write(void *data) { /* not needed */ } -static bool nbio_mmap_unix_iterate(struct nbio_t* handle) +static bool nbio_mmap_unix_iterate(void *data) { return true; /* not needed */ } -static void nbio_mmap_unix_resize(struct nbio_t* handle, size_t len) +static void nbio_mmap_unix_resize(void *data, size_t len) { + struct nbio_mmap_unix_t* handle = (struct nbio_mmap_unix_t*)data; + if (!handle) + return; if (len < handle->len) { /* this works perfectly fine if this check is removed, but it @@ -118,8 +121,9 @@ static void nbio_mmap_unix_resize(struct nbio_t* handle, size_t len) } } -static void *nbio_mmap_unix_get_ptr(struct nbio_t* handle, size_t* len) +static void *nbio_mmap_unix_get_ptr(void *data, size_t* len) { + struct nbio_mmap_unix_t* handle = (struct nbio_mmap_unix_t*)data; if (!handle) return NULL; if (len) @@ -127,13 +131,14 @@ static void *nbio_mmap_unix_get_ptr(struct nbio_t* handle, size_t* len) return handle->ptr; } -static void nbio_mmap_unix_cancel(struct nbio_t* handle) +static void nbio_mmap_unix_cancel(void *data) { /* not needed */ } -static void nbio_mmap_unix_free(struct nbio_t* handle) +static void nbio_mmap_unix_free(void *data) { + struct nbio_mmap_unix_t* handle = (struct nbio_mmap_unix_t*)data; if (!handle) return; close(handle->fd); diff --git a/libretro-common/file/nbio/nbio_windowsmmap.c b/libretro-common/file/nbio/nbio_windowsmmap.c index 350b6a5275..1777398136 100644 --- a/libretro-common/file/nbio/nbio_windowsmmap.c +++ b/libretro-common/file/nbio/nbio_windowsmmap.c @@ -43,7 +43,7 @@ #define FILE_SHARE_ALL (FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE) #endif -struct nbio_t +struct nbio_mmap_win32_t { HANDLE file; bool is_write; @@ -51,20 +51,20 @@ struct nbio_t void* ptr; }; -static struct nbio_t* nbio_mmap_win32_open(const char * filename, unsigned mode) +static void *nbio_mmap_win32_open(const char * filename, unsigned mode) { static const DWORD dispositions[] = { OPEN_EXISTING, CREATE_ALWAYS, OPEN_ALWAYS, OPEN_EXISTING, CREATE_ALWAYS }; HANDLE mem; LARGE_INTEGER len; - struct nbio_t* handle = NULL; - void* ptr = NULL; - bool is_write = (mode == NBIO_WRITE || mode == NBIO_UPDATE || mode == BIO_WRITE); - DWORD access = (is_write ? GENERIC_READ|GENERIC_WRITE : GENERIC_READ); + struct nbio_mmap_win32_t* handle = NULL; + void* ptr = NULL; + bool is_write = (mode == NBIO_WRITE || mode == NBIO_UPDATE || mode == BIO_WRITE); + DWORD access = (is_write ? GENERIC_READ|GENERIC_WRITE : GENERIC_READ); #if !defined(_WIN32) || defined(LEGACY_WIN32) - HANDLE file = CreateFile(filename, access, FILE_SHARE_ALL, NULL, dispositions[mode], FILE_ATTRIBUTE_NORMAL, NULL); + HANDLE file = CreateFile(filename, access, FILE_SHARE_ALL, NULL, dispositions[mode], FILE_ATTRIBUTE_NORMAL, NULL); #else - wchar_t *filename_wide = utf8_to_utf16_string_alloc(filename); - HANDLE file = CreateFileW(filename_wide, access, FILE_SHARE_ALL, NULL, dispositions[mode], FILE_ATTRIBUTE_NORMAL, NULL); + wchar_t *filename_wide = utf8_to_utf16_string_alloc(filename); + HANDLE file = CreateFileW(filename_wide, access, FILE_SHARE_ALL, NULL, dispositions[mode], FILE_ATTRIBUTE_NORMAL, NULL); if (filename_wide) free(filename_wide); @@ -79,7 +79,7 @@ static struct nbio_t* nbio_mmap_win32_open(const char * filename, unsigned mode) ptr = MapViewOfFile(mem, is_write ? (FILE_MAP_READ|FILE_MAP_WRITE) : FILE_MAP_READ, 0, 0, len.QuadPart); CloseHandle(mem); - handle = malloc(sizeof(struct nbio_t)); + handle = malloc(sizeof(struct nbio_mmap_win32_t)); handle->file = file; handle->is_write = is_write; @@ -89,26 +89,27 @@ static struct nbio_t* nbio_mmap_win32_open(const char * filename, unsigned mode) return handle; } -static void nbio_mmap_win32_begin_read(struct nbio_t* handle) +static void nbio_mmap_win32_begin_read(void *data) { /* not needed */ } -static void nbio_mmap_win32_begin_write(struct nbio_t* handle) +static void nbio_mmap_win32_begin_write(void *data) { /* not needed */ } -static bool nbio_mmap_win32_iterate(struct nbio_t* handle) +static bool nbio_mmap_win32_iterate(void *data) { /* not needed */ return true; } -static void nbio_mmap_win32_resize(struct nbio_t* handle, size_t len) +static void nbio_mmap_win32_resize(void *data, size_t len) { LARGE_INTEGER len_li; HANDLE mem; + struct nbio_mmap_win32_t* handle = (struct nbio_mmap_win32_t*)data; if (!handle) return; @@ -145,8 +146,9 @@ static void nbio_mmap_win32_resize(struct nbio_t* handle, size_t len) } } -static void *nbio_mmap_win32_get_ptr(struct nbio_t* handle, size_t* len) +static void *nbio_mmap_win32_get_ptr(void *data, size_t* len) { + struct nbio_mmap_win32_t* handle = (struct nbio_mmap_win32_t*)data; if (!handle) return NULL; if (len) @@ -154,13 +156,14 @@ static void *nbio_mmap_win32_get_ptr(struct nbio_t* handle, size_t* len) return handle->ptr; } -static void nbio_mmap_win32_cancel(struct nbio_t* handle) +static void nbio_mmap_win32_cancel(void *data) { /* not needed */ } -static void nbio_mmap_win32_free(struct nbio_t* handle) +static void nbio_mmap_win32_free(void *data) { + struct nbio_mmap_win32_t* handle = (struct nbio_mmap_win32_t*)data; if (!handle) return; CloseHandle(handle->file); diff --git a/libretro-common/include/file/nbio.h b/libretro-common/include/file/nbio.h index 86b74098d6..2aec848994 100644 --- a/libretro-common/include/file/nbio.h +++ b/libretro-common/include/file/nbio.h @@ -51,74 +51,73 @@ RETRO_BEGIN_DECLS #define BIO_WRITE 4 #endif -struct nbio_t; - typedef struct nbio_intf { - struct nbio_t* (*open)(const char * filename, unsigned mode); + void *(*open)(const char * filename, unsigned mode); - void (*begin_read)(struct nbio_t* handle); + void (*begin_read)(void *data); - void (*begin_write)(struct nbio_t* handle); + void (*begin_write)(void *data); - bool (*iterate)(struct nbio_t* handle); + bool (*iterate)(void *data); - void (*resize)(struct nbio_t* handle, size_t len); + void (*resize)(void *data, size_t len); - void *(*get_ptr)(struct nbio_t* handle, size_t* len); + void *(*get_ptr)(void *data, size_t* len); - void (*cancel)(struct nbio_t* handle); + void (*cancel)(void *data); - void (*free)(struct nbio_t* handle); + void (*free)(void *data); /* Human readable string. */ const char *ident; } nbio_intf_t; /* - * Creates an nbio structure for performing the given operation on the given file. + * Creates an nbio structure for performing the + * given operation on the given file. */ -struct nbio_t* nbio_open(const char * filename, unsigned mode); +void *nbio_open(const char * filename, unsigned mode); /* * Starts reading the given file. When done, it will be available in nbio_get_ptr. * Can not be done if the structure was created with {N,}BIO_WRITE. */ -void nbio_begin_read(struct nbio_t* handle); +void nbio_begin_read(void *data); /* * Starts writing to the given file. Before this, you should've copied the data to nbio_get_ptr. * Can not be done if the structure was created with {N,}BIO_READ. */ -void nbio_begin_write(struct nbio_t* handle); +void nbio_begin_write(void *data); /* * Performs part of the requested operation, or checks how it's going. * When it returns true, it's done. */ -bool nbio_iterate(struct nbio_t* handle); +bool nbio_iterate(void *data); /* * Resizes the file up to the given size; cannot shrink. * Can not be done if the structure was created with {N,}BIO_READ. */ -void nbio_resize(struct nbio_t* handle, size_t len); +void nbio_resize(void *data, size_t len); /* * Returns a pointer to the file data. Writable only if structure was not created with {N,}BIO_READ. * If any operation is in progress, the pointer will be NULL, but len will still be correct. */ -void* nbio_get_ptr(struct nbio_t* handle, size_t* len); +void* nbio_get_ptr(void *data, size_t* len); /* * Stops any pending operation, allowing the object to be freed. */ -void nbio_cancel(struct nbio_t* handle); +void nbio_cancel(void *data); /* * Deletes the nbio structure and its associated pointer. */ -void nbio_free(struct nbio_t* handle); +void nbio_free(void *data); RETRO_END_DECLS From ff7a244f5bf38386af3eb992c88534418cfc0035 Mon Sep 17 00:00:00 2001 From: Twinaphex Date: Sat, 25 Nov 2017 18:39:09 +0100 Subject: [PATCH 114/183] use Unix mmap for OSX/macOS now --- libretro-common/file/nbio/nbio_intf.c | 2 +- libretro-common/file/nbio/nbio_unixmmap.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libretro-common/file/nbio/nbio_intf.c b/libretro-common/file/nbio/nbio_intf.c index 1f123723b8..e4ddf9a7fb 100644 --- a/libretro-common/file/nbio/nbio_intf.c +++ b/libretro-common/file/nbio/nbio_intf.c @@ -36,7 +36,7 @@ extern nbio_intf_t nbio_stdio; #if defined(HAVE_MMAP) && defined(_linux__) static nbio_intf_t *internal_nbio = &nbio_linux; -#elif defined(HAVE_MMAP) && defined(BSD) && !defined(__MACH__) +#elif defined(HAVE_MMAP) && defined(BSD) static nbio_intf_t *internal_nbio = &nbio_mmap_unix; #elif defined(_WIN32) && !defined(_XBOX) static nbio_intf_t *internal_nbio = &nbio_mmap_win32; diff --git a/libretro-common/file/nbio/nbio_unixmmap.c b/libretro-common/file/nbio/nbio_unixmmap.c index e06e9a1d2f..869a3864ad 100644 --- a/libretro-common/file/nbio/nbio_unixmmap.c +++ b/libretro-common/file/nbio/nbio_unixmmap.c @@ -20,7 +20,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#if defined(HAVE_MMAP) && defined(__linux__) +#if defined(HAVE_MMAP) && defined(BSD) #include #include From 369be389f426648fb2e9534d34482b0142f04414 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 25 Nov 2017 18:42:12 +0100 Subject: [PATCH 115/183] Don't need HAVE_MMAP for linux --- libretro-common/file/nbio/nbio_intf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libretro-common/file/nbio/nbio_intf.c b/libretro-common/file/nbio/nbio_intf.c index e4ddf9a7fb..57d3eb6484 100644 --- a/libretro-common/file/nbio/nbio_intf.c +++ b/libretro-common/file/nbio/nbio_intf.c @@ -34,7 +34,7 @@ extern nbio_intf_t nbio_mmap_unix; extern nbio_intf_t nbio_mmap_win32; extern nbio_intf_t nbio_stdio; -#if defined(HAVE_MMAP) && defined(_linux__) +#if defined(_linux__) static nbio_intf_t *internal_nbio = &nbio_linux; #elif defined(HAVE_MMAP) && defined(BSD) static nbio_intf_t *internal_nbio = &nbio_mmap_unix; From 7e7c17596d73d99dd8a3f5ba1c888c284de28742 Mon Sep 17 00:00:00 2001 From: Rob Loach Date: Sat, 25 Nov 2017 12:51:12 -0500 Subject: [PATCH 116/183] Add Add To Favorites Playlist icon id --- menu/drivers/xmb.c | 1 + 1 file changed, 1 insertion(+) diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index 7dc700b29e..6301b86cd1 100755 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -2104,6 +2104,7 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb, case MENU_ENUM_LABEL_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE: return xmb->textures.list[XMB_TEXTURE_CORE_OPTIONS]; case MENU_ENUM_LABEL_ADD_TO_FAVORITES: + case MENU_ENUM_LABEL_ADD_TO_FAVORITES_PLAYLIST: return xmb->textures.list[XMB_TEXTURE_ADD_FAVORITE]; case MENU_ENUM_LABEL_CORE_INPUT_REMAPPING_OPTIONS: return xmb->textures.list[XMB_TEXTURE_INPUT_REMAPPING_OPTIONS]; From 82db21ed0bfe33b041e197a92db463ae5046517c Mon Sep 17 00:00:00 2001 From: orbea Date: Sat, 25 Nov 2017 09:41:19 -0800 Subject: [PATCH 117/183] qb: Fix undefined references to EGL without pkg-config. --- qb/config.libs.sh | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/qb/config.libs.sh b/qb/config.libs.sh index f456f6445e..e438351d8b 100644 --- a/qb/config.libs.sh +++ b/qb/config.libs.sh @@ -121,7 +121,10 @@ if [ "$HAVE_EGL" != "no" ] && [ "$OS" != 'Win32' ]; then # some systems have EGL libs, but no pkgconfig if [ "$HAVE_EGL" = "no" ]; then HAVE_EGL=auto; check_lib '' EGL "-l${VC_PREFIX}EGL $EXTRA_GL_LIBS" - [ "$HAVE_EGL" = "yes" ] && EGL_LIBS=-l"$VC_PREFIX"EGL + if [ "$HAVE_EGL" = "yes" ]; then + EGL_LIBS="-l${VC_PREFIX}EGL $EXTRA_GL_LIBS" + PKG_CONF_USED="$PKG_CONF_USED EGL" + fi else EGL_LIBS="$EGL_LIBS $EXTRA_GL_LIBS" fi @@ -402,7 +405,14 @@ check_pkgconf V4L2 libv4l2 check_pkgconf FREETYPE freetype2 check_pkgconf X11 x11 check_pkgconf XCB xcb -[ "$HAVE_X11" = "no" ] && HAVE_XEXT=no && HAVE_XF86VM=no && HAVE_XINERAMA=no && HAVE_XSHM=no + +if [ "$HAVE_X11" = "no" ] && [ "$OS" != 'Darwin' ]; then + HAVE_X11=auto; check_lib '' X11 -lX11 + if [ "$HAVE_X11" = "yes" ]; then + X11_LIBS="-lX11" + PKG_CONF_USED="$PKG_CONF_USED X11" + fi +fi check_pkgconf WAYLAND wayland-egl check_pkgconf WAYLAND_CURSOR wayland-cursor @@ -411,6 +421,27 @@ check_pkgconf XKBCOMMON xkbcommon 0.3.2 check_pkgconf DBUS dbus-1 check_pkgconf XEXT xext check_pkgconf XF86VM xxf86vm + +if [ "$HAVE_X11" != "no" ]; then + if [ "$HAVE_XEXT" = "no" ]; then + HAVE_XEXT=auto; check_lib '' XEXT -lXext + if [ "$HAVE_XEXT" = "yes" ]; then + XEXT_LIBS="-lXext" + PKG_CONF_USED="$PKG_CONF_USED XEXT" + fi + fi + + if [ "$HAVE_XF86VM" = "no" ]; then + HAVE_XF86VM=auto; check_lib '' XF86VM -lXxf86vm + if [ "$HAVE_XF86VM" = "yes" ]; then + XF86VM_LIBS="-lXxf86vm" + PKG_CONF_USED="$PKG_CONF_USED XF86VM" + fi + fi +else + HAVE_XEXT=no; HAVE_XF86VM=no; HAVE_XINERAMA=no; HAVE_XSHM=no +fi + check_pkgconf XINERAMA xinerama if [ "$HAVE_X11" = 'yes' ] && [ "$HAVE_XEXT" = 'yes' ] && [ "$HAVE_XF86VM" = 'yes' ]; then check_pkgconf XVIDEO xv From 3fa035ba2a64a9567edcd4a6280aad4f374666d9 Mon Sep 17 00:00:00 2001 From: Alcaro Date: Sat, 25 Nov 2017 20:25:37 +0100 Subject: [PATCH 118/183] This include doesn't go here --- file_path_special.c | 4 ++++ libretro-common/file/file_path.c | 4 ---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/file_path_special.c b/file_path_special.c index b6ac69470e..9113f27dc6 100644 --- a/file_path_special.c +++ b/file_path_special.c @@ -28,6 +28,10 @@ #include #endif +#ifdef __HAIKU__ +#include +#endif + #include #include #include diff --git a/libretro-common/file/file_path.c b/libretro-common/file/file_path.c index 8acd372e08..1643b0d6cb 100644 --- a/libretro-common/file/file_path.c +++ b/libretro-common/file/file_path.c @@ -72,10 +72,6 @@ #include #endif -#ifdef __HAIKU__ -#include -#endif - #if defined(__CELLOS_LV2__) #include #endif From 1d9d6d2f40365f4adbe406f43ed9983dca049656 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 25 Nov 2017 21:18:25 +0100 Subject: [PATCH 119/183] Refactoring some identical code --- menu/cbs/menu_cbs_ok.c | 63 +++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 38 deletions(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 9677500317..c41ce08133 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -1443,6 +1443,29 @@ static int action_ok_file_load(const char *path, return 0; } +static void generic_playlist_write(size_t idx, + const char *path) +{ + char core_display_name[PATH_MAX_LENGTH]; + playlist_t *playlist = NULL; + + menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &playlist); + + retro_assert(playlist != NULL); + + core_display_name[0] = '\0'; + + core_info_get_name(path, core_display_name, sizeof(core_display_name)); + + playlist_update(playlist, idx, + NULL, NULL, + path, core_display_name, + NULL, + NULL); + + playlist_write_file(playlist); +} + static int action_ok_playlist_entry_collection(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { @@ -2317,27 +2340,9 @@ static int action_ok_path_scan_directory(const char *path, static int action_ok_core_deferred_set(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { - char core_display_name[PATH_MAX_LENGTH]; - playlist_t *playlist = NULL; size_t selection = menu_navigation_get_selection(); - core_display_name[0] = '\0'; - - menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &playlist); - - retro_assert(playlist != NULL); - - core_info_get_name(path, core_display_name, sizeof(core_display_name)); - - idx = rdb_entry_start_game_selection_ptr; - - playlist_update(playlist, idx, - NULL, NULL, - path, core_display_name, - NULL, - NULL); - - playlist_write_file(playlist); + generic_playlist_write(rdb_entry_start_game_selection_ptr, path); menu_entries_pop_stack(&selection, 0, 1); menu_navigation_set_selection(selection); @@ -2348,27 +2353,9 @@ static int action_ok_core_deferred_set(const char *path, static int action_ok_core_deferred_set_current_core(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { - char core_display_name[PATH_MAX_LENGTH]; - playlist_t *playlist = NULL; size_t selection = menu_navigation_get_selection(); - core_display_name[0] = '\0'; - - menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &playlist); - - retro_assert(playlist != NULL); - - core_info_get_name(path, core_display_name, sizeof(core_display_name)); - - idx = rdb_entry_start_game_selection_ptr; - - playlist_update(playlist, idx, - NULL, NULL, - path, core_display_name, - NULL, - NULL); - - playlist_write_file(playlist); + generic_playlist_write(rdb_entry_start_game_selection_ptr, path); menu_entries_pop_stack(&selection, 0, 1); menu_navigation_set_selection(selection); From bc4d14149afe015b0b464b43462b60ad9441e473 Mon Sep 17 00:00:00 2001 From: orbea Date: Sat, 25 Nov 2017 12:19:22 -0800 Subject: [PATCH 120/183] qb: Clean up empty defines in config.mk --- qb/qb.libs.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/qb/qb.libs.sh b/qb/qb.libs.sh index b641ec561a..994d2c31ba 100644 --- a/qb/qb.libs.sh +++ b/qb/qb.libs.sh @@ -93,12 +93,13 @@ check_pkgconf() #$1 = HAVE_$1 $2 = package $3 = version $4 = critical error mess eval HAVE_$1="$answer"; echo "$ECHOBUF ... $version" - PKG_CONF_USED="$PKG_CONF_USED $1" - [ "$answer" = 'no' ] && { + if [ "$answer" = 'no' ]; then [ "$4" ] && die 1 "$4" [ "$tmpval" = 'yes' ] && \ die 1 "Forced to build with package $2, but cannot locate. Exiting ..." - } + else + PKG_CONF_USED="$PKG_CONF_USED $1" + fi } check_header() #$1 = HAVE_$1 $2..$5 = header files From 086ff6e60a5852da2f41db7b638d863c3a2af733 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 25 Nov 2017 21:35:00 +0100 Subject: [PATCH 121/183] More refactoring --- menu/cbs/menu_cbs_ok.c | 56 ++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 30 deletions(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index c41ce08133..0374127c1f 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -1444,22 +1444,23 @@ static int action_ok_file_load(const char *path, } static void generic_playlist_write(size_t idx, + const char *core_display_name, + const char *label, const char *path) { - char core_display_name[PATH_MAX_LENGTH]; playlist_t *playlist = NULL; menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &playlist); retro_assert(playlist != NULL); - core_display_name[0] = '\0'; - - core_info_get_name(path, core_display_name, sizeof(core_display_name)); - - playlist_update(playlist, idx, - NULL, NULL, - path, core_display_name, + playlist_update( + playlist, + idx, + label, + NULL, + path, + core_display_name, NULL, NULL); @@ -1608,7 +1609,6 @@ static int action_ok_playlist_entry(const char *path, const char *entry_label = NULL; const char *core_path = NULL; const char *core_name = NULL; - playlist_t *tmp_playlist = NULL; menu_handle_t *menu = NULL; content_info.argc = 0; @@ -1629,6 +1629,7 @@ static int action_ok_playlist_entry(const char *path, { core_info_ctx_find_t core_info; char new_core_path[PATH_MAX_LENGTH]; + playlist_t *tmp_playlist = NULL; char *new_display_name = NULL; const char *entry_path = NULL; const char *path_base = @@ -1954,25 +1955,10 @@ static void menu_input_st_string_cb_rename_entry(void *userdata, const char *label = menu_input_dialog_get_buffer(); if (!string_is_empty(label)) - { - playlist_t *tmp_playlist = NULL; - size_t new_selection_ptr = menu_input_dialog_get_kb_idx(); - - menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &tmp_playlist); - - if (tmp_playlist) - { - playlist_update(tmp_playlist, - new_selection_ptr, - NULL, - label, - NULL, - NULL, - NULL, - NULL); - playlist_write_file(tmp_playlist); - } - } + generic_playlist_write(menu_input_dialog_get_kb_idx(), + NULL, + label, + NULL); } menu_input_dialog_end(); @@ -2340,9 +2326,14 @@ static int action_ok_path_scan_directory(const char *path, static int action_ok_core_deferred_set(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { + char core_display_name[PATH_MAX_LENGTH]; size_t selection = menu_navigation_get_selection(); - generic_playlist_write(rdb_entry_start_game_selection_ptr, path); + core_display_name[0] = '\0'; + + core_info_get_name(path, core_display_name, sizeof(core_display_name)); + generic_playlist_write(rdb_entry_start_game_selection_ptr, + core_display_name, NULL, path); menu_entries_pop_stack(&selection, 0, 1); menu_navigation_set_selection(selection); @@ -2353,9 +2344,14 @@ static int action_ok_core_deferred_set(const char *path, static int action_ok_core_deferred_set_current_core(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { + char core_display_name[PATH_MAX_LENGTH]; size_t selection = menu_navigation_get_selection(); - generic_playlist_write(rdb_entry_start_game_selection_ptr, path); + core_display_name[0] = '\0'; + + core_info_get_name(path, core_display_name, sizeof(core_display_name)); + generic_playlist_write(rdb_entry_start_game_selection_ptr, + core_display_name, NULL, path); menu_entries_pop_stack(&selection, 0, 1); menu_navigation_set_selection(selection); From 7f3738d3cda7bbf556aec824d7799bea576be3d8 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 25 Nov 2017 21:40:29 +0100 Subject: [PATCH 122/183] More refactoring --- menu/cbs/menu_cbs_ok.c | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 0374127c1f..c81010012e 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -1443,7 +1443,7 @@ static int action_ok_file_load(const char *path, return 0; } -static void generic_playlist_write(size_t idx, +static void generic_playlist_update_write(size_t idx, const char *core_display_name, const char *label, const char *path) @@ -1629,7 +1629,6 @@ static int action_ok_playlist_entry(const char *path, { core_info_ctx_find_t core_info; char new_core_path[PATH_MAX_LENGTH]; - playlist_t *tmp_playlist = NULL; char *new_display_name = NULL; const char *entry_path = NULL; const char *path_base = @@ -1654,21 +1653,14 @@ static int action_ok_playlist_entry(const char *path, return action_ok_file_load_with_detect_core(entry_path, label, type, selection_ptr, entry_idx); - menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &tmp_playlist); - new_display_name = strdup(core_info.inf->display_name); - playlist_update(tmp_playlist, - selection_ptr, - NULL, - NULL, - new_core_path, + generic_playlist_update_write(selection_ptr, new_display_name, NULL, - NULL); + new_core_path); free(new_display_name); - playlist_write_file(tmp_playlist); } playlist_info.data = playlist; @@ -1854,7 +1846,8 @@ static int action_ok_audio_add_to_mixer_and_collection(const char *path, fill_pathname_join(combined_path, menu->scratch2_buf, menu->scratch_buf, sizeof(combined_path)); - playlist_push(g_defaults.music_history, + playlist_push( + g_defaults.music_history, combined_path, NULL, "builtin", @@ -1955,7 +1948,7 @@ static void menu_input_st_string_cb_rename_entry(void *userdata, const char *label = menu_input_dialog_get_buffer(); if (!string_is_empty(label)) - generic_playlist_write(menu_input_dialog_get_kb_idx(), + generic_playlist_update_write(menu_input_dialog_get_kb_idx(), NULL, label, NULL); @@ -2332,7 +2325,7 @@ static int action_ok_core_deferred_set(const char *path, core_display_name[0] = '\0'; core_info_get_name(path, core_display_name, sizeof(core_display_name)); - generic_playlist_write(rdb_entry_start_game_selection_ptr, + generic_playlist_update_write(rdb_entry_start_game_selection_ptr, core_display_name, NULL, path); menu_entries_pop_stack(&selection, 0, 1); @@ -2350,7 +2343,7 @@ static int action_ok_core_deferred_set_current_core(const char *path, core_display_name[0] = '\0'; core_info_get_name(path, core_display_name, sizeof(core_display_name)); - generic_playlist_write(rdb_entry_start_game_selection_ptr, + generic_playlist_update_write(rdb_entry_start_game_selection_ptr, core_display_name, NULL, path); menu_entries_pop_stack(&selection, 0, 1); From c992d92c993780d0fc859e7aa7439b1f67ab821a Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 25 Nov 2017 21:45:28 +0100 Subject: [PATCH 123/183] Updates --- menu/cbs/menu_cbs_ok.c | 40 ++++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index c81010012e..5c52048432 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -1443,14 +1443,19 @@ static int action_ok_file_load(const char *path, return 0; } -static void generic_playlist_update_write(size_t idx, +static void generic_playlist_update_write( + playlist_t *plist, + size_t idx, const char *core_display_name, const char *label, const char *path) { playlist_t *playlist = NULL; - menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &playlist); + if (plist) + playlist = plist; + else + menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &playlist); retro_assert(playlist != NULL); @@ -1561,15 +1566,12 @@ static int action_ok_playlist_entry_collection(const char *path, strlcpy(new_display_name, core_info.inf->display_name, sizeof(new_display_name)); - playlist_update(tmp_playlist, + + generic_playlist_update_write(tmp_playlist, selection_ptr, - NULL, - NULL, - new_core_path, new_display_name, NULL, - NULL); - playlist_write_file(tmp_playlist); + new_core_path); } else { @@ -1655,7 +1657,8 @@ static int action_ok_playlist_entry(const char *path, new_display_name = strdup(core_info.inf->display_name); - generic_playlist_update_write(selection_ptr, + generic_playlist_update_write(NULL, + selection_ptr, new_display_name, NULL, new_core_path); @@ -1766,15 +1769,13 @@ static int action_ok_playlist_entry_start_content(const char *path, strlcpy(new_display_name, core_info.inf->display_name, sizeof(new_display_name)); - playlist_update(tmp_playlist, + + generic_playlist_update_write( + tmp_playlist, selection_ptr, - NULL, - NULL, - new_core_path, new_display_name, NULL, - NULL); - playlist_write_file(tmp_playlist); + new_core_path); } playlist_info.data = playlist; @@ -1948,7 +1949,8 @@ static void menu_input_st_string_cb_rename_entry(void *userdata, const char *label = menu_input_dialog_get_buffer(); if (!string_is_empty(label)) - generic_playlist_update_write(menu_input_dialog_get_kb_idx(), + generic_playlist_update_write(NULL, + menu_input_dialog_get_kb_idx(), NULL, label, NULL); @@ -2325,7 +2327,8 @@ static int action_ok_core_deferred_set(const char *path, core_display_name[0] = '\0'; core_info_get_name(path, core_display_name, sizeof(core_display_name)); - generic_playlist_update_write(rdb_entry_start_game_selection_ptr, + generic_playlist_update_write(NULL, + rdb_entry_start_game_selection_ptr, core_display_name, NULL, path); menu_entries_pop_stack(&selection, 0, 1); @@ -2343,7 +2346,8 @@ static int action_ok_core_deferred_set_current_core(const char *path, core_display_name[0] = '\0'; core_info_get_name(path, core_display_name, sizeof(core_display_name)); - generic_playlist_update_write(rdb_entry_start_game_selection_ptr, + generic_playlist_update_write(NULL, + rdb_entry_start_game_selection_ptr, core_display_name, NULL, path); menu_entries_pop_stack(&selection, 0, 1); From aa14dca1b91fdf0bed1713eaf6d980eca2a68bad Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 25 Nov 2017 21:51:32 +0100 Subject: [PATCH 124/183] Cleanups --- menu/cbs/menu_cbs_ok.c | 44 ++++++++++-------------------------------- 1 file changed, 10 insertions(+), 34 deletions(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 5c52048432..355025d496 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -1444,7 +1444,6 @@ static int action_ok_file_load(const char *path, } static void generic_playlist_update_write( - playlist_t *plist, size_t idx, const char *core_display_name, const char *label, @@ -1452,10 +1451,7 @@ static void generic_playlist_update_write( { playlist_t *playlist = NULL; - if (plist) - playlist = plist; - else - menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &playlist); + menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &playlist); retro_assert(playlist != NULL); @@ -1535,7 +1531,6 @@ static int action_ok_playlist_entry_collection(const char *path, && string_is_equal(core_name, file_path_str(FILE_PATH_DETECT))) { core_info_ctx_find_t core_info; - char new_display_name[PATH_MAX_LENGTH]; const char *entry_path = NULL; const char *path_base = path_basename(menu->db_playlist_file); @@ -1543,8 +1538,6 @@ static int action_ok_playlist_entry_collection(const char *path, menu_content_playlist_find_associated_core( path_base, new_core_path, sizeof(new_core_path)); - new_display_name[0] = '\0'; - core_info.inf = NULL; core_info.path = new_core_path; @@ -1562,14 +1555,9 @@ static int action_ok_playlist_entry_collection(const char *path, return ret; } - menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &tmp_playlist); - - strlcpy(new_display_name, - core_info.inf->display_name, sizeof(new_display_name)); - - generic_playlist_update_write(tmp_playlist, + generic_playlist_update_write( selection_ptr, - new_display_name, + core_info.inf->display_name, NULL, new_core_path); } @@ -1631,7 +1619,6 @@ static int action_ok_playlist_entry(const char *path, { core_info_ctx_find_t core_info; char new_core_path[PATH_MAX_LENGTH]; - char *new_display_name = NULL; const char *entry_path = NULL; const char *path_base = path_basename(menu->db_playlist_file); @@ -1655,15 +1642,11 @@ static int action_ok_playlist_entry(const char *path, return action_ok_file_load_with_detect_core(entry_path, label, type, selection_ptr, entry_idx); - new_display_name = strdup(core_info.inf->display_name); - - generic_playlist_update_write(NULL, + generic_playlist_update_write( selection_ptr, - new_display_name, + core_info.inf->display_name, NULL, new_core_path); - - free(new_display_name); } playlist_info.data = playlist; @@ -1736,13 +1719,12 @@ static int action_ok_playlist_entry_start_content(const char *path, { core_info_ctx_find_t core_info; char new_core_path[PATH_MAX_LENGTH]; - char new_display_name[PATH_MAX_LENGTH]; const char *entry_path = NULL; const char *path_base = path_basename(menu->db_playlist_file); bool found_associated_core = false; - new_core_path[0] = new_display_name[0] = '\0'; + new_core_path[0] = '\0'; found_associated_core = menu_content_playlist_find_associated_core( @@ -1765,15 +1747,9 @@ static int action_ok_playlist_entry_start_content(const char *path, return ret; } - menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &tmp_playlist); - - strlcpy(new_display_name, - core_info.inf->display_name, sizeof(new_display_name)); - generic_playlist_update_write( - tmp_playlist, selection_ptr, - new_display_name, + core_info.inf->display_name, NULL, new_core_path); } @@ -1949,7 +1925,7 @@ static void menu_input_st_string_cb_rename_entry(void *userdata, const char *label = menu_input_dialog_get_buffer(); if (!string_is_empty(label)) - generic_playlist_update_write(NULL, + generic_playlist_update_write( menu_input_dialog_get_kb_idx(), NULL, label, @@ -2327,7 +2303,7 @@ static int action_ok_core_deferred_set(const char *path, core_display_name[0] = '\0'; core_info_get_name(path, core_display_name, sizeof(core_display_name)); - generic_playlist_update_write(NULL, + generic_playlist_update_write( rdb_entry_start_game_selection_ptr, core_display_name, NULL, path); @@ -2346,7 +2322,7 @@ static int action_ok_core_deferred_set_current_core(const char *path, core_display_name[0] = '\0'; core_info_get_name(path, core_display_name, sizeof(core_display_name)); - generic_playlist_update_write(NULL, + generic_playlist_update_write( rdb_entry_start_game_selection_ptr, core_display_name, NULL, path); From ee26a2f2aff4cbfc1db37caebc63aa072a546f1b Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 25 Nov 2017 21:52:30 +0100 Subject: [PATCH 125/183] Restore this --- menu/cbs/menu_cbs_ok.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 355025d496..f078fc3a0f 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -1444,6 +1444,7 @@ static int action_ok_file_load(const char *path, } static void generic_playlist_update_write( + playlist_t *plist, size_t idx, const char *core_display_name, const char *label, @@ -1451,7 +1452,10 @@ static void generic_playlist_update_write( { playlist_t *playlist = NULL; - menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &playlist); + if (plist) + playlist = plist; + else + menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &playlist); retro_assert(playlist != NULL); @@ -1555,7 +1559,9 @@ static int action_ok_playlist_entry_collection(const char *path, return ret; } - generic_playlist_update_write( + menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &tmp_playlist); + + generic_playlist_update_write(tmp_playlist, selection_ptr, core_info.inf->display_name, NULL, @@ -1642,7 +1648,7 @@ static int action_ok_playlist_entry(const char *path, return action_ok_file_load_with_detect_core(entry_path, label, type, selection_ptr, entry_idx); - generic_playlist_update_write( + generic_playlist_update_write(NULL, selection_ptr, core_info.inf->display_name, NULL, @@ -1747,7 +1753,10 @@ static int action_ok_playlist_entry_start_content(const char *path, return ret; } + menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &tmp_playlist); + generic_playlist_update_write( + tmp_playlist, selection_ptr, core_info.inf->display_name, NULL, @@ -1925,7 +1934,7 @@ static void menu_input_st_string_cb_rename_entry(void *userdata, const char *label = menu_input_dialog_get_buffer(); if (!string_is_empty(label)) - generic_playlist_update_write( + generic_playlist_update_write(NULL, menu_input_dialog_get_kb_idx(), NULL, label, @@ -2303,7 +2312,7 @@ static int action_ok_core_deferred_set(const char *path, core_display_name[0] = '\0'; core_info_get_name(path, core_display_name, sizeof(core_display_name)); - generic_playlist_update_write( + generic_playlist_update_write(NULL, rdb_entry_start_game_selection_ptr, core_display_name, NULL, path); @@ -2322,7 +2331,7 @@ static int action_ok_core_deferred_set_current_core(const char *path, core_display_name[0] = '\0'; core_info_get_name(path, core_display_name, sizeof(core_display_name)); - generic_playlist_update_write( + generic_playlist_update_write(NULL, rdb_entry_start_game_selection_ptr, core_display_name, NULL, path); From a2f721a6237acccee414242b6232755e13cbe5ae Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 25 Nov 2017 21:54:30 +0100 Subject: [PATCH 126/183] Cleanups --- menu/cbs/menu_cbs_ok.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index f078fc3a0f..8846e6c7bb 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -1568,16 +1568,16 @@ static int action_ok_playlist_entry_collection(const char *path, new_core_path); } else - { strlcpy(new_core_path, core_path, sizeof(new_core_path)); - } playlist_info.data = playlist; playlist_info.idx = (unsigned)selection_ptr; if (!menu_content_playlist_load(&playlist_info)) { - runloop_msg_queue_push("File could not be loaded from playlist.\n", 1, 100, true); + runloop_msg_queue_push( + "File could not be loaded from playlist.\n", + 1, 100, true); return menu_cbs_exit(); } From bf8cfe4123f09dd409b7d5ac2fc839ed9b6a54b6 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 25 Nov 2017 22:00:56 +0100 Subject: [PATCH 127/183] Add HAVE_MENU ifdef --- menu/cbs/menu_cbs_ok.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 8846e6c7bb..5355cbd000 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -1454,8 +1454,10 @@ static void generic_playlist_update_write( if (plist) playlist = plist; +#ifdef HAVE_MENU else menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &playlist); +#endif retro_assert(playlist != NULL); From ca616f3e3229a8ddf6fb68a0298bc42ab2be95eb Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 25 Nov 2017 22:33:43 +0100 Subject: [PATCH 128/183] Cleanup --- tasks/task_screenshot.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tasks/task_screenshot.c b/tasks/task_screenshot.c index e9f071c5b2..7646ec2343 100644 --- a/tasks/task_screenshot.c +++ b/tasks/task_screenshot.c @@ -158,12 +158,13 @@ static void task_screenshot_handler(retro_task_t *task) #endif #ifdef HAVE_IMAGEVIEWER - if (ret && !state->silence) + if ( ret && + !state->silence && + state->history_list_enable && + g_defaults.image_history + ) { - if ( - state->history_list_enable - && g_defaults.image_history - && playlist_push( + if (playlist_push( g_defaults.image_history, state->filename, NULL, @@ -171,8 +172,7 @@ static void task_screenshot_handler(retro_task_t *task) "imageviewer", NULL, NULL - ) - ) + )) playlist_write_file(g_defaults.image_history); } #endif From e0eb2b8a31acd66f13e9cb43f837248e4ddea694 Mon Sep 17 00:00:00 2001 From: orbea Date: Sat, 25 Nov 2017 13:12:31 -0800 Subject: [PATCH 129/183] qb: Add $PKG_CONF_USED to the check_lib function to help avoid undefined referenecs. --- qb/config.libs.sh | 8 -------- qb/qb.libs.sh | 11 ++++++----- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/qb/config.libs.sh b/qb/config.libs.sh index e438351d8b..70a9b864ea 100644 --- a/qb/config.libs.sh +++ b/qb/config.libs.sh @@ -123,7 +123,6 @@ if [ "$HAVE_EGL" != "no" ] && [ "$OS" != 'Win32' ]; then HAVE_EGL=auto; check_lib '' EGL "-l${VC_PREFIX}EGL $EXTRA_GL_LIBS" if [ "$HAVE_EGL" = "yes" ]; then EGL_LIBS="-l${VC_PREFIX}EGL $EXTRA_GL_LIBS" - PKG_CONF_USED="$PKG_CONF_USED EGL" fi else EGL_LIBS="$EGL_LIBS $EXTRA_GL_LIBS" @@ -316,9 +315,6 @@ if [ "$HAVE_OPENGL" != 'no' ] && [ "$HAVE_OPENGLES" != 'yes' ]; then [ "$HAVE_CG" = 'yes' ] && CG_LIBS='-lCg -lCgGL' fi - # fix undefined variables - PKG_CONF_USED="$PKG_CONF_USED CG" - check_pkgconf OSMESA osmesa else die : 'Notice: Ignoring Cg. Desktop OpenGL is not enabled.' @@ -410,7 +406,6 @@ if [ "$HAVE_X11" = "no" ] && [ "$OS" != 'Darwin' ]; then HAVE_X11=auto; check_lib '' X11 -lX11 if [ "$HAVE_X11" = "yes" ]; then X11_LIBS="-lX11" - PKG_CONF_USED="$PKG_CONF_USED X11" fi fi @@ -427,7 +422,6 @@ if [ "$HAVE_X11" != "no" ]; then HAVE_XEXT=auto; check_lib '' XEXT -lXext if [ "$HAVE_XEXT" = "yes" ]; then XEXT_LIBS="-lXext" - PKG_CONF_USED="$PKG_CONF_USED XEXT" fi fi @@ -435,7 +429,6 @@ if [ "$HAVE_X11" != "no" ]; then HAVE_XF86VM=auto; check_lib '' XF86VM -lXxf86vm if [ "$HAVE_XF86VM" = "yes" ]; then XF86VM_LIBS="-lXxf86vm" - PKG_CONF_USED="$PKG_CONF_USED XF86VM" fi fi else @@ -457,7 +450,6 @@ if [ "$HAVE_UDEV" != "no" ]; then HAVE_UDEV=auto; check_lib '' UDEV "-ludev" if [ "$HAVE_UDEV" = "yes" ]; then UDEV_LIBS='-ludev' - PKG_CONF_USED="$PKG_CONF_USED UDEV" fi fi fi diff --git a/qb/qb.libs.sh b/qb/qb.libs.sh index 994d2c31ba..5f96629486 100644 --- a/qb/qb.libs.sh +++ b/qb/qb.libs.sh @@ -58,13 +58,14 @@ check_lib() # $1 = language $2 = HAVE_$2 $3 = lib $4 = function in lib $5 = printf %s\\n "$ECHOBUF ... $answer" rm -f -- "$TEMP_CODE" "$TEMP_EXE" - [ "$answer" = 'no' ] && { + if [ "$answer" = 'no' ]; then [ "$7" ] && die 1 "$7" [ "$tmpval" = 'yes' ] && { die 1 "Forced to build with library $3, but cannot locate. Exiting ..." } - - } + else + PKG_CONF_USED="$PKG_CONF_USED $2" + fi return 0 } @@ -219,8 +220,8 @@ create_config_make() *$1*) FLAGS="$(eval "printf %s \"\$$1_CFLAGS\"")" LIBS="$(eval "printf %s \"\$$1_LIBS\"")" - printf %s\\n "$1_CFLAGS = ${FLAGS%"${FLAGS##*[! ]}"}" \ - "$1_LIBS = ${LIBS%"${LIBS##*[! ]}"}" + [ "${FLAGS}" ] && printf %s\\n "$1_CFLAGS = ${FLAGS%"${FLAGS##*[! ]}"}" + [ "${LIBS}" ] && printf %s\\n "$1_LIBS = ${LIBS%"${LIBS##*[! ]}"}" ;; esac shift From b604a1871a1b6868640ae68a5cc71a55933968d8 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 25 Nov 2017 22:54:42 +0100 Subject: [PATCH 130/183] Create command_playlist_update_write_file and move it to command.c --- command.c | 32 ++++++++++++++++++++++++++++++++ command.h | 7 +++++++ menu/cbs/menu_cbs_ok.c | 42 ++++++------------------------------------ 3 files changed, 45 insertions(+), 36 deletions(-) diff --git a/command.c b/command.c index ef15a962cb..18e49c0084 100644 --- a/command.c +++ b/command.c @@ -1702,6 +1702,38 @@ static bool command_event_resize_windowed_scale(void) return true; } +void command_playlist_update_write( + void *data, + size_t idx, + const char *core_display_name, + const char *label, + const char *path) +{ + playlist_t *plist = (playlist_t*)data; + playlist_t *playlist = NULL; + + if (plist) + playlist = plist; +#ifdef HAVE_MENU + else + menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &playlist); +#endif + if (!playlist) + return; + + playlist_update( + playlist, + idx, + label, + NULL, + path, + core_display_name, + NULL, + NULL); + + playlist_write_file(playlist); +} + /** * command_event: * @cmd : Event command index. diff --git a/command.h b/command.h index 33c408638f..b0305d3526 100644 --- a/command.h +++ b/command.h @@ -259,6 +259,13 @@ bool command_free(command_t *handle); **/ bool command_event(enum event_command action, void *data); +void command_playlist_update_write( + void *data, + size_t idx, + const char *core_display_name, + const char *label, + const char *path); + RETRO_END_DECLS #endif diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 5355cbd000..66c9b2d977 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -1443,36 +1443,6 @@ static int action_ok_file_load(const char *path, return 0; } -static void generic_playlist_update_write( - playlist_t *plist, - size_t idx, - const char *core_display_name, - const char *label, - const char *path) -{ - playlist_t *playlist = NULL; - - if (plist) - playlist = plist; -#ifdef HAVE_MENU - else - menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &playlist); -#endif - - retro_assert(playlist != NULL); - - playlist_update( - playlist, - idx, - label, - NULL, - path, - core_display_name, - NULL, - NULL); - - playlist_write_file(playlist); -} static int action_ok_playlist_entry_collection(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) @@ -1563,7 +1533,7 @@ static int action_ok_playlist_entry_collection(const char *path, menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &tmp_playlist); - generic_playlist_update_write(tmp_playlist, + command_playlist_update_write(tmp_playlist, selection_ptr, core_info.inf->display_name, NULL, @@ -1650,7 +1620,7 @@ static int action_ok_playlist_entry(const char *path, return action_ok_file_load_with_detect_core(entry_path, label, type, selection_ptr, entry_idx); - generic_playlist_update_write(NULL, + command_playlist_update_write(NULL, selection_ptr, core_info.inf->display_name, NULL, @@ -1757,7 +1727,7 @@ static int action_ok_playlist_entry_start_content(const char *path, menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &tmp_playlist); - generic_playlist_update_write( + command_playlist_update_write( tmp_playlist, selection_ptr, core_info.inf->display_name, @@ -1936,7 +1906,7 @@ static void menu_input_st_string_cb_rename_entry(void *userdata, const char *label = menu_input_dialog_get_buffer(); if (!string_is_empty(label)) - generic_playlist_update_write(NULL, + command_playlist_update_write(NULL, menu_input_dialog_get_kb_idx(), NULL, label, @@ -2314,7 +2284,7 @@ static int action_ok_core_deferred_set(const char *path, core_display_name[0] = '\0'; core_info_get_name(path, core_display_name, sizeof(core_display_name)); - generic_playlist_update_write(NULL, + command_playlist_update_write(NULL, rdb_entry_start_game_selection_ptr, core_display_name, NULL, path); @@ -2333,7 +2303,7 @@ static int action_ok_core_deferred_set_current_core(const char *path, core_display_name[0] = '\0'; core_info_get_name(path, core_display_name, sizeof(core_display_name)); - generic_playlist_update_write(NULL, + command_playlist_update_write(NULL, rdb_entry_start_game_selection_ptr, core_display_name, NULL, path); From e8b21cbafe64e921a2886433c1255d9c02acccfd Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 25 Nov 2017 22:59:47 +0100 Subject: [PATCH 131/183] Refactor code --- command.c | 38 +++++++++++++++++++++++++++++++++----- command.h | 7 +++++++ menu/cbs/menu_cbs_ok.c | 8 ++------ 3 files changed, 42 insertions(+), 11 deletions(-) diff --git a/command.c b/command.c index 18e49c0084..d40ed14906 100644 --- a/command.c +++ b/command.c @@ -1702,6 +1702,37 @@ static bool command_event_resize_windowed_scale(void) return true; } +void command_playlist_push_write( + void *data, + const char *path, + const char *label, + const char *core_path, + const char *core_name) +{ + playlist_t *plist = (playlist_t*)data; + playlist_t *playlist = NULL; + + if (plist) + playlist = plist; +#ifdef HAVE_MENU + else + menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &playlist); +#endif + if (!playlist) + return; + + playlist_push( + playlist, + path, + label, + core_path, + core_name, + NULL, + NULL + ); + playlist_write_file(playlist); +} + void command_playlist_update_write( void *data, size_t idx, @@ -2304,16 +2335,13 @@ TODO: Add a setting for these tweaks */ if (!string_is_empty(global->name.label)) label = global->name.label; - playlist_push( + command_playlist_push_write( g_defaults.content_favorites, (const char*)data, label, core_path, - core_name, - NULL, - NULL + core_name ); - playlist_write_file(g_defaults.content_favorites); runloop_msg_queue_push(msg_hash_to_str(MSG_ADDED_TO_FAVORITES), 1, 180, true); break; } diff --git a/command.h b/command.h index b0305d3526..286383fc83 100644 --- a/command.h +++ b/command.h @@ -259,6 +259,13 @@ bool command_free(command_t *handle); **/ bool command_event(enum event_command action, void *data); +void command_playlist_push_write( + void *data, + const char *path, + const char *label, + const char *core_path, + const char *core_name); + void command_playlist_update_write( void *data, size_t idx, diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 66c9b2d977..af7c5dda31 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -1804,16 +1804,12 @@ static int action_ok_audio_add_to_mixer_and_collection(const char *path, fill_pathname_join(combined_path, menu->scratch2_buf, menu->scratch_buf, sizeof(combined_path)); - playlist_push( + command_playlist_push_write( g_defaults.music_history, combined_path, NULL, "builtin", - "musicplayer", - NULL, - NULL); - - playlist_write_file(g_defaults.music_history); + "musicplayer"); if(path_file_exists(combined_path)) task_push_audio_mixer_load(combined_path, From 8cc2e9bade24963e58c7bf0a8bd938846a71abfe Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 25 Nov 2017 23:06:25 +0100 Subject: [PATCH 132/183] Cleanups --- command.c | 15 ++++----------- tasks/task_content.c | 12 ++++-------- tasks/task_screenshot.c | 19 +++++++------------ 3 files changed, 15 insertions(+), 31 deletions(-) diff --git a/command.c b/command.c index d40ed14906..ac088b7fdb 100644 --- a/command.c +++ b/command.c @@ -1709,19 +1709,12 @@ void command_playlist_push_write( const char *core_path, const char *core_name) { - playlist_t *plist = (playlist_t*)data; - playlist_t *playlist = NULL; + playlist_t *playlist = (playlist_t*)data; - if (plist) - playlist = plist; -#ifdef HAVE_MENU - else - menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &playlist); -#endif if (!playlist) return; - playlist_push( + if (playlist_push( playlist, path, label, @@ -1729,8 +1722,8 @@ void command_playlist_push_write( core_name, NULL, NULL - ); - playlist_write_file(playlist); + )) + playlist_write_file(playlist); } void command_playlist_update_write( diff --git a/tasks/task_content.c b/tasks/task_content.c index d82d912e34..4c88634f49 100644 --- a/tasks/task_content.c +++ b/tasks/task_content.c @@ -961,18 +961,14 @@ static bool task_load_content(content_ctx_info_t *content_info, label = global->name.label; if ( - content_ctx->history_list_enable - && playlist_tmp - && playlist_push( + content_ctx->history_list_enable + && playlist_tmp) + command_playlist_push_write( playlist_tmp, tmp, label, core_path, - core_name, - NULL, - NULL) - ) - playlist_write_file(playlist_tmp); + core_name); } free(tmp); diff --git a/tasks/task_screenshot.c b/tasks/task_screenshot.c index 7646ec2343..12f0885463 100644 --- a/tasks/task_screenshot.c +++ b/tasks/task_screenshot.c @@ -49,6 +49,7 @@ #endif #include "../defaults.h" +#include "../command.h" #include "../configuration.h" #include "../retroarch.h" #include "../paths.h" @@ -163,18 +164,12 @@ static void task_screenshot_handler(retro_task_t *task) state->history_list_enable && g_defaults.image_history ) - { - if (playlist_push( - g_defaults.image_history, - state->filename, - NULL, - "builtin", - "imageviewer", - NULL, - NULL - )) - playlist_write_file(g_defaults.image_history); - } + command_playlist_push_write( + g_defaults.image_history, + state->filename, + NULL, + "builtin", + "imageviewer"); #endif task_set_progress(task, 100); From b4ac3e7b2f52b0327195f2272c0723016c749b9e Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 25 Nov 2017 23:06:56 +0100 Subject: [PATCH 133/183] Cleanups --- tasks/task_screenshot.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tasks/task_screenshot.c b/tasks/task_screenshot.c index 12f0885463..dee2926136 100644 --- a/tasks/task_screenshot.c +++ b/tasks/task_screenshot.c @@ -161,8 +161,7 @@ static void task_screenshot_handler(retro_task_t *task) #ifdef HAVE_IMAGEVIEWER if ( ret && !state->silence && - state->history_list_enable && - g_defaults.image_history + state->history_list_enable ) command_playlist_push_write( g_defaults.image_history, From df7513be27a612a82c5fc2fd1b4781665e343f9c Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 25 Nov 2017 23:39:31 +0100 Subject: [PATCH 134/183] Cleanups --- menu/cbs/menu_cbs_ok.c | 6 +++++- playlist.c | 10 +++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index af7c5dda31..157710ec01 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -3229,7 +3229,11 @@ static int action_ok_delete_entry(const char *path, playlist = g_defaults.image_history; #endif - playlist_delete_index(playlist, rpl_entry_selection_ptr); + if (playlist) + { + playlist_delete_index(playlist, rpl_entry_selection_ptr); + playlist_write_file(playlist); + } new_selection_ptr = menu_navigation_get_selection(); menu_entries_pop_stack(&new_selection_ptr, 0, 1); diff --git a/playlist.c b/playlist.c index c410fbb5f2..9c840dd250 100644 --- a/playlist.c +++ b/playlist.c @@ -121,8 +121,6 @@ void playlist_delete_index(playlist_t *playlist, playlist->size = playlist->size - 1; playlist->modified = true; - - playlist_write_file(playlist); } void playlist_get_index_by_path(playlist_t *playlist, @@ -283,17 +281,19 @@ bool playlist_push(playlist_t *playlist, const char *db_name) { size_t i; + bool core_path_empty = string_is_empty(core_path); + bool core_name_empty = string_is_empty(core_name); - if (string_is_empty(core_path) || string_is_empty(core_name)) + if (core_path_empty || core_name_empty) { - if (string_is_empty(core_name) && !string_is_empty(core_path)) + if (core_name_empty && !core_path_empty) { static char base_path[255] = {0}; fill_pathname_base_noext(base_path, core_path, sizeof(base_path)); core_name = base_path; } - if (string_is_empty(core_path) || string_is_empty(core_name)) + if (core_path_empty || core_name_empty) { RARCH_ERR("cannot push NULL or empty core name into the playlist.\n"); return false; From cda840683be98e3d94b73de91d02d379c7e117d4 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 26 Nov 2017 00:02:28 +0100 Subject: [PATCH 135/183] playlist.c - some optimizations --- playlist.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/playlist.c b/playlist.c index 9c840dd250..2c22d9243d 100644 --- a/playlist.c +++ b/playlist.c @@ -381,22 +381,23 @@ void playlist_write_file(playlist_t *playlist) { size_t i; RFILE *file = NULL; + FILE *fp = NULL; if (!playlist || !playlist->modified) return; file = filestream_open(playlist->conf_path, RFILE_MODE_WRITE, -1); - RARCH_LOG("Trying to write to playlist file: %s\n", playlist->conf_path); - if (!file) { RARCH_ERR("Failed to write to playlist file: %s\n", playlist->conf_path); return; } + fp = filestream_get_fp(file); + for (i = 0; i < playlist->size; i++) - fprintf(filestream_get_fp(file), "%s\n%s\n%s\n%s\n%s\n%s\n", + fprintf(fp, "%s\n%s\n%s\n%s\n%s\n%s\n", playlist->entries[i].path ? playlist->entries[i].path : "", playlist->entries[i].label ? playlist->entries[i].label : "", playlist->entries[i].core_path, @@ -406,6 +407,9 @@ void playlist_write_file(playlist_t *playlist) ); playlist->modified = false; + + RARCH_LOG("Written to playlist file: %s\n", playlist->conf_path); + filestream_close(file); } From fc5f04a762ab745bc5760cd7ef4f7f0cefece01d Mon Sep 17 00:00:00 2001 From: orbea Date: Sat, 25 Nov 2017 15:00:01 -0800 Subject: [PATCH 136/183] qb: Define $2_LIBS in the check_lib function. --- qb/config.libs.sh | 41 ++++++++++++++--------------------------- qb/qb.libs.sh | 1 + 2 files changed, 15 insertions(+), 27 deletions(-) diff --git a/qb/config.libs.sh b/qb/config.libs.sh index 70a9b864ea..2f6069c5e5 100644 --- a/qb/config.libs.sh +++ b/qb/config.libs.sh @@ -120,10 +120,8 @@ if [ "$HAVE_EGL" != "no" ] && [ "$OS" != 'Win32' ]; then check_pkgconf EGL "$VC_PREFIX"egl # some systems have EGL libs, but no pkgconfig if [ "$HAVE_EGL" = "no" ]; then - HAVE_EGL=auto; check_lib '' EGL "-l${VC_PREFIX}EGL $EXTRA_GL_LIBS" - if [ "$HAVE_EGL" = "yes" ]; then - EGL_LIBS="-l${VC_PREFIX}EGL $EXTRA_GL_LIBS" - fi + HAVE_EGL=auto + check_lib '' EGL "-l${VC_PREFIX}EGL $EXTRA_GL_LIBS" else EGL_LIBS="$EGL_LIBS $EXTRA_GL_LIBS" fi @@ -239,7 +237,7 @@ check_header OSS_BSD soundcard.h check_lib '' OSS_LIB -lossaudio if [ "$OS" = 'Linux' ]; then - HAVE_TINYALSA=yes + HAVE_TINYALSA=yes fi if [ "$OS" = 'Darwin' ]; then @@ -304,15 +302,12 @@ if [ "$HAVE_OPENGL" != 'no' ] && [ "$HAVE_OPENGLES" != 'yes' ]; then if [ "$HAVE_OPENGL" = 'yes' ]; then if [ "$OS" = 'Darwin' ]; then - check_lib '' CG "-framework Cg" cgCreateContext - [ "$HAVE_CG" = 'yes' ] && CG_LIBS='-framework Cg' + check_lib '' CG '-framework Cg' cgCreateContext elif [ "$OS" = 'Win32' ]; then - check_lib cxx CG -lcg cgCreateContext - [ "$HAVE_CG" = 'yes' ] && CG_LIBS='-lcg -lcgGL' + check_lib cxx CG '-lcg -lcgGL' cgCreateContext else # On some distros, -lCg doesn't link against -lstdc++ it seems ... - check_lib cxx CG -lCg cgCreateContext - [ "$HAVE_CG" = 'yes' ] && CG_LIBS='-lCg -lCgGL' + check_lib cxx CG '-lCg -lCgGL' cgCreateContext fi check_pkgconf OSMESA osmesa @@ -403,10 +398,8 @@ check_pkgconf X11 x11 check_pkgconf XCB xcb if [ "$HAVE_X11" = "no" ] && [ "$OS" != 'Darwin' ]; then - HAVE_X11=auto; check_lib '' X11 -lX11 - if [ "$HAVE_X11" = "yes" ]; then - X11_LIBS="-lX11" - fi + HAVE_X11=auto + check_lib '' X11 -lX11 fi check_pkgconf WAYLAND wayland-egl @@ -419,17 +412,13 @@ check_pkgconf XF86VM xxf86vm if [ "$HAVE_X11" != "no" ]; then if [ "$HAVE_XEXT" = "no" ]; then - HAVE_XEXT=auto; check_lib '' XEXT -lXext - if [ "$HAVE_XEXT" = "yes" ]; then - XEXT_LIBS="-lXext" - fi + HAVE_XEXT=auto + check_lib '' XEXT -lXext fi if [ "$HAVE_XF86VM" = "no" ]; then - HAVE_XF86VM=auto; check_lib '' XF86VM -lXxf86vm - if [ "$HAVE_XF86VM" = "yes" ]; then - XF86VM_LIBS="-lXxf86vm" - fi + HAVE_XF86VM=auto + check_lib '' XF86VM -lXxf86vm fi else HAVE_XEXT=no; HAVE_XF86VM=no; HAVE_XINERAMA=no; HAVE_XSHM=no @@ -447,10 +436,8 @@ fi if [ "$HAVE_UDEV" != "no" ]; then check_pkgconf UDEV libudev if [ "$HAVE_UDEV" = "no" ]; then - HAVE_UDEV=auto; check_lib '' UDEV "-ludev" - if [ "$HAVE_UDEV" = "yes" ]; then - UDEV_LIBS='-ludev' - fi + HAVE_UDEV=auto + check_lib '' UDEV "-ludev" fi fi diff --git a/qb/qb.libs.sh b/qb/qb.libs.sh index 5f96629486..6bbf851414 100644 --- a/qb/qb.libs.sh +++ b/qb/qb.libs.sh @@ -64,6 +64,7 @@ check_lib() # $1 = language $2 = HAVE_$2 $3 = lib $4 = function in lib $5 = die 1 "Forced to build with library $3, but cannot locate. Exiting ..." } else + eval "${2}_LIBS=\"$3\"" PKG_CONF_USED="$PKG_CONF_USED $2" fi From 714aee7068421879505e163044784ad535c79609 Mon Sep 17 00:00:00 2001 From: orbea Date: Sat, 25 Nov 2017 15:40:08 -0800 Subject: [PATCH 137/183] Makefile.common: Use new defines from config.mk. --- Makefile.common | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Makefile.common b/Makefile.common index 54f09bb7ae..ace2a5c4a6 100644 --- a/Makefile.common +++ b/Makefile.common @@ -322,7 +322,7 @@ endif endif ifeq ($(HAVE_SSA),1) -LIBS += -lass +LIBS += $(SSA_LIBS) endif # LibretroDB @@ -601,7 +601,7 @@ ifeq ($(HAVE_AL), 1) ifeq ($(OSX),1) LIBS += -framework OpenAL else - LIBS += -lopenal + LIBS += $(AL_LIBS) endif endif @@ -812,7 +812,7 @@ ifeq ($(HAVE_THREADS), 1) audio/audio_thread_wrapper.o DEFINES += -DHAVE_THREADS ifeq ($(findstring Haiku,$(OS)),) - LIBS += -lpthread + LIBS += $(THREADS_LIBS) endif endif @@ -1066,7 +1066,7 @@ endif else DEFINES += -DHAVE_GL_SYNC OBJ += $(LIBRETRO_COMM_DIR)/glsym/glsym_gl.o - GL_LIBS := -lGL + GL_LIBS := $(OPENGL_LIBS) ifeq ($(OSX), 1) GL_LIBS := -framework OpenGL OBJ += gfx/drivers_context/cgl_ctx.o @@ -1512,7 +1512,7 @@ ifeq ($(HAVE_NETWORKING), 1) $(DEPS_DIR)/miniupnpc/minixml.o \ $(DEPS_DIR)/miniupnpc/minisoap.o else - LIBS += -lminiupnpc + LIBS += $(MINIUPNPC_LIBS) endif endif endif From 5e3eb437acd75e14030ae90e75252f6704e5802f Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 26 Nov 2017 00:57:02 +0100 Subject: [PATCH 138/183] Change RARCH_ERR invocations --- tasks/task_content.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tasks/task_content.c b/tasks/task_content.c index 4c88634f49..9877d6b375 100644 --- a/tasks/task_content.c +++ b/tasks/task_content.c @@ -1128,7 +1128,7 @@ bool task_push_start_dummy_core(content_ctx_info_t *content_info) if (error_string) { runloop_msg_queue_push(error_string, 2, 90, true); - RARCH_ERR(error_string); + RARCH_ERR("%s\n", error_string); free(error_string); } @@ -1219,7 +1219,7 @@ bool task_push_load_content_from_playlist_from_menu( if (error_string) { runloop_msg_queue_push(error_string, 2, 90, true); - RARCH_ERR(error_string); + RARCH_ERR("%s\n", error_string); free(error_string); } @@ -1321,7 +1321,7 @@ bool task_push_start_current_core(content_ctx_info_t *content_info) if (error_string) { runloop_msg_queue_push(error_string, 2, 90, true); - RARCH_ERR(error_string); + RARCH_ERR("%s\n", error_string); free(error_string); } @@ -1449,7 +1449,7 @@ bool task_push_load_content_with_new_core_from_menu( if (error_string) { runloop_msg_queue_push(error_string, 2, 90, true); - RARCH_ERR(error_string); + RARCH_ERR("%s\n", error_string); free(error_string); } @@ -1554,7 +1554,7 @@ end: if (error_string) { runloop_msg_queue_push(error_string, 2, 90, true); - RARCH_ERR(error_string); + RARCH_ERR("%s\n", error_string); free(error_string); } From 9875bbbd7dcca121e1a891cbed00b2640a094ee0 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 26 Nov 2017 01:06:48 +0100 Subject: [PATCH 139/183] Silence some Coverity warnings --- configuration.c | 3 +-- menu/widgets/menu_filebrowser.c | 11 ++++++----- network/netplay/netplay_discovery.c | 13 +++++-------- 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/configuration.c b/configuration.c index 0154dcd8cc..9d95452cdb 100644 --- a/configuration.c +++ b/configuration.c @@ -3549,8 +3549,7 @@ bool config_save_autoconf_profile(const char *path, unsigned user) config_file_free(conf); free(buf); free(autoconf_file); - if (path_new) - free(path_new); + free(path_new); return ret; error: diff --git a/menu/widgets/menu_filebrowser.c b/menu/widgets/menu_filebrowser.c index b3c0f729ba..0e5e5da57a 100644 --- a/menu/widgets/menu_filebrowser.c +++ b/menu/widgets/menu_filebrowser.c @@ -274,9 +274,10 @@ void filebrowser_parse(void *data, unsigned type_data) } end: - menu_entries_prepend(info->list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PARENT_DIRECTORY), - path, - MENU_ENUM_LABEL_PARENT_DIRECTORY, - FILE_TYPE_PARENT_DIRECTORY, 0, 0); + if (info) + menu_entries_prepend(info->list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PARENT_DIRECTORY), + path, + MENU_ENUM_LABEL_PARENT_DIRECTORY, + FILE_TYPE_PARENT_DIRECTORY, 0, 0); } diff --git a/network/netplay/netplay_discovery.c b/network/netplay/netplay_discovery.c index 1004c67bbe..6ab0591318 100644 --- a/network/netplay/netplay_discovery.c +++ b/network/netplay/netplay_discovery.c @@ -338,16 +338,13 @@ bool netplay_lan_ad_server(netplay_t *netplay) snprintf(port_str, 6, "%hu", ntohs(((struct sockaddr_in*)(&their_addr))->sin_port)); if (getaddrinfo_retro(reply_addr, port_str, &hints, &our_addr) < 0) continue; - else - { - RARCH_LOG ("[discovery] sending reply to %s \n", reply_addr); - /* And send it */ - sendto(lan_ad_server_fd, (const char*)&ad_packet_buffer, + RARCH_LOG ("[discovery] sending reply to %s \n", reply_addr); + + /* And send it */ + sendto(lan_ad_server_fd, (const char*)&ad_packet_buffer, sizeof(struct ad_packet), 0, our_addr->ai_addr, our_addr->ai_addrlen); - } - if (our_addr) - freeaddrinfo_retro(our_addr); + freeaddrinfo_retro(our_addr); } else continue; From 631f0c4a8bad22c9a2bb1ac6b36540f37c5816eb Mon Sep 17 00:00:00 2001 From: orbea Date: Sat, 25 Nov 2017 17:09:26 -0800 Subject: [PATCH 140/183] qb: Create a check_val function for the no pkg-config fallback path. --- qb/config.comp.sh | 1 - qb/config.libs.sh | 38 +++++++++----------------------------- qb/qb.libs.sh | 10 +++++++++- 3 files changed, 18 insertions(+), 31 deletions(-) diff --git a/qb/config.comp.sh b/qb/config.comp.sh index f0fcc84844..1ce76eeb14 100644 --- a/qb/config.comp.sh +++ b/qb/config.comp.sh @@ -4,4 +4,3 @@ USE_LANG_C="yes" if [ "$OS" = 'Win32' ]; then USE_LANG_CXX="yes" fi - diff --git a/qb/config.libs.sh b/qb/config.libs.sh index 2f6069c5e5..9ef47c2f83 100644 --- a/qb/config.libs.sh +++ b/qb/config.libs.sh @@ -119,10 +119,8 @@ fi if [ "$HAVE_EGL" != "no" ] && [ "$OS" != 'Win32' ]; then check_pkgconf EGL "$VC_PREFIX"egl # some systems have EGL libs, but no pkgconfig - if [ "$HAVE_EGL" = "no" ]; then - HAVE_EGL=auto - check_lib '' EGL "-l${VC_PREFIX}EGL $EXTRA_GL_LIBS" - else + check_val '' EGL "-l${VC_PREFIX}EGL $EXTRA_GL_LIBS" + if [ "$HAVE_EGL" = "yes" ]; then EGL_LIBS="$EGL_LIBS $EXTRA_GL_LIBS" fi fi @@ -319,11 +317,7 @@ fi if [ "$HAVE_ZLIB" != 'no' ]; then check_pkgconf ZLIB zlib - - if [ "$HAVE_ZLIB" = 'no' ]; then - HAVE_ZLIB='auto' - check_lib '' ZLIB '-lz' - fi + check_val '' ZLIB '-lz' fi if [ "$HAVE_THREADS" != 'no' ]; then @@ -382,10 +376,7 @@ if [ "$HAVE_EGL" = "yes" ]; then fi if [ "$HAVE_VG" != "no" ]; then check_pkgconf VG "$VC_PREFIX"vg - if [ "$HAVE_VG" = "no" ]; then - HAVE_VG=auto; check_lib '' VG "-l${VC_PREFIX}OpenVG $EXTRA_GL_LIBS" - [ "$HAVE_VG" = "yes" ] && VG_LIBS=-l"$VC_PREFIX"OpenVG - fi + check_val '' VG "-l${VC_PREFIX}OpenVG $EXTRA_GL_LIBS" fi else HAVE_VG=no @@ -397,9 +388,8 @@ check_pkgconf FREETYPE freetype2 check_pkgconf X11 x11 check_pkgconf XCB xcb -if [ "$HAVE_X11" = "no" ] && [ "$OS" != 'Darwin' ]; then - HAVE_X11=auto - check_lib '' X11 -lX11 +if [ "$OS" != 'Darwin' ]; then + check_val '' X11 -lX11 fi check_pkgconf WAYLAND wayland-egl @@ -411,15 +401,8 @@ check_pkgconf XEXT xext check_pkgconf XF86VM xxf86vm if [ "$HAVE_X11" != "no" ]; then - if [ "$HAVE_XEXT" = "no" ]; then - HAVE_XEXT=auto - check_lib '' XEXT -lXext - fi - - if [ "$HAVE_XF86VM" = "no" ]; then - HAVE_XF86VM=auto - check_lib '' XF86VM -lXxf86vm - fi + check_val '' XEXT -lXext + check_val '' XF86VM -lXxf86vm else HAVE_XEXT=no; HAVE_XF86VM=no; HAVE_XINERAMA=no; HAVE_XSHM=no fi @@ -435,10 +418,7 @@ fi if [ "$HAVE_UDEV" != "no" ]; then check_pkgconf UDEV libudev - if [ "$HAVE_UDEV" = "no" ]; then - HAVE_UDEV=auto - check_lib '' UDEV "-ludev" - fi + check_val '' UDEV "-ludev" fi check_header XSHM X11/Xlib.h X11/extensions/XShm.h diff --git a/qb/qb.libs.sh b/qb/qb.libs.sh index 6bbf851414..00411c9109 100644 --- a/qb/qb.libs.sh +++ b/qb/qb.libs.sh @@ -71,7 +71,7 @@ check_lib() # $1 = language $2 = HAVE_$2 $3 = lib $4 = function in lib $5 = return 0 } -check_pkgconf() #$1 = HAVE_$1 $2 = package $3 = version $4 = critical error message [checked only if non-empty] +check_pkgconf() # $1 = HAVE_$1 $2 = package $3 = version $4 = critical error message [checked only if non-empty] { tmpval="$(eval echo \$HAVE_$1)" [ "$tmpval" = 'no' ] && return 0 @@ -154,6 +154,14 @@ check_switch() # $1 = language $2 = HAVE_$2 $3 = switch $4 = critical error m } } +check_val() # $1 = language $2 = HAVE_$2 $3 = lib +{ tmpval="$(eval "printf %s \"\$HAVE_$2\"")" + if [ "$tmpval" = 'no' ]; then + eval "HAVE_$2=auto" + check_lib "$1" "$2" "$3" + fi +} + create_config_header() { outfile="$1"; shift From 771efdabc0e21b5b391ac58c52687ea67dee2f57 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 26 Nov 2017 03:01:28 +0100 Subject: [PATCH 141/183] Fix edge case issue where game's label was not being properly set when loading two games one after another from a playlist/collection - the previous game's name was being used instead --- menu/cbs/menu_cbs_ok.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 157710ec01..7fea03125c 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -1497,8 +1497,16 @@ static int action_ok_playlist_entry_collection(const char *path, if (system && string_is_equal(system->library_name, core_name)) { + global_t *global = global_get_ptr(); + if (playlist_initialized) playlist_free(tmp_playlist); + if (global) + { + global->name.label[0] = '\0'; + if (!string_is_empty(entry_label)) + strlcpy(global->name.label, entry_label, sizeof(global->name.label)); + } return action_ok_file_load(menu->deferred_path, label, type, idx, entry_idx); } From 7f2f90de24ad6dd78312f4f6c71bc16f0b866fe5 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sat, 25 Nov 2017 18:35:05 -0800 Subject: [PATCH 142/183] Fix name issue with nekop2, use ${DEVKITPRO} for smdhtool, got devkitarm setup, compiles and works --- Makefile.ctr | 4 ++-- Makefile.ctr.salamander | 4 ++-- pkg/ctr/Makefile.cores | 6 +++--- pkg/ctr/assets/{np2.png => nekop2.png} | Bin .../assets/{np2_banner.png => nekop2_banner.png} | Bin 5 files changed, 7 insertions(+), 7 deletions(-) rename pkg/ctr/assets/{np2.png => nekop2.png} (100%) rename pkg/ctr/assets/{np2_banner.png => nekop2_banner.png} (100%) diff --git a/Makefile.ctr b/Makefile.ctr index 91feeb4406..c277d3df77 100644 --- a/Makefile.ctr +++ b/Makefile.ctr @@ -228,7 +228,7 @@ endif %.vsh: $(TARGET).smdh: $(APP_ICON) - smdhtool --create "$(APP_TITLE)" "$(APP_DESCRIPTION)" "$(APP_AUTHOR)" $(APP_ICON) $@ + $(DEVKITPRO)/devkitARM/bin/smdhtool --create "$(APP_TITLE)" "$(APP_DESCRIPTION)" "$(APP_AUTHOR)" $(APP_ICON) $@ $(TARGET).3dsx: $(TARGET).elf ifeq ($(APP_BIG_TEXT_SECTION), 1) @@ -236,7 +236,7 @@ ifeq ($(APP_BIG_TEXT_SECTION), 1) else rm -f $(TARGET).xml endif - -3dsxtool $< $@ $(_3DSXFLAGS) + $(DEVKITPRO)/devkitARM/bin/3dsxtool $< $@ $(_3DSXFLAGS) $(TARGET).elf: ctr/3dsx_custom_crt0.o $(LD) $(LDFLAGS) $(OBJ) $(LIBDIRS) $(LIBS) -o $@ diff --git a/Makefile.ctr.salamander b/Makefile.ctr.salamander index 60ab600a2e..930b5badc7 100644 --- a/Makefile.ctr.salamander +++ b/Makefile.ctr.salamander @@ -44,7 +44,7 @@ ifeq ($(strip $(DEVKITPRO)),) endif ifeq ($(strip $(CTRULIB)),) - CTRULIB = $(DEVKITPRO)/ctrulib + CTRULIB = $(DEVKITPRO)/libctru endif APP_TITLE := $(shell echo "$(APP_TITLE)" | cut -c1-128) @@ -160,7 +160,7 @@ endif %.vsh: $(TARGET).smdh: $(APP_ICON) - smdhtool --create "$(APP_TITLE)" "$(APP_DESCRIPTION)" "$(APP_AUTHOR)" $(APP_ICON) $@ + $(DEVKITPRO)/devkitARM/bin/smdhtool --create "$(APP_TITLE)" "$(APP_DESCRIPTION)" "$(APP_AUTHOR)" $(APP_ICON) $@ $(TARGET).3dsx: $(TARGET).elf ifeq ($(APP_BIG_TEXT_SECTION), 1) diff --git a/pkg/ctr/Makefile.cores b/pkg/ctr/Makefile.cores index fbb51d464d..ebf5cf7a5c 100644 --- a/pkg/ctr/Makefile.cores +++ b/pkg/ctr/Makefile.cores @@ -210,13 +210,13 @@ else ifeq ($(LIBRETRO), dosbox) APP_ICON = pkg/ctr/assets/dosbox.png APP_BANNER = pkg/ctr/assets/dosbox_banner.png -else ifeq ($(LIBRETRO), np2) +else ifeq ($(LIBRETRO), nekop2) APP_TITLE = Neko Project 2 APP_AUTHOR = various APP_PRODUCT_CODE = RARCH-NP2 APP_UNIQUE_ID = 0xBAC1C - APP_ICON = pkg/ctr/assets/np2.png - APP_BANNER = pkg/ctr/assets/np2_banner.png + APP_ICON = pkg/ctr/assets/nekop2.png + APP_BANNER = pkg/ctr/assets/nekop2_banner.png else ifeq ($(LIBRETRO), np2kai) APP_TITLE = Neko Project 2 Kai diff --git a/pkg/ctr/assets/np2.png b/pkg/ctr/assets/nekop2.png similarity index 100% rename from pkg/ctr/assets/np2.png rename to pkg/ctr/assets/nekop2.png diff --git a/pkg/ctr/assets/np2_banner.png b/pkg/ctr/assets/nekop2_banner.png similarity index 100% rename from pkg/ctr/assets/np2_banner.png rename to pkg/ctr/assets/nekop2_banner.png From dee66ab6bb2d7892de80ab563a3252a7a8c1cbda Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 26 Nov 2017 05:04:18 +0100 Subject: [PATCH 143/183] Get rid of this - seems to be a highly problematic codepath in general --- menu/cbs/menu_cbs_ok.c | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 7fea03125c..93a4bdeb22 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -1490,26 +1490,6 @@ static int action_ok_playlist_entry_collection(const char *path, playlist_get_index(playlist, selection_ptr, &entry_path, &entry_label, &core_path, &core_name, NULL, NULL); - /* If the currently loaded core's name is equal - * to the core name from the playlist entry, - * then we directly load this game with the current core. - */ - if (system && - string_is_equal(system->library_name, core_name)) - { - global_t *global = global_get_ptr(); - - if (playlist_initialized) - playlist_free(tmp_playlist); - if (global) - { - global->name.label[0] = '\0'; - if (!string_is_empty(entry_label)) - strlcpy(global->name.label, entry_label, sizeof(global->name.label)); - } - return action_ok_file_load(menu->deferred_path, label, type, idx, entry_idx); - } - /* Is the core path / name of the playlist entry not yet filled in? */ if ( string_is_equal(core_path, file_path_str(FILE_PATH_DETECT)) && string_is_equal(core_name, file_path_str(FILE_PATH_DETECT))) From f15aaa0b2c8101098f1c78359a58af7683d4d128 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 26 Nov 2017 05:07:35 +0100 Subject: [PATCH 144/183] Reduce differences between the two functions --- menu/cbs/menu_cbs_ok.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 93a4bdeb22..4175a8302e 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -1559,6 +1559,7 @@ static int action_ok_playlist_entry(const char *path, { menu_content_ctx_playlist_info_t playlist_info; content_ctx_info_t content_info; + char new_core_path[PATH_MAX_LENGTH]; size_t selection_ptr = 0; playlist_t *playlist = g_defaults.content_history; const char *entry_path = NULL; @@ -1572,6 +1573,8 @@ static int action_ok_playlist_entry(const char *path, content_info.args = NULL; content_info.environ_get = NULL; + new_core_path[0] = '\0'; + if (!menu_driver_ctl(RARCH_MENU_CTL_DRIVER_DATA_GET, &menu)) return menu_cbs_exit(); @@ -1584,15 +1587,10 @@ static int action_ok_playlist_entry(const char *path, && string_is_equal(core_name, file_path_str(FILE_PATH_DETECT))) { core_info_ctx_find_t core_info; - char new_core_path[PATH_MAX_LENGTH]; const char *entry_path = NULL; const char *path_base = path_basename(menu->db_playlist_file); - bool found_associated_core = false; - - new_core_path[0] = '\0'; - - found_associated_core = + bool found_associated_core = menu_content_playlist_find_associated_core( path_base, new_core_path, sizeof(new_core_path)); @@ -1614,6 +1612,8 @@ static int action_ok_playlist_entry(const char *path, NULL, new_core_path); } + else + strlcpy(new_core_path, core_path, sizeof(new_core_path)); playlist_info.data = playlist; playlist_info.idx = (unsigned)selection_ptr; @@ -1631,7 +1631,7 @@ static int action_ok_playlist_entry(const char *path, NULL, NULL); if (!task_push_load_content_from_playlist_from_menu( - core_path, path, entry_label, + new_core_path, path, entry_label, &content_info, NULL, NULL)) return -1; From bd1e06bbb79fc8de7f4e89fdfb501762f7bd2b02 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 26 Nov 2017 06:03:34 +0100 Subject: [PATCH 145/183] Group identical functions --- menu/cbs/menu_cbs_ok.c | 245 +++++++++++++++++++++-------------------- 1 file changed, 125 insertions(+), 120 deletions(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 4175a8302e..bea7d7aa28 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -1866,21 +1866,6 @@ static void menu_input_wifi_cb(void *userdata, const char *passphrase) menu_input_dialog_end(); } -static int action_ok_cheat(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - menu_input_ctx_line_t line; - - line.label = msg_hash_to_str(MSG_INPUT_CHEAT); - line.label_setting = label; - line.type = type; - line.idx = (unsigned)idx; - line.cb = menu_input_st_cheat_cb; - - if (!menu_input_dialog_start(&line)) - return -1; - return 0; -} static void menu_input_st_string_cb_rename_entry(void *userdata, const char *str) @@ -1987,6 +1972,30 @@ static void menu_input_st_string_cb_save_preset(void *userdata, menu_input_dialog_end(); } +static void menu_input_st_string_cb_cheat_file_save_as( + void *userdata, const char *str) +{ + if (str && *str) + { + rarch_setting_t *setting = NULL; + settings_t *settings = config_get_ptr(); + const char *label = menu_input_dialog_get_label_buffer(); + + if (!string_is_empty(label)) + setting = menu_setting_find(label); + + if (setting) + { + setting_set_with_string_representation(setting, str); + menu_setting_generic(setting, false); + } + else if (!string_is_empty(label)) + cheat_manager_save(str, settings->paths.path_cheat_database); + } + + menu_input_dialog_end(); +} + static int action_ok_shader_preset_save_as(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { @@ -2003,6 +2012,102 @@ static int action_ok_shader_preset_save_as(const char *path, return 0; } +static int action_ok_enable_settings(const char *path, + const char *label, unsigned type, size_t idx, size_t entry_idx) +{ + menu_input_ctx_line_t line; + + line.label = msg_hash_to_str(MSG_INPUT_ENABLE_SETTINGS_PASSWORD); + line.label_setting = label; + line.type = type; + line.idx = (unsigned)entry_idx; + line.cb = menu_input_st_string_cb_enable_settings; + + if (!menu_input_dialog_start(&line)) + return -1; + return 0; +} + +static int action_ok_wifi(const char *path, + const char *label, unsigned type, size_t idx, size_t entry_idx) +{ + menu_input_ctx_line_t line; + + line.label = "Passphrase"; + line.label_setting = label; + line.type = type; + line.idx = (unsigned)idx; + line.cb = menu_input_wifi_cb; + + if (!menu_input_dialog_start(&line)) + return -1; + return 0; +} + +static int action_ok_cheat_file_save_as(const char *path, + const char *label, unsigned type, size_t idx, size_t entry_idx) +{ + menu_input_ctx_line_t line; + + line.label = msg_hash_to_str(MSG_INPUT_CHEAT_FILENAME); + line.label_setting = label; + line.type = type; + line.idx = (unsigned)idx; + line.cb = menu_input_st_string_cb_cheat_file_save_as; + + if (!menu_input_dialog_start(&line)) + return -1; + return 0; +} + +static int action_ok_cheat(const char *path, + const char *label, unsigned type, size_t idx, size_t entry_idx) +{ + menu_input_ctx_line_t line; + + line.label = msg_hash_to_str(MSG_INPUT_CHEAT); + line.label_setting = label; + line.type = type; + line.idx = (unsigned)idx; + line.cb = menu_input_st_cheat_cb; + + if (!menu_input_dialog_start(&line)) + return -1; + return 0; +} + +static int action_ok_disable_kiosk_mode(const char *path, + const char *label, unsigned type, size_t idx, size_t entry_idx) +{ + menu_input_ctx_line_t line; + + line.label = msg_hash_to_str(MSG_INPUT_KIOSK_MODE_PASSWORD); + line.label_setting = label; + line.type = type; + line.idx = (unsigned)entry_idx; + line.cb = menu_input_st_string_cb_disable_kiosk_mode; + + if (!menu_input_dialog_start(&line)) + return -1; + return 0; +} + +static int action_ok_rename_entry(const char *path, + const char *label, unsigned type, size_t idx, size_t entry_idx) +{ + menu_input_ctx_line_t line; + + line.label = msg_hash_to_str(MSG_INPUT_RENAME_ENTRY); + line.label_setting = label; + line.type = type; + line.idx = (unsigned)entry_idx; + line.cb = menu_input_st_string_cb_rename_entry; + + if (!menu_input_dialog_start(&line)) + return -1; + return 0; +} + enum { ACTION_OK_SHADER_PRESET_SAVE_CORE = 0, @@ -2081,45 +2186,7 @@ static int action_ok_shader_preset_save_game(const char *path, idx, entry_idx, ACTION_OK_SHADER_PRESET_SAVE_GAME); } -static void menu_input_st_string_cb_cheat_file_save_as( - void *userdata, const char *str) -{ - if (str && *str) - { - rarch_setting_t *setting = NULL; - settings_t *settings = config_get_ptr(); - const char *label = menu_input_dialog_get_label_buffer(); - if (!string_is_empty(label)) - setting = menu_setting_find(label); - - if (setting) - { - setting_set_with_string_representation(setting, str); - menu_setting_generic(setting, false); - } - else if (!string_is_empty(label)) - cheat_manager_save(str, settings->paths.path_cheat_database); - } - - menu_input_dialog_end(); -} - -static int action_ok_cheat_file_save_as(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - menu_input_ctx_line_t line; - - line.label = msg_hash_to_str(MSG_INPUT_CHEAT_FILENAME); - line.label_setting = label; - line.type = type; - line.idx = (unsigned)idx; - line.cb = menu_input_st_string_cb_cheat_file_save_as; - - if (!menu_input_dialog_start(&line)) - return -1; - return 0; -} static int generic_action_ok_remap_file_operation(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx, @@ -3161,21 +3228,6 @@ static int action_ok_add_to_favorites_playlist(const char *path, return 0; } -static int action_ok_rename_entry(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - menu_input_ctx_line_t line; - - line.label = msg_hash_to_str(MSG_INPUT_RENAME_ENTRY); - line.label_setting = label; - line.type = type; - line.idx = (unsigned)entry_idx; - line.cb = menu_input_st_string_cb_rename_entry; - - if (!menu_input_dialog_start(&line)) - return -1; - return 0; -} static int action_ok_delete_entry(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) @@ -3230,37 +3282,6 @@ static int action_ok_delete_entry(const char *path, return 0; } -static int action_ok_disable_kiosk_mode(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - menu_input_ctx_line_t line; - - line.label = msg_hash_to_str(MSG_INPUT_KIOSK_MODE_PASSWORD); - line.label_setting = label; - line.type = type; - line.idx = (unsigned)entry_idx; - line.cb = menu_input_st_string_cb_disable_kiosk_mode; - - if (!menu_input_dialog_start(&line)) - return -1; - return 0; -} - -static int action_ok_enable_settings(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - menu_input_ctx_line_t line; - - line.label = msg_hash_to_str(MSG_INPUT_ENABLE_SETTINGS_PASSWORD); - line.label_setting = label; - line.type = type; - line.idx = (unsigned)entry_idx; - line.cb = menu_input_st_string_cb_enable_settings; - - if (!menu_input_dialog_start(&line)) - return -1; - return 0; -} static int action_ok_rdb_entry_submenu(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) @@ -3456,22 +3477,6 @@ static int action_ok_netplay_connect_room(const char *path, return 0; } -static int action_ok_wifi(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - - menu_input_ctx_line_t line; - - line.label = "Passphrase"; - line.label_setting = label; - line.type = type; - line.idx = (unsigned)idx; - line.cb = menu_input_wifi_cb; - - if (!menu_input_dialog_start(&line)) - return -1; - return 0; -} static int action_ok_netplay_lan_scan(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) @@ -4148,12 +4153,12 @@ static int action_ok_netplay_enable_client(const char *path, command_event(CMD_EVENT_NETPLAY_DEINIT, NULL); netplay_driver_ctl(RARCH_NETPLAY_CTL_ENABLE_CLIENT, NULL); - /* If no host was specified in the config, ask for one */ - memset(&line, 0, sizeof(line)); - - line.label = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_IP_ADDRESS); + line.label = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_IP_ADDRESS); line.label_setting = "no_setting"; - line.cb = action_ok_netplay_enable_client_hostname_cb; + line.type = 0; + line.idx = 0; + line.cb = action_ok_netplay_enable_client_hostname_cb; + if (menu_input_dialog_start(&line)) return 0; #endif From 99fcc63b3896cc917584c2b52fb6f29bb1a21023 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 26 Nov 2017 06:12:51 +0100 Subject: [PATCH 146/183] Cut down on code duplication --- menu/cbs/menu_cbs_ok.c | 149 +++++++++++------------------------------ 1 file changed, 40 insertions(+), 109 deletions(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index bea7d7aa28..92671dcb5e 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -1996,117 +1996,48 @@ static void menu_input_st_string_cb_cheat_file_save_as( menu_input_dialog_end(); } -static int action_ok_shader_preset_save_as(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - menu_input_ctx_line_t line; - - line.label = msg_hash_to_str(MSG_INPUT_PRESET_FILENAME); - line.label_setting = label; - line.type = type; - line.idx = (unsigned)idx; - line.cb = menu_input_st_string_cb_save_preset; - - if (!menu_input_dialog_start(&line)) - return -1; - return 0; +#define default_action_dialog_start(funcname, _label_setting, _idx, _cb) \ +static int (funcname)(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) \ +{ \ + menu_input_ctx_line_t line; \ + line.label = label; \ + line.label_setting = _label_setting; \ + line.type = type; \ + line.idx = (_idx); \ + line.cb = _cb; \ + if (!menu_input_dialog_start(&line)) \ + return -1; \ + return 0; \ } -static int action_ok_enable_settings(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - menu_input_ctx_line_t line; - - line.label = msg_hash_to_str(MSG_INPUT_ENABLE_SETTINGS_PASSWORD); - line.label_setting = label; - line.type = type; - line.idx = (unsigned)entry_idx; - line.cb = menu_input_st_string_cb_enable_settings; - - if (!menu_input_dialog_start(&line)) - return -1; - return 0; -} - -static int action_ok_wifi(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - menu_input_ctx_line_t line; - - line.label = "Passphrase"; - line.label_setting = label; - line.type = type; - line.idx = (unsigned)idx; - line.cb = menu_input_wifi_cb; - - if (!menu_input_dialog_start(&line)) - return -1; - return 0; -} - -static int action_ok_cheat_file_save_as(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - menu_input_ctx_line_t line; - - line.label = msg_hash_to_str(MSG_INPUT_CHEAT_FILENAME); - line.label_setting = label; - line.type = type; - line.idx = (unsigned)idx; - line.cb = menu_input_st_string_cb_cheat_file_save_as; - - if (!menu_input_dialog_start(&line)) - return -1; - return 0; -} - -static int action_ok_cheat(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - menu_input_ctx_line_t line; - - line.label = msg_hash_to_str(MSG_INPUT_CHEAT); - line.label_setting = label; - line.type = type; - line.idx = (unsigned)idx; - line.cb = menu_input_st_cheat_cb; - - if (!menu_input_dialog_start(&line)) - return -1; - return 0; -} - -static int action_ok_disable_kiosk_mode(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - menu_input_ctx_line_t line; - - line.label = msg_hash_to_str(MSG_INPUT_KIOSK_MODE_PASSWORD); - line.label_setting = label; - line.type = type; - line.idx = (unsigned)entry_idx; - line.cb = menu_input_st_string_cb_disable_kiosk_mode; - - if (!menu_input_dialog_start(&line)) - return -1; - return 0; -} - -static int action_ok_rename_entry(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - menu_input_ctx_line_t line; - - line.label = msg_hash_to_str(MSG_INPUT_RENAME_ENTRY); - line.label_setting = label; - line.type = type; - line.idx = (unsigned)entry_idx; - line.cb = menu_input_st_string_cb_rename_entry; - - if (!menu_input_dialog_start(&line)) - return -1; - return 0; -} +default_action_dialog_start(action_ok_shader_preset_save_as, + msg_hash_to_str(MSG_INPUT_PRESET_FILENAME), + (unsigned)idx, + menu_input_st_string_cb_save_preset) +default_action_dialog_start(action_ok_enable_settings, + msg_hash_to_str(MSG_INPUT_ENABLE_SETTINGS_PASSWORD), + (unsigned)entry_idx, + menu_input_st_string_cb_enable_settings) +default_action_dialog_start(action_ok_wifi, + "Passphrase", + (unsigned)idx, + menu_input_wifi_cb) +default_action_dialog_start(action_ok_cheat_file_save_as, + msg_hash_to_str(MSG_INPUT_CHEAT_FILENAME), + (unsigned)idx, + menu_input_st_string_cb_cheat_file_save_as) +default_action_dialog_start(action_ok_cheat, + msg_hash_to_str(MSG_INPUT_CHEAT), + (unsigned)idx, + menu_input_st_cheat_cb) +default_action_dialog_start(action_ok_disable_kiosk_mode, + msg_hash_to_str(MSG_INPUT_KIOSK_MODE_PASSWORD), + (unsigned)entry_idx, + menu_input_st_string_cb_disable_kiosk_mode) +default_action_dialog_start(action_ok_rename_entry, + msg_hash_to_str(MSG_INPUT_RENAME_ENTRY), + (unsigned)entry_idx, + menu_input_st_string_cb_rename_entry) enum { From ce91c082e43d610f12d64ca2ef72155289c9d28b Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 26 Nov 2017 06:23:14 +0100 Subject: [PATCH 147/183] Cut down on code duplication --- menu/cbs/menu_cbs_ok.c | 71 +++++++++--------------------------------- 1 file changed, 14 insertions(+), 57 deletions(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 92671dcb5e..b3830a47e2 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -2276,25 +2276,6 @@ static int action_ok_core_deferred_set(const char *path, return menu_cbs_exit(); } -static int action_ok_core_deferred_set_current_core(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - char core_display_name[PATH_MAX_LENGTH]; - size_t selection = menu_navigation_get_selection(); - - core_display_name[0] = '\0'; - - core_info_get_name(path, core_display_name, sizeof(core_display_name)); - command_playlist_update_write(NULL, - rdb_entry_start_game_selection_ptr, - core_display_name, NULL, path); - - menu_entries_pop_stack(&selection, 0, 1); - menu_navigation_set_selection(selection); - - return 0; -} - static int action_ok_deferred_list_stub(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { @@ -2325,43 +2306,21 @@ static int action_ok_load_core_deferred(const char *path, return 0; } -static int action_ok_start_net_retropad_core(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - content_ctx_info_t content_info; - - content_info.argc = 0; - content_info.argv = NULL; - content_info.args = NULL; - content_info.environ_get = NULL; - - if (!task_push_start_builtin_core( - &content_info, - CORE_TYPE_NETRETROPAD, - NULL, NULL)) - return -1; - - return 0; +#define default_action_ok_start_builtin_core(funcname, _id) \ +static int (funcname)(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) \ +{ \ + content_ctx_info_t content_info; \ + content_info.argc = 0; \ + content_info.argv = NULL; \ + content_info.args = NULL; \ + content_info.environ_get = NULL; \ + if (!task_push_start_builtin_core(&content_info, _id, NULL, NULL)) \ + return -1; \ + return 0; \ } -static int action_ok_start_video_processor_core(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - content_ctx_info_t content_info; - - content_info.argc = 0; - content_info.argv = NULL; - content_info.args = NULL; - content_info.environ_get = NULL; - - if (!task_push_start_builtin_core( - &content_info, - CORE_TYPE_VIDEO_PROCESSOR, - NULL, NULL)) - return -1; - - return 0; -} +default_action_ok_start_builtin_core(action_ok_start_net_retropad_core, CORE_TYPE_NETRETROPAD) +default_action_ok_start_builtin_core(action_ok_start_video_processor_core, CORE_TYPE_VIDEO_PROCESSOR) #ifdef HAVE_FFMPEG static int action_ok_file_load_ffmpeg(const char *path, @@ -4236,10 +4195,8 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs, BIND_ACTION_OK(cbs, action_ok_load_core); break; case MENU_ENUM_LABEL_FILE_BROWSER_CORE_SELECT_FROM_COLLECTION: - BIND_ACTION_OK(cbs, action_ok_core_deferred_set); - break; case MENU_ENUM_LABEL_FILE_BROWSER_CORE_SELECT_FROM_COLLECTION_CURRENT_CORE: - BIND_ACTION_OK(cbs, action_ok_core_deferred_set_current_core); + BIND_ACTION_OK(cbs, action_ok_core_deferred_set); break; case MENU_ENUM_LABEL_START_CORE: BIND_ACTION_OK(cbs, action_ok_start_core); From d5c30fd68c0a82a5c4692e3309cfde8fab9dd0ce Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 26 Nov 2017 06:35:53 +0100 Subject: [PATCH 148/183] Cleanups --- menu/cbs/menu_cbs_ok.c | 43 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index b3830a47e2..403e2b31e6 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -1189,6 +1189,13 @@ static int set_path_generic(const char *label, const char *action_path) return 0; } +static int generic_action_ok_command(enum event_command cmd) +{ + if (!command_event(cmd, NULL)) + return menu_cbs_exit(); + return 0; +} + static int generic_action_ok(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx, unsigned id, enum msg_hash_enums flush_id) @@ -1319,7 +1326,7 @@ static int generic_action_ok(const char *path, case ACTION_OK_APPEND_DISK_IMAGE: flush_type = MENU_SETTINGS; command_event(CMD_EVENT_DISK_APPEND_IMAGE, action_path); - command_event(CMD_EVENT_RESUME, NULL); + generic_action_ok_command(CMD_EVENT_RESUME); break; case ACTION_OK_SET_DIRECTORY: flush_char = msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_DIRECTORY_SETTINGS_LIST); @@ -1747,9 +1754,7 @@ static int action_ok_playlist_entry_start_content(const char *path, static int action_ok_cheat_apply_changes(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { - command_event(CMD_EVENT_CHEATS_APPLY, NULL); - - return 0; + return generic_action_ok_command(CMD_EVENT_CHEATS_APPLY); } static int action_ok_lookup_setting(const char *path, @@ -2456,12 +2461,6 @@ static int action_ok_file_load_detect_core(const char *path, return 0; } -static int generic_action_ok_command(enum event_command cmd) -{ - if (!command_event(cmd, NULL)) - return menu_cbs_exit(); - return 0; -} static int action_ok_load_state(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) @@ -2509,10 +2508,10 @@ static void cb_decompressed(void *task_data, void *user_data, const char *err) switch (type_hash) { case CB_CORE_UPDATER_DOWNLOAD: - command_event(CMD_EVENT_CORE_INFO_INIT, NULL); + generic_action_ok_command(CMD_EVENT_CORE_INFO_INIT); break; case CB_UPDATE_ASSETS: - command_event(CMD_EVENT_REINIT, NULL); + generic_action_ok_command(CMD_EVENT_REINIT); break; } } @@ -2608,7 +2607,7 @@ static int generic_action_ok_network(const char *path, menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh); - command_event(CMD_EVENT_NETWORK_INIT, NULL); + generic_action_ok_command(CMD_EVENT_NETWORK_INIT); transf = (menu_file_transfer_t*)calloc(1, sizeof(*transf)); strlcpy(transf->path, url_path, sizeof(transf->path)); @@ -2804,7 +2803,7 @@ static void cb_generic_download(void *task_data, switch (transf->enum_idx) { case MENU_ENUM_LABEL_CB_CORE_UPDATER_DOWNLOAD: - command_event(CMD_EVENT_CORE_INFO_INIT, NULL); + generic_action_ok_command(CMD_EVENT_CORE_INFO_INIT); break; default: break; @@ -3329,7 +3328,7 @@ static int action_ok_netplay_connect_room(const char *path, tmp_hostname[0] = '\0'; if (netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_DATA_INITED, NULL)) - command_event(CMD_EVENT_NETPLAY_DEINIT, NULL); + generic_action_ok_command(CMD_EVENT_NETPLAY_DEINIT); netplay_driver_ctl(RARCH_NETPLAY_CTL_ENABLE_CLIENT, NULL); if (netplay_room_list[idx - 3].host_method == NETPLAY_HOST_METHOD_MITM) @@ -3384,7 +3383,7 @@ static int action_ok_netplay_lan_scan(const char *path, /* Enable Netplay client mode */ if (netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_DATA_INITED, NULL)) - command_event(CMD_EVENT_NETPLAY_DEINIT, NULL); + generic_action_ok_command(CMD_EVENT_NETPLAY_DEINIT); netplay_driver_ctl(RARCH_NETPLAY_CTL_ENABLE_CLIENT, NULL); /* Enable Netplay */ @@ -3794,7 +3793,7 @@ static int action_ok_load_archive(const char *path, fill_pathname_join(detect_content_path, menu_path, content_path, sizeof(detect_content_path)); - command_event(CMD_EVENT_LOAD_CORE, NULL); + generic_action_ok_command(CMD_EVENT_LOAD_CORE); if (!task_push_load_content_with_core_from_menu( detect_content_path, @@ -3947,7 +3946,7 @@ static int action_ok_video_resolution(const char *path, msg[0] = '\0'; #if defined(__CELLOS_LV2__) || defined(_WIN32) - command_event(CMD_EVENT_REINIT, NULL); + generic_action_ok_command(CMD_EVENT_REINIT); #endif video_driver_set_video_mode(width, height, true); #ifdef GEKKO @@ -3974,7 +3973,7 @@ static int action_ok_netplay_enable_host(const char *path, content_get_status(&contentless, &is_inited); if (netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_DATA_INITED, NULL)) - command_event(CMD_EVENT_NETPLAY_DEINIT, NULL); + generic_action_ok_command(CMD_EVENT_NETPLAY_DEINIT); netplay_driver_ctl(RARCH_NETPLAY_CTL_ENABLE_SERVER, NULL); /* If we haven't yet started, this will load on its own */ @@ -4040,7 +4039,7 @@ static int action_ok_netplay_enable_client(const char *path, #ifdef HAVE_NETWORKING menu_input_ctx_line_t line; if (netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_DATA_INITED, NULL)) - command_event(CMD_EVENT_NETPLAY_DEINIT, NULL); + generic_action_ok_command(CMD_EVENT_NETPLAY_DEINIT); netplay_driver_ctl(RARCH_NETPLAY_CTL_ENABLE_CLIENT, NULL); line.label = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_IP_ADDRESS); @@ -4067,9 +4066,9 @@ static int action_ok_netplay_disconnect(const char *path, /* Re-enable rewind if it was enabled TODO: Add a setting for these tweaks */ if (settings->bools.rewind_enable) - command_event(CMD_EVENT_REWIND_INIT, NULL); + generic_action_ok_command(CMD_EVENT_REWIND_INIT); if (settings->uints.autosave_interval != 0) - command_event(CMD_EVENT_AUTOSAVE_INIT, NULL); + generic_action_ok_command(CMD_EVENT_AUTOSAVE_INIT); return generic_action_ok_command(CMD_EVENT_RESUME); #else From edfe5e699198e242f475fb1fbcc3562d93ece17c Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 26 Nov 2017 06:49:58 +0100 Subject: [PATCH 149/183] Cut down on code duplication --- menu/cbs/menu_cbs_ok.c | 41 +++++++++-------------------------------- 1 file changed, 9 insertions(+), 32 deletions(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 403e2b31e6..15dd13fdd0 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -2618,40 +2618,17 @@ static int generic_action_ok_network(const char *path, label, type, idx, entry_idx, type_id2); } -static int action_ok_core_content_list(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return generic_action_ok_network(path, label, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_CORE_CONTENT_LIST); +#define default_action_ok_list(funcname, _id) \ +static int (funcname)(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) \ +{ \ + return generic_action_ok_network(path, label, type, idx, entry_idx, _id); \ } -static int action_ok_core_content_dirs_list(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return generic_action_ok_network(path, label, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_CORE_CONTENT_DIRS_LIST); -} - -static int action_ok_core_updater_list(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return generic_action_ok_network(path, label, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_CORE_UPDATER_LIST); -} - -static int action_ok_thumbnails_updater_list(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return generic_action_ok_network(path, label, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_THUMBNAILS_UPDATER_LIST); -} - -static int action_ok_lakka_list(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return generic_action_ok_network(path, label, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_LAKKA_LIST); -} +default_action_ok_list(action_ok_core_content_list, MENU_ENUM_LABEL_CB_CORE_CONTENT_LIST) +default_action_ok_list(action_ok_core_content_dirs_list, MENU_ENUM_LABEL_CB_CORE_CONTENT_DIRS_LIST) +default_action_ok_list(action_ok_core_updater_list, MENU_ENUM_LABEL_CB_CORE_UPDATER_LIST) +default_action_ok_list(action_ok_thumbnails_updater_list, MENU_ENUM_LABEL_CB_THUMBNAILS_UPDATER_LIST) +default_action_ok_list(action_ok_lakka_list, MENU_ENUM_LABEL_CB_LAKKA_LIST) static void cb_generic_dir_download(void *task_data, void *user_data, const char *err) From 2e7a532c895ac1683882e0242435df699d8bb91f Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 26 Nov 2017 06:57:05 +0100 Subject: [PATCH 150/183] Cut down on code duplication --- menu/cbs/menu_cbs_ok.c | 59 ++++++++---------------------------------- 1 file changed, 11 insertions(+), 48 deletions(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 15dd13fdd0..79acc07077 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -3859,56 +3859,19 @@ static int action_ok_load_archive_detect_core(const char *path, return ret; } -static int action_ok_help_audio_video_troubleshooting(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return generic_action_ok_help(path, label, type, idx, entry_idx, - MENU_ENUM_LABEL_HELP_AUDIO_VIDEO_TROUBLESHOOTING, - MENU_DIALOG_HELP_AUDIO_VIDEO_TROUBLESHOOTING); +#define default_action_ok_help(funcname, _id, _id2) \ +static int (funcname)(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) \ +{ \ + return generic_action_ok_help(path, label, type, idx, entry_idx, _id, _id2); \ } -static int action_ok_help(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return generic_action_ok_help(path, label, type, idx, entry_idx, - MENU_ENUM_LABEL_HELP, MENU_DIALOG_WELCOME); -} - -static int action_ok_help_controls(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return generic_action_ok_help(path, label, type, idx, entry_idx, - MENU_ENUM_LABEL_HELP_CONTROLS, MENU_DIALOG_HELP_CONTROLS); -} - -static int action_ok_help_what_is_a_core(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return generic_action_ok_help(path, label, type, idx, entry_idx, - MENU_ENUM_LABEL_HELP_WHAT_IS_A_CORE, MENU_DIALOG_HELP_WHAT_IS_A_CORE); -} - -static int action_ok_help_scanning_content(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return generic_action_ok_help(path, label, type, idx, entry_idx, - MENU_ENUM_LABEL_HELP_SCANNING_CONTENT, MENU_DIALOG_HELP_SCANNING_CONTENT); -} - -static int action_ok_help_change_virtual_gamepad(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return generic_action_ok_help(path, label, type, idx, entry_idx, - MENU_ENUM_LABEL_HELP_CHANGE_VIRTUAL_GAMEPAD, - MENU_DIALOG_HELP_CHANGE_VIRTUAL_GAMEPAD); -} - -static int action_ok_help_load_content(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return generic_action_ok_help(path, label, type, idx, entry_idx, - MENU_ENUM_LABEL_HELP_LOADING_CONTENT, MENU_DIALOG_HELP_LOADING_CONTENT); -} +default_action_ok_help(action_ok_help_audio_video_troubleshooting, MENU_ENUM_LABEL_HELP_AUDIO_VIDEO_TROUBLESHOOTING, MENU_DIALOG_HELP_AUDIO_VIDEO_TROUBLESHOOTING) +default_action_ok_help(action_ok_help, MENU_ENUM_LABEL_HELP, MENU_DIALOG_WELCOME) +default_action_ok_help(action_ok_help_controls, MENU_ENUM_LABEL_HELP_CONTROLS, MENU_DIALOG_HELP_CONTROLS) +default_action_ok_help(action_ok_help_what_is_a_core, MENU_ENUM_LABEL_HELP_WHAT_IS_A_CORE, MENU_DIALOG_HELP_WHAT_IS_A_CORE) +default_action_ok_help(action_ok_help_scanning_content, MENU_ENUM_LABEL_HELP_SCANNING_CONTENT, MENU_DIALOG_HELP_SCANNING_CONTENT) +default_action_ok_help(action_ok_help_change_virtual_gamepad, MENU_ENUM_LABEL_HELP_CHANGE_VIRTUAL_GAMEPAD, MENU_DIALOG_HELP_CHANGE_VIRTUAL_GAMEPAD) +default_action_ok_help(action_ok_help_load_content, MENU_ENUM_LABEL_HELP_LOADING_CONTENT, MENU_DIALOG_HELP_LOADING_CONTENT) static int action_ok_video_resolution(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) From 1dab4a7f83204eacd81813019d18ac981c99ccf0 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 26 Nov 2017 07:04:05 +0100 Subject: [PATCH 151/183] Cut dowon on code duplication --- menu/cbs/menu_cbs_ok.c | 113 +++++++---------------------------------- 1 file changed, 18 insertions(+), 95 deletions(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 79acc07077..51b784c505 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -2909,103 +2909,26 @@ static int action_ok_core_content_download(const char *path, MENU_ENUM_LABEL_CB_CORE_CONTENT_DOWNLOAD); } -static int action_ok_core_content_thumbnails(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_CORE_THUMBNAILS_DOWNLOAD); +#define default_action_ok_download(funcname, _id) \ +static int (funcname)(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) \ +{ \ + return action_ok_download_generic(path, label, NULL, type, idx, entry_idx,_id); \ } -static int action_ok_thumbnails_updater_download(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_THUMBNAILS_UPDATER_DOWNLOAD); -} - -static int action_ok_download_url(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_DOWNLOAD_URL); -} - -static int action_ok_core_updater_download(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_CORE_UPDATER_DOWNLOAD); -} - -static int action_ok_lakka_download(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_LAKKA_DOWNLOAD); -} - -static int action_ok_update_assets(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_UPDATE_ASSETS); -} - -static int action_ok_update_core_info_files(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_UPDATE_CORE_INFO_FILES); -} - -static int action_ok_update_overlays(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_UPDATE_OVERLAYS); -} - -static int action_ok_update_shaders_cg(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_UPDATE_SHADERS_CG); -} - -static int action_ok_update_shaders_glsl(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_UPDATE_SHADERS_GLSL); -} - -static int action_ok_update_shaders_slang(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_UPDATE_SHADERS_SLANG); -} - -static int action_ok_update_databases(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_UPDATE_DATABASES); -} - -static int action_ok_update_cheats(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_UPDATE_CHEATS); -} - -static int action_ok_update_autoconfig_profiles(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_UPDATE_AUTOCONFIG_PROFILES); -} +default_action_ok_download(action_ok_core_content_thumbnails, MENU_ENUM_LABEL_CB_CORE_THUMBNAILS_DOWNLOAD) +default_action_ok_download(action_ok_thumbnails_updater_download, MENU_ENUM_LABEL_CB_THUMBNAILS_UPDATER_DOWNLOAD) +default_action_ok_download(action_ok_download_url, MENU_ENUM_LABEL_CB_DOWNLOAD_URL) +default_action_ok_download(action_ok_core_updater_download, MENU_ENUM_LABEL_CB_CORE_UPDATER_DOWNLOAD) +default_action_ok_download(action_ok_lakka_download, MENU_ENUM_LABEL_CB_LAKKA_DOWNLOAD) +default_action_ok_download(action_ok_update_assets, MENU_ENUM_LABEL_CB_UPDATE_ASSETS) +default_action_ok_download(action_ok_update_core_info_files, MENU_ENUM_LABEL_CB_UPDATE_CORE_INFO_FILES) +default_action_ok_download(action_ok_update_overlays, MENU_ENUM_LABEL_CB_UPDATE_OVERLAYS) +default_action_ok_download(action_ok_update_shaders_cg, MENU_ENUM_LABEL_CB_UPDATE_SHADERS_CG) +default_action_ok_download(action_ok_update_shaders_glsl, MENU_ENUM_LABEL_CB_UPDATE_SHADERS_GLSL) +default_action_ok_download(action_ok_update_shaders_slang, MENU_ENUM_LABEL_CB_UPDATE_SHADERS_SLANG) +default_action_ok_download(action_ok_update_databases, MENU_ENUM_LABEL_CB_UPDATE_DATABASES) +default_action_ok_download(action_ok_update_cheats, MENU_ENUM_LABEL_CB_UPDATE_CHEATS) +default_action_ok_download(action_ok_update_autoconfig_profiles, MENU_ENUM_LABEL_CB_UPDATE_AUTOCONFIG_PROFILES) /* creates folder and core options stub file for subsequent runs */ static int action_ok_option_create(const char *path, From ec92edb998cb7c1b591b6dd798bf1f487f472d5e Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 26 Nov 2017 07:10:18 +0100 Subject: [PATCH 152/183] Cut down on code duplication --- menu/cbs/menu_cbs_ok.c | 35 ++++++++++------------------------- 1 file changed, 10 insertions(+), 25 deletions(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 51b784c505..1f92d5143b 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -3293,33 +3293,18 @@ static int action_ok_netplay_lan_scan(const char *path, return -1; } -static int action_ok_content_collection_list(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - filebrowser_set_type(FILEBROWSER_SELECT_COLLECTION); - return generic_action_ok_displaylist_push(path, NULL, label, type, idx, - entry_idx, ACTION_OK_DL_CONTENT_COLLECTION_LIST); +#define default_action_ok_dl_push(funcname, _fbid, _id, _path) \ +static int (funcname)(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) \ +{ \ + settings_t *settings = config_get_ptr(); \ + (void)settings; \ + filebrowser_set_type(_fbid); \ + return generic_action_ok_displaylist_push(path, _path, label, type, idx, entry_idx, _id); \ } -static int action_ok_push_content_list(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - settings_t *settings = config_get_ptr(); - filebrowser_set_type(FILEBROWSER_SELECT_FILE); - return generic_action_ok_displaylist_push(path, - settings->paths.directory_menu_content, label, type, idx, - entry_idx, ACTION_OK_DL_CONTENT_LIST); -} - -static int action_ok_push_scan_file(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - settings_t *settings = config_get_ptr(); - filebrowser_set_type(FILEBROWSER_SCAN_FILE); - return generic_action_ok_displaylist_push(path, - settings->paths.directory_menu_content, label, type, idx, - entry_idx, ACTION_OK_DL_CONTENT_LIST); -} +default_action_ok_dl_push(action_ok_content_collection_list, FILEBROWSER_SELECT_COLLECTION, ACTION_OK_DL_CONTENT_COLLECTION_LIST, NULL) +default_action_ok_dl_push(action_ok_push_content_list, FILEBROWSER_SELECT_FILE, ACTION_OK_DL_CONTENT_LIST, settings->paths.directory_menu_content) +default_action_ok_dl_push(action_ok_push_scan_file, FILEBROWSER_SCAN_FILE, ACTION_OK_DL_CONTENT_LIST, settings->paths.directory_menu_content) #ifdef HAVE_NETWORKING struct netplay_host_list *lan_hosts; From e049b51a21e68fc2536d84785c0c3c90946e19da Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 26 Nov 2017 07:17:31 +0100 Subject: [PATCH 153/183] Cleanup --- menu/cbs/menu_cbs_ok.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 1f92d5143b..dd42d52f35 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -1751,12 +1751,6 @@ static int action_ok_playlist_entry_start_content(const char *path, return 0; } -static int action_ok_cheat_apply_changes(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return generic_action_ok_command(CMD_EVENT_CHEATS_APPLY); -} - static int action_ok_lookup_setting(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { @@ -2981,6 +2975,7 @@ int (func_name)(const char *path, const char *label, unsigned type, size_t idx, return generic_action_ok_command(cmd); \ } +default_action_ok_cmd_func(action_ok_cheat_apply_changes,CMD_EVENT_CHEATS_APPLY) default_action_ok_cmd_func(action_ok_quit, CMD_EVENT_QUIT) default_action_ok_cmd_func(action_ok_save_new_config, CMD_EVENT_MENU_SAVE_CONFIG) default_action_ok_cmd_func(action_ok_resume_content, CMD_EVENT_RESUME) @@ -3607,7 +3602,8 @@ static int action_ok_push_downloads_dir(const char *path, settings_t *settings = config_get_ptr(); filebrowser_set_type(FILEBROWSER_SELECT_FILE); - return generic_action_ok_displaylist_push(path, settings->paths.directory_core_assets, + return generic_action_ok_displaylist_push(path, + settings->paths.directory_core_assets, msg_hash_to_str(MENU_ENUM_LABEL_FAVORITES), type, idx, entry_idx, ACTION_OK_DL_CONTENT_LIST); @@ -3928,7 +3924,12 @@ static int action_ok_netplay_disconnect(const char *path, static int action_ok_core_delete(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { - char* core_path = strdup(path_get(RARCH_PATH_CORE)); + const char *path_core = path_get(RARCH_PATH_CORE); + char *core_path = !string_is_empty(path_core) + ? strdup(path_core) : NULL; + + if (!core_path) + return 0; generic_action_ok_command(CMD_EVENT_UNLOAD_CORE); menu_entries_flush_stack(0, 0); From 064ad8145a449cb6647a4d4c53aa4ec41bedb1ff Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 26 Nov 2017 07:29:19 +0100 Subject: [PATCH 154/183] Cut down on code duplication --- menu/cbs/menu_cbs_ok.c | 108 +++++++++-------------------------------- 1 file changed, 22 insertions(+), 86 deletions(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index dd42d52f35..fc004a9d32 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -1361,6 +1361,19 @@ error: return menu_cbs_exit(); } +static int default_action_ok_load_content_with_core_from_menu(const char *_path, unsigned _type) +{ + content_ctx_info_t content_info; + content_info.argc = 0; + content_info.argv = NULL; + content_info.args = NULL; + content_info.environ_get = NULL; + if (!task_push_load_content_with_core_from_menu(_path, &content_info, _type, NULL, NULL)) + return -1; + return 0; +} + + #define default_action_ok_set(funcname, _id, _flush) \ static int (funcname)(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) \ { \ @@ -1385,17 +1398,11 @@ static int action_ok_file_load(const char *path, { char menu_path_new[PATH_MAX_LENGTH]; char full_path_new[PATH_MAX_LENGTH]; - content_ctx_info_t content_info; const char *menu_label = NULL; const char *menu_path = NULL; rarch_setting_t *setting = NULL; file_list_t *menu_stack = menu_entries_get_menu_stack_ptr(0); - content_info.argc = 0; - content_info.argv = NULL; - content_info.args = NULL; - content_info.environ_get = NULL; - menu_path_new[0] = full_path_new[0] = '\0'; file_list_get_last(menu_stack, &menu_path, &menu_label, NULL, NULL); @@ -1440,14 +1447,8 @@ static int action_ok_file_load(const char *path, break; } - if (!task_push_load_content_with_core_from_menu( - full_path_new, - &content_info, - CORE_TYPE_PLAIN, - NULL, NULL)) - return -1; - - return 0; + return default_action_ok_load_content_with_core_from_menu(full_path_new, + CORE_TYPE_PLAIN); } @@ -2326,31 +2327,18 @@ static int action_ok_file_load_ffmpeg(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { char new_path[PATH_MAX_LENGTH]; - content_ctx_info_t content_info; - const char *menu_path = NULL; file_list_t *menu_stack = menu_entries_get_menu_stack_ptr(0); + file_list_get_last(menu_stack, &menu_path, NULL, NULL, NULL); new_path[0] = '\0'; - content_info.argc = 0; - content_info.argv = NULL; - content_info.args = NULL; - content_info.environ_get = NULL; - if (!string_is_empty(menu_path)) fill_pathname_join(new_path, menu_path, path, sizeof(new_path)); - if (!task_push_load_content_with_core_from_menu( - new_path, - &content_info, - CORE_TYPE_FFMPEG, - NULL, NULL)) - return -1; - - return 0; + return default_action_ok_load_content_with_core_from_menu(new_path, CORE_TYPE_FFMPEG); } #endif @@ -2358,7 +2346,6 @@ static int action_ok_audio_run(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { char combined_path[PATH_MAX_LENGTH]; - content_ctx_info_t content_info; menu_handle_t *menu = NULL; combined_path[0] = '\0'; @@ -2369,26 +2356,13 @@ static int action_ok_audio_run(const char *path, fill_pathname_join(combined_path, menu->scratch2_buf, menu->scratch_buf, sizeof(combined_path)); - content_info.argc = 0; - content_info.argv = NULL; - content_info.args = NULL; - content_info.environ_get = NULL; - - if (!task_push_load_content_with_core_from_menu( - combined_path, - &content_info, - CORE_TYPE_FFMPEG, - NULL, NULL)) - return -1; - - return 0; + return default_action_ok_load_content_with_core_from_menu(combined_path, CORE_TYPE_FFMPEG); } static int action_ok_file_load_imageviewer(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { char fullpath[PATH_MAX_LENGTH]; - content_ctx_info_t content_info; const char *menu_path = NULL; file_list_t *menu_stack = menu_entries_get_menu_stack_ptr(0); @@ -2396,43 +2370,17 @@ static int action_ok_file_load_imageviewer(const char *path, fullpath[0] = '\0'; - content_info.argc = 0; - content_info.argv = NULL; - content_info.args = NULL; - content_info.environ_get = NULL; - if (!string_is_empty(menu_path)) fill_pathname_join(fullpath, menu_path, path, sizeof(fullpath)); - if (!task_push_load_content_with_core_from_menu( - fullpath, - &content_info, - CORE_TYPE_IMAGEVIEWER, - NULL, NULL)) - return -1; - - return 0; + return default_action_ok_load_content_with_core_from_menu(fullpath, CORE_TYPE_IMAGEVIEWER); } static int action_ok_file_load_current_core(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { - content_ctx_info_t content_info; - - content_info.argc = 0; - content_info.argv = NULL; - content_info.args = NULL; - content_info.environ_get = NULL; - - if (!task_push_load_content_with_core_from_menu( - detect_content_path, - &content_info, - CORE_TYPE_PLAIN, - NULL, NULL)) - return -1; - - return 0; + return default_action_ok_load_content_with_core_from_menu(detect_content_path, CORE_TYPE_PLAIN); } static int action_ok_file_load_detect_core(const char *path, @@ -3654,17 +3602,10 @@ static int action_ok_start_core(const char *path, static int action_ok_load_archive(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { - content_ctx_info_t content_info; - menu_handle_t *menu = NULL; const char *menu_path = NULL; const char *content_path = NULL; - content_info.argc = 0; - content_info.argv = NULL; - content_info.args = NULL; - content_info.environ_get = NULL; - if (!menu_driver_ctl(RARCH_MENU_CTL_DRIVER_DATA_GET, &menu)) return menu_cbs_exit(); @@ -3676,14 +3617,9 @@ static int action_ok_load_archive(const char *path, generic_action_ok_command(CMD_EVENT_LOAD_CORE); - if (!task_push_load_content_with_core_from_menu( + return default_action_ok_load_content_with_core_from_menu( detect_content_path, - &content_info, - CORE_TYPE_PLAIN, - NULL, NULL)) - return -1; - - return 0; + CORE_TYPE_PLAIN); } static int action_ok_load_archive_detect_core(const char *path, From 66c7eccd91650f13054e5b68e9c2f322e544dd68 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 26 Nov 2017 07:35:06 +0100 Subject: [PATCH 155/183] Cut down on code duplication --- menu/cbs/menu_cbs_ok.c | 58 +++++++++++++----------------------------- 1 file changed, 18 insertions(+), 40 deletions(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index fc004a9d32..638d0e40ce 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -1373,6 +1373,21 @@ static int default_action_ok_load_content_with_core_from_menu(const char *_path, return 0; } +static int default_action_ok_load_content_from_playlist_from_menu(const char *_path, const char *path, const char *entry_label) +{ + content_ctx_info_t content_info; + content_info.argc = 0; + content_info.argv = NULL; + content_info.args = NULL; + content_info.environ_get = NULL; + if (!task_push_load_content_from_playlist_from_menu( + _path, path, entry_label, + &content_info, + NULL, NULL)) + return -1; + return 0; +} + #define default_action_ok_set(funcname, _id, _flush) \ static int (funcname)(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) \ @@ -1457,7 +1472,6 @@ static int action_ok_playlist_entry_collection(const char *path, { menu_content_ctx_playlist_info_t playlist_info; char new_core_path[PATH_MAX_LENGTH]; - content_ctx_info_t content_info; size_t selection_ptr = 0; bool playlist_initialized = false; playlist_t *playlist = NULL; @@ -1470,11 +1484,6 @@ static int action_ok_playlist_entry_collection(const char *path, rarch_system_info_t *info = runloop_get_system_info(); struct retro_system_info *system = &info->info; - content_info.argc = 0; - content_info.argv = NULL; - content_info.args = NULL; - content_info.environ_get = NULL; - if (!menu_driver_ctl(RARCH_MENU_CTL_DRIVER_DATA_GET, &menu)) return menu_cbs_exit(); @@ -1552,21 +1561,13 @@ static int action_ok_playlist_entry_collection(const char *path, playlist_get_index(playlist, playlist_info.idx, &path, NULL, NULL, NULL, NULL, NULL); - - if (!task_push_load_content_from_playlist_from_menu( - new_core_path, path, entry_label, - &content_info, - NULL, NULL)) - return -1; - - return 0; + return default_action_ok_load_content_from_playlist_from_menu(new_core_path, path, entry_label); } static int action_ok_playlist_entry(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { menu_content_ctx_playlist_info_t playlist_info; - content_ctx_info_t content_info; char new_core_path[PATH_MAX_LENGTH]; size_t selection_ptr = 0; playlist_t *playlist = g_defaults.content_history; @@ -1576,11 +1577,6 @@ static int action_ok_playlist_entry(const char *path, const char *core_name = NULL; menu_handle_t *menu = NULL; - content_info.argc = 0; - content_info.argv = NULL; - content_info.args = NULL; - content_info.environ_get = NULL; - new_core_path[0] = '\0'; if (!menu_driver_ctl(RARCH_MENU_CTL_DRIVER_DATA_GET, &menu)) @@ -1638,20 +1634,13 @@ static int action_ok_playlist_entry(const char *path, playlist_info.idx, &path, NULL, NULL, NULL, NULL, NULL); - if (!task_push_load_content_from_playlist_from_menu( - new_core_path, path, entry_label, - &content_info, - NULL, NULL)) - return -1; - - return 0; + return default_action_ok_load_content_from_playlist_from_menu(new_core_path, path, entry_label); } static int action_ok_playlist_entry_start_content(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { menu_content_ctx_playlist_info_t playlist_info; - content_ctx_info_t content_info; size_t selection_ptr = 0; bool playlist_initialized = false; playlist_t *playlist = NULL; @@ -1662,11 +1651,6 @@ static int action_ok_playlist_entry_start_content(const char *path, playlist_t *tmp_playlist = NULL; menu_handle_t *menu = NULL; - content_info.argc = 0; - content_info.argv = NULL; - content_info.args = NULL; - content_info.environ_get = NULL; - if (!menu_driver_ctl(RARCH_MENU_CTL_DRIVER_DATA_GET, &menu)) return menu_cbs_exit(); @@ -1743,13 +1727,7 @@ static int action_ok_playlist_entry_start_content(const char *path, playlist_get_index(playlist, playlist_info.idx, &path, NULL, NULL, NULL, NULL, NULL); - if (!task_push_load_content_from_playlist_from_menu( - core_path, path, entry_label, - &content_info, - NULL, NULL)) - return -1; - - return 0; + return default_action_ok_load_content_from_playlist_from_menu(core_path, path, entry_label); } static int action_ok_lookup_setting(const char *path, From b190ac1943d57fc290656f1a84acdb2352182828 Mon Sep 17 00:00:00 2001 From: David Walters Date: Sun, 26 Nov 2017 11:49:37 +0000 Subject: [PATCH 156/183] Add 'mbutton' field to retro_keybind struct --- config.def.keybinds.h | 293 +++++++++++++++++++++--------------------- input/input_driver.h | 2 + 2 files changed, 150 insertions(+), 145 deletions(-) diff --git a/config.def.keybinds.h b/config.def.keybinds.h index 5ed2203f51..6a999a0e32 100644 --- a/config.def.keybinds.h +++ b/config.def.keybinds.h @@ -22,163 +22,166 @@ /* User 1 */ static const struct retro_keybind retro_keybinds_1[] = { - /* | RetroPad button | enum | keyboard key | js btn | js axis | */ + /* | RetroPad button | enum | keyboard key | m-btn | js btn | js axis | */ #ifdef __QNX__ - { true, RETRO_DEVICE_ID_JOYPAD_B, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, RETROK_k, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_Y, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, RETROK_i, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_SELECT, RETROK_v, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_START, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_START, RETROK_b, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_UP, RETROK_e, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_DOWN, RETROK_s, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_LEFT, RETROK_w, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_RIGHT, RETROK_d, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_A, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_A, RETROK_l, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_X, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_X, RETROK_o, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_L, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L, RETROK_f, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_R, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R, RETROK_j, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_L2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L2, RETROK_r, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_R2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R2, RETROK_u, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_L3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L3, RETROK_g, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_R3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R3, RETROK_h, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_B, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, RETROK_k, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_Y, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, RETROK_i, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_SELECT, RETROK_v, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_START, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_START, RETROK_b, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_UP, RETROK_e, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_DOWN, RETROK_s, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_LEFT, RETROK_w, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_RIGHT, RETROK_d, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_A, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_A, RETROK_l, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_X, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_X, RETROK_o, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_L, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L, RETROK_f, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_R, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R, RETROK_j, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_L2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L2, RETROK_r, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_R2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R2, RETROK_u, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_L3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L3, RETROK_g, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_R3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R3, RETROK_h, NO_BTN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_LEFT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_LEFT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_LEFT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_LEFT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_RIGHT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_RIGHT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_RIGHT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_RIGHT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_LEFT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_LEFT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_LEFT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_LEFT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_RIGHT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_RIGHT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_RIGHT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_RIGHT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_TURBO_ENABLE, MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_FAST_FORWARD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_KEY, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_FAST_FORWARD_HOLD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_HOLD_KEY,RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_LOAD_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_SAVE_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_SAVE_STATE_KEY, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_FULLSCREEN_TOGGLE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FULLSCREEN_TOGGLE_KEY,RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_QUIT_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_STATE_SLOT_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_STATE_SLOT_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_REWIND, MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_MOVIE_RECORD_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_PAUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_FRAMEADVANCE, MENU_ENUM_LABEL_VALUE_INPUT_META_FRAMEADVANCE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_RESET, MENU_ENUM_LABEL_VALUE_INPUT_META_RESET, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_SHADER_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_SHADER_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_PREV, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_CHEAT_INDEX_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_CHEAT_INDEX_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_CHEAT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_TOGGLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_SCREENSHOT, MENU_ENUM_LABEL_VALUE_INPUT_META_SCREENSHOT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_MUTE, MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_OSK, MENU_ENUM_LABEL_VALUE_INPUT_META_OSK, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_NETPLAY_FLIP, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_FLIP, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_NETPLAY_GAME_WATCH, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_GAME_WATCH, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_SLOWMOTION, MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ENABLE_HOTKEY, MENU_ENUM_LABEL_VALUE_INPUT_META_ENABLE_HOTKEY, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_VOLUME_UP, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_UP, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_VOLUME_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_DOWN, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_OVERLAY_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_OVERLAY_NEXT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_DISK_EJECT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_EJECT_TOGGLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_DISK_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_NEXT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_DISK_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_PREV, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_GRAB_MOUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GRAB_MOUSE_TOGGLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_GAME_FOCUS_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GAME_FOCUS_TOGGLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_MENU_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, RETROK_SPACE, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_TURBO_ENABLE, MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + + { true, RARCH_FAST_FORWARD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_FAST_FORWARD_HOLD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_HOLD_KEY,RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LOAD_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_SAVE_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_SAVE_STATE_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_FULLSCREEN_TOGGLE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FULLSCREEN_TOGGLE_KEY,RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_QUIT_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_STATE_SLOT_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_STATE_SLOT_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_REWIND, MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_MOVIE_RECORD_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_PAUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_FRAMEADVANCE, MENU_ENUM_LABEL_VALUE_INPUT_META_FRAMEADVANCE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_RESET, MENU_ENUM_LABEL_VALUE_INPUT_META_RESET, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_SHADER_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_SHADER_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_PREV, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_CHEAT_INDEX_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_CHEAT_INDEX_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_CHEAT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_SCREENSHOT, MENU_ENUM_LABEL_VALUE_INPUT_META_SCREENSHOT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_MUTE, MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_OSK, MENU_ENUM_LABEL_VALUE_INPUT_META_OSK, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_NETPLAY_FLIP, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_FLIP, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_NETPLAY_GAME_WATCH, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_GAME_WATCH, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_SLOWMOTION, MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ENABLE_HOTKEY, MENU_ENUM_LABEL_VALUE_INPUT_META_ENABLE_HOTKEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_VOLUME_UP, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_UP, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_VOLUME_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_DOWN, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_OVERLAY_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_OVERLAY_NEXT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_DISK_EJECT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_EJECT_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_DISK_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_NEXT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_DISK_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_PREV, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_GRAB_MOUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GRAB_MOUSE_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_GAME_FOCUS_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GAME_FOCUS_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_MENU_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, RETROK_SPACE, NO_BTN, NO_BTN, 0, AXIS_NONE }, #else - { true, RETRO_DEVICE_ID_JOYPAD_B, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, RETROK_z, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_Y, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, RETROK_a, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_SELECT, RETROK_RSHIFT, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_START, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_START, RETROK_RETURN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_UP, RETROK_UP, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_DOWN, RETROK_DOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_LEFT, RETROK_LEFT, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_RIGHT, RETROK_RIGHT, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_A, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_A, RETROK_x, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_X, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_X, RETROK_s, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_L, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L, RETROK_q, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_R, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R, RETROK_w, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_L2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L2, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_R2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R2, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_L3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L3, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_R3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R3, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_B, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, RETROK_z, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_Y, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, RETROK_a, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_SELECT, RETROK_RSHIFT, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_START, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_START, RETROK_RETURN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_UP, RETROK_UP, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_DOWN, RETROK_DOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_LEFT, RETROK_LEFT, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_RIGHT, RETROK_RIGHT, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_A, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_A, RETROK_x, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_X, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_X, RETROK_s, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_L, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L, RETROK_q, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_R, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R, RETROK_w, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_L2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L2, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_R2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R2, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_L3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L3, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_R3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R3, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_LEFT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_LEFT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_LEFT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_LEFT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_RIGHT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_RIGHT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_RIGHT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_RIGHT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_LEFT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_LEFT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_LEFT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_LEFT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_RIGHT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_RIGHT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_RIGHT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_RIGHT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_TURBO_ENABLE, MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_FAST_FORWARD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_KEY, RETROK_SPACE, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_FAST_FORWARD_HOLD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_HOLD_KEY,RETROK_l, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_LOAD_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, RETROK_F4, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_SAVE_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_SAVE_STATE_KEY, RETROK_F2, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_FULLSCREEN_TOGGLE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FULLSCREEN_TOGGLE_KEY,RETROK_f, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_QUIT_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, RETROK_ESCAPE, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_STATE_SLOT_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS, RETROK_F7, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_STATE_SLOT_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS, RETROK_F6, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_REWIND, MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND, RETROK_r, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_MOVIE_RECORD_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE, RETROK_o, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_PAUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE, RETROK_p, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_FRAMEADVANCE, MENU_ENUM_LABEL_VALUE_INPUT_META_FRAMEADVANCE, RETROK_k, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_RESET, MENU_ENUM_LABEL_VALUE_INPUT_META_RESET, RETROK_h, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_SHADER_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, RETROK_m, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_SHADER_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_PREV, RETROK_n, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_CHEAT_INDEX_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_PLUS, RETROK_y, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_CHEAT_INDEX_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_MINUS, RETROK_t, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_CHEAT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_TOGGLE, RETROK_u, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_SCREENSHOT, MENU_ENUM_LABEL_VALUE_INPUT_META_SCREENSHOT, RETROK_F8, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_MUTE, MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, RETROK_F9, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_OSK, MENU_ENUM_LABEL_VALUE_INPUT_META_OSK, RETROK_F12, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_NETPLAY_FLIP, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_FLIP, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_NETPLAY_GAME_WATCH, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_GAME_WATCH, RETROK_i, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_SLOWMOTION, MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION, RETROK_e, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ENABLE_HOTKEY, MENU_ENUM_LABEL_VALUE_INPUT_META_ENABLE_HOTKEY, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_VOLUME_UP, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_UP, RETROK_KP_PLUS, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_VOLUME_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_DOWN, RETROK_KP_MINUS,NO_BTN, 0, AXIS_NONE }, - { true, RARCH_OVERLAY_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_OVERLAY_NEXT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_DISK_EJECT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_EJECT_TOGGLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_DISK_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_NEXT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_DISK_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_PREV, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_GRAB_MOUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GRAB_MOUSE_TOGGLE, RETROK_F11, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_GAME_FOCUS_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GAME_FOCUS_TOGGLE, RETROK_SCROLLOCK, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_MENU_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, RETROK_F1, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_TURBO_ENABLE, MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + + { true, RARCH_FAST_FORWARD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_KEY, RETROK_SPACE, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_FAST_FORWARD_HOLD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_HOLD_KEY,RETROK_l, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LOAD_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, RETROK_F4, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_SAVE_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_SAVE_STATE_KEY, RETROK_F2, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_FULLSCREEN_TOGGLE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FULLSCREEN_TOGGLE_KEY,RETROK_f, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_QUIT_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, RETROK_ESCAPE, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_STATE_SLOT_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS, RETROK_F7, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_STATE_SLOT_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS, RETROK_F6, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_REWIND, MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND, RETROK_r, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_MOVIE_RECORD_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE, RETROK_o, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_PAUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE, RETROK_p, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_FRAMEADVANCE, MENU_ENUM_LABEL_VALUE_INPUT_META_FRAMEADVANCE, RETROK_k, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_RESET, MENU_ENUM_LABEL_VALUE_INPUT_META_RESET, RETROK_h, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_SHADER_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, RETROK_m, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_SHADER_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_PREV, RETROK_n, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_CHEAT_INDEX_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_PLUS, RETROK_y, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_CHEAT_INDEX_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_MINUS, RETROK_t, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_CHEAT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_TOGGLE, RETROK_u, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_SCREENSHOT, MENU_ENUM_LABEL_VALUE_INPUT_META_SCREENSHOT, RETROK_F8, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_MUTE, MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, RETROK_F9, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_OSK, MENU_ENUM_LABEL_VALUE_INPUT_META_OSK, RETROK_F12, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_NETPLAY_FLIP, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_FLIP, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_NETPLAY_GAME_WATCH, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_GAME_WATCH, RETROK_i, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_SLOWMOTION, MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION, RETROK_e, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ENABLE_HOTKEY, MENU_ENUM_LABEL_VALUE_INPUT_META_ENABLE_HOTKEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_VOLUME_UP, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_UP, RETROK_KP_PLUS, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_VOLUME_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_DOWN, RETROK_KP_MINUS,NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_OVERLAY_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_OVERLAY_NEXT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_DISK_EJECT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_EJECT_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_DISK_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_NEXT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_DISK_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_PREV, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_GRAB_MOUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GRAB_MOUSE_TOGGLE, RETROK_F11, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_GAME_FOCUS_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GAME_FOCUS_TOGGLE, RETROK_SCROLLOCK, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_MENU_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, RETROK_F1, NO_BTN, NO_BTN, 0, AXIS_NONE }, #endif }; /* Users 2 to MAX_USERS */ static const struct retro_keybind retro_keybinds_rest[] = { - /* | RetroPad button | desc | keyboard key | js btn | js axis | */ - { true, RETRO_DEVICE_ID_JOYPAD_B, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_Y, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_SELECT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_START, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_START, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_UP, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_DOWN, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_LEFT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_RIGHT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_A, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_A, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_X, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_X, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_L, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_R, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_L2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L2, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_R2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R2, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_L3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L3, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_R3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R3, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, + /* | RetroPad button | desc | keyboard key | js btn | js axis | */ + { true, RETRO_DEVICE_ID_JOYPAD_B, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_Y, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_SELECT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_START, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_START, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_UP, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_DOWN, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_LEFT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_RIGHT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_A, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_A, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_X, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_X, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_L, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_R, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_L2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L2, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_R2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R2, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_L3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L3, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_R3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R3, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_LEFT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_LEFT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_LEFT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_LEFT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_RIGHT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_RIGHT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_RIGHT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_RIGHT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_TURBO_ENABLE, MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_LEFT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_LEFT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_LEFT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_LEFT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_RIGHT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_RIGHT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_RIGHT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_RIGHT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + + { true, RARCH_TURBO_ENABLE, MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, }; #endif diff --git a/input/input_driver.h b/input/input_driver.h index d760e6fe43..215766058c 100644 --- a/input/input_driver.h +++ b/input/input_driver.h @@ -96,6 +96,8 @@ struct retro_keybind enum msg_hash_enums enum_idx; enum retro_key key; + uint16_t mbutton; + /* Joypad key. Joypad POV (hats) * are embedded into this key as well. */ uint64_t joykey; From 56ea1253ffa3736bbe89d818ea152a26a06c7962 Mon Sep 17 00:00:00 2001 From: David Walters Date: Sun, 26 Nov 2017 11:51:07 +0000 Subject: [PATCH 157/183] msg_hash strings for mouse buttons+wheel *English Only* --- intl/msg_hash_chs.h | 18 ++++++++++++++++++ intl/msg_hash_cht.h | 18 ++++++++++++++++++ intl/msg_hash_de.h | 18 ++++++++++++++++++ intl/msg_hash_eo.h | 18 ++++++++++++++++++ intl/msg_hash_fr.h | 18 ++++++++++++++++++ intl/msg_hash_it.h | 18 ++++++++++++++++++ intl/msg_hash_ja.h | 18 ++++++++++++++++++ intl/msg_hash_ko.h | 18 ++++++++++++++++++ intl/msg_hash_nl.h | 18 ++++++++++++++++++ intl/msg_hash_pt_br.h | 18 ++++++++++++++++++ intl/msg_hash_pt_pt.h | 18 ++++++++++++++++++ intl/msg_hash_ru.h | 18 ++++++++++++++++++ intl/msg_hash_us.h | 18 ++++++++++++++++++ intl/msg_hash_vn.h | 18 ++++++++++++++++++ msg_hash.h | 9 +++++++++ 15 files changed, 261 insertions(+) diff --git a/intl/msg_hash_chs.h b/intl/msg_hash_chs.h index 142ffad5d7..db03e7ddd5 100644 --- a/intl/msg_hash_chs.h +++ b/intl/msg_hash_chs.h @@ -744,6 +744,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, "Y键(左侧)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(键: %s)") /*FIXME:"(Key: %s)"*/ +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "MOUSE1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "MOUSE2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "MOUSE3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "MOUSE4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "MOUSE5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "MWHEELUP") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "MWHEELDN") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "MWHEELLEFT") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "MWHEELRIGHT") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "键盘控制器映射类型") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, diff --git a/intl/msg_hash_cht.h b/intl/msg_hash_cht.h index 9e13d1de7d..6eeed496da 100644 --- a/intl/msg_hash_cht.h +++ b/intl/msg_hash_cht.h @@ -744,6 +744,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, "Y鍵(左側)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(鍵: %s)") /*FIXME:"(Key: %s)"*/ +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "MOUSE1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "MOUSE2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "MOUSE3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "MOUSE4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "MOUSE5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "MWHEELUP") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "MWHEELDN") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "MWHEELLEFT") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "MWHEELRIGHT") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "鍵盤控制器映射類型") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, diff --git a/intl/msg_hash_de.h b/intl/msg_hash_de.h index 44c710daff..7b8eb52625 100644 --- a/intl/msg_hash_de.h +++ b/intl/msg_hash_de.h @@ -751,6 +751,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, "Y-Knopf (links)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Taste: %s)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "MOUSE1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "MOUSE2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "MOUSE3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "MOUSE4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "MOUSE5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "MWHEELUP") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "MWHEELDN") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "MWHEELLEFT") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "MWHEELRIGHT") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "Typ der Keyboard-Controller-Abbildung") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, diff --git a/intl/msg_hash_eo.h b/intl/msg_hash_eo.h index c17db311bb..627cabb0e4 100644 --- a/intl/msg_hash_eo.h +++ b/intl/msg_hash_eo.h @@ -660,6 +660,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, "Y button (left)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Key: %s)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "MOUSE1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "MOUSE2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "MOUSE3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "MOUSE4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "MOUSE5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "MWHEELUP") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "MWHEELDN") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "MWHEELLEFT") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "MWHEELRIGHT") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "Keyboard Gamepad Mapping Type") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, diff --git a/intl/msg_hash_fr.h b/intl/msg_hash_fr.h index fa1094a768..ad92c95526 100644 --- a/intl/msg_hash_fr.h +++ b/intl/msg_hash_fr.h @@ -745,6 +745,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, "Bouton Y (gauche)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Touche : %s)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "MOUSE1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "MOUSE2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "MOUSE3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "MOUSE4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "MOUSE5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "MWHEELUP") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "MWHEELDN") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "MWHEELLEFT") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "MWHEELRIGHT") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "Type de mappage manette/clavier") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, diff --git a/intl/msg_hash_it.h b/intl/msg_hash_it.h index 2ebdad385b..d8f989e0ae 100644 --- a/intl/msg_hash_it.h +++ b/intl/msg_hash_it.h @@ -751,6 +751,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, "Pulsante Y (sinistro)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Tasto: %s)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "MOUSE1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "MOUSE2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "MOUSE3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "MOUSE4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "MOUSE5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "MWHEELUP") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "MWHEELDN") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "MWHEELLEFT") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "MWHEELRIGHT") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "Tipo di mappatura del gamepad della tastiera") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, diff --git a/intl/msg_hash_ja.h b/intl/msg_hash_ja.h index 3c772118af..eb233b64c6 100644 --- a/intl/msg_hash_ja.h +++ b/intl/msg_hash_ja.h @@ -769,6 +769,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, "Yボタン(左)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(キー: %s)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "MOUSE1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "MOUSE2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "MOUSE3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "MOUSE4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "MOUSE5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "MWHEELUP") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "MWHEELDN") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "MWHEELLEFT") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "MWHEELRIGHT") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "キーボードのゲームパッドマッピング式") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, diff --git a/intl/msg_hash_ko.h b/intl/msg_hash_ko.h index f4e980e451..f05b7b4ceb 100644 --- a/intl/msg_hash_ko.h +++ b/intl/msg_hash_ko.h @@ -731,6 +731,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, "Y 버튼 (좌)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(키: %s)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "MOUSE1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "MOUSE2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "MOUSE3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "MOUSE4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "MOUSE5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "MWHEELUP") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "MWHEELDN") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "MWHEELLEFT") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "MWHEELRIGHT") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "키보드 게임패드 설정 형식") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, diff --git a/intl/msg_hash_nl.h b/intl/msg_hash_nl.h index d414566d66..aa441fa969 100644 --- a/intl/msg_hash_nl.h +++ b/intl/msg_hash_nl.h @@ -660,6 +660,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, "Y knop (left)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Key: %s)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "MOUSE1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "MOUSE2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "MOUSE3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "MOUSE4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "MOUSE5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "MWHEELUP") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "MWHEELDN") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "MWHEELLEFT") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "MWHEELRIGHT") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "Keyboard Gamepad Mapping Type") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, diff --git a/intl/msg_hash_pt_br.h b/intl/msg_hash_pt_br.h index dcaeaebd75..c8ce759e90 100644 --- a/intl/msg_hash_pt_br.h +++ b/intl/msg_hash_pt_br.h @@ -757,6 +757,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Tecla: %s)" ) +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "MOUSE1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "MOUSE2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "MOUSE3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "MOUSE4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "MOUSE5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "MWHEELUP") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "MWHEELDN") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "MWHEELLEFT") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "MWHEELRIGHT") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "Tipo de Mapeamento para Gamepad no Teclado" ) diff --git a/intl/msg_hash_pt_pt.h b/intl/msg_hash_pt_pt.h index 800463bdc5..bfb5b7cb3a 100644 --- a/intl/msg_hash_pt_pt.h +++ b/intl/msg_hash_pt_pt.h @@ -731,6 +731,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, "Botão Y (esquerda)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Tecla: %s)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "MOUSE1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "MOUSE2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "MOUSE3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "MOUSE4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "MOUSE5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "MWHEELUP") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "MWHEELDN") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "MWHEELLEFT") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "MWHEELRIGHT") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "Tipo de Mapeamento do Gamepad no Teclado") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, diff --git a/intl/msg_hash_ru.h b/intl/msg_hash_ru.h index f2e9a9826a..dfa3f024c7 100644 --- a/intl/msg_hash_ru.h +++ b/intl/msg_hash_ru.h @@ -754,6 +754,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, "Кнопка Y") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Клавиша: %s)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "MOUSE1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "MOUSE2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "MOUSE3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "MOUSE4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "MOUSE5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "MWHEELUP") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "MWHEELDN") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "MWHEELLEFT") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "MWHEELRIGHT") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "Тип отображения клавиатуры для геймпада") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 1cbd3d133f..565e1b85f3 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -763,6 +763,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, "Y button (left)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Key: %s)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "MOUSE1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "MOUSE2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "MOUSE3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "MOUSE4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "MOUSE5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "MWHEELUP") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "MWHEELDN") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "MWHEELLEFT") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "MWHEELRIGHT") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "Keyboard Gamepad Mapping Type") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, diff --git a/intl/msg_hash_vn.h b/intl/msg_hash_vn.h index ca95e43315..00adb3fc70 100644 --- a/intl/msg_hash_vn.h +++ b/intl/msg_hash_vn.h @@ -743,6 +743,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, "Y button (left)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Key: %s)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "MOUSE1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "MOUSE2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "MOUSE3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "MOUSE4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "MOUSE5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "MWHEELUP") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "MWHEELDN") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "MWHEELLEFT") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "MWHEELRIGHT") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "Keyboard Gamepad Mapping Type") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, diff --git a/msg_hash.h b/msg_hash.h index 8d43407884..8eb389a235 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -547,6 +547,15 @@ enum msg_hash_enums MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R3, MENU_ENUM_LABEL_VALUE_INPUT_KEY, + MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X, From 1d70fef70c84f9715d249bec9c4145665dab13bd Mon Sep 17 00:00:00 2001 From: David Walters Date: Sun, 26 Nov 2017 11:54:10 +0000 Subject: [PATCH 158/183] load/save mbutton assignments to retroarch config --- configuration.c | 52 ++++++++++++++++++++++++++++++++++++++++++++ input/input_driver.c | 49 +++++++++++++++++++++++++++++++++++++++++ input/input_driver.h | 3 +++ 3 files changed, 104 insertions(+) diff --git a/configuration.c b/configuration.c index 9d95452cdb..7f2fa1fc91 100644 --- a/configuration.c +++ b/configuration.c @@ -2143,6 +2143,24 @@ static void read_keybinds_axis(config_file_t *conf, unsigned user, input_config_bind_map_get_base(idx), bind); } +static void read_keybinds_mbutton(config_file_t *conf, unsigned user, + unsigned idx, struct retro_keybind *bind) +{ + const char *prefix = NULL; + + if (!input_config_bind_map_get_valid(idx)) + return; + if (!input_config_bind_map_get_base(idx)) + return; + + prefix = input_config_get_prefix(user, + input_config_bind_map_get_meta(idx)); + + if (prefix) + input_config_parse_mouse_button(conf, prefix, + input_config_bind_map_get_base(idx), bind); +} + static void read_keybinds_user(config_file_t *conf, unsigned user) { unsigned i; @@ -2157,6 +2175,7 @@ static void read_keybinds_user(config_file_t *conf, unsigned user) read_keybinds_keyboard(conf, user, i, bind); read_keybinds_button(conf, user, i, bind); read_keybinds_axis(conf, user, i, bind); + read_keybinds_mbutton(conf, user, i, bind); } } @@ -3349,6 +3368,38 @@ static void save_keybind_axis(config_file_t *conf, const char *prefix, } } +static void save_keybind_mbutton(config_file_t *conf, const char *prefix, + const char *base, const struct retro_keybind *bind, bool save_empty) +{ + char key[64]; + + key[0] = '\0'; + + fill_pathname_join_delim_concat(key, prefix, + base, '_', "_mbtn", sizeof(key)); + + switch ( bind->mbutton ) + { + + case RETRO_DEVICE_ID_MOUSE_LEFT: config_set_uint64(conf, key, 1); break; + case RETRO_DEVICE_ID_MOUSE_RIGHT: config_set_uint64(conf, key, 2); break; + case RETRO_DEVICE_ID_MOUSE_MIDDLE: config_set_uint64(conf, key, 3); break; + case RETRO_DEVICE_ID_MOUSE_BUTTON_4: config_set_uint64(conf, key, 4); break; + case RETRO_DEVICE_ID_MOUSE_BUTTON_5: config_set_uint64(conf, key, 5); break; + + case RETRO_DEVICE_ID_MOUSE_WHEELUP: config_set_string(conf, key, "wu"); break; + case RETRO_DEVICE_ID_MOUSE_WHEELDOWN: config_set_string(conf, key, "wd"); break; + case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP: config_set_string(conf, key, "whu"); break; + case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN: config_set_string(conf, key, "whd"); break; + + default: + if ( save_empty ) { + config_set_string(conf, key, file_path_str(FILE_PATH_NUL)); + } + break; + } +} + /** * save_keybind: * @conf : pointer to config file object @@ -3369,6 +3420,7 @@ static void save_keybind(config_file_t *conf, const char *prefix, save_keybind_key(conf, prefix, base, bind); save_keybind_joykey(conf, prefix, base, bind, save_empty); save_keybind_axis(conf, prefix, base, bind, save_empty); + save_keybind_mbutton(conf, prefix, base, bind, save_empty); } /** diff --git a/input/input_driver.c b/input/input_driver.c index 522f6caab8..e76f0189b4 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -2410,6 +2410,55 @@ void input_config_parse_joy_axis(void *data, const char *prefix, } } +void input_config_parse_mouse_button(void *data, const char *prefix, + const char *btn, struct retro_keybind *bind) +{ + int val; + char str[256]; + char tmp[64]; + char key[64]; + config_file_t *conf = (config_file_t*)data; + + str[0] = tmp[0] = key[0] = '\0'; + + fill_pathname_join_delim(str, prefix, btn, + '_', sizeof(str)); + fill_pathname_join_delim(key, str, + "mbtn", '_', sizeof(key)); + + if ( bind && config_get_array(conf, key, tmp, sizeof(tmp)) ) + { + bind->mbutton = NO_BTN; + + if ( tmp[0]=='w' ) + { + switch ( tmp[1] ) { + case 'u': bind->mbutton = RETRO_DEVICE_ID_MOUSE_WHEELUP; break; + case 'd': bind->mbutton = RETRO_DEVICE_ID_MOUSE_WHEELDOWN; break; + case 'h': + { + switch ( tmp[2] ) { + case 'u': bind->mbutton = RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP; break; + case 'd': bind->mbutton = RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN; break; + } + } + break; + } + } + else + { + val = atoi(tmp); + switch ( val ) { + case 1: bind->mbutton = RETRO_DEVICE_ID_MOUSE_LEFT; break; + case 2: bind->mbutton = RETRO_DEVICE_ID_MOUSE_RIGHT; break; + case 3: bind->mbutton = RETRO_DEVICE_ID_MOUSE_MIDDLE; break; + case 4: bind->mbutton = RETRO_DEVICE_ID_MOUSE_BUTTON_4; break; + case 5: bind->mbutton = RETRO_DEVICE_ID_MOUSE_BUTTON_5; break; + } + } + } +} + static void input_config_get_bind_string_joykey( char *buf, const char *prefix, const struct retro_keybind *bind, size_t size) diff --git a/input/input_driver.h b/input/input_driver.h index 215766058c..7cd3c068a6 100644 --- a/input/input_driver.h +++ b/input/input_driver.h @@ -761,6 +761,9 @@ void input_config_parse_joy_button(void *data, const char *prefix, void input_config_parse_joy_axis(void *data, const char *prefix, const char *axis, struct retro_keybind *bind); +void input_config_parse_mouse_button(void *data, const char *prefix, + const char *btn, struct retro_keybind *bind); + void input_config_set_device_name(unsigned port, const char *name); void input_config_clear_device_name(unsigned port); From 25efae063065b28263a3cef897496726c0047583 Mon Sep 17 00:00:00 2001 From: David Walters Date: Sun, 26 Nov 2017 11:56:02 +0000 Subject: [PATCH 159/183] Show mbutton binds on settings list; comma separate joy and key bins --- input/input_driver.c | 58 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 55 insertions(+), 3 deletions(-) diff --git a/input/input_driver.c b/input/input_driver.c index e76f0189b4..d603a6a12e 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -2501,9 +2501,9 @@ static void input_config_get_bind_string_joykey( { if (bind->joykey_label && !string_is_empty(bind->joykey_label) && label_show) - snprintf(buf, size, "%s%s (btn) ", prefix, bind->joykey_label); + snprintf(buf, size, "%s%s (btn)", prefix, bind->joykey_label); else - snprintf(buf, size, "%s%u (%s) ", prefix, (unsigned)bind->joykey, + snprintf(buf, size, "%s%u (%s)", prefix, (unsigned)bind->joykey, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE)); } } @@ -2531,7 +2531,7 @@ static void input_config_get_bind_string_joyaxis(char *buf, const char *prefix, dir = '+'; axis = AXIS_POS_GET(bind->joyaxis); } - snprintf(buf, size, "%s%c%u (%s) ", prefix, dir, axis, + snprintf(buf, size, "%s%c%u (%s)", prefix, dir, axis, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE)); } } @@ -2539,6 +2539,7 @@ static void input_config_get_bind_string_joyaxis(char *buf, const char *prefix, void input_config_get_bind_string(char *buf, const struct retro_keybind *bind, const struct retro_keybind *auto_bind, size_t size) { + int delim = 0; #ifndef RARCH_CONSOLE char key[64]; char keybuf[64]; @@ -2556,17 +2557,68 @@ void input_config_get_bind_string(char *buf, const struct retro_keybind *bind, else if (auto_bind && auto_bind->joyaxis != AXIS_NONE) input_config_get_bind_string_joyaxis(buf, "Auto: ", auto_bind, size); + if ( *buf ) { + delim = 1; + } + #ifndef RARCH_CONSOLE input_keymaps_translate_rk_to_str(bind->key, key, sizeof(key)); if (string_is_equal(key, file_path_str(FILE_PATH_NUL))) *key = '\0'; /*empty?*/ if ( *key != '\0' ) { + if ( delim ) { + strlcat(buf, ", ", size); + } snprintf(keybuf, sizeof(keybuf), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_KEY), key); strlcat(buf, keybuf, size); + delim = 1; } #endif + if ( bind->mbutton != NO_BTN ) + { + int tag = 0; + switch ( bind->mbutton ) + { + case RETRO_DEVICE_ID_MOUSE_LEFT: + tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT; + break; + case RETRO_DEVICE_ID_MOUSE_RIGHT: + tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT; + break; + case RETRO_DEVICE_ID_MOUSE_MIDDLE: + tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE; + break; + case RETRO_DEVICE_ID_MOUSE_BUTTON_4: + tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4; + break; + case RETRO_DEVICE_ID_MOUSE_BUTTON_5: + tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5; + break; + case RETRO_DEVICE_ID_MOUSE_WHEELUP: + tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP; + break; + case RETRO_DEVICE_ID_MOUSE_WHEELDOWN: + tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN; + break; + case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP: + tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP; + break; + case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN: + tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN; + break; + } /* switch ( bind->mbutton ) */ + + if ( tag != 0 ) { + if ( delim ) { + strlcat(buf, ", ", size); + } + strlcat( buf, msg_hash_to_str(tag), size ); + delim = 1; + } + } + /*completely empty?*/ if ( *buf == '\0' ) { strlcat(buf, "---", size); From b2674195515cfce2879a2766efaa203379c69e9b Mon Sep 17 00:00:00 2001 From: David Walters Date: Sun, 26 Nov 2017 11:56:55 +0000 Subject: [PATCH 160/183] initialise/clear mbutton field --- menu/cbs/menu_cbs_scan.c | 1 + menu/menu_setting.c | 1 + setting_list.c | 2 ++ 3 files changed, 4 insertions(+) diff --git a/menu/cbs/menu_cbs_scan.c b/menu/cbs/menu_cbs_scan.c index 965e99207e..213b6b8ad1 100644 --- a/menu/cbs/menu_cbs_scan.c +++ b/menu/cbs/menu_cbs_scan.c @@ -144,6 +144,7 @@ static int action_scan_input_desc(const char *path, target->key = RETROK_UNKNOWN; target->joykey = NO_BTN; target->joyaxis = AXIS_NONE; + target->mbutton = NO_BTN; } return 0; diff --git a/menu/menu_setting.c b/menu/menu_setting.c index bb39557308..17e388340b 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -1441,6 +1441,7 @@ static int setting_action_ok_bind_defaults(void *data, bool wraparound) target->key = def_binds[i - MENU_SETTINGS_BIND_BEGIN].key; target->joykey = NO_BTN; target->joyaxis = AXIS_NONE; + target->mbutton = NO_BTN; } return 0; diff --git a/setting_list.c b/setting_list.c index ebb84273fd..1b69342c31 100644 --- a/setting_list.c +++ b/setting_list.c @@ -131,6 +131,8 @@ static int setting_bind_action_start(void *data) bind_type = setting_get_bind_type(setting); keybind->key = def_binds[bind_type - MENU_SETTINGS_BIND_BEGIN].key; + keybind->mbutton = NO_BTN; + return 0; } #endif From 9682e2777b346c9e2ff6d67a26298b89dfbdb11e Mon Sep 17 00:00:00 2001 From: David Walters Date: Sun, 26 Nov 2017 12:55:17 +0000 Subject: [PATCH 161/183] support for mouse button binds in Windows input drivers --- input/drivers/dinput.c | 52 +- input/drivers/winraw_input.c | 1481 ++++++++++++++++++---------------- 2 files changed, 814 insertions(+), 719 deletions(-) diff --git a/input/drivers/dinput.c b/input/drivers/dinput.c index f890444e46..6e525355f0 100644 --- a/input/drivers/dinput.c +++ b/input/drivers/dinput.c @@ -267,6 +267,49 @@ static bool dinput_keyboard_pressed(struct dinput_input *di, unsigned key) return di->state[sym] & 0x80; } +static bool dinput_mbutton_pressed(struct dinput_input *di, unsigned key) +{ + bool result; + + switch ( key ) + { + + case RETRO_DEVICE_ID_MOUSE_LEFT: + return di->mouse_l; + case RETRO_DEVICE_ID_MOUSE_RIGHT: + return di->mouse_r; + case RETRO_DEVICE_ID_MOUSE_MIDDLE: + return di->mouse_m; + case RETRO_DEVICE_ID_MOUSE_BUTTON_4: + return di->mouse_b4; + case RETRO_DEVICE_ID_MOUSE_BUTTON_5: + return di->mouse_b5; + + case RETRO_DEVICE_ID_MOUSE_WHEELUP: + result = di->mouse_wu; + di->mouse_wu = false; + return result; + + case RETRO_DEVICE_ID_MOUSE_WHEELDOWN: + result = di->mouse_wd; + di->mouse_wd = false; + return result; + + case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP: + result = di->mouse_hwu; + di->mouse_hwu = false; + return result; + + case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN: + result = di->mouse_hwd; + di->mouse_hwd = false; + return result; + + } + + return false; +} + static bool dinput_is_pressed(struct dinput_input *di, rarch_joypad_info_t joypad_info, const struct retro_keybind *binds, @@ -276,8 +319,13 @@ static bool dinput_is_pressed(struct dinput_input *di, if (!di->blocked && (bind->key < RETROK_LAST) && dinput_keyboard_pressed(di, bind->key)) return true; - if (binds && binds[id].valid && input_joypad_pressed(di->joypad, joypad_info, port, binds, id)) - return true; + if (binds && binds[id].valid) + { + if (dinput_mbutton_pressed(di, bind->mbutton)) + return true; + if (input_joypad_pressed(di->joypad, joypad_info, port, binds, id)) + return true; + } return false; } diff --git a/input/drivers/winraw_input.c b/input/drivers/winraw_input.c index cd844e838e..c7397d39d8 100644 --- a/input/drivers/winraw_input.c +++ b/input/drivers/winraw_input.c @@ -1,717 +1,764 @@ -/* RetroArch - A frontend for libretro. - * Copyright (C) 2011-2017 - Daniel De Matteis - * - * RetroArch is free software: you can redistribute it and/or modify it under the terms - * of the GNU General Public License as published by the Free Software Found- - * ation, either version 3 of the License, or (at your option) any later version. - * - * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with RetroArch. - * If not, see . - */ - -#include - -#include "../input_driver.h" -#include "../input_keymaps.h" - -#include "../../configuration.h" -#include "../../gfx/video_driver.h" -#include "../../verbosity.h" - -typedef struct -{ - uint8_t keys[256]; -} winraw_keyboard_t; - -typedef struct -{ - HANDLE hnd; - LONG x, y, dlt_x, dlt_y; - LONG whl_u, whl_d; - bool btn_l, btn_m, btn_r, btn_b4, btn_b5; -} winraw_mouse_t; - -typedef struct -{ - bool kbd_mapp_block; - bool mouse_grab; - winraw_keyboard_t keyboard; - HWND window; - winraw_mouse_t *mice; - const input_device_driver_t *joypad; -} winraw_input_t; - -static winraw_keyboard_t *g_keyboard = NULL; -static winraw_mouse_t *g_mice = NULL; -static unsigned g_mouse_cnt = 0; -static bool g_mouse_xy_mapping_ready = false; -static double g_view_abs_ratio_x = 0.0; -static double g_view_abs_ratio_y = 0.0; - -static HWND winraw_create_window(WNDPROC wnd_proc) -{ - HWND wnd; - WNDCLASSA wc = {0}; - - wc.hInstance = GetModuleHandleA(NULL); - - if (!wc.hInstance) - { - RARCH_ERR("[WINRAW]: GetModuleHandleA failed with error %lu.\n", GetLastError()); - return NULL; - } - - wc.lpfnWndProc = wnd_proc; - wc.lpszClassName = "winraw-input"; - if (!RegisterClassA(&wc) && GetLastError() != ERROR_CLASS_ALREADY_EXISTS) - { - RARCH_ERR("[WINRAW]: RegisterClassA failed with error %lu.\n", GetLastError()); - return NULL; - } - - wnd = CreateWindowExA(0, wc.lpszClassName, NULL, 0, 0, 0, 0, 0, - HWND_MESSAGE, NULL, NULL, NULL); - if (!wnd) - { - RARCH_ERR("[WINRAW]: CreateWindowExA failed with error %lu.\n", GetLastError()); - goto error; - } - - return wnd; - -error: - UnregisterClassA(wc.lpszClassName, NULL); - return NULL; -} - -static void winraw_destroy_window(HWND wnd) -{ - BOOL r; - - if (!wnd) - return; - - r = DestroyWindow(wnd); - - if (!r) - { - RARCH_WARN("[WINRAW]: DestroyWindow failed with error %lu.\n", GetLastError()); - } - - r = UnregisterClassA("winraw-input", NULL); - - if (!r) - { - RARCH_WARN("[WINRAW]: UnregisterClassA failed with error %lu.\n", GetLastError()); - } -} - -static bool winraw_set_keyboard_input(HWND window) -{ - RAWINPUTDEVICE rid; - BOOL r; - - rid.dwFlags = window ? 0 : RIDEV_REMOVE; - rid.hwndTarget = window; - rid.usUsagePage = 0x01; /* generic desktop */ - rid.usUsage = 0x06; /* keyboard */ - - r = RegisterRawInputDevices(&rid, 1, sizeof(RAWINPUTDEVICE)); - - if (!r) - { - RARCH_ERR("[WINRAW]: RegisterRawInputDevices failed with error %lu.\n", GetLastError()); - return false; - } - - return true; -} - -static void winraw_log_mice_info(winraw_mouse_t *mice, unsigned mouse_cnt) -{ - UINT r; - unsigned i; - char name[256]; - UINT name_size = sizeof(name); - - for (i = 0; i < mouse_cnt; ++i) - { - r = GetRawInputDeviceInfoA(mice[i].hnd, RIDI_DEVICENAME, name, &name_size); - if (r == (UINT)-1 || r == 0) - name[0] = '\0'; - RARCH_LOG("[WINRAW]: Mouse #%u %s.\n", i, name); - } -} - -static bool winraw_init_devices(winraw_mouse_t **mice, unsigned *mouse_cnt) -{ - UINT i; - POINT crs_pos; - winraw_mouse_t *mice_r = NULL; - unsigned mouse_cnt_r = 0; - RAWINPUTDEVICELIST *devs = NULL; - UINT dev_cnt = 0; - UINT r = GetRawInputDeviceList( - NULL, &dev_cnt, sizeof(RAWINPUTDEVICELIST)); - - if (r == (UINT)-1) - { - RARCH_ERR("[WINRAW]: GetRawInputDeviceList failed with error %lu.\n", GetLastError()); - goto error; - } - - devs = (RAWINPUTDEVICELIST*)malloc(dev_cnt * sizeof(RAWINPUTDEVICELIST)); - if (!devs) - goto error; - - dev_cnt = GetRawInputDeviceList(devs, &dev_cnt, sizeof(RAWINPUTDEVICELIST)); - if (dev_cnt == (UINT)-1) - { - RARCH_ERR("[WINRAW]: GetRawInputDeviceList failed with error %lu.\n", GetLastError()); - goto error; - } - - for (i = 0; i < dev_cnt; ++i) - mouse_cnt_r += devs[i].dwType == RIM_TYPEMOUSE ? 1 : 0; - - if (mouse_cnt_r) - { - mice_r = (winraw_mouse_t*)calloc(1, mouse_cnt_r * sizeof(winraw_mouse_t)); - if (!mice_r) - goto error; - - if (!GetCursorPos(&crs_pos)) - goto error; - - for (i = 0; i < mouse_cnt_r; ++i) - { - mice_r[i].x = crs_pos.x; - mice_r[i].y = crs_pos.y; - } - } - - /* count is already checked, so this is safe */ - for (i = mouse_cnt_r = 0; i < dev_cnt; ++i) - { - if (devs[i].dwType == RIM_TYPEMOUSE) - mice_r[mouse_cnt_r++].hnd = devs[i].hDevice; - } - - winraw_log_mice_info(mice_r, mouse_cnt_r); - - *mice = mice_r; - *mouse_cnt = mouse_cnt_r; - - return true; - -error: - free(devs); - free(mice_r); - *mice = NULL; - *mouse_cnt = 0; - return false; -} - -static bool winraw_set_mouse_input(HWND window, bool grab) -{ - RAWINPUTDEVICE rid; - BOOL r; - - if (window) - rid.dwFlags = grab ? RIDEV_CAPTUREMOUSE : 0; - else - rid.dwFlags = RIDEV_REMOVE; - - rid.hwndTarget = window; - rid.usUsagePage = 0x01; /* generic desktop */ - rid.usUsage = 0x02; /* mouse */ - - r = RegisterRawInputDevices(&rid, 1, sizeof(RAWINPUTDEVICE)); - - if (!r) - { - RARCH_ERR("[WINRAW]: RegisterRawInputDevice failed with error %lu.\n", GetLastError()); - return false; - } - - return true; -} - -static int16_t winraw_mouse_state(winraw_input_t *wr, - unsigned port, bool abs, unsigned id) -{ - unsigned i; - settings_t *settings = config_get_ptr(); - winraw_mouse_t *mouse = NULL; - - if (port >= MAX_USERS) - return 0; - - for (i = 0; i < g_mouse_cnt; ++i) - { - if (i == settings->uints.input_mouse_index[port]) - { - mouse = &wr->mice[i]; - break; - } - } - - if (!mouse) - return 0; - - switch (id) - { - case RETRO_DEVICE_ID_MOUSE_X: - return abs ? mouse->x : mouse->dlt_x; - case RETRO_DEVICE_ID_MOUSE_Y: - return abs ? mouse->y : mouse->dlt_y; - case RETRO_DEVICE_ID_MOUSE_LEFT: - return mouse->btn_l ? 1 : 0; - case RETRO_DEVICE_ID_MOUSE_RIGHT: - return mouse->btn_r ? 1 : 0; - case RETRO_DEVICE_ID_MOUSE_WHEELUP: - return mouse->whl_u ? 1 : 0; - case RETRO_DEVICE_ID_MOUSE_WHEELDOWN: - return mouse->whl_d ? 1 : 0; - case RETRO_DEVICE_ID_MOUSE_MIDDLE: - return mouse->btn_m ? 1 : 0; - case RETRO_DEVICE_ID_MOUSE_BUTTON_4: - return mouse->btn_b4 ? 1 : 0; - case RETRO_DEVICE_ID_MOUSE_BUTTON_5: - return mouse->btn_b5 ? 1 : 0; - } - - return 0; -} - -static int16_t winraw_joypad_state(winraw_input_t *wr, - rarch_joypad_info_t joypad_info, - const struct retro_keybind *binds, - unsigned port, unsigned id) -{ - const struct retro_keybind *bind = &binds[id]; - unsigned key = rarch_keysym_lut[(enum retro_key)bind->key]; - - if (!wr->kbd_mapp_block && (bind->key < RETROK_LAST) && wr->keyboard.keys[key]) - return 1; - - return input_joypad_pressed(wr->joypad, joypad_info, port, binds, id); -} - -static void winraw_init_mouse_xy_mapping() -{ - struct video_viewport viewport; - int center_x; - int center_y; - unsigned i; - - if (video_driver_get_viewport_info(&viewport)) - { - center_x = viewport.x + viewport.width / 2; - center_y = viewport.y + viewport.height / 2; - - for (i = 0; i < g_mouse_cnt; ++i) - { - g_mice[i].x = center_x; - g_mice[i].y = center_y; - } - - g_view_abs_ratio_x = (double)viewport.full_width / 65535.0; - g_view_abs_ratio_y = (double)viewport.full_height / 65535.0; - - g_mouse_xy_mapping_ready = true; - } -} - -static int16_t winraw_lightgun_state(winraw_input_t *wr, - unsigned port, unsigned id) -{ - unsigned i; - settings_t *settings = config_get_ptr(); - winraw_mouse_t *mouse = NULL; - - if (port >= MAX_USERS) - return 0; - - for (i = 0; i < g_mouse_cnt; ++i) - { - if (i == settings->uints.input_mouse_index[port]) - { - mouse = &wr->mice[i]; - break; - } - } - - if (!mouse) - return 0; - - switch (id) - { - case RETRO_DEVICE_ID_LIGHTGUN_X: - return mouse->dlt_x; - case RETRO_DEVICE_ID_LIGHTGUN_Y: - return mouse->dlt_y; - case RETRO_DEVICE_ID_LIGHTGUN_TRIGGER: - return mouse->btn_l ? 1 : 0; - case RETRO_DEVICE_ID_LIGHTGUN_CURSOR: - return mouse->btn_m ? 1 : 0; - case RETRO_DEVICE_ID_LIGHTGUN_TURBO: - return mouse->btn_r ? 1 : 0; - case RETRO_DEVICE_ID_LIGHTGUN_START: - return (mouse->btn_m && mouse->btn_r) ? 1 : 0; - case RETRO_DEVICE_ID_LIGHTGUN_PAUSE: - return mouse->btn_m && mouse->btn_l ? 1 : 0; - } - - return 0; -} - -static void winraw_update_mouse_state(winraw_mouse_t *mouse, RAWMOUSE *state) -{ - POINT crs_pos; - - if (state->usFlags & MOUSE_MOVE_ABSOLUTE) - { - if (g_mouse_xy_mapping_ready) - { - state->lLastX = (LONG)(g_view_abs_ratio_x * state->lLastX); - state->lLastY = (LONG)(g_view_abs_ratio_y * state->lLastY); - InterlockedExchangeAdd(&mouse->dlt_x, state->lLastX - mouse->x); - InterlockedExchangeAdd(&mouse->dlt_y, state->lLastY - mouse->y); - mouse->x = state->lLastX; - mouse->y = state->lLastY; - } - else - winraw_init_mouse_xy_mapping(); - } - else if (state->lLastX || state->lLastY) - { - InterlockedExchangeAdd(&mouse->dlt_x, state->lLastX); - InterlockedExchangeAdd(&mouse->dlt_y, state->lLastY); - - if (!GetCursorPos(&crs_pos)) - { - RARCH_WARN("[WINRAW]: GetCursorPos failed with error %lu.\n", GetLastError()); - } - else if (!ScreenToClient((HWND)video_driver_window_get(), &crs_pos)) - { - RARCH_WARN("[WINRAW]: ScreenToClient failed with error %lu.\n", GetLastError()); - } - else - { - mouse->x = crs_pos.x; - mouse->y = crs_pos.y; - } - } - - if (state->usButtonFlags & RI_MOUSE_LEFT_BUTTON_DOWN) - mouse->btn_l = true; - else if (state->usButtonFlags & RI_MOUSE_LEFT_BUTTON_UP) - mouse->btn_l = false; - - if (state->usButtonFlags & RI_MOUSE_MIDDLE_BUTTON_DOWN) - mouse->btn_m = true; - else if (state->usButtonFlags & RI_MOUSE_MIDDLE_BUTTON_UP) - mouse->btn_m = false; - - if (state->usButtonFlags & RI_MOUSE_RIGHT_BUTTON_DOWN) - mouse->btn_r = true; - else if (state->usButtonFlags & RI_MOUSE_RIGHT_BUTTON_UP) - mouse->btn_r = false; - - if (state->usButtonFlags & RI_MOUSE_BUTTON_4_DOWN) - mouse->btn_b4 = true; - else if (state->usButtonFlags & RI_MOUSE_BUTTON_4_UP) - mouse->btn_b4 = false; - - if (state->usButtonFlags & RI_MOUSE_BUTTON_5_DOWN) - mouse->btn_b5 = true; - else if (state->usButtonFlags & RI_MOUSE_BUTTON_5_UP) - mouse->btn_b5 = false; - - if (state->usButtonFlags & RI_MOUSE_WHEEL) - { - if ((SHORT)state->usButtonData > 0) - InterlockedExchange(&mouse->whl_u, 1); - else if ((SHORT)state->usButtonData < 0) - InterlockedExchange(&mouse->whl_d, 1); - } -} - -static LRESULT CALLBACK winraw_callback(HWND wnd, UINT msg, WPARAM wpar, LPARAM lpar) -{ - static uint8_t data[1024]; - UINT r; - unsigned i; - RAWINPUT *ri = (RAWINPUT*)data; - UINT size = sizeof(data); - - if (msg != WM_INPUT) - return DefWindowProcA(wnd, msg, wpar, lpar); - - /* app is in the background */ - if (GET_RAWINPUT_CODE_WPARAM(wpar) != RIM_INPUT) - goto end; - - r = GetRawInputData((HRAWINPUT)lpar, RID_INPUT, - data, &size, sizeof(RAWINPUTHEADER)); - if (r == (UINT)-1) - { - RARCH_WARN("[WINRAW]: GetRawInputData failed with error %lu.\n", - GetLastError()); - goto end; - } - - if (ri->header.dwType == RIM_TYPEKEYBOARD) - { - if (ri->data.keyboard.Message == WM_KEYDOWN) - g_keyboard->keys[ri->data.keyboard.VKey] = 1; - else if (ri->data.keyboard.Message == WM_KEYUP) - g_keyboard->keys[ri->data.keyboard.VKey] = 0; - } - else if (ri->header.dwType == RIM_TYPEMOUSE) - { - for (i = 0; i < g_mouse_cnt; ++i) - { - if (g_mice[i].hnd == ri->header.hDevice) - { - winraw_update_mouse_state(&g_mice[i], &ri->data.mouse); - break; - } - } - } - -end: - DefWindowProcA(wnd, msg, wpar, lpar); - return 0; -} - -static void *winraw_init(const char *joypad_driver) -{ - bool r; - winraw_input_t *wr = (winraw_input_t *) - calloc(1, sizeof(winraw_input_t)); - g_keyboard = (winraw_keyboard_t*) - calloc(1, sizeof(winraw_keyboard_t)); - - if (!wr || !g_keyboard) - goto error; - - RARCH_LOG("[WINRAW]: Initializing input driver... \n"); - - input_keymaps_init_keyboard_lut(rarch_key_map_winraw); - - wr->window = winraw_create_window(winraw_callback); - if (!wr->window) - goto error; - - r = winraw_init_devices(&g_mice, &g_mouse_cnt); - if (!r) - goto error; - - if (!g_mouse_cnt) - { - RARCH_LOG("[WINRAW]: Mouse unavailable.\n"); - } - else - { - wr->mice = (winraw_mouse_t*) - malloc(g_mouse_cnt * sizeof(winraw_mouse_t)); - if (!wr->mice) - goto error; - - memcpy(wr->mice, g_mice, g_mouse_cnt * sizeof(winraw_mouse_t)); - } - - r = winraw_set_keyboard_input(wr->window); - if (!r) - goto error; - - r = winraw_set_mouse_input(wr->window, false); - if (!r) - goto error; - - wr->joypad = input_joypad_init_driver(joypad_driver, wr); - - return wr; - -error: - if (wr && wr->window) - { - winraw_set_mouse_input(NULL, false); - winraw_set_keyboard_input(NULL); - winraw_destroy_window(wr->window); - } - free(g_keyboard); - free(g_mice); - if (wr) - free(wr->mice); - free(wr); - return NULL; -} - -static void winraw_poll(void *d) -{ - unsigned i; - winraw_input_t *wr = (winraw_input_t*)d; - - memcpy(&wr->keyboard, g_keyboard, sizeof(winraw_keyboard_t)); - - /* following keys are not handled by windows raw input api */ - wr->keyboard.keys[VK_LCONTROL] = GetAsyncKeyState(VK_LCONTROL) >> 1 ? 1 : 0; - wr->keyboard.keys[VK_RCONTROL] = GetAsyncKeyState(VK_RCONTROL) >> 1 ? 1 : 0; - wr->keyboard.keys[VK_LMENU] = GetAsyncKeyState(VK_LMENU) >> 1 ? 1 : 0; - wr->keyboard.keys[VK_RMENU] = GetAsyncKeyState(VK_RMENU) >> 1 ? 1 : 0; - wr->keyboard.keys[VK_LSHIFT] = GetAsyncKeyState(VK_LSHIFT) >> 1 ? 1 : 0; - wr->keyboard.keys[VK_RSHIFT] = GetAsyncKeyState(VK_RSHIFT) >> 1 ? 1 : 0; - - for (i = 0; i < g_mouse_cnt; ++i) - { - wr->mice[i].x = g_mice[i].x; - wr->mice[i].y = g_mice[i].y; - wr->mice[i].dlt_x = InterlockedExchange(&g_mice[i].dlt_x, 0); - wr->mice[i].dlt_y = InterlockedExchange(&g_mice[i].dlt_y, 0); - wr->mice[i].whl_u = InterlockedExchange(&g_mice[i].whl_u, 0); - wr->mice[i].whl_d = InterlockedExchange(&g_mice[i].whl_d, 0); - wr->mice[i].btn_l = g_mice[i].btn_l; - wr->mice[i].btn_m = g_mice[i].btn_m; - wr->mice[i].btn_r = g_mice[i].btn_r; - wr->mice[i].btn_b4 = g_mice[i].btn_b4; - wr->mice[i].btn_b5 = g_mice[i].btn_b5; - } - - if (wr->joypad) - wr->joypad->poll(); -} - -static int16_t winraw_input_state(void *d, - rarch_joypad_info_t joypad_info, - const struct retro_keybind **binds, - unsigned port, unsigned device, unsigned index, unsigned id) -{ - winraw_input_t *wr = (winraw_input_t*)d; - - switch (device) - { - case RETRO_DEVICE_KEYBOARD: - if (id < RETROK_LAST) - { - unsigned key = rarch_keysym_lut[(enum retro_key)id]; - return wr->keyboard.keys[key]; - } - break; - case RETRO_DEVICE_MOUSE: - return winraw_mouse_state(wr, port, false, id); - case RARCH_DEVICE_MOUSE_SCREEN: - return winraw_mouse_state(wr, port, true, id); - case RETRO_DEVICE_JOYPAD: - return winraw_joypad_state(wr, joypad_info, binds[port], port, id); - case RETRO_DEVICE_ANALOG: - if (binds[port]) - return input_joypad_analog(wr->joypad, joypad_info, - port, index, id, binds[port]); - break; - case RETRO_DEVICE_LIGHTGUN: - return winraw_lightgun_state(wr, port, id); - } - - return 0; -} - -static bool winraw_meta_key_pressed(void *u1, int u2) -{ - return false; -} - -static void winraw_free(void *d) -{ - winraw_input_t *wr = (winraw_input_t*)d; - - if (wr->joypad) - wr->joypad->destroy(); - winraw_set_mouse_input(NULL, false); - winraw_set_keyboard_input(NULL); - winraw_destroy_window(wr->window); - free(g_mice); - free(g_keyboard); - free(wr->mice); - free(wr); - - g_mouse_xy_mapping_ready = false; -} - -static uint64_t winraw_get_capabilities(void *u) -{ - return (1 << RETRO_DEVICE_KEYBOARD) | - (1 << RETRO_DEVICE_MOUSE) | - (1 << RETRO_DEVICE_JOYPAD) | - (1 << RETRO_DEVICE_ANALOG) | - (1 << RETRO_DEVICE_LIGHTGUN); -} - -static void winraw_grab_mouse(void *d, bool grab) -{ - bool r = false; - winraw_input_t *wr = (winraw_input_t*)d; - - if (grab == wr->mouse_grab) - return; - - r = winraw_set_mouse_input(wr->window, grab); - if (!r) - return; - - wr->mouse_grab = grab; -} - -static bool winraw_set_rumble(void *d, unsigned port, - enum retro_rumble_effect effect, uint16_t strength) -{ - winraw_input_t *wr = (winraw_input_t*)d; - - return input_joypad_set_rumble(wr->joypad, port, effect, strength); -} - -static const input_device_driver_t *winraw_get_joypad_driver(void *d) -{ - winraw_input_t *wr = (winraw_input_t*)d; - - return wr->joypad; -} - -static bool winraw_keyboard_mapping_is_blocked(void *d) -{ - winraw_input_t *wr = (winraw_input_t*)d; - - return wr->kbd_mapp_block; -} - -static void winraw_keyboard_mapping_set_block(void *d, bool block) -{ - winraw_input_t *wr = (winraw_input_t*)d; - - wr->kbd_mapp_block = block; -} - -input_driver_t input_winraw = { - winraw_init, - winraw_poll, - winraw_input_state, - winraw_meta_key_pressed, - winraw_free, - NULL, - NULL, - winraw_get_capabilities, - "raw", - winraw_grab_mouse, - NULL, - winraw_set_rumble, - winraw_get_joypad_driver, - NULL, - winraw_keyboard_mapping_is_blocked, - winraw_keyboard_mapping_set_block, -}; +/* RetroArch - A frontend for libretro. + * Copyright (C) 2011-2017 - Daniel De Matteis + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + +#include + +#include "../input_driver.h" +#include "../input_keymaps.h" + +#include "../../configuration.h" +#include "../../gfx/video_driver.h" +#include "../../verbosity.h" + +typedef struct +{ + uint8_t keys[256]; +} winraw_keyboard_t; + +typedef struct +{ + HANDLE hnd; + LONG x, y, dlt_x, dlt_y; + LONG whl_u, whl_d; + bool btn_l, btn_m, btn_r, btn_b4, btn_b5; +} winraw_mouse_t; + +typedef struct +{ + bool kbd_mapp_block; + bool mouse_grab; + winraw_keyboard_t keyboard; + HWND window; + winraw_mouse_t *mice; + const input_device_driver_t *joypad; +} winraw_input_t; + +static winraw_keyboard_t *g_keyboard = NULL; +static winraw_mouse_t *g_mice = NULL; +static unsigned g_mouse_cnt = 0; +static bool g_mouse_xy_mapping_ready = false; +static double g_view_abs_ratio_x = 0.0; +static double g_view_abs_ratio_y = 0.0; + +static HWND winraw_create_window(WNDPROC wnd_proc) +{ + HWND wnd; + WNDCLASSA wc = {0}; + + wc.hInstance = GetModuleHandleA(NULL); + + if (!wc.hInstance) + { + RARCH_ERR("[WINRAW]: GetModuleHandleA failed with error %lu.\n", GetLastError()); + return NULL; + } + + wc.lpfnWndProc = wnd_proc; + wc.lpszClassName = "winraw-input"; + if (!RegisterClassA(&wc) && GetLastError() != ERROR_CLASS_ALREADY_EXISTS) + { + RARCH_ERR("[WINRAW]: RegisterClassA failed with error %lu.\n", GetLastError()); + return NULL; + } + + wnd = CreateWindowExA(0, wc.lpszClassName, NULL, 0, 0, 0, 0, 0, + HWND_MESSAGE, NULL, NULL, NULL); + if (!wnd) + { + RARCH_ERR("[WINRAW]: CreateWindowExA failed with error %lu.\n", GetLastError()); + goto error; + } + + return wnd; + +error: + UnregisterClassA(wc.lpszClassName, NULL); + return NULL; +} + +static void winraw_destroy_window(HWND wnd) +{ + BOOL r; + + if (!wnd) + return; + + r = DestroyWindow(wnd); + + if (!r) + { + RARCH_WARN("[WINRAW]: DestroyWindow failed with error %lu.\n", GetLastError()); + } + + r = UnregisterClassA("winraw-input", NULL); + + if (!r) + { + RARCH_WARN("[WINRAW]: UnregisterClassA failed with error %lu.\n", GetLastError()); + } +} + +static bool winraw_set_keyboard_input(HWND window) +{ + RAWINPUTDEVICE rid; + BOOL r; + + rid.dwFlags = window ? 0 : RIDEV_REMOVE; + rid.hwndTarget = window; + rid.usUsagePage = 0x01; /* generic desktop */ + rid.usUsage = 0x06; /* keyboard */ + + r = RegisterRawInputDevices(&rid, 1, sizeof(RAWINPUTDEVICE)); + + if (!r) + { + RARCH_ERR("[WINRAW]: RegisterRawInputDevices failed with error %lu.\n", GetLastError()); + return false; + } + + return true; +} + +static void winraw_log_mice_info(winraw_mouse_t *mice, unsigned mouse_cnt) +{ + UINT r; + unsigned i; + char name[256]; + UINT name_size = sizeof(name); + + for (i = 0; i < mouse_cnt; ++i) + { + r = GetRawInputDeviceInfoA(mice[i].hnd, RIDI_DEVICENAME, name, &name_size); + if (r == (UINT)-1 || r == 0) + name[0] = '\0'; + RARCH_LOG("[WINRAW]: Mouse #%u %s.\n", i, name); + } +} + +static bool winraw_init_devices(winraw_mouse_t **mice, unsigned *mouse_cnt) +{ + UINT i; + POINT crs_pos; + winraw_mouse_t *mice_r = NULL; + unsigned mouse_cnt_r = 0; + RAWINPUTDEVICELIST *devs = NULL; + UINT dev_cnt = 0; + UINT r = GetRawInputDeviceList( + NULL, &dev_cnt, sizeof(RAWINPUTDEVICELIST)); + + if (r == (UINT)-1) + { + RARCH_ERR("[WINRAW]: GetRawInputDeviceList failed with error %lu.\n", GetLastError()); + goto error; + } + + devs = (RAWINPUTDEVICELIST*)malloc(dev_cnt * sizeof(RAWINPUTDEVICELIST)); + if (!devs) + goto error; + + dev_cnt = GetRawInputDeviceList(devs, &dev_cnt, sizeof(RAWINPUTDEVICELIST)); + if (dev_cnt == (UINT)-1) + { + RARCH_ERR("[WINRAW]: GetRawInputDeviceList failed with error %lu.\n", GetLastError()); + goto error; + } + + for (i = 0; i < dev_cnt; ++i) + mouse_cnt_r += devs[i].dwType == RIM_TYPEMOUSE ? 1 : 0; + + if (mouse_cnt_r) + { + mice_r = (winraw_mouse_t*)calloc(1, mouse_cnt_r * sizeof(winraw_mouse_t)); + if (!mice_r) + goto error; + + if (!GetCursorPos(&crs_pos)) + goto error; + + for (i = 0; i < mouse_cnt_r; ++i) + { + mice_r[i].x = crs_pos.x; + mice_r[i].y = crs_pos.y; + } + } + + /* count is already checked, so this is safe */ + for (i = mouse_cnt_r = 0; i < dev_cnt; ++i) + { + if (devs[i].dwType == RIM_TYPEMOUSE) + mice_r[mouse_cnt_r++].hnd = devs[i].hDevice; + } + + winraw_log_mice_info(mice_r, mouse_cnt_r); + + *mice = mice_r; + *mouse_cnt = mouse_cnt_r; + + return true; + +error: + free(devs); + free(mice_r); + *mice = NULL; + *mouse_cnt = 0; + return false; +} + +static bool winraw_set_mouse_input(HWND window, bool grab) +{ + RAWINPUTDEVICE rid; + BOOL r; + + if (window) + rid.dwFlags = grab ? RIDEV_CAPTUREMOUSE : 0; + else + rid.dwFlags = RIDEV_REMOVE; + + rid.hwndTarget = window; + rid.usUsagePage = 0x01; /* generic desktop */ + rid.usUsage = 0x02; /* mouse */ + + r = RegisterRawInputDevices(&rid, 1, sizeof(RAWINPUTDEVICE)); + + if (!r) + { + RARCH_ERR("[WINRAW]: RegisterRawInputDevice failed with error %lu.\n", GetLastError()); + return false; + } + + return true; +} + +static int16_t winraw_mouse_state(winraw_input_t *wr, + unsigned port, bool abs, unsigned id) +{ + unsigned i; + settings_t *settings = config_get_ptr(); + winraw_mouse_t *mouse = NULL; + + if (port >= MAX_USERS) + return 0; + + for (i = 0; i < g_mouse_cnt; ++i) + { + if (i == settings->uints.input_mouse_index[port]) + { + mouse = &wr->mice[i]; + break; + } + } + + if (!mouse) + return 0; + + switch (id) + { + case RETRO_DEVICE_ID_MOUSE_X: + return abs ? mouse->x : mouse->dlt_x; + case RETRO_DEVICE_ID_MOUSE_Y: + return abs ? mouse->y : mouse->dlt_y; + case RETRO_DEVICE_ID_MOUSE_LEFT: + return mouse->btn_l ? 1 : 0; + case RETRO_DEVICE_ID_MOUSE_RIGHT: + return mouse->btn_r ? 1 : 0; + case RETRO_DEVICE_ID_MOUSE_WHEELUP: + return mouse->whl_u ? 1 : 0; + case RETRO_DEVICE_ID_MOUSE_WHEELDOWN: + return mouse->whl_d ? 1 : 0; + case RETRO_DEVICE_ID_MOUSE_MIDDLE: + return mouse->btn_m ? 1 : 0; + case RETRO_DEVICE_ID_MOUSE_BUTTON_4: + return mouse->btn_b4 ? 1 : 0; + case RETRO_DEVICE_ID_MOUSE_BUTTON_5: + return mouse->btn_b5 ? 1 : 0; + } + + return 0; +} + +static bool winraw_mbutton_pressed(winraw_input_t *wr, unsigned port, unsigned key) +{ + unsigned i; + bool result; + winraw_mouse_t *mouse = NULL; + settings_t *settings = config_get_ptr(); + + if (port >= MAX_USERS) + return false; + + for (i = 0; i < g_mouse_cnt; ++i) + { + if (i == settings->uints.input_mouse_index[port]) + { + mouse = &wr->mice[i]; + break; + } + } + + if (!mouse) + return false; + + switch ( key ) + { + + case RETRO_DEVICE_ID_MOUSE_LEFT: + return mouse->btn_l; + case RETRO_DEVICE_ID_MOUSE_RIGHT: + return mouse->btn_r; + case RETRO_DEVICE_ID_MOUSE_MIDDLE: + return mouse->btn_m; + case RETRO_DEVICE_ID_MOUSE_BUTTON_4: + return mouse->btn_b4; + case RETRO_DEVICE_ID_MOUSE_BUTTON_5: + return mouse->btn_b5; + case RETRO_DEVICE_ID_MOUSE_WHEELUP: + return mouse->whl_u; + case RETRO_DEVICE_ID_MOUSE_WHEELDOWN: + return mouse->whl_d; + } + + return false; +} + +static int16_t winraw_joypad_state(winraw_input_t *wr, + rarch_joypad_info_t joypad_info, + const struct retro_keybind *binds, + unsigned port, unsigned id) +{ + const struct retro_keybind *bind = &binds[id]; + unsigned key = rarch_keysym_lut[(enum retro_key)bind->key]; + + if (!wr->kbd_mapp_block && (bind->key < RETROK_LAST) && wr->keyboard.keys[key]) + return 1; + + if (binds && binds[id].valid && winraw_mbutton_pressed(wr, port, bind->mbutton)) + return 1; + + return input_joypad_pressed(wr->joypad, joypad_info, port, binds, id); +} + +static void winraw_init_mouse_xy_mapping() +{ + struct video_viewport viewport; + int center_x; + int center_y; + unsigned i; + + if (video_driver_get_viewport_info(&viewport)) + { + center_x = viewport.x + viewport.width / 2; + center_y = viewport.y + viewport.height / 2; + + for (i = 0; i < g_mouse_cnt; ++i) + { + g_mice[i].x = center_x; + g_mice[i].y = center_y; + } + + g_view_abs_ratio_x = (double)viewport.full_width / 65535.0; + g_view_abs_ratio_y = (double)viewport.full_height / 65535.0; + + g_mouse_xy_mapping_ready = true; + } +} + +static int16_t winraw_lightgun_state(winraw_input_t *wr, + unsigned port, unsigned id) +{ + unsigned i; + settings_t *settings = config_get_ptr(); + winraw_mouse_t *mouse = NULL; + + if (port >= MAX_USERS) + return 0; + + for (i = 0; i < g_mouse_cnt; ++i) + { + if (i == settings->uints.input_mouse_index[port]) + { + mouse = &wr->mice[i]; + break; + } + } + + if (!mouse) + return 0; + + switch (id) + { + case RETRO_DEVICE_ID_LIGHTGUN_X: + return mouse->dlt_x; + case RETRO_DEVICE_ID_LIGHTGUN_Y: + return mouse->dlt_y; + case RETRO_DEVICE_ID_LIGHTGUN_TRIGGER: + return mouse->btn_l ? 1 : 0; + case RETRO_DEVICE_ID_LIGHTGUN_CURSOR: + return mouse->btn_m ? 1 : 0; + case RETRO_DEVICE_ID_LIGHTGUN_TURBO: + return mouse->btn_r ? 1 : 0; + case RETRO_DEVICE_ID_LIGHTGUN_START: + return (mouse->btn_m && mouse->btn_r) ? 1 : 0; + case RETRO_DEVICE_ID_LIGHTGUN_PAUSE: + return mouse->btn_m && mouse->btn_l ? 1 : 0; + } + + return 0; +} + +static void winraw_update_mouse_state(winraw_mouse_t *mouse, RAWMOUSE *state) +{ + POINT crs_pos; + + if (state->usFlags & MOUSE_MOVE_ABSOLUTE) + { + if (g_mouse_xy_mapping_ready) + { + state->lLastX = (LONG)(g_view_abs_ratio_x * state->lLastX); + state->lLastY = (LONG)(g_view_abs_ratio_y * state->lLastY); + InterlockedExchangeAdd(&mouse->dlt_x, state->lLastX - mouse->x); + InterlockedExchangeAdd(&mouse->dlt_y, state->lLastY - mouse->y); + mouse->x = state->lLastX; + mouse->y = state->lLastY; + } + else + winraw_init_mouse_xy_mapping(); + } + else if (state->lLastX || state->lLastY) + { + InterlockedExchangeAdd(&mouse->dlt_x, state->lLastX); + InterlockedExchangeAdd(&mouse->dlt_y, state->lLastY); + + if (!GetCursorPos(&crs_pos)) + { + RARCH_WARN("[WINRAW]: GetCursorPos failed with error %lu.\n", GetLastError()); + } + else if (!ScreenToClient((HWND)video_driver_window_get(), &crs_pos)) + { + RARCH_WARN("[WINRAW]: ScreenToClient failed with error %lu.\n", GetLastError()); + } + else + { + mouse->x = crs_pos.x; + mouse->y = crs_pos.y; + } + } + + if (state->usButtonFlags & RI_MOUSE_LEFT_BUTTON_DOWN) + mouse->btn_l = true; + else if (state->usButtonFlags & RI_MOUSE_LEFT_BUTTON_UP) + mouse->btn_l = false; + + if (state->usButtonFlags & RI_MOUSE_MIDDLE_BUTTON_DOWN) + mouse->btn_m = true; + else if (state->usButtonFlags & RI_MOUSE_MIDDLE_BUTTON_UP) + mouse->btn_m = false; + + if (state->usButtonFlags & RI_MOUSE_RIGHT_BUTTON_DOWN) + mouse->btn_r = true; + else if (state->usButtonFlags & RI_MOUSE_RIGHT_BUTTON_UP) + mouse->btn_r = false; + + if (state->usButtonFlags & RI_MOUSE_BUTTON_4_DOWN) + mouse->btn_b4 = true; + else if (state->usButtonFlags & RI_MOUSE_BUTTON_4_UP) + mouse->btn_b4 = false; + + if (state->usButtonFlags & RI_MOUSE_BUTTON_5_DOWN) + mouse->btn_b5 = true; + else if (state->usButtonFlags & RI_MOUSE_BUTTON_5_UP) + mouse->btn_b5 = false; + + if (state->usButtonFlags & RI_MOUSE_WHEEL) + { + if ((SHORT)state->usButtonData > 0) + InterlockedExchange(&mouse->whl_u, 1); + else if ((SHORT)state->usButtonData < 0) + InterlockedExchange(&mouse->whl_d, 1); + } +} + +static LRESULT CALLBACK winraw_callback(HWND wnd, UINT msg, WPARAM wpar, LPARAM lpar) +{ + static uint8_t data[1024]; + UINT r; + unsigned i; + RAWINPUT *ri = (RAWINPUT*)data; + UINT size = sizeof(data); + + if (msg != WM_INPUT) + return DefWindowProcA(wnd, msg, wpar, lpar); + + /* app is in the background */ + if (GET_RAWINPUT_CODE_WPARAM(wpar) != RIM_INPUT) + goto end; + + r = GetRawInputData((HRAWINPUT)lpar, RID_INPUT, + data, &size, sizeof(RAWINPUTHEADER)); + if (r == (UINT)-1) + { + RARCH_WARN("[WINRAW]: GetRawInputData failed with error %lu.\n", + GetLastError()); + goto end; + } + + if (ri->header.dwType == RIM_TYPEKEYBOARD) + { + if (ri->data.keyboard.Message == WM_KEYDOWN) + g_keyboard->keys[ri->data.keyboard.VKey] = 1; + else if (ri->data.keyboard.Message == WM_KEYUP) + g_keyboard->keys[ri->data.keyboard.VKey] = 0; + } + else if (ri->header.dwType == RIM_TYPEMOUSE) + { + for (i = 0; i < g_mouse_cnt; ++i) + { + if (g_mice[i].hnd == ri->header.hDevice) + { + winraw_update_mouse_state(&g_mice[i], &ri->data.mouse); + break; + } + } + } + +end: + DefWindowProcA(wnd, msg, wpar, lpar); + return 0; +} + +static void *winraw_init(const char *joypad_driver) +{ + bool r; + winraw_input_t *wr = (winraw_input_t *) + calloc(1, sizeof(winraw_input_t)); + g_keyboard = (winraw_keyboard_t*) + calloc(1, sizeof(winraw_keyboard_t)); + + if (!wr || !g_keyboard) + goto error; + + RARCH_LOG("[WINRAW]: Initializing input driver... \n"); + + input_keymaps_init_keyboard_lut(rarch_key_map_winraw); + + wr->window = winraw_create_window(winraw_callback); + if (!wr->window) + goto error; + + r = winraw_init_devices(&g_mice, &g_mouse_cnt); + if (!r) + goto error; + + if (!g_mouse_cnt) + { + RARCH_LOG("[WINRAW]: Mouse unavailable.\n"); + } + else + { + wr->mice = (winraw_mouse_t*) + malloc(g_mouse_cnt * sizeof(winraw_mouse_t)); + if (!wr->mice) + goto error; + + memcpy(wr->mice, g_mice, g_mouse_cnt * sizeof(winraw_mouse_t)); + } + + r = winraw_set_keyboard_input(wr->window); + if (!r) + goto error; + + r = winraw_set_mouse_input(wr->window, false); + if (!r) + goto error; + + wr->joypad = input_joypad_init_driver(joypad_driver, wr); + + return wr; + +error: + if (wr && wr->window) + { + winraw_set_mouse_input(NULL, false); + winraw_set_keyboard_input(NULL); + winraw_destroy_window(wr->window); + } + free(g_keyboard); + free(g_mice); + if (wr) + free(wr->mice); + free(wr); + return NULL; +} + +static void winraw_poll(void *d) +{ + unsigned i; + winraw_input_t *wr = (winraw_input_t*)d; + + memcpy(&wr->keyboard, g_keyboard, sizeof(winraw_keyboard_t)); + + /* following keys are not handled by windows raw input api */ + wr->keyboard.keys[VK_LCONTROL] = GetAsyncKeyState(VK_LCONTROL) >> 1 ? 1 : 0; + wr->keyboard.keys[VK_RCONTROL] = GetAsyncKeyState(VK_RCONTROL) >> 1 ? 1 : 0; + wr->keyboard.keys[VK_LMENU] = GetAsyncKeyState(VK_LMENU) >> 1 ? 1 : 0; + wr->keyboard.keys[VK_RMENU] = GetAsyncKeyState(VK_RMENU) >> 1 ? 1 : 0; + wr->keyboard.keys[VK_LSHIFT] = GetAsyncKeyState(VK_LSHIFT) >> 1 ? 1 : 0; + wr->keyboard.keys[VK_RSHIFT] = GetAsyncKeyState(VK_RSHIFT) >> 1 ? 1 : 0; + + for (i = 0; i < g_mouse_cnt; ++i) + { + wr->mice[i].x = g_mice[i].x; + wr->mice[i].y = g_mice[i].y; + wr->mice[i].dlt_x = InterlockedExchange(&g_mice[i].dlt_x, 0); + wr->mice[i].dlt_y = InterlockedExchange(&g_mice[i].dlt_y, 0); + wr->mice[i].whl_u = InterlockedExchange(&g_mice[i].whl_u, 0); + wr->mice[i].whl_d = InterlockedExchange(&g_mice[i].whl_d, 0); + wr->mice[i].btn_l = g_mice[i].btn_l; + wr->mice[i].btn_m = g_mice[i].btn_m; + wr->mice[i].btn_r = g_mice[i].btn_r; + wr->mice[i].btn_b4 = g_mice[i].btn_b4; + wr->mice[i].btn_b5 = g_mice[i].btn_b5; + } + + if (wr->joypad) + wr->joypad->poll(); +} + +static int16_t winraw_input_state(void *d, + rarch_joypad_info_t joypad_info, + const struct retro_keybind **binds, + unsigned port, unsigned device, unsigned index, unsigned id) +{ + winraw_input_t *wr = (winraw_input_t*)d; + + switch (device) + { + case RETRO_DEVICE_KEYBOARD: + if (id < RETROK_LAST) + { + unsigned key = rarch_keysym_lut[(enum retro_key)id]; + return wr->keyboard.keys[key]; + } + break; + case RETRO_DEVICE_MOUSE: + return winraw_mouse_state(wr, port, false, id); + case RARCH_DEVICE_MOUSE_SCREEN: + return winraw_mouse_state(wr, port, true, id); + case RETRO_DEVICE_JOYPAD: + return winraw_joypad_state(wr, joypad_info, binds[port], port, id); + case RETRO_DEVICE_ANALOG: + if (binds[port]) + return input_joypad_analog(wr->joypad, joypad_info, + port, index, id, binds[port]); + break; + case RETRO_DEVICE_LIGHTGUN: + return winraw_lightgun_state(wr, port, id); + } + + return 0; +} + +static bool winraw_meta_key_pressed(void *u1, int u2) +{ + return false; +} + +static void winraw_free(void *d) +{ + winraw_input_t *wr = (winraw_input_t*)d; + + if (wr->joypad) + wr->joypad->destroy(); + winraw_set_mouse_input(NULL, false); + winraw_set_keyboard_input(NULL); + winraw_destroy_window(wr->window); + free(g_mice); + free(g_keyboard); + free(wr->mice); + free(wr); + + g_mouse_xy_mapping_ready = false; +} + +static uint64_t winraw_get_capabilities(void *u) +{ + return (1 << RETRO_DEVICE_KEYBOARD) | + (1 << RETRO_DEVICE_MOUSE) | + (1 << RETRO_DEVICE_JOYPAD) | + (1 << RETRO_DEVICE_ANALOG) | + (1 << RETRO_DEVICE_LIGHTGUN); +} + +static void winraw_grab_mouse(void *d, bool grab) +{ + bool r = false; + winraw_input_t *wr = (winraw_input_t*)d; + + if (grab == wr->mouse_grab) + return; + + r = winraw_set_mouse_input(wr->window, grab); + if (!r) + return; + + wr->mouse_grab = grab; +} + +static bool winraw_set_rumble(void *d, unsigned port, + enum retro_rumble_effect effect, uint16_t strength) +{ + winraw_input_t *wr = (winraw_input_t*)d; + + return input_joypad_set_rumble(wr->joypad, port, effect, strength); +} + +static const input_device_driver_t *winraw_get_joypad_driver(void *d) +{ + winraw_input_t *wr = (winraw_input_t*)d; + + return wr->joypad; +} + +static bool winraw_keyboard_mapping_is_blocked(void *d) +{ + winraw_input_t *wr = (winraw_input_t*)d; + + return wr->kbd_mapp_block; +} + +static void winraw_keyboard_mapping_set_block(void *d, bool block) +{ + winraw_input_t *wr = (winraw_input_t*)d; + + wr->kbd_mapp_block = block; +} + +input_driver_t input_winraw = { + winraw_init, + winraw_poll, + winraw_input_state, + winraw_meta_key_pressed, + winraw_free, + NULL, + NULL, + winraw_get_capabilities, + "raw", + winraw_grab_mouse, + NULL, + winraw_set_rumble, + winraw_get_joypad_driver, + NULL, + winraw_keyboard_mapping_is_blocked, + winraw_keyboard_mapping_set_block, +}; From 59812e95097165695e90db13b3aaf9aa2dba2f51 Mon Sep 17 00:00:00 2001 From: David Walters Date: Sun, 26 Nov 2017 13:23:39 +0000 Subject: [PATCH 162/183] include mouse buttons in block hotkey check --- input/input_driver.c | 1 + 1 file changed, 1 insertion(+) diff --git a/input/input_driver.c b/input/input_driver.c index d603a6a12e..f1abed8726 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -381,6 +381,7 @@ static const void *hid_data = NULL; #define check_input_driver_block_hotkey(normal_bind, autoconf_bind) \ ( \ (((normal_bind)->key != RETROK_UNKNOWN) \ + || ((normal_bind)->mbutton != NO_BTN) \ || ((normal_bind)->joykey != NO_BTN) \ || ((normal_bind)->joyaxis != AXIS_NONE) \ || ((autoconf_bind)->key != RETROK_UNKNOWN ) \ From cdb5a656f28eaf21181ff604dd583f5a65692560 Mon Sep 17 00:00:00 2001 From: David Walters Date: Sun, 26 Nov 2017 15:40:27 +0000 Subject: [PATCH 163/183] dinput: only support hardware mouse index 0 --- input/drivers/dinput.c | 44 +++++++++++++++++++++++++++++++++++------- 1 file changed, 37 insertions(+), 7 deletions(-) diff --git a/input/drivers/dinput.c b/input/drivers/dinput.c index 6e525355f0..23fe84a719 100644 --- a/input/drivers/dinput.c +++ b/input/drivers/dinput.c @@ -49,6 +49,7 @@ #include "../../gfx/video_driver.h" +#include "../../configuration.h" #include "../../verbosity.h" /* Keep track of which pad indexes are 360 controllers. @@ -267,9 +268,18 @@ static bool dinput_keyboard_pressed(struct dinput_input *di, unsigned key) return di->state[sym] & 0x80; } -static bool dinput_mbutton_pressed(struct dinput_input *di, unsigned key) +static bool dinput_mbutton_pressed(struct dinput_input *di, unsigned port, unsigned key) { bool result; + settings_t *settings = config_get_ptr(); + + if (port >= MAX_USERS) + return false; + + /* the driver only supports one mouse */ + if ( settings->uints.input_mouse_index[ port ] != 0 ) { + return false; + } switch ( key ) { @@ -321,7 +331,7 @@ static bool dinput_is_pressed(struct dinput_input *di, return true; if (binds && binds[id].valid) { - if (dinput_mbutton_pressed(di, bind->mbutton)) + if (dinput_mbutton_pressed(di, port, bind->mbutton)) return true; if (input_joypad_pressed(di->joypad, joypad_info, port, binds, id)) return true; @@ -382,10 +392,20 @@ static int16_t dinput_lightgun_state(struct dinput_input *di, unsigned id) return 0; } -static int16_t dinput_mouse_state(struct dinput_input *di, unsigned id) +static int16_t dinput_mouse_state(struct dinput_input *di, unsigned port, unsigned id) { int16_t state = 0; + settings_t *settings = config_get_ptr(); + + if (port >= MAX_USERS) + return false; + + /* the driver only supports one mouse */ + if ( settings->uints.input_mouse_index[ port ] != 0 ) { + return 0; + } + switch (id) { case RETRO_DEVICE_ID_MOUSE_X: @@ -427,8 +447,18 @@ static int16_t dinput_mouse_state(struct dinput_input *di, unsigned id) return 0; } -static int16_t dinput_mouse_state_screen(struct dinput_input *di, unsigned id) +static int16_t dinput_mouse_state_screen(struct dinput_input *di, unsigned port, unsigned id) { + settings_t *settings = config_get_ptr(); + + if (port >= MAX_USERS) + return false; + + /* the driver only supports one mouse */ + if ( settings->uints.input_mouse_index[ port ] != 0 ) { + return 0; + } + switch (id) { case RETRO_DEVICE_ID_MOUSE_X: @@ -439,7 +469,7 @@ static int16_t dinput_mouse_state_screen(struct dinput_input *di, unsigned id) break; } - return dinput_mouse_state(di, id); + return dinput_mouse_state(di, port, id); } static int16_t dinput_pointer_state(struct dinput_input *di, @@ -542,10 +572,10 @@ static int16_t dinput_input_state(void *data, return 0; case RETRO_DEVICE_MOUSE: - return dinput_mouse_state(di, id); + return dinput_mouse_state(di, port, id); case RARCH_DEVICE_MOUSE_SCREEN: - return dinput_mouse_state_screen(di, id); + return dinput_mouse_state_screen(di, port, id); case RETRO_DEVICE_POINTER: case RARCH_DEVICE_POINTER_SCREEN: From c733f96a1670b97fa1ff4df73fedd818c9d101f4 Mon Sep 17 00:00:00 2001 From: David Walters Date: Sun, 26 Nov 2017 15:42:47 +0000 Subject: [PATCH 164/183] listen for mouse buttons/wheel when binding input --- input/input_driver.c | 35 +++++++++++++++++++++++++++ input/input_driver.h | 15 +++++++++++- menu/widgets/menu_input_bind_dialog.c | 34 +++++++++++++++++++++++++- 3 files changed, 82 insertions(+), 2 deletions(-) diff --git a/input/input_driver.c b/input/input_driver.c index f1abed8726..8a6751c06f 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -1745,6 +1745,41 @@ bool input_joypad_hat_raw(const input_device_driver_t *drv, return drv->button(port, HAT_MAP(hat, hat_dir)); } +/** + * input_mouse_button_raw: + * @port : Mouse number. + * @button : Identifier of key (libretro mouse constant). + * + * Checks if key (@button) was being pressed by user + * with mouse number @port. + * + * Returns: true (1) if key was pressed, otherwise + * false (0). + **/ +bool input_mouse_button_raw(unsigned port, unsigned id) +{ + int16_t res; + rarch_joypad_info_t joypad_info; + settings_t *settings = config_get_ptr(); + + /*ignore axes*/ + if ( id == RETRO_DEVICE_ID_MOUSE_X || id == RETRO_DEVICE_ID_MOUSE_Y ) { + return false; + } + + 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]; + + res = current_input->input_state(current_input_data, + joypad_info, libretro_input_binds, port, RETRO_DEVICE_MOUSE, 0, id); + + if ( res ) { + return true; + } + return false; +} + /** * input_conv_analog_id_to_bind_id: * @idx : Analog key index. diff --git a/input/input_driver.h b/input/input_driver.h index 7cd3c068a6..c3084979a9 100644 --- a/input/input_driver.h +++ b/input/input_driver.h @@ -608,7 +608,20 @@ bool input_joypad_hat_raw(const input_device_driver_t *driver, unsigned joypad, unsigned hat_dir, unsigned hat); /** - * input_joypad_name: + * input_mouse_button_raw: + * @port : Mouse number. + * @button : Identifier of key (libretro mouse constant). + * + * Checks if key (@button) was being pressed by user + * with mouse number @port. + * + * Returns: true (1) if key was pressed, otherwise + * false (0). + **/ +bool input_mouse_button_raw(unsigned port, unsigned button); + +/** + * input_joypad_name: * @drv : Input device driver handle. * @port : Joystick number. * diff --git a/menu/widgets/menu_input_bind_dialog.c b/menu/widgets/menu_input_bind_dialog.c index 960110fcb8..456ae54b46 100644 --- a/menu/widgets/menu_input_bind_dialog.c +++ b/menu/widgets/menu_input_bind_dialog.c @@ -30,9 +30,11 @@ #define MENU_MAX_BUTTONS 219 #define MENU_MAX_AXES 32 #define MENU_MAX_HATS 4 +#define MENU_MAX_MBUTTONS 32 /*enough to cover largest libretro constant*/ struct menu_bind_state_port { + bool mbuttons[MENU_MAX_MBUTTONS]; bool buttons[MENU_MAX_BUTTONS]; int16_t axes[MENU_MAX_AXES]; uint16_t hats[MENU_MAX_HATS]; @@ -206,6 +208,7 @@ static void menu_input_key_bind_poll_bind_state( unsigned port, bool timed_out) { + unsigned b; rarch_joypad_info_t joypad_info; const input_device_driver_t *joypad = input_driver_get_joypad_driver(); @@ -217,6 +220,11 @@ static void menu_input_key_bind_poll_bind_state( memset(state->state, 0, sizeof(state->state)); + /* poll mouse (on the relevant port) */ + for (b = 0; b < MENU_MAX_MBUTTONS; b++) + state->state[port].mbuttons[b] = + input_mouse_button_raw(port, b); + joypad_info.joy_idx = 0; joypad_info.auto_binds = NULL; joypad_info.axis_threshold = 0.0f; @@ -277,6 +285,30 @@ static bool menu_input_key_bind_poll_find_trigger_pad( const struct menu_bind_state_port *o = (const struct menu_bind_state_port*) &state->state[p]; + for (b = 0; b < MENU_MAX_MBUTTONS; b++) + { + bool iterate = n->mbuttons[b] && !o->mbuttons[b]; + + if (!iterate) + continue; + + switch ( b ) + { + + case RETRO_DEVICE_ID_MOUSE_LEFT: + case RETRO_DEVICE_ID_MOUSE_RIGHT: + case RETRO_DEVICE_ID_MOUSE_MIDDLE: + case RETRO_DEVICE_ID_MOUSE_BUTTON_4: + case RETRO_DEVICE_ID_MOUSE_BUTTON_5: + case RETRO_DEVICE_ID_MOUSE_WHEELUP: + case RETRO_DEVICE_ID_MOUSE_WHEELDOWN: + case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP: + case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN: + state->target->mbutton = b; + return true; + } + } + for (b = 0; b < MENU_MAX_BUTTONS; b++) { bool iterate = n->buttons[b] && !o->buttons[b]; @@ -398,7 +430,7 @@ bool menu_input_key_bind_iterate(menu_input_ctx_bind_t *bind) } snprintf(bind->s, bind->len, - "[%s]\npress keyboard or joypad\n(timeout %d %s)", + "[%s]\npress keyboard, mouse or joypad\n(timeout %d %s)", input_config_bind_map_get_desc( menu_input_binds.begin - MENU_SETTINGS_BIND_BEGIN), rarch_timer_get_timeout(&menu_input_binds.timer), From 1003e681cc7bfb03cf883a4a077820b4ac9cf1a7 Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 26 Nov 2017 11:33:02 -0500 Subject: [PATCH 165/183] don't assume the core never has content --- tasks/task_content.c | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/tasks/task_content.c b/tasks/task_content.c index 9877d6b375..0c8f0b4129 100644 --- a/tasks/task_content.c +++ b/tasks/task_content.c @@ -173,27 +173,21 @@ static void content_load_init_wrap( *argc = 0; argv[(*argc)++] = strdup("retroarch"); -#ifdef HAVE_DYNAMIC - if (!args->no_content) + if (args->content_path) { -#endif - if (args->content_path) - { - RARCH_LOG("Using content: %s.\n", args->content_path); - argv[(*argc)++] = strdup(args->content_path); - } + RARCH_LOG("Using content: %s.\n", args->content_path); + argv[(*argc)++] = strdup(args->content_path); + } #ifdef HAVE_MENU - else - { - RARCH_LOG("%s\n", - msg_hash_to_str(MSG_NO_CONTENT_STARTING_DUMMY_CORE)); - argv[(*argc)++] = strdup("--menu"); - } -#endif -#ifdef HAVE_DYNAMIC + else + { + RARCH_LOG("%s\n", + msg_hash_to_str(MSG_NO_CONTENT_STARTING_DUMMY_CORE)); + argv[(*argc)++] = strdup("--menu"); } #endif + if (args->sram_path) { argv[(*argc)++] = strdup("-s"); From db2ce016de8178ad953b7477a33b18df317ec044 Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 26 Nov 2017 11:33:18 -0500 Subject: [PATCH 166/183] clear paths properly before loading the next core without closing content --- command.c | 1 + 1 file changed, 1 insertion(+) diff --git a/command.c b/command.c index ac088b7fdb..7f281ba546 100644 --- a/command.c +++ b/command.c @@ -1805,6 +1805,7 @@ bool command_event(enum event_command cmd, void *data) case CMD_EVENT_LOAD_CORE_PERSIST: { #ifdef HAVE_MENU + path_clear_all(); core_info_ctx_find_t info_find; rarch_system_info_t *system_info = runloop_get_system_info(); struct retro_system_info *system = &system_info->info; From 218d7f88ffdd7acac70eb14ff3c4024985052382 Mon Sep 17 00:00:00 2001 From: David Walters Date: Sun, 26 Nov 2017 16:46:33 +0000 Subject: [PATCH 167/183] New lightgun API in libretro.h --- libretro-common/include/libretro.h | 39 ++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/libretro-common/include/libretro.h b/libretro-common/include/libretro.h index 27b61b70b7..4cb422bfcc 100644 --- a/libretro-common/include/libretro.h +++ b/libretro-common/include/libretro.h @@ -126,8 +126,14 @@ extern "C" { */ #define RETRO_DEVICE_KEYBOARD 3 -/* Lightgun X/Y coordinates are reported relatively to last poll, - * similar to mouse. */ +/* LIGHTGUN device is similar to Guncon-2 for PlayStation 2. + * It reports X/Y coordinates in screen space (similar to the pointer) + * in the range [-0x8000, 0x7fff] in both axes, with zero being center. + * As well as reporting on/off screen state. It features a trigger, + * start/select buttons, four auxiliary action buttons and a + * directional pad. A forced off-screen shot can be requested for + * auto-reloading function in some games. + */ #define RETRO_DEVICE_LIGHTGUN 4 /* The ANALOG device is an extension to JOYPAD (RetroPad). @@ -214,14 +220,27 @@ extern "C" { #define RETRO_DEVICE_ID_MOUSE_BUTTON_4 9 #define RETRO_DEVICE_ID_MOUSE_BUTTON_5 10 -/* Id values for LIGHTGUN types. */ -#define RETRO_DEVICE_ID_LIGHTGUN_X 0 -#define RETRO_DEVICE_ID_LIGHTGUN_Y 1 -#define RETRO_DEVICE_ID_LIGHTGUN_TRIGGER 2 -#define RETRO_DEVICE_ID_LIGHTGUN_CURSOR 3 -#define RETRO_DEVICE_ID_LIGHTGUN_TURBO 4 -#define RETRO_DEVICE_ID_LIGHTGUN_PAUSE 5 -#define RETRO_DEVICE_ID_LIGHTGUN_START 6 +/* Id values for LIGHTGUN. */ +#define RETRO_DEVICE_ID_LIGHTGUN_SCREEN_X 13 /*Absolute Position*/ +#define RETRO_DEVICE_ID_LIGHTGUN_SCREEN_Y 14 /*Absolute*/ +#define RETRO_DEVICE_ID_LIGHTGUN_IS_OFFSCREEN 15 /*Status Check*/ +#define RETRO_DEVICE_ID_LIGHTGUN_TRIGGER 2 +#define RETRO_DEVICE_ID_LIGHTGUN_RELOAD 16 /*Forced off-screen shot*/ +#define RETRO_DEVICE_ID_LIGHTGUN_AUX_A 3 +#define RETRO_DEVICE_ID_LIGHTGUN_AUX_B 4 +#define RETRO_DEVICE_ID_LIGHTGUN_START 6 +#define RETRO_DEVICE_ID_LIGHTGUN_SELECT 7 +#define RETRO_DEVICE_ID_LIGHTGUN_AUX_C 8 +#define RETRO_DEVICE_ID_LIGHTGUN_DPAD_UP 9 +#define RETRO_DEVICE_ID_LIGHTGUN_DPAD_DOWN 10 +#define RETRO_DEVICE_ID_LIGHTGUN_DPAD_LEFT 11 +#define RETRO_DEVICE_ID_LIGHTGUN_DPAD_RIGHT 12 +/* deprecated */ +#define RETRO_DEVICE_ID_LIGHTGUN_X 0 /*Relative Position*/ +#define RETRO_DEVICE_ID_LIGHTGUN_Y 1 /*Relative*/ +#define RETRO_DEVICE_ID_LIGHTGUN_CURSOR 3 /*Use Aux:A*/ +#define RETRO_DEVICE_ID_LIGHTGUN_TURBO 4 /*Use Aux:B*/ +#define RETRO_DEVICE_ID_LIGHTGUN_PAUSE 5 /*Use Start*/ /* Id values for POINTER. */ #define RETRO_DEVICE_ID_POINTER_X 0 From 70ff6db30c207180b8a16612bbe49b6cef3db548 Mon Sep 17 00:00:00 2001 From: David Walters Date: Sun, 26 Nov 2017 16:46:52 +0000 Subject: [PATCH 168/183] Lightgun input localisation strings. English only --- intl/msg_hash_chs.h | 22 ++++++++++++++++++++++ intl/msg_hash_cht.h | 22 ++++++++++++++++++++++ intl/msg_hash_de.h | 22 ++++++++++++++++++++++ intl/msg_hash_eo.h | 22 ++++++++++++++++++++++ intl/msg_hash_fr.h | 22 ++++++++++++++++++++++ intl/msg_hash_it.h | 22 ++++++++++++++++++++++ intl/msg_hash_ja.h | 22 ++++++++++++++++++++++ intl/msg_hash_ko.h | 22 ++++++++++++++++++++++ intl/msg_hash_nl.h | 22 ++++++++++++++++++++++ intl/msg_hash_pt_br.h | 22 ++++++++++++++++++++++ intl/msg_hash_pt_pt.h | 22 ++++++++++++++++++++++ intl/msg_hash_ru.h | 22 ++++++++++++++++++++++ intl/msg_hash_us.h | 22 ++++++++++++++++++++++ intl/msg_hash_vn.h | 22 ++++++++++++++++++++++ msg_hash.h | 11 +++++++++++ 15 files changed, 319 insertions(+) diff --git a/intl/msg_hash_chs.h b/intl/msg_hash_chs.h index db03e7ddd5..a153ea7f21 100644 --- a/intl/msg_hash_chs.h +++ b/intl/msg_hash_chs.h @@ -682,6 +682,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, "右摇杆Y- (上)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, "右摇杆Y+ (下)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "启用自动配置") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, diff --git a/intl/msg_hash_cht.h b/intl/msg_hash_cht.h index 6eeed496da..2f3faad0a0 100644 --- a/intl/msg_hash_cht.h +++ b/intl/msg_hash_cht.h @@ -682,6 +682,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, "右搖桿Y- (上)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, "右搖桿Y+ (下)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "啟用自動設定") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, diff --git a/intl/msg_hash_de.h b/intl/msg_hash_de.h index 7b8eb52625..88a901c924 100644 --- a/intl/msg_hash_de.h +++ b/intl/msg_hash_de.h @@ -687,6 +687,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, "Rechter Analogstick Y- (nach oben)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, "Rechter Analogstick Y+ (nach unten)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Automatische Konfiguration aktivieren") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, diff --git a/intl/msg_hash_eo.h b/intl/msg_hash_eo.h index 627cabb0e4..dd89e15d49 100644 --- a/intl/msg_hash_eo.h +++ b/intl/msg_hash_eo.h @@ -598,6 +598,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, "Right analog Y- (up)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, "Right analog Y+ (down)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Autoconfig Enable") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, diff --git a/intl/msg_hash_fr.h b/intl/msg_hash_fr.h index ad92c95526..3de35add8f 100644 --- a/intl/msg_hash_fr.h +++ b/intl/msg_hash_fr.h @@ -681,6 +681,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, "Analogique droit Y- (haut)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, "Analogique droit Y+ (bas)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Activer l'autoconfiguration") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, diff --git a/intl/msg_hash_it.h b/intl/msg_hash_it.h index d8f989e0ae..74aaf27942 100644 --- a/intl/msg_hash_it.h +++ b/intl/msg_hash_it.h @@ -687,6 +687,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, "Analogico Destro Y- (su)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, "Analogico Destro Y+ (giù)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Abilita Autoconfigurazione") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, diff --git a/intl/msg_hash_ja.h b/intl/msg_hash_ja.h index eb233b64c6..5eee3b8c8d 100644 --- a/intl/msg_hash_ja.h +++ b/intl/msg_hash_ja.h @@ -705,6 +705,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, "右アナログY- (上)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, "右アナログY+ (下)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "自動コンフィグを有効") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, diff --git a/intl/msg_hash_ko.h b/intl/msg_hash_ko.h index f05b7b4ceb..4dcb2315ff 100644 --- a/intl/msg_hash_ko.h +++ b/intl/msg_hash_ko.h @@ -669,6 +669,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, "우 아날로그 Y- (상)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, "우 아날로그 Y+ (하)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "자동설정 사용") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, diff --git a/intl/msg_hash_nl.h b/intl/msg_hash_nl.h index aa441fa969..245ae1a437 100644 --- a/intl/msg_hash_nl.h +++ b/intl/msg_hash_nl.h @@ -598,6 +598,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, "Right analog Y- (up)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, "Right analog Y+ (down)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Autoconfiguratie Activeren") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, diff --git a/intl/msg_hash_pt_br.h b/intl/msg_hash_pt_br.h index c8ce759e90..9e98aafce8 100644 --- a/intl/msg_hash_pt_br.h +++ b/intl/msg_hash_pt_br.h @@ -661,6 +661,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, "Analógico Direito Y+ (baixo)" ) +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Habilitar Autoconfiguração" ) diff --git a/intl/msg_hash_pt_pt.h b/intl/msg_hash_pt_pt.h index bfb5b7cb3a..3c35f71320 100644 --- a/intl/msg_hash_pt_pt.h +++ b/intl/msg_hash_pt_pt.h @@ -669,6 +669,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, "Analógico Direito Y- (cima)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, "Analógico Direito Y+ (baixo)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Habilitar Auto-configuração") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, diff --git a/intl/msg_hash_ru.h b/intl/msg_hash_ru.h index dfa3f024c7..7cb859c746 100644 --- a/intl/msg_hash_ru.h +++ b/intl/msg_hash_ru.h @@ -690,6 +690,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, "Правый аналоговый стик - ось Y- (вверх)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, "Правый аналоговый стик - ось Y+ (вниз)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Автоматическая настройка включена") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 565e1b85f3..9760de42f9 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -699,6 +699,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, "Right analog Y- (up)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, "Right analog Y+ (down)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Autoconfig Enable") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, diff --git a/intl/msg_hash_vn.h b/intl/msg_hash_vn.h index 00adb3fc70..662a1136c1 100644 --- a/intl/msg_hash_vn.h +++ b/intl/msg_hash_vn.h @@ -681,6 +681,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, "Right analog Y- (up)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, "Right analog Y+ (down)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Kích hoạt Autoconfig") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, diff --git a/msg_hash.h b/msg_hash.h index 8eb389a235..0cce4dfd36 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -568,6 +568,17 @@ enum msg_hash_enums MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_KEY, From dbd9bf3b46c5ab8b2eaefa6cb6ec3dc53bd7b504 Mon Sep 17 00:00:00 2001 From: David Walters Date: Sun, 26 Nov 2017 16:59:48 +0000 Subject: [PATCH 169/183] New lightgun binds --- config.def.keybinds.h | 36 ++++++++++++++++++++++++++++++++++++ input/input_defines.h | 19 ++++++++++++++++++- input/input_driver.c | 12 ++++++++++++ 3 files changed, 66 insertions(+), 1 deletion(-) diff --git a/config.def.keybinds.h b/config.def.keybinds.h index 6a999a0e32..b7f0a32e86 100644 --- a/config.def.keybinds.h +++ b/config.def.keybinds.h @@ -50,6 +50,18 @@ static const struct retro_keybind retro_keybinds_1[] = { { true, RARCH_ANALOG_RIGHT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, { true, RARCH_ANALOG_RIGHT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_TRIGGER, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_RELOAD, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_AUX_A, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_AUX_B, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_AUX_C, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_START, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_DPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_DPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_DPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_DPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_TURBO_ENABLE, MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, { true, RARCH_FAST_FORWARD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, @@ -113,6 +125,18 @@ static const struct retro_keybind retro_keybinds_1[] = { { true, RARCH_ANALOG_RIGHT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, { true, RARCH_ANALOG_RIGHT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_TRIGGER, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_RELOAD, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_AUX_A, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_AUX_B, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_AUX_C, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_START, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_DPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_DPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_DPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_DPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_TURBO_ENABLE, MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, { true, RARCH_FAST_FORWARD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_KEY, RETROK_SPACE, NO_BTN, NO_BTN, 0, AXIS_NONE }, @@ -181,6 +205,18 @@ static const struct retro_keybind retro_keybinds_rest[] = { { true, RARCH_ANALOG_RIGHT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, { true, RARCH_ANALOG_RIGHT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_TRIGGER, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_RELOAD, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_AUX_A, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_AUX_B, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_AUX_C, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_START, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_DPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_DPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_DPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_DPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_TURBO_ENABLE, MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, }; diff --git a/input/input_defines.h b/input/input_defines.h index 2d1d88d3f3..d9ef13cc37 100644 --- a/input/input_defines.h +++ b/input/input_defines.h @@ -26,6 +26,8 @@ RETRO_BEGIN_DECLS #define MAX_USERS 16 #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 #define RARCH_FIRST_META_KEY RARCH_CUSTOM_BIND_LIST_END /* RetroArch specific bind IDs. */ @@ -42,9 +44,24 @@ enum RARCH_ANALOG_RIGHT_X_MINUS, RARCH_ANALOG_RIGHT_Y_PLUS, RARCH_ANALOG_RIGHT_Y_MINUS, + RARCH_ANALOG_BIND_LIST_END, + + /* Lightgun */ + RARCH_LIGHTGUN_TRIGGER = RARCH_FIRST_LIGHTGUN_BIND, + RARCH_LIGHTGUN_RELOAD, + RARCH_LIGHTGUN_AUX_A, + RARCH_LIGHTGUN_AUX_B, + RARCH_LIGHTGUN_AUX_C, + RARCH_LIGHTGUN_START, + RARCH_LIGHTGUN_SELECT, + RARCH_LIGHTGUN_DPAD_UP, + RARCH_LIGHTGUN_DPAD_DOWN, + RARCH_LIGHTGUN_DPAD_LEFT, + RARCH_LIGHTGUN_DPAD_RIGHT, + RARCH_LIGHTGUN_BIND_LIST_END, /* Turbo */ - RARCH_TURBO_ENABLE, + RARCH_TURBO_ENABLE = RARCH_FIRST_MISC_CUSTOM_BIND, RARCH_CUSTOM_BIND_LIST_END, diff --git a/input/input_driver.c b/input/input_driver.c index 8a6751c06f..d19414199f 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -267,6 +267,18 @@ const struct input_bind_map input_config_bind_map[RARCH_BIND_LIST_END_NULL] = { DECLARE_BIND(r_y_plus, RARCH_ANALOG_RIGHT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS), DECLARE_BIND(r_y_minus, RARCH_ANALOG_RIGHT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS), + DECLARE_BIND( gun_trigger, RARCH_LIGHTGUN_TRIGGER, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER ), + DECLARE_BIND( gun_offscreen_shot, RARCH_LIGHTGUN_RELOAD, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD ), + DECLARE_BIND( gun_aux_a, RARCH_LIGHTGUN_AUX_A, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A ), + DECLARE_BIND( gun_aux_b, RARCH_LIGHTGUN_AUX_B, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B ), + DECLARE_BIND( gun_aux_c, RARCH_LIGHTGUN_AUX_C, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C ), + DECLARE_BIND( gun_start, RARCH_LIGHTGUN_START, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START ), + DECLARE_BIND( gun_select, RARCH_LIGHTGUN_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT ), + DECLARE_BIND( gun_dpad_up, RARCH_LIGHTGUN_DPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP ), + DECLARE_BIND( gun_dpad_down, RARCH_LIGHTGUN_DPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN ), + DECLARE_BIND( gun_dpad_left, RARCH_LIGHTGUN_DPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT ), + DECLARE_BIND( gun_dpad_right, RARCH_LIGHTGUN_DPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT ), + DECLARE_BIND(turbo, RARCH_TURBO_ENABLE, MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE), DECLARE_META_BIND(1, toggle_fast_forward, RARCH_FAST_FORWARD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_KEY), From 816ffe6fcfa005fd470cb5ae9479fd2374146fab Mon Sep 17 00:00:00 2001 From: David Walters Date: Sun, 26 Nov 2017 17:04:30 +0000 Subject: [PATCH 170/183] Change mouse button name style in localisation strings. --- intl/msg_hash_chs.h | 18 +++++++++--------- intl/msg_hash_cht.h | 18 +++++++++--------- intl/msg_hash_de.h | 18 +++++++++--------- intl/msg_hash_eo.h | 18 +++++++++--------- intl/msg_hash_fr.h | 18 +++++++++--------- intl/msg_hash_it.h | 18 +++++++++--------- intl/msg_hash_ja.h | 18 +++++++++--------- intl/msg_hash_ko.h | 18 +++++++++--------- intl/msg_hash_nl.h | 18 +++++++++--------- intl/msg_hash_pt_br.h | 18 +++++++++--------- intl/msg_hash_pt_pt.h | 18 +++++++++--------- intl/msg_hash_ru.h | 18 +++++++++--------- intl/msg_hash_us.h | 18 +++++++++--------- intl/msg_hash_vn.h | 18 +++++++++--------- 14 files changed, 126 insertions(+), 126 deletions(-) diff --git a/intl/msg_hash_chs.h b/intl/msg_hash_chs.h index a153ea7f21..d9d5f633c1 100644 --- a/intl/msg_hash_chs.h +++ b/intl/msg_hash_chs.h @@ -767,23 +767,23 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(键: %s)") /*FIXME:"(Key: %s)"*/ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, - "MOUSE1") + "Mouse 1") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, - "MOUSE2") + "Mouse 2") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, - "MOUSE3") + "Mouse 3") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, - "MOUSE4") + "Mouse 4") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, - "MOUSE5") + "Mouse 5") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, - "MWHEELUP") + "Wheel Up") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, - "MWHEELDN") + "Wheel Down") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, - "MWHEELLEFT") + "Wheel Left") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, - "MWHEELRIGHT") + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "键盘控制器映射类型") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, diff --git a/intl/msg_hash_cht.h b/intl/msg_hash_cht.h index 2f3faad0a0..3074dc5f32 100644 --- a/intl/msg_hash_cht.h +++ b/intl/msg_hash_cht.h @@ -767,23 +767,23 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(鍵: %s)") /*FIXME:"(Key: %s)"*/ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, - "MOUSE1") + "Mouse 1") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, - "MOUSE2") + "Mouse 2") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, - "MOUSE3") + "Mouse 3") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, - "MOUSE4") + "Mouse 4") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, - "MOUSE5") + "Mouse 5") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, - "MWHEELUP") + "Wheel Up") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, - "MWHEELDN") + "Wheel Down") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, - "MWHEELLEFT") + "Wheel Left") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, - "MWHEELRIGHT") + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "鍵盤控制器映射類型") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, diff --git a/intl/msg_hash_de.h b/intl/msg_hash_de.h index 88a901c924..e5bf9687e8 100644 --- a/intl/msg_hash_de.h +++ b/intl/msg_hash_de.h @@ -774,23 +774,23 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Taste: %s)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, - "MOUSE1") + "Mouse 1") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, - "MOUSE2") + "Mouse 2") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, - "MOUSE3") + "Mouse 3") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, - "MOUSE4") + "Mouse 4") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, - "MOUSE5") + "Mouse 5") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, - "MWHEELUP") + "Wheel Up") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, - "MWHEELDN") + "Wheel Down") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, - "MWHEELLEFT") + "Wheel Left") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, - "MWHEELRIGHT") + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "Typ der Keyboard-Controller-Abbildung") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, diff --git a/intl/msg_hash_eo.h b/intl/msg_hash_eo.h index dd89e15d49..3f16073e95 100644 --- a/intl/msg_hash_eo.h +++ b/intl/msg_hash_eo.h @@ -683,23 +683,23 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Key: %s)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, - "MOUSE1") + "Mouse 1") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, - "MOUSE2") + "Mouse 2") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, - "MOUSE3") + "Mouse 3") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, - "MOUSE4") + "Mouse 4") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, - "MOUSE5") + "Mouse 5") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, - "MWHEELUP") + "Wheel Up") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, - "MWHEELDN") + "Wheel Down") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, - "MWHEELLEFT") + "Wheel Left") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, - "MWHEELRIGHT") + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "Keyboard Gamepad Mapping Type") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, diff --git a/intl/msg_hash_fr.h b/intl/msg_hash_fr.h index 3de35add8f..1920e13ad8 100644 --- a/intl/msg_hash_fr.h +++ b/intl/msg_hash_fr.h @@ -768,23 +768,23 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Touche : %s)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, - "MOUSE1") + "Mouse 1") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, - "MOUSE2") + "Mouse 2") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, - "MOUSE3") + "Mouse 3") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, - "MOUSE4") + "Mouse 4") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, - "MOUSE5") + "Mouse 5") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, - "MWHEELUP") + "Wheel Up") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, - "MWHEELDN") + "Wheel Down") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, - "MWHEELLEFT") + "Wheel Left") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, - "MWHEELRIGHT") + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "Type de mappage manette/clavier") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, diff --git a/intl/msg_hash_it.h b/intl/msg_hash_it.h index 74aaf27942..22232ed4f4 100644 --- a/intl/msg_hash_it.h +++ b/intl/msg_hash_it.h @@ -774,23 +774,23 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Tasto: %s)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, - "MOUSE1") + "Mouse 1") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, - "MOUSE2") + "Mouse 2") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, - "MOUSE3") + "Mouse 3") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, - "MOUSE4") + "Mouse 4") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, - "MOUSE5") + "Mouse 5") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, - "MWHEELUP") + "Wheel Up") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, - "MWHEELDN") + "Wheel Down") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, - "MWHEELLEFT") + "Wheel Left") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, - "MWHEELRIGHT") + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "Tipo di mappatura del gamepad della tastiera") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, diff --git a/intl/msg_hash_ja.h b/intl/msg_hash_ja.h index 5eee3b8c8d..ebae8a65ed 100644 --- a/intl/msg_hash_ja.h +++ b/intl/msg_hash_ja.h @@ -792,23 +792,23 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(キー: %s)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, - "MOUSE1") + "Mouse 1") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, - "MOUSE2") + "Mouse 2") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, - "MOUSE3") + "Mouse 3") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, - "MOUSE4") + "Mouse 4") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, - "MOUSE5") + "Mouse 5") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, - "MWHEELUP") + "Wheel Up") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, - "MWHEELDN") + "Wheel Down") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, - "MWHEELLEFT") + "Wheel Left") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, - "MWHEELRIGHT") + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "キーボードのゲームパッドマッピング式") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, diff --git a/intl/msg_hash_ko.h b/intl/msg_hash_ko.h index 4dcb2315ff..9a22edd4c8 100644 --- a/intl/msg_hash_ko.h +++ b/intl/msg_hash_ko.h @@ -754,23 +754,23 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(키: %s)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, - "MOUSE1") + "Mouse 1") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, - "MOUSE2") + "Mouse 2") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, - "MOUSE3") + "Mouse 3") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, - "MOUSE4") + "Mouse 4") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, - "MOUSE5") + "Mouse 5") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, - "MWHEELUP") + "Wheel Up") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, - "MWHEELDN") + "Wheel Down") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, - "MWHEELLEFT") + "Wheel Left") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, - "MWHEELRIGHT") + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "키보드 게임패드 설정 형식") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, diff --git a/intl/msg_hash_nl.h b/intl/msg_hash_nl.h index 245ae1a437..dcd21e2962 100644 --- a/intl/msg_hash_nl.h +++ b/intl/msg_hash_nl.h @@ -683,23 +683,23 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Key: %s)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, - "MOUSE1") + "Mouse 1") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, - "MOUSE2") + "Mouse 2") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, - "MOUSE3") + "Mouse 3") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, - "MOUSE4") + "Mouse 4") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, - "MOUSE5") + "Mouse 5") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, - "MWHEELUP") + "Wheel Up") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, - "MWHEELDN") + "Wheel Down") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, - "MWHEELLEFT") + "Wheel Left") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, - "MWHEELRIGHT") + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "Keyboard Gamepad Mapping Type") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, diff --git a/intl/msg_hash_pt_br.h b/intl/msg_hash_pt_br.h index 9e98aafce8..2603504428 100644 --- a/intl/msg_hash_pt_br.h +++ b/intl/msg_hash_pt_br.h @@ -780,23 +780,23 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Tecla: %s)" ) MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, - "MOUSE1") + "Mouse 1") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, - "MOUSE2") + "Mouse 2") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, - "MOUSE3") + "Mouse 3") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, - "MOUSE4") + "Mouse 4") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, - "MOUSE5") + "Mouse 5") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, - "MWHEELUP") + "Wheel Up") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, - "MWHEELDN") + "Wheel Down") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, - "MWHEELLEFT") + "Wheel Left") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, - "MWHEELRIGHT") + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "Tipo de Mapeamento para Gamepad no Teclado" ) diff --git a/intl/msg_hash_pt_pt.h b/intl/msg_hash_pt_pt.h index 3c35f71320..9e6cb8641d 100644 --- a/intl/msg_hash_pt_pt.h +++ b/intl/msg_hash_pt_pt.h @@ -754,23 +754,23 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Tecla: %s)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, - "MOUSE1") + "Mouse 1") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, - "MOUSE2") + "Mouse 2") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, - "MOUSE3") + "Mouse 3") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, - "MOUSE4") + "Mouse 4") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, - "MOUSE5") + "Mouse 5") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, - "MWHEELUP") + "Wheel Up") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, - "MWHEELDN") + "Wheel Down") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, - "MWHEELLEFT") + "Wheel Left") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, - "MWHEELRIGHT") + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "Tipo de Mapeamento do Gamepad no Teclado") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, diff --git a/intl/msg_hash_ru.h b/intl/msg_hash_ru.h index 7cb859c746..84aec3c7ba 100644 --- a/intl/msg_hash_ru.h +++ b/intl/msg_hash_ru.h @@ -777,23 +777,23 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Клавиша: %s)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, - "MOUSE1") + "Mouse 1") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, - "MOUSE2") + "Mouse 2") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, - "MOUSE3") + "Mouse 3") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, - "MOUSE4") + "Mouse 4") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, - "MOUSE5") + "Mouse 5") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, - "MWHEELUP") + "Wheel Up") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, - "MWHEELDN") + "Wheel Down") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, - "MWHEELLEFT") + "Wheel Left") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, - "MWHEELRIGHT") + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "Тип отображения клавиатуры для геймпада") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 9760de42f9..f877546905 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -786,23 +786,23 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Key: %s)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, - "MOUSE1") + "Mouse 1") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, - "MOUSE2") + "Mouse 2") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, - "MOUSE3") + "Mouse 3") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, - "MOUSE4") + "Mouse 4") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, - "MOUSE5") + "Mouse 5") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, - "MWHEELUP") + "Wheel Up") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, - "MWHEELDN") + "Wheel Down") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, - "MWHEELLEFT") + "Wheel Left") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, - "MWHEELRIGHT") + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "Keyboard Gamepad Mapping Type") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, diff --git a/intl/msg_hash_vn.h b/intl/msg_hash_vn.h index 662a1136c1..efea88ed20 100644 --- a/intl/msg_hash_vn.h +++ b/intl/msg_hash_vn.h @@ -766,23 +766,23 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Key: %s)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, - "MOUSE1") + "Mouse 1") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, - "MOUSE2") + "Mouse 2") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, - "MOUSE3") + "Mouse 3") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, - "MOUSE4") + "Mouse 4") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, - "MOUSE5") + "Mouse 5") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, - "MWHEELUP") + "Wheel Up") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, - "MWHEELDN") + "Wheel Down") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, - "MWHEELLEFT") + "Wheel Left") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, - "MWHEELRIGHT") + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "Keyboard Gamepad Mapping Type") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, From 59c188f75cb3e758b10077a1aa9de16382606103 Mon Sep 17 00:00:00 2001 From: David Walters Date: Sun, 26 Nov 2017 17:09:15 +0000 Subject: [PATCH 171/183] Implement new lightgun API --- input/drivers/dinput.c | 121 ++++++++++++++++++++++++++++++++++------- 1 file changed, 101 insertions(+), 20 deletions(-) diff --git a/input/drivers/dinput.c b/input/drivers/dinput.c index 23fe84a719..9b2e14f66e 100644 --- a/input/drivers/dinput.c +++ b/input/drivers/dinput.c @@ -369,27 +369,67 @@ static bool dinput_meta_key_pressed(void *data, int key) return false; } -static int16_t dinput_lightgun_state(struct dinput_input *di, unsigned id) +static int16_t dinput_lightgun_aiming_state( struct dinput_input *di, unsigned idx, unsigned id ) { - switch (id) - { - case RETRO_DEVICE_ID_LIGHTGUN_X: - return di->mouse_rel_x; - case RETRO_DEVICE_ID_LIGHTGUN_Y: - return di->mouse_rel_y; - case RETRO_DEVICE_ID_LIGHTGUN_TRIGGER: - return di->mouse_l; - case RETRO_DEVICE_ID_LIGHTGUN_CURSOR: - return di->mouse_m; - case RETRO_DEVICE_ID_LIGHTGUN_TURBO: - return di->mouse_r; - case RETRO_DEVICE_ID_LIGHTGUN_START: - return di->mouse_m && di->mouse_r; - case RETRO_DEVICE_ID_LIGHTGUN_PAUSE: - return di->mouse_m && di->mouse_l; - } + const int edge_detect = 32700; + struct video_viewport vp; + bool inside = false; + int x = 0; + int y = 0; + int16_t res_x = 0; + int16_t res_y = 0; + int16_t res_screen_x = 0; + int16_t res_screen_y = 0; + unsigned num = 0; - return 0; + struct pointer_status* check_pos = di->pointer_head.next; + + vp.x = 0; + vp.y = 0; + vp.width = 0; + vp.height = 0; + vp.full_width = 0; + vp.full_height = 0; + + while ( check_pos && num < idx ) + { + num++; + check_pos = check_pos->next; + } + + if ( !check_pos && idx > 0 ) /* idx = 0 has mouse fallback. */ + return 0; + + x = di->mouse_x; + y = di->mouse_y; + + if ( check_pos ) + { + x = check_pos->pointer_x; + y = check_pos->pointer_y; + } + + if ( !( video_driver_translate_coord_viewport_wrap( + &vp, x, y, &res_x, &res_y, &res_screen_x, &res_screen_y ) ) ) + { + return 0; + } + + inside = (res_x >= -edge_detect) && (res_y >= -edge_detect) && (res_x <= edge_detect) && (res_y <= edge_detect); + + switch ( id ) + { + case RETRO_DEVICE_ID_LIGHTGUN_SCREEN_X: + return inside ? res_x : 0; + case RETRO_DEVICE_ID_LIGHTGUN_SCREEN_Y: + return inside ? res_y : 0; + case RETRO_DEVICE_ID_LIGHTGUN_IS_OFFSCREEN: + return !inside; + default: + break; + } + + return 0; } static int16_t dinput_mouse_state(struct dinput_input *di, unsigned port, unsigned id) @@ -583,7 +623,48 @@ static int16_t dinput_input_state(void *data, device == RARCH_DEVICE_POINTER_SCREEN); case RETRO_DEVICE_LIGHTGUN: - return dinput_lightgun_state(di, id); + switch ( id ) + { + /*aiming*/ + case RETRO_DEVICE_ID_LIGHTGUN_SCREEN_X: + case RETRO_DEVICE_ID_LIGHTGUN_SCREEN_Y: + case RETRO_DEVICE_ID_LIGHTGUN_IS_OFFSCREEN: + return dinput_lightgun_aiming_state( di, idx, id ); + + /*buttons*/ + case RETRO_DEVICE_ID_LIGHTGUN_TRIGGER: + return dinput_is_pressed(di, joypad_info, binds[port], port, RARCH_LIGHTGUN_TRIGGER); + case RETRO_DEVICE_ID_LIGHTGUN_RELOAD: + return dinput_is_pressed(di, joypad_info, binds[port], port, RARCH_LIGHTGUN_RELOAD); + case RETRO_DEVICE_ID_LIGHTGUN_AUX_A: + return dinput_is_pressed(di, joypad_info, binds[port], port, RARCH_LIGHTGUN_AUX_A); + case RETRO_DEVICE_ID_LIGHTGUN_AUX_B: + return dinput_is_pressed(di, joypad_info, binds[port], port, RARCH_LIGHTGUN_AUX_B); + case RETRO_DEVICE_ID_LIGHTGUN_AUX_C: + return dinput_is_pressed(di, joypad_info, binds[port], port, RARCH_LIGHTGUN_AUX_C); + case RETRO_DEVICE_ID_LIGHTGUN_START: + return dinput_is_pressed(di, joypad_info, binds[port], port, RARCH_LIGHTGUN_START); + case RETRO_DEVICE_ID_LIGHTGUN_SELECT: + return dinput_is_pressed(di, joypad_info, binds[port], port, RARCH_LIGHTGUN_SELECT); + case RETRO_DEVICE_ID_LIGHTGUN_DPAD_UP: + return dinput_is_pressed(di, joypad_info, binds[port], port, RARCH_LIGHTGUN_DPAD_UP); + case RETRO_DEVICE_ID_LIGHTGUN_DPAD_DOWN: + return dinput_is_pressed(di, joypad_info, binds[port], port, RARCH_LIGHTGUN_DPAD_DOWN); + case RETRO_DEVICE_ID_LIGHTGUN_DPAD_LEFT: + return dinput_is_pressed(di, joypad_info, binds[port], port, RARCH_LIGHTGUN_DPAD_LEFT); + case RETRO_DEVICE_ID_LIGHTGUN_DPAD_RIGHT: + return dinput_is_pressed(di, joypad_info, binds[port], port, RARCH_LIGHTGUN_DPAD_RIGHT); + + /*deprecated*/ + case RETRO_DEVICE_ID_LIGHTGUN_X: + return di->mouse_rel_x; + case RETRO_DEVICE_ID_LIGHTGUN_Y: + return di->mouse_rel_y; + case RETRO_DEVICE_ID_LIGHTGUN_PAUSE: + return dinput_is_pressed(di, joypad_info, binds[port], port, RARCH_LIGHTGUN_START); + + } + break; } return 0; From 6168db8aebe19639d7afef7a74ea2081dd8b24f5 Mon Sep 17 00:00:00 2001 From: David Walters Date: Sun, 26 Nov 2017 17:20:41 +0000 Subject: [PATCH 172/183] correct lightgun api comment --- libretro-common/include/libretro.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libretro-common/include/libretro.h b/libretro-common/include/libretro.h index 4cb422bfcc..b900ac93e6 100644 --- a/libretro-common/include/libretro.h +++ b/libretro-common/include/libretro.h @@ -130,7 +130,7 @@ extern "C" { * It reports X/Y coordinates in screen space (similar to the pointer) * in the range [-0x8000, 0x7fff] in both axes, with zero being center. * As well as reporting on/off screen state. It features a trigger, - * start/select buttons, four auxiliary action buttons and a + * start/select buttons, auxiliary action buttons and a * directional pad. A forced off-screen shot can be requested for * auto-reloading function in some games. */ From 461b884dc0cc9e13ee5caaf7112558c7e0f6fb36 Mon Sep 17 00:00:00 2001 From: Brian Koropoff Date: Sun, 26 Nov 2017 09:58:24 -0800 Subject: [PATCH 173/183] Remove commited Mac binaries --- libretro-db/c_converter | Bin 69288 -> 0 bytes libretro-db/libretrodb_tool | Bin 58068 -> 0 bytes libretro-db/rmsgpack_test | Bin 25792 -> 0 bytes 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100755 libretro-db/c_converter delete mode 100755 libretro-db/libretrodb_tool delete mode 100755 libretro-db/rmsgpack_test diff --git a/libretro-db/c_converter b/libretro-db/c_converter deleted file mode 100755 index 3887af551f1c685a4f6c022f8b6cb2908f140de1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69288 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 diff --git a/libretro-db/libretrodb_tool b/libretro-db/libretrodb_tool deleted file mode 100755 index 6103a09b3cd9a6444fa398e76a366952b602b812..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58068 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 X-0;ldjy|L_eufK%Xu1fQPpA14D$>%5 diff --git a/libretro-db/rmsgpack_test b/libretro-db/rmsgpack_test deleted file mode 100755 index 2f694d014fcb9fb954d818043fcfea173e95e8da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25792 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 From 3991f9b316548064041c210d41f8eee4defe3a03 Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 26 Nov 2017 12:15:51 -0500 Subject: [PATCH 174/183] add frontend name to netplay announce --- network/netplay/netplay_frontend.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/network/netplay/netplay_frontend.c b/network/netplay/netplay_frontend.c index 49026cb10f..b393865a7a 100644 --- a/network/netplay/netplay_frontend.c +++ b/network/netplay/netplay_frontend.c @@ -613,9 +613,12 @@ static void netplay_announce(void) char *corename = NULL; char *gamename = NULL; char *coreversion = NULL; + char *frontend_ident = NULL; settings_t *settings = config_get_ptr(); rarch_system_info_t *system = runloop_get_system_info(); uint32_t content_crc = content_get_crc(); + const frontend_ctx_driver_t + *frontend = frontend_get_ptr(); net_http_urlencode_full(&username, settings->paths.username); net_http_urlencode_full(&corename, system->info.library_name); @@ -623,18 +626,19 @@ static void netplay_announce(void) !string_is_empty(path_basename(path_get(RARCH_PATH_BASENAME))) ? path_basename(path_get(RARCH_PATH_BASENAME)) : "N/A"); net_http_urlencode_full(&coreversion, system->info.library_version); + net_http_urlencode_full(&frontend_ident, frontend->ident); buf[0] = '\0'; snprintf(buf, sizeof(buf), "username=%s&core_name=%s&core_version=%s&" "game_name=%s&game_crc=%08X&port=%d" - "&has_password=%d&has_spectate_password=%d&force_mitm=%d&retroarch_version=%s", + "&has_password=%d&has_spectate_password=%d&force_mitm=%d&retroarch_version=%s&frontend=%s", username, corename, coreversion, gamename, content_crc, settings->uints.netplay_port, *settings->paths.netplay_password ? 1 : 0, *settings->paths.netplay_spectate_password ? 1 : 0, settings->bools.netplay_use_mitm_server, - PACKAGE_VERSION); + PACKAGE_VERSION, frontend_ident); #if 0 RARCH_LOG("[netplay] announcement URL: %s\n", buf); #endif From bc69737dae395b9b92de1ab7a5130cf2396f4c39 Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 26 Nov 2017 13:00:30 -0500 Subject: [PATCH 175/183] remove this, it's causing issues with the history list --- command.c | 1 - 1 file changed, 1 deletion(-) diff --git a/command.c b/command.c index 7f281ba546..ac088b7fdb 100644 --- a/command.c +++ b/command.c @@ -1805,7 +1805,6 @@ bool command_event(enum event_command cmd, void *data) case CMD_EVENT_LOAD_CORE_PERSIST: { #ifdef HAVE_MENU - path_clear_all(); core_info_ctx_find_t info_find; rarch_system_info_t *system_info = runloop_get_system_info(); struct retro_system_info *system = &system_info->info; From 2dda04787a79aa2c66016e39847ce1c58f79820a Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 26 Nov 2017 13:39:39 -0500 Subject: [PATCH 176/183] only disable states when hardcore mode is enabled --- command.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/command.c b/command.c index ac088b7fdb..019dd62a27 100644 --- a/command.c +++ b/command.c @@ -1102,7 +1102,7 @@ static void command_event_load_auto_state(void) #endif #ifdef HAVE_CHEEVOS - if (settings->bools.cheevos_hardcore_mode_enable) + if (cheevos_loaded && settings->bools.cheevos_hardcore_mode_enable) goto error; #endif @@ -1356,7 +1356,7 @@ static bool command_event_save_auto_state(void) goto error; #ifdef HAVE_CHEEVOS - if (settings->bools.cheevos_hardcore_mode_enable) + if (cheevos_loaded && settings->bools.cheevos_hardcore_mode_enable) goto error; #endif @@ -1845,7 +1845,7 @@ bool command_event(enum event_command cmd, void *data) #ifdef HAVE_CHEEVOS { settings_t *settings = config_get_ptr(); - if (settings->bools.cheevos_hardcore_mode_enable) + if (cheevos_loaded && settings->bools.cheevos_hardcore_mode_enable) return false; } #endif @@ -1887,7 +1887,7 @@ bool command_event(enum event_command cmd, void *data) { settings_t *settings = config_get_ptr(); #ifdef HAVE_CHEEVOS - if (settings->bools.cheevos_hardcore_mode_enable) + if (cheevos_loaded && settings->bools.cheevos_hardcore_mode_enable) return false; #endif @@ -1978,7 +1978,7 @@ bool command_event(enum event_command cmd, void *data) { #ifdef HAVE_CHEEVOS settings_t *settings = config_get_ptr(); - if (settings->bools.cheevos_hardcore_mode_enable) + if (cheevos_loaded && settings->bools.cheevos_hardcore_mode_enable) return false; #endif @@ -1989,7 +1989,7 @@ bool command_event(enum event_command cmd, void *data) { settings_t *settings = config_get_ptr(); #ifdef HAVE_CHEEVOS - if (settings->bools.cheevos_hardcore_mode_enable) + if (cheevos_loaded && settings->bools.cheevos_hardcore_mode_enable) return false; #endif if (settings->bools.rewind_enable) From 6e67a6ba632e1fa7cc941fd1c40a793c7b6b3537 Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 26 Nov 2017 13:43:00 -0500 Subject: [PATCH 177/183] let's just clear basename instead (used to populate override, remaps, shader preset paths --- command.c | 1 + 1 file changed, 1 insertion(+) diff --git a/command.c b/command.c index 019dd62a27..c1e83e008d 100644 --- a/command.c +++ b/command.c @@ -1805,6 +1805,7 @@ bool command_event(enum event_command cmd, void *data) case CMD_EVENT_LOAD_CORE_PERSIST: { #ifdef HAVE_MENU + path_clear(RARCH_PATH_BASENAME); core_info_ctx_find_t info_find; rarch_system_info_t *system_info = runloop_get_system_info(); struct retro_system_info *system = &system_info->info; From fec63ae8edec7f547c3f4ad6bbe0d4c025452542 Mon Sep 17 00:00:00 2001 From: orbea Date: Sun, 26 Nov 2017 12:26:33 -0800 Subject: [PATCH 178/183] qb: Set configure paths without unset variables. --- qb/config.libs.sh | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/qb/config.libs.sh b/qb/config.libs.sh index 9ef47c2f83..d93a6f2732 100644 --- a/qb/config.libs.sh +++ b/qb/config.libs.sh @@ -150,14 +150,9 @@ fi add_define MAKEFILE libretro "$LIBRETRO" } -[ -z "$ASSETS_DIR" ] && ASSETS_DIR="${PREFIX}/share" -add_define MAKEFILE ASSETS_DIR "$ASSETS_DIR" - -[ -z "$BIN_DIR" ] && BIN_DIR="${PREFIX}/bin" -add_define MAKEFILE BIN_DIR "$BIN_DIR" - -[ -z "$MAN_DIR" ] && MAN_DIR="${PREFIX}/share/man" -add_define MAKEFILE MAN_DIR "$MAN_DIR" +add_define MAKEFILE ASSETS_DIR "${ASSETS_DIR:-${PREFIX}/share}" +add_define MAKEFILE BIN_DIR "${BIN_DIR:-${PREFIX}/bin}" +add_define MAKEFILE MAN_DIR "${MAN_DIR:-${PREFIX}/share/man}" if [ "$OS" = 'DOS' ]; then HAVE_SHADERPIPELINE=no From 97f971fd46e850b7f233fdce6374cc0e96179a93 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 26 Nov 2017 22:38:12 +0100 Subject: [PATCH 179/183] Fix C89 build --- command.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/command.c b/command.c index c1e83e008d..41f23e6ff7 100644 --- a/command.c +++ b/command.c @@ -1805,11 +1805,15 @@ bool command_event(enum event_command cmd, void *data) case CMD_EVENT_LOAD_CORE_PERSIST: { #ifdef HAVE_MENU - path_clear(RARCH_PATH_BASENAME); core_info_ctx_find_t info_find; - rarch_system_info_t *system_info = runloop_get_system_info(); - struct retro_system_info *system = &system_info->info; - const char *core_path = path_get(RARCH_PATH_CORE); + rarch_system_info_t *system_info = NULL; + struct retro_system_info *system = NULL; + const char *core_path = NULL; + + path_clear(RARCH_PATH_BASENAME); + system_info = runloop_get_system_info(); + system = &system_info->info; + core_path = path_get(RARCH_PATH_CORE); #if defined(HAVE_DYNAMIC) if (string_is_empty(core_path)) From e35394d4bdcf738f412f7515a25aa9a66593b9d4 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 26 Nov 2017 22:41:34 +0100 Subject: [PATCH 180/183] Fix MSVC 2003 build --- input/input_driver.c | 8 ++++---- libretro-common/compat/compat_strl.c | 2 +- libretro-common/file/nbio/nbio_windowsmmap.c | 2 +- menu/cbs/menu_cbs_ok.c | 2 +- tasks/task_file_transfer.c | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/input/input_driver.c b/input/input_driver.c index d19414199f..931da37956 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -2658,11 +2658,11 @@ void input_config_get_bind_string(char *buf, const struct retro_keybind *bind, break; } /* switch ( bind->mbutton ) */ - if ( tag != 0 ) { - if ( delim ) { + if (tag != 0) + { + if (delim) strlcat(buf, ", ", size); - } - strlcat( buf, msg_hash_to_str(tag), size ); + strlcat(buf, msg_hash_to_str((msg_hash_enums)tag), size ); delim = 1; } } diff --git a/libretro-common/compat/compat_strl.c b/libretro-common/compat/compat_strl.c index 3473ba56d3..9886b22ed2 100644 --- a/libretro-common/compat/compat_strl.c +++ b/libretro-common/compat/compat_strl.c @@ -64,7 +64,7 @@ size_t strlcat(char *dest, const char *source, size_t size) char *strldup(const char *s, size_t n) { - char *dst = malloc(sizeof(char) * (n + 1)); + char *dst = (char*)malloc(sizeof(char) * (n + 1)); strlcpy(dst, s, n); return dst; } diff --git a/libretro-common/file/nbio/nbio_windowsmmap.c b/libretro-common/file/nbio/nbio_windowsmmap.c index 1777398136..17e2a2332d 100644 --- a/libretro-common/file/nbio/nbio_windowsmmap.c +++ b/libretro-common/file/nbio/nbio_windowsmmap.c @@ -79,7 +79,7 @@ static void *nbio_mmap_win32_open(const char * filename, unsigned mode) ptr = MapViewOfFile(mem, is_write ? (FILE_MAP_READ|FILE_MAP_WRITE) : FILE_MAP_READ, 0, 0, len.QuadPart); CloseHandle(mem); - handle = malloc(sizeof(struct nbio_mmap_win32_t)); + handle = (nbio_mmap_win32_t*)malloc(sizeof(struct nbio_mmap_win32_t)); handle->file = file; handle->is_write = is_write; diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 638d0e40ce..588c705ed2 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -1368,7 +1368,7 @@ static int default_action_ok_load_content_with_core_from_menu(const char *_path, content_info.argv = NULL; content_info.args = NULL; content_info.environ_get = NULL; - if (!task_push_load_content_with_core_from_menu(_path, &content_info, _type, NULL, NULL)) + if (!task_push_load_content_with_core_from_menu(_path, &content_info, (rarch_core_type)_type, NULL, NULL)) return -1; return 0; } diff --git a/tasks/task_file_transfer.c b/tasks/task_file_transfer.c index de00534f4d..9d8ed3976a 100644 --- a/tasks/task_file_transfer.c +++ b/tasks/task_file_transfer.c @@ -67,7 +67,7 @@ void task_file_load_handler(retro_task_t *task) case NBIO_STATUS_INIT: if (nbio && !string_is_empty(nbio->path)) { - struct nbio_t *handle = nbio_open(nbio->path, NBIO_READ); + struct nbio_t *handle = (struct nbio_t*)nbio_open(nbio->path, NBIO_READ); if (handle) { From 493d442f8c79191f4a921a1a07c9248b7f77a13d Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 26 Nov 2017 22:43:58 +0100 Subject: [PATCH 181/183] Silence some warnings --- menu/cbs/menu_cbs_ok.c | 4 ++-- network/netplay/netplay_discovery.c | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 588c705ed2..d5615dabe8 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -3388,12 +3388,12 @@ static void netplay_refresh_rooms_cb(void *task_data, void *user_data, const cha calloc(netplay_room_count + lan_room_count, sizeof(struct netplay_room)); - for (i = 0; i < netplay_room_count; i++) + for (i = 0; i < (unsigned)netplay_room_count; i++) memcpy(&netplay_room_list[i], netplay_room_get(i), sizeof(netplay_room_list[i])); if (lan_room_count != 0) { - for (i = netplay_room_count; i < netplay_room_count + lan_room_count; i++) + for (i = netplay_room_count; i < (unsigned)(netplay_room_count + lan_room_count); i++) { struct netplay_host *host = &lan_hosts->hosts[j++]; diff --git a/network/netplay/netplay_discovery.c b/network/netplay/netplay_discovery.c index 6ab0591318..82e63ada7a 100644 --- a/network/netplay/netplay_discovery.c +++ b/network/netplay/netplay_discovery.c @@ -128,8 +128,8 @@ bool netplay_discovery_driver_ctl(enum rarch_netplay_discovery_ctl_state state, { #ifndef RARCH_CONSOLE char port_str[6]; - int k = 0; int ret; + unsigned k = 0; if (lan_ad_client_fd < 0) return false; @@ -138,10 +138,9 @@ bool netplay_discovery_driver_ctl(enum rarch_netplay_discovery_ctl_state state, { case RARCH_NETPLAY_DISCOVERY_CTL_LAN_SEND_QUERY: { - struct addrinfo hints = {0}, *addr; - int canBroadcast = 1; - net_ifinfo_t interfaces; + struct addrinfo hints = {0}, *addr; + int canBroadcast = 1; if (!net_ifinfo_new(&interfaces)) return false; @@ -162,7 +161,7 @@ bool netplay_discovery_driver_ctl(enum rarch_netplay_discovery_ctl_state state, memcpy((void *) &ad_packet_buffer, "RANQ", 4); ad_packet_buffer.protocol_version = htonl(NETPLAY_PROTOCOL_VERSION); - for (k=0; k < interfaces.size; k++) + for (k = 0; k < (unsigned)interfaces.size; k++) { strlcpy(ad_packet_buffer.address, interfaces.entries[k].host, NETPLAY_HOST_STR_LEN); @@ -233,11 +232,12 @@ bool netplay_lan_ad_server(netplay_t *netplay) /* Todo: implement net_ifinfo and ntohs for consoles */ #ifndef RARCH_CONSOLE fd_set fds; + int ret; struct timeval tmp_tv = {0}; struct sockaddr their_addr; socklen_t addr_size; rarch_system_info_t *info = NULL; - int ret, k = 0; + unsigned k = 0; char reply_addr[NETPLAY_HOST_STR_LEN], port_str[6]; struct addrinfo *our_addr, hints = {0}; From 00d57af00508b1632701c594ce2c57fd607e0805 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 26 Nov 2017 22:53:42 +0100 Subject: [PATCH 182/183] C89_BUILD fixes --- gfx/video_driver.c | 2 +- input/input_driver.c | 2 +- libretro-common/file/nbio/nbio_linux.c | 15 ++++++++++++++- libretro-common/file/nbio/nbio_unixmmap.c | 16 ++++++++++++++-- libretro-common/file/nbio/nbio_windowsmmap.c | 17 +++++++++++++++-- retroarch.c | 5 ++--- 6 files changed, 47 insertions(+), 10 deletions(-) diff --git a/gfx/video_driver.c b/gfx/video_driver.c index b4ae34c571..1656d11bab 100644 --- a/gfx/video_driver.c +++ b/gfx/video_driver.c @@ -2409,7 +2409,7 @@ void video_driver_frame(const void *data, unsigned width, video_driver_frame_count++; - // Display the FPS, with a higher priority. + /* Display the FPS, with a higher priority. */ if (video_info.fps_show) runloop_msg_queue_push(video_info.fps_text, 2, 1, true); } diff --git a/input/input_driver.c b/input/input_driver.c index 931da37956..0506b90a23 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -2662,7 +2662,7 @@ void input_config_get_bind_string(char *buf, const struct retro_keybind *bind, { if (delim) strlcat(buf, ", ", size); - strlcat(buf, msg_hash_to_str((msg_hash_enums)tag), size ); + strlcat(buf, msg_hash_to_str((enum msg_hash_enums)tag), size ); delim = 1; } } diff --git a/libretro-common/file/nbio/nbio_linux.c b/libretro-common/file/nbio/nbio_linux.c index e6eba48620..7b40551194 100644 --- a/libretro-common/file/nbio/nbio_linux.c +++ b/libretro-common/file/nbio/nbio_linux.c @@ -20,6 +20,8 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +#include + #if defined(__linux__) #define _GNU_SOURCE @@ -28,7 +30,6 @@ #include #include -#include #include #include @@ -226,5 +227,17 @@ nbio_intf_t nbio_linux = { nbio_linux_free, "nbio_linux", }; +#else +nbio_intf_t nbio_linux = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "nbio_linux", +}; #endif diff --git a/libretro-common/file/nbio/nbio_unixmmap.c b/libretro-common/file/nbio/nbio_unixmmap.c index 869a3864ad..25ec106cd8 100644 --- a/libretro-common/file/nbio/nbio_unixmmap.c +++ b/libretro-common/file/nbio/nbio_unixmmap.c @@ -20,13 +20,13 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +#include + #if defined(HAVE_MMAP) && defined(BSD) #include #include -#include - #ifdef _WIN32 #include #else @@ -157,5 +157,17 @@ nbio_intf_t nbio_mmap_unix = { nbio_mmap_unix_free, "nbio_mmap_unix", }; +#else +nbio_intf_t nbio_mmap_unix = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "nbio_mmap_unix", +}; #endif diff --git a/libretro-common/file/nbio/nbio_windowsmmap.c b/libretro-common/file/nbio/nbio_windowsmmap.c index 17e2a2332d..42a22a16d6 100644 --- a/libretro-common/file/nbio/nbio_windowsmmap.c +++ b/libretro-common/file/nbio/nbio_windowsmmap.c @@ -20,12 +20,13 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +#include + #if defined(_WIN32) && !defined(_XBOX) #include #include -#include #include #include @@ -79,7 +80,7 @@ static void *nbio_mmap_win32_open(const char * filename, unsigned mode) ptr = MapViewOfFile(mem, is_write ? (FILE_MAP_READ|FILE_MAP_WRITE) : FILE_MAP_READ, 0, 0, len.QuadPart); CloseHandle(mem); - handle = (nbio_mmap_win32_t*)malloc(sizeof(struct nbio_mmap_win32_t)); + handle = (struct nbio_mmap_win32_t*)malloc(sizeof(struct nbio_mmap_win32_t)); handle->file = file; handle->is_write = is_write; @@ -182,5 +183,17 @@ nbio_intf_t nbio_mmap_win32 = { nbio_mmap_win32_free, "nbio_mmap_win32", }; +#else +nbio_intf_t nbio_mmap_win32 = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "nbio_mmap_win32", +}; #endif diff --git a/retroarch.c b/retroarch.c index f6f4061846..88173a0266 100644 --- a/retroarch.c +++ b/retroarch.c @@ -2799,11 +2799,10 @@ static enum runloop_state runloop_check_state( driver_set_nonblock_state(); } - // Display the fast forward state to the user, if needed. - if (runloop_fastmotion) { + /* Display the fast forward state to the user, if needed. */ + if (runloop_fastmotion) runloop_msg_queue_push( msg_hash_to_str(MSG_FAST_FORWARD), 1, 1, false); - } old_button_state = new_button_state; old_hold_button_state = new_hold_button_state; From dfebea910910b9277e02b1706a4e62580f326308 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 26 Nov 2017 22:58:36 +0100 Subject: [PATCH 183/183] Cleanups --- input/input_driver.c | 144 ++++++++++++++++++++++------------------- menu/cbs/menu_cbs_ok.c | 2 +- 2 files changed, 80 insertions(+), 66 deletions(-) diff --git a/input/input_driver.c b/input/input_driver.c index 0506b90a23..eabb1bd733 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -1775,9 +1775,8 @@ bool input_mouse_button_raw(unsigned port, unsigned id) settings_t *settings = config_get_ptr(); /*ignore axes*/ - if ( id == RETRO_DEVICE_ID_MOUSE_X || id == RETRO_DEVICE_ID_MOUSE_Y ) { + if ( id == RETRO_DEVICE_ID_MOUSE_X || id == RETRO_DEVICE_ID_MOUSE_Y ) return false; - } joypad_info.axis_threshold = input_driver_axis_threshold; joypad_info.joy_idx = settings->uints.input_joypad_map[port]; @@ -1786,9 +1785,8 @@ bool input_mouse_button_raw(unsigned port, unsigned id) res = current_input->input_state(current_input_data, joypad_info, libretro_input_binds, port, RETRO_DEVICE_MOUSE, 0, id); - if ( res ) { + if (res) return true; - } return false; } @@ -2480,28 +2478,47 @@ void input_config_parse_mouse_button(void *data, const char *prefix, if ( tmp[0]=='w' ) { - switch ( tmp[1] ) { - case 'u': bind->mbutton = RETRO_DEVICE_ID_MOUSE_WHEELUP; break; - case 'd': bind->mbutton = RETRO_DEVICE_ID_MOUSE_WHEELDOWN; break; - case 'h': - { - switch ( tmp[2] ) { - case 'u': bind->mbutton = RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP; break; - case 'd': bind->mbutton = RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN; break; - } - } - break; - } + switch ( tmp[1] ) + { + case 'u': + bind->mbutton = RETRO_DEVICE_ID_MOUSE_WHEELUP; + break; + case 'd': + bind->mbutton = RETRO_DEVICE_ID_MOUSE_WHEELDOWN; + break; + case 'h': + switch ( tmp[2] ) + { + case 'u': + bind->mbutton = RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP; + break; + case 'd': + bind->mbutton = RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN; + break; + } + break; + } } else { val = atoi(tmp); - switch ( val ) { - case 1: bind->mbutton = RETRO_DEVICE_ID_MOUSE_LEFT; break; - case 2: bind->mbutton = RETRO_DEVICE_ID_MOUSE_RIGHT; break; - case 3: bind->mbutton = RETRO_DEVICE_ID_MOUSE_MIDDLE; break; - case 4: bind->mbutton = RETRO_DEVICE_ID_MOUSE_BUTTON_4; break; - case 5: bind->mbutton = RETRO_DEVICE_ID_MOUSE_BUTTON_5; break; + switch ( val ) + { + case 1: + bind->mbutton = RETRO_DEVICE_ID_MOUSE_LEFT; + break; + case 2: + bind->mbutton = RETRO_DEVICE_ID_MOUSE_RIGHT; + break; + case 3: + bind->mbutton = RETRO_DEVICE_ID_MOUSE_MIDDLE; + break; + case 4: + bind->mbutton = RETRO_DEVICE_ID_MOUSE_BUTTON_4; + break; + case 5: + bind->mbutton = RETRO_DEVICE_ID_MOUSE_BUTTON_5; + break; } } } @@ -2605,22 +2622,21 @@ void input_config_get_bind_string(char *buf, const struct retro_keybind *bind, else if (auto_bind && auto_bind->joyaxis != AXIS_NONE) input_config_get_bind_string_joyaxis(buf, "Auto: ", auto_bind, size); - if ( *buf ) { + if (*buf) delim = 1; - } #ifndef RARCH_CONSOLE input_keymaps_translate_rk_to_str(bind->key, key, sizeof(key)); if (string_is_equal(key, file_path_str(FILE_PATH_NUL))) *key = '\0'; /*empty?*/ - if ( *key != '\0' ) { - if ( delim ) { - strlcat(buf, ", ", size); - } - snprintf(keybuf, sizeof(keybuf), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_KEY), key); - strlcat(buf, keybuf, size); - delim = 1; + if (*key != '\0') + { + if (delim ) + strlcat(buf, ", ", size); + snprintf(keybuf, sizeof(keybuf), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_KEY), key); + strlcat(buf, keybuf, size); + delim = 1; } #endif @@ -2628,35 +2644,35 @@ void input_config_get_bind_string(char *buf, const struct retro_keybind *bind, { int tag = 0; switch ( bind->mbutton ) - { - case RETRO_DEVICE_ID_MOUSE_LEFT: - tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT; - break; - case RETRO_DEVICE_ID_MOUSE_RIGHT: - tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT; - break; - case RETRO_DEVICE_ID_MOUSE_MIDDLE: - tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE; - break; - case RETRO_DEVICE_ID_MOUSE_BUTTON_4: - tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4; - break; - case RETRO_DEVICE_ID_MOUSE_BUTTON_5: - tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5; - break; - case RETRO_DEVICE_ID_MOUSE_WHEELUP: - tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP; - break; - case RETRO_DEVICE_ID_MOUSE_WHEELDOWN: - tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN; - break; - case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP: - tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP; - break; - case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN: - tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN; - break; - } /* switch ( bind->mbutton ) */ + { + case RETRO_DEVICE_ID_MOUSE_LEFT: + tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT; + break; + case RETRO_DEVICE_ID_MOUSE_RIGHT: + tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT; + break; + case RETRO_DEVICE_ID_MOUSE_MIDDLE: + tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE; + break; + case RETRO_DEVICE_ID_MOUSE_BUTTON_4: + tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4; + break; + case RETRO_DEVICE_ID_MOUSE_BUTTON_5: + tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5; + break; + case RETRO_DEVICE_ID_MOUSE_WHEELUP: + tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP; + break; + case RETRO_DEVICE_ID_MOUSE_WHEELDOWN: + tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN; + break; + case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP: + tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP; + break; + case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN: + tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN; + break; + } /* switch ( bind->mbutton ) */ if (tag != 0) { @@ -2668,9 +2684,8 @@ void input_config_get_bind_string(char *buf, const struct retro_keybind *bind, } /*completely empty?*/ - if ( *buf == '\0' ) { + if ( *buf == '\0' ) strlcat(buf, "---", size); - } } const char *input_config_get_device_name(unsigned port) @@ -2683,11 +2698,9 @@ const char *input_config_get_device_name(unsigned port) void input_config_set_device_name(unsigned port, const char *name) { if (!string_is_empty(name)) - { strlcpy(input_device_names[port], name, sizeof(input_device_names[port])); - } } void input_config_clear_device_name(unsigned port) @@ -2727,7 +2740,8 @@ bool input_config_get_bind_idx(unsigned port, unsigned *joy_idx_real) return true; } -const struct retro_keybind *input_config_get_bind_auto(unsigned port, unsigned id) +const struct retro_keybind *input_config_get_bind_auto( + unsigned port, unsigned id) { settings_t *settings = config_get_ptr(); unsigned joy_idx = settings->uints.input_joypad_map[port]; diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index d5615dabe8..1b8172c6e5 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -1368,7 +1368,7 @@ static int default_action_ok_load_content_with_core_from_menu(const char *_path, content_info.argv = NULL; content_info.args = NULL; content_info.environ_get = NULL; - if (!task_push_load_content_with_core_from_menu(_path, &content_info, (rarch_core_type)_type, NULL, NULL)) + if (!task_push_load_content_with_core_from_menu(_path, &content_info, (enum rarch_core_type)_type, NULL, NULL)) return -1; return 0; }