From 1ebf00851797a07e815da919cdfb39043cc617c3 Mon Sep 17 00:00:00 2001 From: Rob Loach Date: Tue, 14 Nov 2017 21:26:35 -0500 Subject: [PATCH 001/177] Add MSG_FAST_FORWARD --- intl/msg_hash_chs.h | 2 ++ intl/msg_hash_cht.h | 2 ++ intl/msg_hash_de.h | 2 ++ intl/msg_hash_eo.h | 2 ++ intl/msg_hash_es.c | 2 ++ intl/msg_hash_fr.h | 2 ++ intl/msg_hash_it.h | 2 ++ intl/msg_hash_ja.h | 2 ++ intl/msg_hash_ko.h | 2 ++ intl/msg_hash_nl.h | 2 ++ intl/msg_hash_pl.c | 4 +++- intl/msg_hash_pt_br.h | 3 +++ intl/msg_hash_pt_pt.h | 2 ++ intl/msg_hash_ru.h | 2 ++ intl/msg_hash_us.h | 2 ++ intl/msg_hash_vn.h | 2 ++ msg_hash.h | 1 + 17 files changed, 35 insertions(+), 1 deletion(-) diff --git a/intl/msg_hash_chs.h b/intl/msg_hash_chs.h index 9fcdf549a7..0737ac3e5f 100644 --- a/intl/msg_hash_chs.h +++ b/intl/msg_hash_chs.h @@ -2163,6 +2163,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "跳过 SRAM 加载。") MSG_HASH(MSG_SLOW_MOTION, "慢动作。") +MSG_HASH(MSG_FAST_FORWARD, + "快进。") MSG_HASH(MSG_SLOW_MOTION_REWIND, "慢动作回溯。") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_cht.h b/intl/msg_hash_cht.h index 5ada1e2891..c8214e7861 100644 --- a/intl/msg_hash_cht.h +++ b/intl/msg_hash_cht.h @@ -2163,6 +2163,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "跳過 SRAM 戴入。") MSG_HASH(MSG_SLOW_MOTION, "慢動作。") +MSG_HASH(MSG_FAST_FORWARD, + "快進。") MSG_HASH(MSG_SLOW_MOTION_REWIND, "慢動作回溯。") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_de.h b/intl/msg_hash_de.h index f5388aebd2..76146f2216 100644 --- a/intl/msg_hash_de.h +++ b/intl/msg_hash_de.h @@ -2225,6 +2225,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Überspringe Laden des SRAM.") MSG_HASH(MSG_SLOW_MOTION, "Zeitlupe.") +MSG_HASH(MSG_FAST_FORWARD, + "Snel vooruit.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "In Zeitlupe zurückspulen.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_eo.h b/intl/msg_hash_eo.h index 14d56c01a5..16d662480a 100644 --- a/intl/msg_hash_eo.h +++ b/intl/msg_hash_eo.h @@ -2052,6 +2052,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Skipping SRAM load.") MSG_HASH(MSG_SLOW_MOTION, "Slow motion.") +MSG_HASH(MSG_FAST_FORWARD, + "Fast forward.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Slow motion rewind.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_es.c b/intl/msg_hash_es.c index 5f8ddab95a..631d53b609 100644 --- a/intl/msg_hash_es.c +++ b/intl/msg_hash_es.c @@ -1469,6 +1469,8 @@ const char *msg_hash_to_str_es(enum msg_hash_enums msg) return "Omitiendo carga de SRAM."; case MSG_SLOW_MOTION: return "Cámara lenta."; + case MSG_FAST_FORWARD: + return "Avance rápido."; case MSG_SLOW_MOTION_REWIND: return "Rebobinar cámara lenta."; case MSG_SRAM_WILL_NOT_BE_SAVED: diff --git a/intl/msg_hash_fr.h b/intl/msg_hash_fr.h index 94bd0f9bbb..e652c33b87 100644 --- a/intl/msg_hash_fr.h +++ b/intl/msg_hash_fr.h @@ -2183,6 +2183,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Ignore le chargement de la SRAM.") MSG_HASH(MSG_SLOW_MOTION, "Ralenti.") +MSG_HASH(MSG_FAST_FORWARD, + "Avance rapide.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Rembobinage ralenti.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_it.h b/intl/msg_hash_it.h index 6d85124076..6e1b0b4c8e 100644 --- a/intl/msg_hash_it.h +++ b/intl/msg_hash_it.h @@ -2223,6 +2223,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Skipping SRAM load.") MSG_HASH(MSG_SLOW_MOTION, "Slow motion.") +MSG_HASH(MSG_FAST_FORWARD, + "Avanti veloce.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Riavvolgimento lento.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_ja.h b/intl/msg_hash_ja.h index c99815da72..fff4d59753 100644 --- a/intl/msg_hash_ja.h +++ b/intl/msg_hash_ja.h @@ -2237,6 +2237,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Skipping SRAM load.") MSG_HASH(MSG_SLOW_MOTION, "スローモーション。") +MSG_HASH(MSG_FAST_FORWARD, + "早送り。") MSG_HASH(MSG_SLOW_MOTION_REWIND, "スローモーション巻き戻し。") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_ko.h b/intl/msg_hash_ko.h index a0db09d6f7..3984ed5260 100644 --- a/intl/msg_hash_ko.h +++ b/intl/msg_hash_ko.h @@ -2163,6 +2163,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "SRAM 불러오기 건너뛰는 중.") MSG_HASH(MSG_SLOW_MOTION, "슬로우 모션.") +MSG_HASH(MSG_FAST_FORWARD, + "빨리 감기.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "슬로우 모션 되감기.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_nl.h b/intl/msg_hash_nl.h index 251c32c283..e8c280b988 100644 --- a/intl/msg_hash_nl.h +++ b/intl/msg_hash_nl.h @@ -2050,6 +2050,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Skipping SRAM load.") MSG_HASH(MSG_SLOW_MOTION, "Slow motion.") +MSG_HASH(MSG_FAST_FORWARD, + "Fast forward.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Slow motion rewind.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_pl.c b/intl/msg_hash_pl.c index cf5300785a..a20415a68d 100644 --- a/intl/msg_hash_pl.c +++ b/intl/msg_hash_pl.c @@ -1,4 +1,4 @@ -/* RetroArch - A frontend for libretro. +/* 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 @@ -982,6 +982,8 @@ const char *msg_hash_to_str_pl(enum msg_hash_enums msg) return "Pomijanie wczytywania SRAM."; case MSG_SLOW_MOTION: return "Spowolnione tempo."; + case MSG_FAST_FORWARD: + return "Szybko do przodu."; case MSG_SLOW_MOTION_REWIND: return "Przewijanie w spowolnionym tempie."; case MSG_SRAM_WILL_NOT_BE_SAVED: diff --git a/intl/msg_hash_pt_br.h b/intl/msg_hash_pt_br.h index bf472714fb..ed0c47b72f 100644 --- a/intl/msg_hash_pt_br.h +++ b/intl/msg_hash_pt_br.h @@ -2965,6 +2965,9 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, MSG_HASH(MSG_SLOW_MOTION, "Câmera Lenta." ) +MSG_HASH(MSG_FAST_FORWARD, + "Avanço rápido." + ) MSG_HASH(MSG_SLOW_MOTION_REWIND, "Voltar Atrás em Câmera Lenta." ) diff --git a/intl/msg_hash_pt_pt.h b/intl/msg_hash_pt_pt.h index 4815a6e8b1..c82ee3e6d3 100644 --- a/intl/msg_hash_pt_pt.h +++ b/intl/msg_hash_pt_pt.h @@ -2153,6 +2153,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Ignorando carregamento de SRAM.") MSG_HASH(MSG_SLOW_MOTION, "Câmera lenta.") +MSG_HASH(MSG_FAST_FORWARD, + "Avanço rápido.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Função rewind em câmera lenta.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_ru.h b/intl/msg_hash_ru.h index 8f734f92a1..dd28e2fab5 100644 --- a/intl/msg_hash_ru.h +++ b/intl/msg_hash_ru.h @@ -2198,6 +2198,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Пропуск загрузки SRAM.") MSG_HASH(MSG_SLOW_MOTION, "Замедление.") +MSG_HASH(MSG_FAST_FORWARD, + "Перемотка вперед.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Замедленная перемотка.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 7ba572c5ca..5e24366ca6 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -2225,6 +2225,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Skipping SRAM load.") MSG_HASH(MSG_SLOW_MOTION, "Slow motion.") +MSG_HASH(MSG_FAST_FORWARD, + "Fast forward.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Slow motion rewind.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_vn.h b/intl/msg_hash_vn.h index 08c362344d..6d9463823b 100644 --- a/intl/msg_hash_vn.h +++ b/intl/msg_hash_vn.h @@ -2181,6 +2181,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Skipping SRAM load.") MSG_HASH(MSG_SLOW_MOTION, "Slow motion.") +MSG_HASH(MSG_FAST_FORWARD, + "Nhanh về phía trước.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Slow motion rewind.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/msg_hash.h b/msg_hash.h index e15745a6b3..c70fa2ee01 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -342,6 +342,7 @@ enum msg_hash_enums MSG_REWINDING, MSG_SLOW_MOTION_REWIND, MSG_SLOW_MOTION, + MSG_FAST_FORWARD, MSG_REWIND_REACHED_END, MSG_FAILED_TO_START_MOVIE_RECORD, MSG_CHEEVOS_HARDCORE_MODE_ENABLE, From 0e131044fee3c24497c5945123566767a37dfc77 Mon Sep 17 00:00:00 2001 From: Rob Loach Date: Tue, 14 Nov 2017 21:53:57 -0500 Subject: [PATCH 002/177] Add a Fast Forward message to the user --- retroarch.c | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/retroarch.c b/retroarch.c index 2a3598be88..da76e37c3c 100644 --- a/retroarch.c +++ b/retroarch.c @@ -219,6 +219,7 @@ static bool runloop_paused = false; static bool runloop_idle = false; static bool runloop_exec = false; static bool runloop_slowmotion = false; +static bool runloop_fastmotion = false; static bool runloop_shutdown_initiated = false; static bool runloop_core_shutdown_initiated = false; static bool runloop_perfcnt_enable = false; @@ -1380,10 +1381,10 @@ static bool rarch_game_specific_options(char **output) if (!retroarch_validate_game_options(game_path, game_path_size, false)) - goto error; + goto error; if (!config_file_exists(game_path)) - goto error; + goto error; RARCH_LOG("%s %s\n", msg_hash_to_str(MSG_GAME_SPECIFIC_CORE_OPTIONS_FOUND_AT), @@ -2765,21 +2766,35 @@ static enum runloop_state runloop_check_state( if (new_button_state && !old_button_state) { - if (input_nonblock_state) + if (input_nonblock_state){ input_driver_unset_nonblock_state(); - else + runloop_fastmotion = false; + } + else { input_driver_set_nonblock_state(); + runloop_fastmotion = true; + } driver_set_nonblock_state(); } else if (old_hold_button_state != new_hold_button_state) { - if (new_hold_button_state) + if (new_hold_button_state) { input_driver_set_nonblock_state(); - else + runloop_fastmotion = true; + } + else { input_driver_unset_nonblock_state(); + runloop_fastmotion = false; + } driver_set_nonblock_state(); } + // Display the fast forward state to the user, if needed. + if (runloop_fastmotion) { + runloop_msg_queue_push( + msg_hash_to_str(MSG_FAST_FORWARD), 2, 15, true); + } + old_button_state = new_button_state; old_hold_button_state = new_hold_button_state; } @@ -3130,7 +3145,6 @@ int runloop_iterate(unsigned *sleep_ms) if (settings->floats.fastforward_ratio) end: { - retro_time_t to_sleep_ms = ( (frame_limit_last_time + frame_limit_minimum_time) - cpu_features_get_time_usec()) / 1000; From 55461f2c2b12542e4c6044f7e463e399f0eb5b64 Mon Sep 17 00:00:00 2001 From: meleu Date: Wed, 15 Nov 2017 22:41:53 -0200 Subject: [PATCH 003/177] added cheevos related updates In my humble opinion the Leaderboards feature (and @celerizer) should be mentioned in the 1.6.8. annoucement. The Leaderboards capability is a long-awaited feature by the RetroArch/RetroAchievements users. --- CHANGES.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index f32ebc6119..6de0f51c9e 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,7 @@ # 1.6.8 (future) - Audio: Fix the Audio DSP picker +- CHEEVOS: Add support for Atari Lynx cheevos. +- CHEEVOS: Add support for RetroAchievements Leaderboards. - GUI: (MaterialUI) Fix crash that happened on context reset with Vulkan. - GUI: (MaterialUI) Skip querying and drawing items that are not visible; Cache content height and bbox calculation. - GUI: (MaterialUI) Fix entry box highlight calculation. From dd6ec31f3db30151f2ffd04542e9394cdeeafe41 Mon Sep 17 00:00:00 2001 From: Rob Loach Date: Wed, 15 Nov 2017 22:19:29 -0500 Subject: [PATCH 004/177] Fix for pressing ENTER on cheats --- menu/widgets/menu_input_dialog.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/menu/widgets/menu_input_dialog.c b/menu/widgets/menu_input_dialog.c index 8031868d85..4b138f55ef 100644 --- a/menu/widgets/menu_input_dialog.c +++ b/menu/widgets/menu_input_dialog.c @@ -59,7 +59,7 @@ void menu_input_dialog_end(void) { menu_input_dialog_keyboard_type = 0; menu_input_dialog_keyboard_idx = 0; - menu_input_dialog_keyboard_display = false; + menu_input_dialog_keyboard_display = false; menu_input_dialog_keyboard_label[0] = '\0'; menu_input_dialog_keyboard_label_setting[0] = '\0'; @@ -86,17 +86,17 @@ unsigned menu_input_dialog_get_kb_idx(void) bool menu_input_dialog_get_display_kb(void) { - return menu_input_dialog_keyboard_display; + return menu_input_dialog_keyboard_display; } void menu_input_dialog_display_kb(void) { - menu_input_dialog_keyboard_display = true; + menu_input_dialog_keyboard_display = true; } void menu_input_dialog_hide_kb(void) { - menu_input_dialog_keyboard_display = false; + menu_input_dialog_keyboard_display = false; } bool menu_input_dialog_start_search(void) @@ -128,10 +128,14 @@ bool menu_input_dialog_start(menu_input_ctx_line_t *line) return false; menu_input_dialog_display_kb(); - strlcpy(menu_input_dialog_keyboard_label, line->label, - sizeof(menu_input_dialog_keyboard_label)); - strlcpy(menu_input_dialog_keyboard_label_setting, - line->label_setting, sizeof(menu_input_dialog_keyboard_label_setting)); + + // Only copy over the menu label and setting if they exist. + if (line->label) + strlcpy(menu_input_dialog_keyboard_label, line->label, + sizeof(menu_input_dialog_keyboard_label)); + if (line->label_setting) + strlcpy(menu_input_dialog_keyboard_label_setting, + line->label_setting, sizeof(menu_input_dialog_keyboard_label_setting)); menu_input_dialog_keyboard_type = line->type; menu_input_dialog_keyboard_idx = line->idx; From bfd815985f0a8b819ac1481980e6d0cf998fda72 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Thu, 16 Nov 2017 12:02:08 +0100 Subject: [PATCH 005/177] Rename function callback --- gfx/drivers/gl.c | 8 ++++---- gfx/drivers_font/gl_raster_font.c | 2 +- gfx/drivers_renderchain/gl2_renderchain.c | 4 ++-- gfx/video_driver.c | 2 +- gfx/video_driver.h | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/gfx/drivers/gl.c b/gfx/drivers/gl.c index 6dced6ce3a..8aa957ce29 100644 --- a/gfx/drivers/gl.c +++ b/gfx/drivers/gl.c @@ -222,7 +222,7 @@ static void gl_render_overlay(gl_t *gl, video_frame_info_t *video_info) video_driver_set_coords(&coords); - video_info->cb_shader_set_mvp(gl, + video_info->cb_set_mvp(gl, video_info->shader_data, &gl->mvp_no_rot); for (i = 0; i < gl->overlays; i++) @@ -821,7 +821,7 @@ static void gl_render_osd_background( glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendEquation(GL_FUNC_ADD); - video_info->cb_shader_set_mvp(gl, + video_info->cb_set_mvp(gl, video_info->shader_data, &gl->mvp_no_rot); uniform_param.type = UNIFORM_4F; @@ -949,7 +949,7 @@ static INLINE void gl_draw_texture(gl_t *gl, video_frame_info_t *video_info) video_driver_set_coords(&coords); - video_info->cb_shader_set_mvp(gl, + video_info->cb_set_mvp(gl, video_info->shader_data, &gl->mvp_no_rot); glEnable(GL_BLEND); @@ -1131,7 +1131,7 @@ static bool gl_frame(void *data, const void *frame, video_driver_set_coords(&coords); - video_info->cb_shader_set_mvp(gl, video_info->shader_data, &gl->mvp); + video_info->cb_set_mvp(gl, video_info->shader_data, &gl->mvp); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); diff --git a/gfx/drivers_font/gl_raster_font.c b/gfx/drivers_font/gl_raster_font.c index 8dc9f6fc16..16a2bbc55f 100644 --- a/gfx/drivers_font/gl_raster_font.c +++ b/gfx/drivers_font/gl_raster_font.c @@ -260,7 +260,7 @@ static void gl_raster_font_draw_vertices(gl_raster_t *font, const video_coords_t video_driver_set_coords(&coords_data); - video_info->cb_shader_set_mvp(font->gl, + video_info->cb_set_mvp(font->gl, video_info->shader_data, &font->gl->mvp_no_rot); glDrawArrays(GL_TRIANGLES, 0, coords->vertices); diff --git a/gfx/drivers_renderchain/gl2_renderchain.c b/gfx/drivers_renderchain/gl2_renderchain.c index f6e6333cc5..0c9733e35f 100644 --- a/gfx/drivers_renderchain/gl2_renderchain.c +++ b/gfx/drivers_renderchain/gl2_renderchain.c @@ -333,7 +333,7 @@ static void gl2_renderchain_render( video_driver_set_coords(&coords); - video_info->cb_shader_set_mvp(gl, + video_info->cb_set_mvp(gl, video_info->shader_data, &gl->mvp); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); @@ -408,7 +408,7 @@ static void gl2_renderchain_render( video_driver_set_coords(&coords); - video_info->cb_shader_set_mvp(gl, + video_info->cb_set_mvp(gl, video_info->shader_data, &gl->mvp); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); diff --git a/gfx/video_driver.c b/gfx/video_driver.c index 60aee35340..24dbe8525a 100644 --- a/gfx/video_driver.c +++ b/gfx/video_driver.c @@ -2590,7 +2590,7 @@ void video_driver_build_info(video_frame_info_t *video_info) video_info->cb_set_resize = current_video_context.set_resize; video_info->cb_shader_use = video_driver_cb_shader_use; - video_info->cb_shader_set_mvp = video_driver_cb_shader_set_mvp; + video_info->cb_set_mvp = video_driver_cb_shader_set_mvp; #if 0 video_info->cb_set_coords = video_driver_cb_set_coords; diff --git a/gfx/video_driver.h b/gfx/video_driver.h index 69970be4bb..0267c11e6d 100644 --- a/gfx/video_driver.h +++ b/gfx/video_driver.h @@ -470,7 +470,7 @@ typedef struct video_frame_info bool (*cb_set_coords)(void *handle_data, void *shader_data, const struct video_coords *coords); #endif - bool (*cb_shader_set_mvp)(void *data, void *shader_data, + bool (*cb_set_mvp)(void *data, void *shader_data, const void *mat_data); void *context_data; From c0d8a2f093dbf4afa4474841b80b688bb2bdf38d Mon Sep 17 00:00:00 2001 From: twinaphex Date: Thu, 16 Nov 2017 14:01:20 +0100 Subject: [PATCH 006/177] Cleanup --- gfx/drivers/gl.c | 47 +++++++++++++++++++---------------------------- 1 file changed, 19 insertions(+), 28 deletions(-) diff --git a/gfx/drivers/gl.c b/gfx/drivers/gl.c index 8aa957ce29..8c2d230194 100644 --- a/gfx/drivers/gl.c +++ b/gfx/drivers/gl.c @@ -377,18 +377,10 @@ static bool gl_shader_init(gl_t *gl, const gfx_ctx_driver_t *ctx_driver, ) { video_shader_ctx_init_t init_data; - enum rarch_shader_type type; settings_t *settings = config_get_ptr(); const char *shader_path = (settings->bools.video_shader_enable && *settings->paths.path_shader) ? settings->paths.path_shader : NULL; - - if (!gl) - { - RARCH_ERR("[GL]: Invalid GL instance passed.\n"); - return false; - } - - type = video_shader_parse_type(shader_path, + enum rarch_shader_type type = video_shader_parse_type(shader_path, gl->core_context_in_use ? RARCH_SHADER_GLSL : DEFAULT_SHADER_TYPE); @@ -621,6 +613,7 @@ static INLINE void gl_set_shader_viewports(gl_t *gl) shader_info.set_active = true; video_shader_driver_use(shader_info); + gl_set_viewport_wrapper(gl, width, height, false, true); shader_info.data = gl; @@ -931,21 +924,19 @@ static INLINE void gl_draw_texture(gl_t *gl, video_frame_info_t *video_info) color[14] = 1.0f; color[15] = gl->menu_texture_alpha; - if (!gl->menu_texture) - return; - gl->coords.vertex = vertexes_flipped; gl->coords.tex_coord = tex_coords; gl->coords.color = color; + glBindTexture(GL_TEXTURE_2D, gl->menu_texture); video_info->cb_shader_use(gl, video_info->shader_data, VIDEO_SHADER_STOCK_BLEND, true); - gl->coords.vertices = 4; + gl->coords.vertices = 4; - coords.handle_data = NULL; - coords.data = &gl->coords; + coords.handle_data = NULL; + coords.data = &gl->coords; video_driver_set_coords(&coords); @@ -965,9 +956,9 @@ static INLINE void gl_draw_texture(gl_t *gl, video_frame_info_t *video_info) glDisable(GL_BLEND); - gl->coords.vertex = gl->vertex_ptr; - gl->coords.tex_coord = gl->tex_info.coord; - gl->coords.color = gl->white_color_ptr; + gl->coords.vertex = gl->vertex_ptr; + gl->coords.tex_coord = gl->tex_info.coord; + gl->coords.color = gl->white_color_ptr; } #endif @@ -1148,7 +1139,7 @@ static bool gl_frame(void *data, const void *frame, { menu_driver_frame(video_info); - if (gl->menu_texture_enable) + if (gl->menu_texture) gl_draw_texture(gl, video_info); } #endif @@ -1340,7 +1331,7 @@ static void gl_set_nonblock_state(void *data, bool state) static bool resolve_extensions(gl_t *gl, const char *context_ident) { - settings_t *settings = config_get_ptr(); + settings_t *settings = config_get_ptr(); /* have_es2_compat - GL_RGB565 internal format support. * Even though ES2 support is claimed, the format @@ -1510,20 +1501,20 @@ static const gfx_ctx_driver_t *gl_get_context(gl_t *gl) unsigned minor = hwr->version_minor; #ifdef HAVE_OPENGLES - api = GFX_CTX_OPENGL_ES_API; - api_name = "OpenGL ES 2.0"; + api = GFX_CTX_OPENGL_ES_API; + api_name = "OpenGL ES 2.0"; if (hwr->context_type == RETRO_HW_CONTEXT_OPENGLES3) { - major = 3; - minor = 0; - api_name = "OpenGL ES 3.0"; + major = 3; + minor = 0; + api_name = "OpenGL ES 3.0"; } else if (hwr->context_type == RETRO_HW_CONTEXT_OPENGLES_VERSION) - api_name = "OpenGL ES 3.1+"; + api_name = "OpenGL ES 3.1+"; #else - api = GFX_CTX_OPENGL_API; - api_name = "OpenGL"; + api = GFX_CTX_OPENGL_API; + api_name = "OpenGL"; #endif (void)api_name; From 40bb1da981ccb8fccc57120c3d5aa4334fda8fd0 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Thu, 16 Nov 2017 14:23:03 +0100 Subject: [PATCH 007/177] Cleanups --- menu/cbs/menu_cbs_select.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/menu/cbs/menu_cbs_select.c b/menu/cbs/menu_cbs_select.c index 70436fc105..84132b7a01 100644 --- a/menu/cbs/menu_cbs_select.c +++ b/menu/cbs/menu_cbs_select.c @@ -42,7 +42,9 @@ static int action_select_default(const char *path, const char *label, unsigned t menu_entry_init(&entry); menu_entry_get(&entry, 0, idx, NULL, false); - cbs = selection_buf ? (menu_file_list_cbs_t*)file_list_get_actiondata_at_offset(selection_buf, idx) : NULL; + if (selection_buf) + cbs = (menu_file_list_cbs_t*) + file_list_get_actiondata_at_offset(selection_buf, idx); if (!cbs) { @@ -76,7 +78,7 @@ static int action_select_default(const char *path, const char *label, unsigned t if (action == MENU_ACTION_NOOP) { if (cbs->action_ok) - action = MENU_ACTION_OK; + action = MENU_ACTION_OK; else { if (cbs->action_start) From 6f2efe7f1ee9ec09189ca772ab6abd8f442df899 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Thu, 16 Nov 2017 15:41:37 +0100 Subject: [PATCH 008/177] Add 'Add to Favorites' to playlist entries --- command.c | 2 +- intl/msg_hash_de.h | 4 ++++ intl/msg_hash_it.h | 4 ++++ intl/msg_hash_ja.h | 2 ++ intl/msg_hash_lbl.h | 2 ++ intl/msg_hash_pt_br.h | 6 ++++++ intl/msg_hash_us.h | 4 ++++ menu/cbs/menu_cbs_ok.c | 32 +++++++++++++++++++++++++++++++- menu/menu_displaylist.c | 8 ++++++++ msg_hash.h | 1 + 10 files changed, 63 insertions(+), 2 deletions(-) diff --git a/command.c b/command.c index 8666504be3..e458b1d640 100644 --- a/command.c +++ b/command.c @@ -2239,7 +2239,7 @@ TODO: Add a setting for these tweaks */ case CMD_EVENT_ADD_TO_FAVORITES: playlist_push( g_defaults.content_favorites, - path_get(RARCH_PATH_CONTENT), + (const char*)data, NULL, file_path_str(FILE_PATH_DETECT), file_path_str(FILE_PATH_DETECT), diff --git a/intl/msg_hash_de.h b/intl/msg_hash_de.h index 76146f2216..78df3c8478 100644 --- a/intl/msg_hash_de.h +++ b/intl/msg_hash_de.h @@ -1263,6 +1263,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_RIGHT_ANALOG, "Rechter Analogstick") MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES, "Zu Favoriten hinzufügen") +MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES_PLAYLIST, + "Zu Favoriten hinzufügen") MSG_HASH(MENU_ENUM_LABEL_VALUE_RUN, "Starten") MSG_HASH(MENU_ENUM_LABEL_VALUE_RUN_MUSIC, @@ -2820,6 +2822,8 @@ MSG_HASH(MENU_ENUM_SUBLABEL_INFORMATION, "Zeige weiterführende Informationen über diesen Inhalt an.") MSG_HASH(MENU_ENUM_SUBLABEL_ADD_TO_FAVORITES, "Füge diesen Eintrag zu deinen Favoriten hinzu.") +MSG_HASH(MENU_ENUM_SUBLABEL_ADD_TO_FAVORITES_PLAYLIST, + "Füge diesen Eintrag zu deinen Favoriten hinzu.") MSG_HASH(MENU_ENUM_SUBLABEL_RUN, "Starte den Inhalt.") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_FILE_BROWSER_SETTINGS, diff --git a/intl/msg_hash_it.h b/intl/msg_hash_it.h index 6e1b0b4c8e..6d2d084385 100644 --- a/intl/msg_hash_it.h +++ b/intl/msg_hash_it.h @@ -1263,6 +1263,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_RIGHT_ANALOG, "Analogico Destro") MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES, "Aggiungi a Preferiti") +MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES_PLAYLIST, + "Aggiungi a Preferiti") MSG_HASH(MENU_ENUM_LABEL_VALUE_RUN, "Avvia") MSG_HASH(MENU_ENUM_LABEL_VALUE_RUN_MUSIC, @@ -2818,6 +2820,8 @@ MSG_HASH(MENU_ENUM_SUBLABEL_INFORMATION, "Visualizza ulteriori informazioni sul contenuto.") MSG_HASH(MENU_ENUM_SUBLABEL_ADD_TO_FAVORITES, "Aggiunge il titolo ai tuoi preferiti.") +MSG_HASH(MENU_ENUM_SUBLABEL_ADD_TO_FAVORITES_PLAYLIST, + "Aggiunge il titolo ai tuoi preferiti.") MSG_HASH(MENU_ENUM_SUBLABEL_RUN, "Avvia il contenuto.") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_FILE_BROWSER_SETTINGS, diff --git a/intl/msg_hash_ja.h b/intl/msg_hash_ja.h index fff4d59753..0f1739d7f3 100644 --- a/intl/msg_hash_ja.h +++ b/intl/msg_hash_ja.h @@ -3167,6 +3167,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_OPACITY, "OSDメッセージ背景の不透明性") MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES, "お気に入りに追加") +MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES_PLAYLIST, + "お気に入りに追加") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_DISABLE_KIOSK_MODE, "キオスクモードを無効") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_DISABLE_KIOSK_MODE, diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index cfe8f4f569..fbf28f4ca6 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -873,6 +873,8 @@ MSG_HASH(MENU_ENUM_LABEL_RGUI_SHOW_START_SCREEN, "rgui_show_start_screen") MSG_HASH(MENU_ENUM_LABEL_ADD_TO_FAVORITES, "favorites_add") +MSG_HASH(MENU_ENUM_LABEL_ADD_TO_FAVORITES_PLAYLIST, + "favorites_add_playlist") MSG_HASH(MENU_ENUM_LABEL_RUN, "collection") MSG_HASH(MENU_ENUM_LABEL_RUN_MUSIC, diff --git a/intl/msg_hash_pt_br.h b/intl/msg_hash_pt_br.h index ed0c47b72f..4f15b37e14 100644 --- a/intl/msg_hash_pt_br.h +++ b/intl/msg_hash_pt_br.h @@ -1525,6 +1525,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_RIGHT_ANALOG, MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES, "Adicionar aos Favoritos" ) +MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES_PLAYLIST, + "Adicionar aos Favoritos" + ) MSG_HASH(MENU_ENUM_LABEL_VALUE_RUN, "Executar" ) @@ -3556,6 +3559,9 @@ MSG_HASH(MENU_ENUM_SUBLABEL_INFORMATION, MSG_HASH(MENU_ENUM_SUBLABEL_ADD_TO_FAVORITES, "Adicionar o item aos seus favoritos." ) +MSG_HASH(MENU_ENUM_SUBLABEL_ADD_TO_FAVORITES_PLAYLIST, + "Adicionar o item aos seus favoritos." + ) MSG_HASH(MENU_ENUM_SUBLABEL_RUN, "Iniciar o conteúdo." ) diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 240a4eb38f..4d601ab296 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -1267,6 +1267,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_RIGHT_ANALOG, "Right Analog") MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES, "Add to Favorites") +MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES_PLAYLIST, + "Add to Favorites") MSG_HASH(MENU_ENUM_LABEL_VALUE_RUN, "Run") MSG_HASH(MENU_ENUM_LABEL_VALUE_RUN_MUSIC, @@ -2826,6 +2828,8 @@ MSG_HASH(MENU_ENUM_SUBLABEL_INFORMATION, "View more information about the content.") MSG_HASH(MENU_ENUM_SUBLABEL_ADD_TO_FAVORITES, "Add the entry to your favorites.") +MSG_HASH(MENU_ENUM_SUBLABEL_ADD_TO_FAVORITES_PLAYLIST, + "Add the entry to your favorites.") MSG_HASH(MENU_ENUM_SUBLABEL_RUN, "Start the content.") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_FILE_BROWSER_SETTINGS, diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index e1c8496eea..00725f6909 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -3209,7 +3209,34 @@ default_action_ok_cmd_func(action_ok_restart_content, CMD_EVENT_RESET) default_action_ok_cmd_func(action_ok_screenshot, CMD_EVENT_TAKE_SCREENSHOT) default_action_ok_cmd_func(action_ok_disk_cycle_tray_status, CMD_EVENT_DISK_EJECT_TOGGLE ) default_action_ok_cmd_func(action_ok_shader_apply_changes, CMD_EVENT_SHADERS_APPLY_CHANGES ) -default_action_ok_cmd_func(action_ok_add_to_favorites, CMD_EVENT_ADD_TO_FAVORITES) + +static int action_ok_add_to_favorites(const char *path, + const char *label, unsigned type, size_t idx, size_t entry_idx) +{ + void *new_path = (void*)path_get(RARCH_PATH_CONTENT); + if (!command_event(CMD_EVENT_ADD_TO_FAVORITES, new_path)) + return menu_cbs_exit(); + return 0; +} + +static int action_ok_add_to_favorites_playlist(const char *path, + const char *label, unsigned type, size_t idx, size_t entry_idx) +{ + const char *tmp_path = NULL; + playlist_t *tmp_playlist = NULL; + + menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &tmp_playlist); + + if (!tmp_playlist) + return 0; + + playlist_get_index(tmp_playlist, + rpl_entry_selection_ptr, &tmp_path, NULL, NULL, NULL, NULL, NULL); + + if (!command_event(CMD_EVENT_ADD_TO_FAVORITES, (void*)tmp_path)) + return menu_cbs_exit(); + return 0; +} static int action_ok_rename_entry(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) @@ -4401,6 +4428,9 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_RESUME_CONTENT: BIND_ACTION_OK(cbs, action_ok_resume_content); break; + case MENU_ENUM_LABEL_ADD_TO_FAVORITES_PLAYLIST: + BIND_ACTION_OK(cbs, action_ok_add_to_favorites_playlist); + break; case MENU_ENUM_LABEL_ADD_TO_FAVORITES: BIND_ACTION_OK(cbs, action_ok_add_to_favorites); break; diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 34bce396ea..e4dd8450d1 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -3035,6 +3035,14 @@ static int menu_displaylist_parse_horizontal_content_actions( msg_hash_to_str(MENU_ENUM_LABEL_DELETE_ENTRY), MENU_ENUM_LABEL_DELETE_ENTRY, MENU_SETTING_ACTION_DELETE_ENTRY, 0, 0); + + if (settings->bools.quick_menu_show_add_to_favorites) + { + menu_entries_append_enum(info->list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES_PLAYLIST), + msg_hash_to_str(MENU_ENUM_LABEL_ADD_TO_FAVORITES_PLAYLIST), + MENU_ENUM_LABEL_ADD_TO_FAVORITES_PLAYLIST, FILE_TYPE_PLAYLIST_ENTRY, 0, 0); + } } if (!string_is_empty(db_name) && (!content_loaded || diff --git a/msg_hash.h b/msg_hash.h index e1f8c8fb13..715b3ec6e6 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -788,6 +788,7 @@ enum msg_hash_enums MENU_LABEL(GOTO_IMAGES), MENU_LABEL(GOTO_VIDEO), MENU_LABEL(ADD_TO_FAVORITES), + MENU_LABEL(ADD_TO_FAVORITES_PLAYLIST), MENU_LABEL(MENU_THROTTLE_FRAMERATE), MENU_LABEL(NO_ACHIEVEMENTS_TO_DISPLAY), MENU_LABEL(NO_ENTRIES_TO_DISPLAY), From f3c774a797688307cf0224909fc1aac4dddb3bba Mon Sep 17 00:00:00 2001 From: Twinaphex Date: Thu, 16 Nov 2017 16:28:58 +0100 Subject: [PATCH 009/177] Revert "Display a "Fast forward." message" --- intl/msg_hash_chs.h | 2 -- intl/msg_hash_cht.h | 2 -- intl/msg_hash_de.h | 2 -- intl/msg_hash_eo.h | 2 -- intl/msg_hash_es.c | 2 -- intl/msg_hash_fr.h | 2 -- intl/msg_hash_it.h | 2 -- intl/msg_hash_ja.h | 2 -- intl/msg_hash_ko.h | 2 -- intl/msg_hash_nl.h | 2 -- intl/msg_hash_pl.c | 4 +--- intl/msg_hash_pt_br.h | 3 --- intl/msg_hash_pt_pt.h | 2 -- intl/msg_hash_ru.h | 2 -- intl/msg_hash_us.h | 2 -- intl/msg_hash_vn.h | 2 -- msg_hash.h | 1 - retroarch.c | 28 +++++++--------------------- 18 files changed, 8 insertions(+), 56 deletions(-) diff --git a/intl/msg_hash_chs.h b/intl/msg_hash_chs.h index 0737ac3e5f..9fcdf549a7 100644 --- a/intl/msg_hash_chs.h +++ b/intl/msg_hash_chs.h @@ -2163,8 +2163,6 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "跳过 SRAM 加载。") MSG_HASH(MSG_SLOW_MOTION, "慢动作。") -MSG_HASH(MSG_FAST_FORWARD, - "快进。") MSG_HASH(MSG_SLOW_MOTION_REWIND, "慢动作回溯。") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_cht.h b/intl/msg_hash_cht.h index c8214e7861..5ada1e2891 100644 --- a/intl/msg_hash_cht.h +++ b/intl/msg_hash_cht.h @@ -2163,8 +2163,6 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "跳過 SRAM 戴入。") MSG_HASH(MSG_SLOW_MOTION, "慢動作。") -MSG_HASH(MSG_FAST_FORWARD, - "快進。") MSG_HASH(MSG_SLOW_MOTION_REWIND, "慢動作回溯。") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_de.h b/intl/msg_hash_de.h index 78df3c8478..e3a8affc65 100644 --- a/intl/msg_hash_de.h +++ b/intl/msg_hash_de.h @@ -2227,8 +2227,6 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Überspringe Laden des SRAM.") MSG_HASH(MSG_SLOW_MOTION, "Zeitlupe.") -MSG_HASH(MSG_FAST_FORWARD, - "Snel vooruit.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "In Zeitlupe zurückspulen.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_eo.h b/intl/msg_hash_eo.h index 16d662480a..14d56c01a5 100644 --- a/intl/msg_hash_eo.h +++ b/intl/msg_hash_eo.h @@ -2052,8 +2052,6 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Skipping SRAM load.") MSG_HASH(MSG_SLOW_MOTION, "Slow motion.") -MSG_HASH(MSG_FAST_FORWARD, - "Fast forward.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Slow motion rewind.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_es.c b/intl/msg_hash_es.c index 631d53b609..5f8ddab95a 100644 --- a/intl/msg_hash_es.c +++ b/intl/msg_hash_es.c @@ -1469,8 +1469,6 @@ const char *msg_hash_to_str_es(enum msg_hash_enums msg) return "Omitiendo carga de SRAM."; case MSG_SLOW_MOTION: return "Cámara lenta."; - case MSG_FAST_FORWARD: - return "Avance rápido."; case MSG_SLOW_MOTION_REWIND: return "Rebobinar cámara lenta."; case MSG_SRAM_WILL_NOT_BE_SAVED: diff --git a/intl/msg_hash_fr.h b/intl/msg_hash_fr.h index e652c33b87..94bd0f9bbb 100644 --- a/intl/msg_hash_fr.h +++ b/intl/msg_hash_fr.h @@ -2183,8 +2183,6 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Ignore le chargement de la SRAM.") MSG_HASH(MSG_SLOW_MOTION, "Ralenti.") -MSG_HASH(MSG_FAST_FORWARD, - "Avance rapide.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Rembobinage ralenti.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_it.h b/intl/msg_hash_it.h index 6d2d084385..1813b60cb6 100644 --- a/intl/msg_hash_it.h +++ b/intl/msg_hash_it.h @@ -2225,8 +2225,6 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Skipping SRAM load.") MSG_HASH(MSG_SLOW_MOTION, "Slow motion.") -MSG_HASH(MSG_FAST_FORWARD, - "Avanti veloce.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Riavvolgimento lento.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_ja.h b/intl/msg_hash_ja.h index 0f1739d7f3..4631acbb91 100644 --- a/intl/msg_hash_ja.h +++ b/intl/msg_hash_ja.h @@ -2237,8 +2237,6 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Skipping SRAM load.") MSG_HASH(MSG_SLOW_MOTION, "スローモーション。") -MSG_HASH(MSG_FAST_FORWARD, - "早送り。") MSG_HASH(MSG_SLOW_MOTION_REWIND, "スローモーション巻き戻し。") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_ko.h b/intl/msg_hash_ko.h index 3984ed5260..a0db09d6f7 100644 --- a/intl/msg_hash_ko.h +++ b/intl/msg_hash_ko.h @@ -2163,8 +2163,6 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "SRAM 불러오기 건너뛰는 중.") MSG_HASH(MSG_SLOW_MOTION, "슬로우 모션.") -MSG_HASH(MSG_FAST_FORWARD, - "빨리 감기.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "슬로우 모션 되감기.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_nl.h b/intl/msg_hash_nl.h index e8c280b988..251c32c283 100644 --- a/intl/msg_hash_nl.h +++ b/intl/msg_hash_nl.h @@ -2050,8 +2050,6 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Skipping SRAM load.") MSG_HASH(MSG_SLOW_MOTION, "Slow motion.") -MSG_HASH(MSG_FAST_FORWARD, - "Fast forward.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Slow motion rewind.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_pl.c b/intl/msg_hash_pl.c index a20415a68d..cf5300785a 100644 --- a/intl/msg_hash_pl.c +++ b/intl/msg_hash_pl.c @@ -1,4 +1,4 @@ -/* RetroArch - A frontend for libretro. +/* 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 @@ -982,8 +982,6 @@ const char *msg_hash_to_str_pl(enum msg_hash_enums msg) return "Pomijanie wczytywania SRAM."; case MSG_SLOW_MOTION: return "Spowolnione tempo."; - case MSG_FAST_FORWARD: - return "Szybko do przodu."; case MSG_SLOW_MOTION_REWIND: return "Przewijanie w spowolnionym tempie."; case MSG_SRAM_WILL_NOT_BE_SAVED: diff --git a/intl/msg_hash_pt_br.h b/intl/msg_hash_pt_br.h index 4f15b37e14..e9b099bfe5 100644 --- a/intl/msg_hash_pt_br.h +++ b/intl/msg_hash_pt_br.h @@ -2968,9 +2968,6 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, MSG_HASH(MSG_SLOW_MOTION, "Câmera Lenta." ) -MSG_HASH(MSG_FAST_FORWARD, - "Avanço rápido." - ) MSG_HASH(MSG_SLOW_MOTION_REWIND, "Voltar Atrás em Câmera Lenta." ) diff --git a/intl/msg_hash_pt_pt.h b/intl/msg_hash_pt_pt.h index c82ee3e6d3..4815a6e8b1 100644 --- a/intl/msg_hash_pt_pt.h +++ b/intl/msg_hash_pt_pt.h @@ -2153,8 +2153,6 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Ignorando carregamento de SRAM.") MSG_HASH(MSG_SLOW_MOTION, "Câmera lenta.") -MSG_HASH(MSG_FAST_FORWARD, - "Avanço rápido.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Função rewind em câmera lenta.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_ru.h b/intl/msg_hash_ru.h index dd28e2fab5..8f734f92a1 100644 --- a/intl/msg_hash_ru.h +++ b/intl/msg_hash_ru.h @@ -2198,8 +2198,6 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Пропуск загрузки SRAM.") MSG_HASH(MSG_SLOW_MOTION, "Замедление.") -MSG_HASH(MSG_FAST_FORWARD, - "Перемотка вперед.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Замедленная перемотка.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 4d601ab296..96ebffcf41 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -2233,8 +2233,6 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Skipping SRAM load.") MSG_HASH(MSG_SLOW_MOTION, "Slow motion.") -MSG_HASH(MSG_FAST_FORWARD, - "Fast forward.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Slow motion rewind.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_vn.h b/intl/msg_hash_vn.h index 6d9463823b..08c362344d 100644 --- a/intl/msg_hash_vn.h +++ b/intl/msg_hash_vn.h @@ -2181,8 +2181,6 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Skipping SRAM load.") MSG_HASH(MSG_SLOW_MOTION, "Slow motion.") -MSG_HASH(MSG_FAST_FORWARD, - "Nhanh về phía trước.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Slow motion rewind.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/msg_hash.h b/msg_hash.h index 715b3ec6e6..a706e72123 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -342,7 +342,6 @@ enum msg_hash_enums MSG_REWINDING, MSG_SLOW_MOTION_REWIND, MSG_SLOW_MOTION, - MSG_FAST_FORWARD, MSG_REWIND_REACHED_END, MSG_FAILED_TO_START_MOVIE_RECORD, MSG_CHEEVOS_HARDCORE_MODE_ENABLE, diff --git a/retroarch.c b/retroarch.c index da76e37c3c..2a3598be88 100644 --- a/retroarch.c +++ b/retroarch.c @@ -219,7 +219,6 @@ static bool runloop_paused = false; static bool runloop_idle = false; static bool runloop_exec = false; static bool runloop_slowmotion = false; -static bool runloop_fastmotion = false; static bool runloop_shutdown_initiated = false; static bool runloop_core_shutdown_initiated = false; static bool runloop_perfcnt_enable = false; @@ -1381,10 +1380,10 @@ static bool rarch_game_specific_options(char **output) if (!retroarch_validate_game_options(game_path, game_path_size, false)) - goto error; + goto error; if (!config_file_exists(game_path)) - goto error; + goto error; RARCH_LOG("%s %s\n", msg_hash_to_str(MSG_GAME_SPECIFIC_CORE_OPTIONS_FOUND_AT), @@ -2766,35 +2765,21 @@ static enum runloop_state runloop_check_state( if (new_button_state && !old_button_state) { - if (input_nonblock_state){ + if (input_nonblock_state) input_driver_unset_nonblock_state(); - runloop_fastmotion = false; - } - else { + else input_driver_set_nonblock_state(); - runloop_fastmotion = true; - } driver_set_nonblock_state(); } else if (old_hold_button_state != new_hold_button_state) { - if (new_hold_button_state) { + if (new_hold_button_state) input_driver_set_nonblock_state(); - runloop_fastmotion = true; - } - else { + else input_driver_unset_nonblock_state(); - runloop_fastmotion = false; - } driver_set_nonblock_state(); } - // Display the fast forward state to the user, if needed. - if (runloop_fastmotion) { - runloop_msg_queue_push( - msg_hash_to_str(MSG_FAST_FORWARD), 2, 15, true); - } - old_button_state = new_button_state; old_hold_button_state = new_hold_button_state; } @@ -3145,6 +3130,7 @@ int runloop_iterate(unsigned *sleep_ms) if (settings->floats.fastforward_ratio) end: { + retro_time_t to_sleep_ms = ( (frame_limit_last_time + frame_limit_minimum_time) - cpu_features_get_time_usec()) / 1000; From 07f39198116e5832985e94de9d6cd4098f9d350a Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Fri, 17 Nov 2017 02:28:45 -0500 Subject: [PATCH 010/177] only call setvbuf right after opening file, and use our own buffer for C89 compliance --- cheevos/cheevos.c | 2 +- libretro-common/file/config_file.c | 11 ++------- libretro-common/streams/file_stream.c | 32 ++++++++++++++++++++++----- libretro-db/rmsgpack_test.c | 2 +- 4 files changed, 31 insertions(+), 16 deletions(-) diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c index c5aca66d00..00dbf7685b 100644 --- a/cheevos/cheevos.c +++ b/cheevos/cheevos.c @@ -2605,7 +2605,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(); diff --git a/libretro-common/file/config_file.c b/libretro-common/file/config_file.c index 302cebd3fc..87f72238fb 100644 --- a/libretro-common/file/config_file.c +++ b/libretro-common/file/config_file.c @@ -389,14 +389,13 @@ static config_file_t *config_file_new_internal( goto error; conf->include_depth = depth; - file = filestream_open(path, RFILE_MODE_READ_TEXT, -1); + file = filestream_open(path, RFILE_MODE_READ_TEXT, 0x4000); if (!file) { free(conf->path); goto error; } - setvbuf(filestream_get_fp(file), NULL, _IOFBF, 0x4000); while (!filestream_eof(file)) { @@ -917,15 +916,9 @@ bool config_file_write(config_file_t *conf, const char *path) if (!string_is_empty(path)) { - file = filestream_open(path, RFILE_MODE_WRITE, -1); + file = filestream_open(path, RFILE_MODE_WRITE, 0x4000); if (!file) return false; -#ifdef WIIU - /* TODO: use FBF everywhere once https://i.imgur.com/muVhNeF.jpg is fixed */ - setvbuf(filestream_get_fp(file), NULL, _IONBF, 0x4000); -#else - setvbuf(filestream_get_fp(file), NULL, _IOFBF, 0x4000); -#endif config_file_dump(conf, filestream_get_fp(file)); } else diff --git a/libretro-common/streams/file_stream.c b/libretro-common/streams/file_stream.c index 745bb251e2..21aecc0901 100644 --- a/libretro-common/streams/file_stream.c +++ b/libretro-common/streams/file_stream.c @@ -107,6 +107,7 @@ struct RFILE #endif int fd; #endif + char *buf; }; FILE* filestream_get_fp(RFILE *stream) @@ -154,6 +155,16 @@ void filestream_set_size(RFILE *stream) filestream_seek(stream, 0, SEEK_SET); } +static void filestream_set_buffer(RFILE *stream, ssize_t len) +{ + if (!stream || !stream->fp) + return; + + stream->buf = (char*)calloc(1, len); + + setvbuf(stream->fp, stream->buf, _IOFBF, len); +} + RFILE *filestream_open(const char *path, unsigned mode, ssize_t len) { int flags = 0; @@ -254,6 +265,12 @@ RFILE *filestream_open(const char *path, unsigned mode, ssize_t len) #if defined(PSP) stream->fd = sceIoOpen(path, flags, mode_int); + + if (stream->fd == -1) + goto error; + + if (len >= 0) + filestream_set_buffer(stream, len); #else #if defined(HAVE_BUFFERED_IO) if ((stream->hints & RFILE_HINT_UNBUFFERED) == 0 && mode_str) @@ -275,8 +292,12 @@ RFILE *filestream_open(const char *path, unsigned mode, ssize_t len) #else stream->fp = fopen(path, mode_str); #endif + if (!stream->fp) goto error; + + if (len >= 0) + filestream_set_buffer(stream, len); } else #endif @@ -299,8 +320,12 @@ RFILE *filestream_open(const char *path, unsigned mode, ssize_t len) #else stream->fd = open(path, flags, mode_int); #endif + if (stream->fd == -1) goto error; + + if (len >= 0) + filestream_set_buffer(stream, len); #ifdef HAVE_MMAP if (stream->hints & RFILE_HINT_MMAP) { @@ -323,11 +348,6 @@ RFILE *filestream_open(const char *path, unsigned mode, ssize_t len) } #endif -#if defined(PSP) - if (stream->fd == -1) - goto error; -#endif - { const char *ld = (const char*)strrchr(path, '.'); if (ld) @@ -666,6 +686,8 @@ int filestream_close(RFILE *stream) if (stream->fd > 0) close(stream->fd); #endif + if (stream->buf) + free(stream->buf); free(stream); return 0; diff --git a/libretro-db/rmsgpack_test.c b/libretro-db/rmsgpack_test.c index 2e7f7d0d3a..1c6f03cb57 100644 --- a/libretro-db/rmsgpack_test.c +++ b/libretro-db/rmsgpack_test.c @@ -186,7 +186,7 @@ static struct rmsgpack_read_callbacks stub_callbacks = { int main(void) { struct stub_state state; - RFILE *fd = filestream_open("test.msgpack", RFILE_MODE_READ, 0); + RFILE *fd = filestream_open("test.msgpack", RFILE_MODE_READ, -1); state.i = 0; state.stack[0] = 0; From 066cbea3c307791e99db12c2b9613fc12003cb32 Mon Sep 17 00:00:00 2001 From: David Walters Date: Fri, 17 Nov 2017 09:58:40 +0000 Subject: [PATCH 011/177] Add constants for mouse buttons 4&5 --- libretro-common/include/libretro.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libretro-common/include/libretro.h b/libretro-common/include/libretro.h index 74820e7a3c..4d35ac7b41 100644 --- a/libretro-common/include/libretro.h +++ b/libretro-common/include/libretro.h @@ -208,6 +208,8 @@ extern "C" { #define RETRO_DEVICE_ID_MOUSE_MIDDLE 6 #define RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP 7 #define RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN 8 +#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 From 41df4a0555f4dc15a5796142d3ba753db8fd7cff Mon Sep 17 00:00:00 2001 From: David Walters Date: Fri, 17 Nov 2017 12:00:24 +0000 Subject: [PATCH 012/177] Support for mouse buttons 4&5 --- input/drivers/dinput.c | 8 +++++++- input/drivers/sdl_input.c | 8 +++++++- input/drivers/winraw_input.c | 18 +++++++++++++++++- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/input/drivers/dinput.c b/input/drivers/dinput.c index e376dfb68e..f890444e46 100644 --- a/input/drivers/dinput.c +++ b/input/drivers/dinput.c @@ -85,7 +85,7 @@ struct dinput_input int mouse_rel_y; int mouse_x; int mouse_y; - bool mouse_l, mouse_r, mouse_m, mouse_wu, mouse_wd, mouse_hwu, mouse_hwd; + bool mouse_l, mouse_r, mouse_m, mouse_b4, mouse_b5, mouse_wu, mouse_wd, mouse_hwu, mouse_hwd; struct pointer_status pointer_head; /* dummy head for easier iteration */ }; @@ -246,6 +246,8 @@ static void dinput_poll(void *data) di->mouse_l = mouse_state.rgbButtons[0]; di->mouse_r = mouse_state.rgbButtons[1]; di->mouse_m = mouse_state.rgbButtons[2]; + di->mouse_b4 = mouse_state.rgbButtons[3]; + di->mouse_b5 = mouse_state.rgbButtons[4]; /* No simple way to get absolute coordinates * for RETRO_DEVICE_POINTER. Just use Win32 APIs. */ @@ -368,6 +370,10 @@ static int16_t dinput_mouse_state(struct dinput_input *di, unsigned id) return state; 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; } return 0; diff --git a/input/drivers/sdl_input.c b/input/drivers/sdl_input.c index 83d18551d3..5b462d55ff 100644 --- a/input/drivers/sdl_input.c +++ b/input/drivers/sdl_input.c @@ -38,7 +38,7 @@ typedef struct sdl_input int mouse_x, mouse_y; int mouse_abs_x, mouse_abs_y; - int mouse_l, mouse_r, mouse_m, mouse_wu, mouse_wd, mouse_wl, mouse_wr; + int mouse_l, mouse_r, mouse_m, mouse_b4, mouse_b5, mouse_wu, mouse_wd, mouse_wl, mouse_wr; } sdl_input_t; static void *sdl_input_init(const char *joypad_driver) @@ -131,6 +131,10 @@ static int16_t sdl_mouse_device_state(sdl_input_t *sdl, unsigned id) return sdl->mouse_y; case RETRO_DEVICE_ID_MOUSE_MIDDLE: return sdl->mouse_m; + case RETRO_DEVICE_ID_MOUSE_BUTTON_4: + return sdl->mouse_b4; + case RETRO_DEVICE_ID_MOUSE_BUTTON_5: + return sdl->mouse_b5; } return 0; @@ -310,6 +314,8 @@ static void sdl_poll_mouse(sdl_input_t *sdl) sdl->mouse_l = (SDL_BUTTON(SDL_BUTTON_LEFT) & btn) ? 1 : 0; sdl->mouse_r = (SDL_BUTTON(SDL_BUTTON_RIGHT) & btn) ? 1 : 0; sdl->mouse_m = (SDL_BUTTON(SDL_BUTTON_MIDDLE) & btn) ? 1 : 0; + sdl->mouse_b4 = (SDL_BUTTON(SDL_BUTTON_X1) & btn) ? 1 : 0; + sdl->mouse_b5 = (SDL_BUTTON(SDL_BUTTON_X2) & btn) ? 1 : 0; #ifndef HAVE_SDL2 sdl->mouse_wu = (SDL_BUTTON(SDL_BUTTON_WHEELUP) & btn) ? 1 : 0; sdl->mouse_wd = (SDL_BUTTON(SDL_BUTTON_WHEELDOWN) & btn) ? 1 : 0; diff --git a/input/drivers/winraw_input.c b/input/drivers/winraw_input.c index bb44a0b92e..cd844e838e 100644 --- a/input/drivers/winraw_input.c +++ b/input/drivers/winraw_input.c @@ -32,7 +32,7 @@ typedef struct HANDLE hnd; LONG x, y, dlt_x, dlt_y; LONG whl_u, whl_d; - bool btn_l, btn_m, btn_r; + bool btn_l, btn_m, btn_r, btn_b4, btn_b5; } winraw_mouse_t; typedef struct @@ -279,6 +279,10 @@ static int16_t winraw_mouse_state(winraw_input_t *wr, 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; @@ -419,6 +423,16 @@ static void winraw_update_mouse_state(winraw_mouse_t *mouse, RAWMOUSE *state) 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) @@ -566,6 +580,8 @@ static void winraw_poll(void *d) 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) From 56a3bc10e3e3b849842f9ed1f8c71271984744a1 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Fri, 17 Nov 2017 19:52:15 +0100 Subject: [PATCH 013/177] Conditional frees --- cheevos/cheevos.c | 104 +++++++++++++++++++++++++++++++--------------- 1 file changed, 70 insertions(+), 34 deletions(-) diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c index 00dbf7685b..5f6e16d6ff 100644 --- a/cheevos/cheevos.c +++ b/cheevos/cheevos.c @@ -915,7 +915,8 @@ 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 +938,13 @@ 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 ((void*)condition->condsets[i].conds) + free((void*)condition->condsets[i].conds); + } - free((void*)condition->condsets); + if ((void*)condition->condsets) + free((void*)condition->condsets); } } @@ -996,7 +1001,8 @@ static int cheevos_parse_expression(cheevos_expr_t *expr, const char* mem) /* invalid character in expression */ else { - free((void*)expr->terms); + if ((void*)expr->terms) + free((void*)expr->terms); return -1; } } @@ -1072,7 +1078,8 @@ error: cheevos_free_condition(&lb->start); cheevos_free_condition(&lb->cancel); cheevos_free_condition(&lb->submit); - free((void*)lb->value.terms); + if ((void*)lb->value.terms) + free((void*)lb->value.terms); return -1; } @@ -1130,10 +1137,14 @@ 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 ((void*)cheevo->title) + free((void*)cheevo->title); + if ((void*)cheevo->description) + free((void*)cheevo->description); + if ((void*)cheevo->author) + free((void*)cheevo->author); + if ((void*)cheevo->badge) + free((void*)cheevo->badge); return -1; } @@ -1228,8 +1239,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 +1418,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; @@ -1964,15 +1980,20 @@ Free the loaded achievements. static void cheevos_free_condset(const cheevos_condset_t *set) { - free((void*)set->conds); + if ((void*)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 ((void*)cheevo->title) + free((void*)cheevo->title); + if ((void*)cheevo->description) + free((void*)cheevo->description); + if ((void*)cheevo->author) + free((void*)cheevo->author); + if ((void*)cheevo->badge) + free((void*)cheevo->badge); cheevos_free_condset(cheevo->condition.condsets); } @@ -1984,7 +2005,8 @@ static void cheevos_free_cheevo_set(const cheevoset_t *set) while (cheevo < end) cheevos_free_cheevo(cheevo++); - free((void*)set->cheevos); + if ((void*)set->cheevos) + free((void*)set->cheevos); } #ifndef CHEEVOS_DONT_DEACTIVATE @@ -2757,11 +2779,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; /* @@ -3052,12 +3076,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 +3165,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) { @@ -3282,7 +3309,8 @@ static int cheevos_iterate(coro_t* coro) 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"); @@ -3310,7 +3338,8 @@ static int cheevos_iterate(coro_t* coro) 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 +3372,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"); @@ -3361,9 +3391,12 @@ static void cheevos_task_handler(retro_task_t *task) if (!cheevos_iterate(coro)) { task_set_finished(task, true); - free(CHEEVOS_VAR_DATA); - free((void*)CHEEVOS_VAR_PATH); - free((void*)coro); + if (CHEEVOS_VAR_DATA) + free(CHEEVOS_VAR_DATA); + if ((void*)CHEEVOS_VAR_PATH) + free((void*)CHEEVOS_VAR_PATH); + if ((void*)coro) + free((void*)coro); } } @@ -3387,7 +3420,8 @@ bool cheevos_load(const void *data) if (!task) { - free((void*)coro); + if ((void*)coro) + free((void*)coro); return false; } @@ -3406,8 +3440,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; } From e6e27fe4cb5122b7582cbcba2ca295f9507b186e Mon Sep 17 00:00:00 2001 From: twinaphex Date: Fri, 17 Nov 2017 20:11:22 +0100 Subject: [PATCH 014/177] Silence one Coverity warning --- cheevos/cheevos.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c index 5f6e16d6ff..c373663af5 100644 --- a/cheevos/cheevos.c +++ b/cheevos/cheevos.c @@ -3388,6 +3388,9 @@ 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); @@ -3395,16 +3398,15 @@ static void cheevos_task_handler(retro_task_t *task) free(CHEEVOS_VAR_DATA); if ((void*)CHEEVOS_VAR_PATH) free((void*)CHEEVOS_VAR_PATH); - if ((void*)coro) - free((void*)coro); + free((void*)coro); } } 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; From 94aa2cd08a6256636d9735f2964d6a4c23d1c1e6 Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Fri, 17 Nov 2017 16:12:36 -0500 Subject: [PATCH 015/177] document setvbuf changes, only call it with bufsize >0 --- libretro-common/include/streams/file_stream.h | 12 ++++- libretro-common/streams/file_stream.c | 46 +++++++++++-------- 2 files changed, 37 insertions(+), 21 deletions(-) diff --git a/libretro-common/include/streams/file_stream.h b/libretro-common/include/streams/file_stream.h index 2a0d6950d7..e6d6bbca1c 100644 --- a/libretro-common/include/streams/file_stream.h +++ b/libretro-common/include/streams/file_stream.h @@ -56,7 +56,17 @@ void filestream_set_size(RFILE *stream); const char *filestream_get_ext(RFILE *stream); -RFILE *filestream_open(const char *path, unsigned mode, ssize_t len); +/** + * filestream_open: + * @path : path to file + * @mode : file mode to use when opening (read/write) + * @bufsize : optional buffer size (-1 or 0 to use default) + * + * Opens a file for reading or writing, depending on the requested mode. + * If bufsize is > 0 for unbuffered modes (like RFILE_MODE_WRITE), file will instead be fully buffered. + * Returns a pointer to an RFILE if opened successfully, otherwise NULL. + **/ +RFILE *filestream_open(const char *path, unsigned mode, ssize_t bufsize); ssize_t filestream_seek(RFILE *stream, ssize_t offset, int whence); diff --git a/libretro-common/streams/file_stream.c b/libretro-common/streams/file_stream.c index 21aecc0901..ff077b7c56 100644 --- a/libretro-common/streams/file_stream.c +++ b/libretro-common/streams/file_stream.c @@ -155,17 +155,17 @@ void filestream_set_size(RFILE *stream) filestream_seek(stream, 0, SEEK_SET); } -static void filestream_set_buffer(RFILE *stream, ssize_t len) -{ - if (!stream || !stream->fp) - return; - - stream->buf = (char*)calloc(1, len); - - setvbuf(stream->fp, stream->buf, _IOFBF, len); -} - -RFILE *filestream_open(const char *path, unsigned mode, ssize_t len) +/** + * filestream_open: + * @path : path to file + * @mode : file mode to use when opening (read/write) + * @bufsize : optional buffer size (-1 or 0 to use default) + * + * Opens a file for reading or writing, depending on the requested mode. + * If bufsize is > 0 for unbuffered modes (like RFILE_MODE_WRITE), file will instead be fully buffered. + * Returns a pointer to an RFILE if opened successfully, otherwise NULL. + **/ +RFILE *filestream_open(const char *path, unsigned mode, ssize_t bufsize) { int flags = 0; int mode_int = 0; @@ -268,9 +268,6 @@ RFILE *filestream_open(const char *path, unsigned mode, ssize_t len) if (stream->fd == -1) goto error; - - if (len >= 0) - filestream_set_buffer(stream, len); #else #if defined(HAVE_BUFFERED_IO) if ((stream->hints & RFILE_HINT_UNBUFFERED) == 0 && mode_str) @@ -296,13 +293,24 @@ RFILE *filestream_open(const char *path, unsigned mode, ssize_t len) if (!stream->fp) goto error; - if (len >= 0) - filestream_set_buffer(stream, len); + if (bufsize > 0) + { + /* Regarding setvbuf: + * + * https://www.freebsd.org/cgi/man.cgi?query=setvbuf&apropos=0&sektion=0&manpath=FreeBSD+11.1-RELEASE&arch=default&format=html + * + * If the size argument is not zero but buf is NULL, a buffer of the given size will be allocated immediately, and + * released on close. This is an extension to ANSI C. + * + * Since C89 does not support specifying a null buffer with a non-zero size, we create and track our own buffer for it. + */ + stream->buf = (char*)calloc(1, bufsize); + setvbuf(stream->fp, stream->buf, _IOFBF, bufsize); + } } else #endif { - /* FIXME: HAVE_BUFFERED_IO is always 1, but if it is ever changed, open() needs to be changed to _wopen() for WIndows. */ #if defined(_WIN32) && !defined(_XBOX) #if defined(LEGACY_WIN32) (void)path_wide; @@ -318,14 +326,12 @@ RFILE *filestream_open(const char *path, unsigned mode, ssize_t len) free(path_wide); #endif #else + /* FIXME: HAVE_BUFFERED_IO is always 1, but if it is ever changed, this open() needs to have an alternate _wopen() for Windows. */ stream->fd = open(path, flags, mode_int); #endif if (stream->fd == -1) goto error; - - if (len >= 0) - filestream_set_buffer(stream, len); #ifdef HAVE_MMAP if (stream->hints & RFILE_HINT_MMAP) { From 668cc01c5c878a90900679cab87d5c2afff45aee Mon Sep 17 00:00:00 2001 From: David Walters Date: Fri, 17 Nov 2017 21:50:50 +0000 Subject: [PATCH 016/177] Added RETRO_DEVICE_INDEX_ANALOG_BUTTON constant --- libretro-common/include/libretro.h | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/libretro-common/include/libretro.h b/libretro-common/include/libretro.h index 4d35ac7b41..27b61b70b7 100644 --- a/libretro-common/include/libretro.h +++ b/libretro-common/include/libretro.h @@ -131,11 +131,12 @@ extern "C" { #define RETRO_DEVICE_LIGHTGUN 4 /* The ANALOG device is an extension to JOYPAD (RetroPad). - * Similar to DualShock it adds two analog sticks. - * This is treated as a separate device type as it returns values in the - * full analog range of [-0x8000, 0x7fff]. Positive X axis is right. - * Positive Y axis is down. - * Only use ANALOG type when polling for analog values of the axes. + * Similar to DualShock2 it adds two analog sticks and all buttons can + * be analog. This is treated as a separate device type as it returns + * axis values in the full analog range of [-0x8000, 0x7fff]. + * Positive X axis is right. Positive Y axis is down. + * Buttons are returned in the range [0, 0x7fff]. + * Only use ANALOG type when polling for analog values. */ #define RETRO_DEVICE_ANALOG 5 @@ -174,7 +175,8 @@ extern "C" { /* Buttons for the RetroPad (JOYPAD). * The placement of these is equivalent to placements on the * Super Nintendo controller. - * L2/R2/L3/R3 buttons correspond to the PS1 DualShock. */ + * L2/R2/L3/R3 buttons correspond to the PS1 DualShock. + * Also used as id values for RETRO_DEVICE_INDEX_ANALOG_BUTTON */ #define RETRO_DEVICE_ID_JOYPAD_B 0 #define RETRO_DEVICE_ID_JOYPAD_Y 1 #define RETRO_DEVICE_ID_JOYPAD_SELECT 2 @@ -193,10 +195,11 @@ extern "C" { #define RETRO_DEVICE_ID_JOYPAD_R3 15 /* Index / Id values for ANALOG device. */ -#define RETRO_DEVICE_INDEX_ANALOG_LEFT 0 -#define RETRO_DEVICE_INDEX_ANALOG_RIGHT 1 -#define RETRO_DEVICE_ID_ANALOG_X 0 -#define RETRO_DEVICE_ID_ANALOG_Y 1 +#define RETRO_DEVICE_INDEX_ANALOG_LEFT 0 +#define RETRO_DEVICE_INDEX_ANALOG_RIGHT 1 +#define RETRO_DEVICE_INDEX_ANALOG_BUTTON 2 +#define RETRO_DEVICE_ID_ANALOG_X 0 +#define RETRO_DEVICE_ID_ANALOG_Y 1 /* Id values for MOUSE. */ #define RETRO_DEVICE_ID_MOUSE_X 0 From 1bd65c8f3e680a516b988205fc5249aa549d4213 Mon Sep 17 00:00:00 2001 From: Alfrix <1247237+alfrix@users.noreply.github.com> Date: Fri, 17 Nov 2017 19:42:03 -0300 Subject: [PATCH 017/177] Add Retrosystem theme --- Makefile | 2 +- intl/msg_hash_chs.h | 2 ++ intl/msg_hash_cht.h | 2 ++ intl/msg_hash_de.h | 2 ++ intl/msg_hash_eo.h | 2 ++ intl/msg_hash_fr.h | 2 ++ intl/msg_hash_it.h | 2 ++ intl/msg_hash_ja.h | 2 ++ intl/msg_hash_ko.h | 2 ++ intl/msg_hash_nl.h | 2 ++ intl/msg_hash_pt_br.h | 3 +++ intl/msg_hash_pt_pt.h | 2 ++ intl/msg_hash_ru.h | 2 ++ intl/msg_hash_us.h | 2 ++ intl/msg_hash_vn.h | 2 ++ menu/cbs/menu_cbs_get_value.c | 4 ++++ menu/drivers/xmb.c | 2 ++ menu/menu_driver.h | 1 + msg_hash.h | 1 + 19 files changed, 38 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 2a5e3c7676..caf65feb12 100644 --- a/Makefile +++ b/Makefile @@ -204,7 +204,7 @@ install: $(TARGET) rm -rf $(DESTDIR)$(ASSETS_DIR)/retroarch/assets/xmb/monochrome/src; \ rm -rf $(DESTDIR)$(ASSETS_DIR)/retroarch/assets/xmb/retroactive/src; \ rm -rf $(DESTDIR)$(ASSETS_DIR)/retroarch/assets/xmb/neoactive/src; \ - rm -rf $(DESTDIR)$(ASSETS_DIR)/retroarch/assets/xmb/retroactive_marked/src; \ + rm -rf $(DESTDIR)$(ASSETS_DIR)/retroarch/assets/xmb/retrosystem/src; \ rm -rf $(DESTDIR)$(ASSETS_DIR)/retroarch/assets/xmb/dot-art/src; \ echo "Asset copying done."; \ fi diff --git a/intl/msg_hash_chs.h b/intl/msg_hash_chs.h index 9fcdf549a7..ae11a94183 100644 --- a/intl/msg_hash_chs.h +++ b/intl/msg_hash_chs.h @@ -1674,6 +1674,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, "Pixel") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "RetroActive") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "Dot-Art") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, diff --git a/intl/msg_hash_cht.h b/intl/msg_hash_cht.h index 5ada1e2891..5396f121da 100644 --- a/intl/msg_hash_cht.h +++ b/intl/msg_hash_cht.h @@ -1674,6 +1674,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, "Pixel") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "RetroActive") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "Dot-Art") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, diff --git a/intl/msg_hash_de.h b/intl/msg_hash_de.h index e3a8affc65..3244e73e83 100644 --- a/intl/msg_hash_de.h +++ b/intl/msg_hash_de.h @@ -1725,6 +1725,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, "Pixel") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "RetroActive") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "Dot-Art") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, diff --git a/intl/msg_hash_eo.h b/intl/msg_hash_eo.h index 14d56c01a5..bf81076201 100644 --- a/intl/msg_hash_eo.h +++ b/intl/msg_hash_eo.h @@ -1570,6 +1570,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, "Pixel") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "RetroActive") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "Dot-Art") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, diff --git a/intl/msg_hash_fr.h b/intl/msg_hash_fr.h index 94bd0f9bbb..0d26321549 100644 --- a/intl/msg_hash_fr.h +++ b/intl/msg_hash_fr.h @@ -1695,6 +1695,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, "Pixel") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "RetroActive") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "Dot-Art") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, diff --git a/intl/msg_hash_it.h b/intl/msg_hash_it.h index 1813b60cb6..87e306c237 100644 --- a/intl/msg_hash_it.h +++ b/intl/msg_hash_it.h @@ -1723,6 +1723,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, "Pixel") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "RetroAttivo") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "Dot-Art") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, diff --git a/intl/msg_hash_ja.h b/intl/msg_hash_ja.h index 4631acbb91..270b55d0dd 100644 --- a/intl/msg_hash_ja.h +++ b/intl/msg_hash_ja.h @@ -1737,6 +1737,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, "ピクセル") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "レトロアクティブ") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "ドット絵") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, diff --git a/intl/msg_hash_ko.h b/intl/msg_hash_ko.h index a0db09d6f7..78c15aa503 100644 --- a/intl/msg_hash_ko.h +++ b/intl/msg_hash_ko.h @@ -1671,6 +1671,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, "Pixel") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "RetroActive") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "Dot-Art") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, diff --git a/intl/msg_hash_nl.h b/intl/msg_hash_nl.h index 251c32c283..3cb6562214 100644 --- a/intl/msg_hash_nl.h +++ b/intl/msg_hash_nl.h @@ -1568,6 +1568,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, "Pixel") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "RetroActive") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "Dot-Art") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, diff --git a/intl/msg_hash_pt_br.h b/intl/msg_hash_pt_br.h index e9b099bfe5..f2d6db8b39 100644 --- a/intl/msg_hash_pt_br.h +++ b/intl/msg_hash_pt_br.h @@ -2215,6 +2215,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "RetroActive" ) +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem" + ) MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "Dot-Art" ) diff --git a/intl/msg_hash_pt_pt.h b/intl/msg_hash_pt_pt.h index 4815a6e8b1..48370268e1 100644 --- a/intl/msg_hash_pt_pt.h +++ b/intl/msg_hash_pt_pt.h @@ -1663,6 +1663,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, "Pixel") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "RetroActive") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "Dot-Art") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, diff --git a/intl/msg_hash_ru.h b/intl/msg_hash_ru.h index 8f734f92a1..c9770e1801 100644 --- a/intl/msg_hash_ru.h +++ b/intl/msg_hash_ru.h @@ -1704,6 +1704,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, "Пиксель") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "RetroActive") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "Dot-Art") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 96ebffcf41..e03e584744 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -1729,6 +1729,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, "Pixel") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "RetroActive") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "Dot-Art") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, diff --git a/intl/msg_hash_vn.h b/intl/msg_hash_vn.h index 08c362344d..df3cf44b63 100644 --- a/intl/msg_hash_vn.h +++ b/intl/msg_hash_vn.h @@ -1689,6 +1689,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, "Pixel") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "RetroActive") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "Dot-Art") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index 4760206b17..183dfe2305 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -741,6 +741,10 @@ static void menu_action_setting_disp_set_label_xmb_theme( strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE), len); break; + case XMB_ICON_THEME_RETROSYSTEM: + strlcpy(s, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM), len); + break; case XMB_ICON_THEME_PIXEL: strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL), len); diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index fabfd50e36..c1d5dac42e 100755 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -382,6 +382,8 @@ const char* xmb_theme_ident(void) return "flatui"; case XMB_ICON_THEME_RETROACTIVE: return "retroactive"; + case XMB_ICON_THEME_RETROSYSTEM: + return "retrosystem"; case XMB_ICON_THEME_PIXEL: return "pixel"; case XMB_ICON_THEME_NEOACTIVE: diff --git a/menu/menu_driver.h b/menu/menu_driver.h index 95ac63ff54..07cabb5255 100644 --- a/menu/menu_driver.h +++ b/menu/menu_driver.h @@ -243,6 +243,7 @@ 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, diff --git a/msg_hash.h b/msg_hash.h index a706e72123..3235e92e18 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -422,6 +422,7 @@ enum msg_hash_enums MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_MONOCHROME, MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_FLATUI, MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, + MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_NEOACTIVE, MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_SYSTEMATIC, From 795057bacf4fa544218a3fa94903334fb7c57ebe Mon Sep 17 00:00:00 2001 From: David Walters Date: Fri, 17 Nov 2017 22:46:23 +0000 Subject: [PATCH 018/177] Support for RETRO_DEVICE_INDEX_ANALOG_BUTTON --- input/input_driver.c | 120 ++++++++++++++++++++++++++++++------------- input/input_driver.h | 1 + 2 files changed, 84 insertions(+), 37 deletions(-) diff --git a/input/input_driver.c b/input/input_driver.c index c28b4d42da..a4af4525cb 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -1609,53 +1609,99 @@ int16_t input_joypad_analog(const input_device_driver_t *drv, unsigned port, unsigned idx, unsigned ident, const struct retro_keybind *binds) { - uint32_t axis_minus, axis_plus; - int16_t pressed_minus, pressed_plus, res; - unsigned ident_minus = 0; - unsigned ident_plus = 0; - const struct retro_keybind *bind_minus = NULL; - const struct retro_keybind *bind_plus = NULL; + int16_t res; - input_conv_analog_id_to_bind_id(idx, ident, &ident_minus, &ident_plus); + if ( idx == RETRO_DEVICE_INDEX_ANALOG_BUTTON ) + { + /* A RETRO_DEVICE_JOYPAD button? */ + if ( ident < RARCH_FIRST_CUSTOM_BIND ) + { + uint32_t axis = 0; + const struct retro_keybind *bind = NULL; - bind_minus = &binds[ident_minus]; - bind_plus = &binds[ident_plus]; + bind = &binds[ ident ]; + if (!bind->valid) + return 0; - if (!bind_minus->valid || !bind_plus->valid) - return 0; + axis = bind->joyaxis; + if ( axis == AXIS_NONE ) + axis = joypad_info.auto_binds[ ident ].joyaxis; - axis_minus = bind_minus->joyaxis; - axis_plus = bind_plus->joyaxis; + /* Analog button. */ + res = abs( drv->axis( joypad_info.joy_idx, axis ) ); - if (axis_minus == AXIS_NONE) - axis_minus = joypad_info.auto_binds[ident_minus].joyaxis; - if (axis_plus == AXIS_NONE) - axis_plus = joypad_info.auto_binds[ident_plus].joyaxis; + /* If the result is zero, it's got a digital button attached to it */ + if ( res == 0 ) + { + uint64_t key = bind->joykey; - pressed_minus = abs(drv->axis(joypad_info.joy_idx, axis_minus)); - pressed_plus = abs(drv->axis(joypad_info.joy_idx, axis_plus)); - res = pressed_plus - pressed_minus; + if ( key == NO_BTN ) + key = joypad_info.auto_binds[ ident ].joykey; - if (res == 0) - { - int16_t digital_left = 0; - int16_t digital_right = 0; - uint64_t key_minus = bind_minus->joykey; - uint64_t key_plus = bind_plus->joykey; + if ( drv->button(joypad_info.joy_idx, (uint16_t)key)) + res = 0x7fff; + } + } + else + { + /* not a suitable button */ + res = 0; + } + } + else + { + /* Analog sticks. Either RETRO_DEVICE_INDEX_ANALOG_LEFT + * or RETRO_DEVICE_INDEX_ANALOG_RIGHT */ - if (key_minus == NO_BTN) - key_minus = joypad_info.auto_binds[ident_minus].joykey; - if (key_plus == NO_BTN) - key_plus = joypad_info.auto_binds[ident_plus].joykey; + uint32_t axis_minus, axis_plus; + int16_t pressed_minus, pressed_plus; + unsigned ident_minus = 0; + unsigned ident_plus = 0; + const struct retro_keybind *bind_minus = NULL; + const struct retro_keybind *bind_plus = NULL; - if (drv->button(joypad_info.joy_idx, (uint16_t)key_minus)) - digital_left = -0x7fff; - if (drv->button(joypad_info.joy_idx, (uint16_t)key_plus)) - digital_right = 0x7fff; - return digital_right + digital_left; - } + input_conv_analog_id_to_bind_id(idx, ident, &ident_minus, &ident_plus); - return res; + bind_minus = &binds[ident_minus]; + bind_plus = &binds[ident_plus]; + + if (!bind_minus->valid || !bind_plus->valid) + return 0; + + axis_minus = bind_minus->joyaxis; + axis_plus = bind_plus->joyaxis; + + if (axis_minus == AXIS_NONE) + axis_minus = joypad_info.auto_binds[ident_minus].joyaxis; + if (axis_plus == AXIS_NONE) + axis_plus = joypad_info.auto_binds[ident_plus].joyaxis; + + pressed_minus = abs(drv->axis(joypad_info.joy_idx, axis_minus)); + pressed_plus = abs(drv->axis(joypad_info.joy_idx, axis_plus)); + res = pressed_plus - pressed_minus; + + if (res == 0) + { + int16_t digital_left = 0; + int16_t digital_right = 0; + uint64_t key_minus = bind_minus->joykey; + uint64_t key_plus = bind_plus->joykey; + + if (key_minus == NO_BTN) + key_minus = joypad_info.auto_binds[ident_minus].joykey; + if (key_plus == NO_BTN) + key_plus = joypad_info.auto_binds[ident_plus].joykey; + + if (drv->button(joypad_info.joy_idx, (uint16_t)key_minus)) + digital_left = -0x7fff; + if (drv->button(joypad_info.joy_idx, (uint16_t)key_plus)) + digital_right = 0x7fff; + + return digital_right + digital_left; + } + } + + return res; } /** diff --git a/input/input_driver.h b/input/input_driver.h index 17d135402d..3267efeacd 100644 --- a/input/input_driver.h +++ b/input/input_driver.h @@ -520,6 +520,7 @@ static INLINE bool input_joypad_pressed( * E.g.: * - RETRO_DEVICE_INDEX_ANALOG_LEFT * - RETRO_DEVICE_INDEX_ANALOG_RIGHT + * - RETRO_DEVICE_INDEX_ANALOG_BUTTON * @ident : Analog key identifier. * E.g.: * - RETRO_DEVICE_ID_ANALOG_X From b66819392385d1af71f25f9a00c93a083c2e40d6 Mon Sep 17 00:00:00 2001 From: Brian Koropoff Date: Wed, 8 Nov 2017 16:59:52 -0800 Subject: [PATCH 019/177] 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 020/177] 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 021/177] 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 022/177] 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 f0f033486f9330a6180e3f96fdfd04e7f7b2763b Mon Sep 17 00:00:00 2001 From: Alfrix <1247237+alfrix@users.noreply.github.com> Date: Fri, 17 Nov 2017 22:33:55 -0300 Subject: [PATCH 023/177] Shorter notification options --- intl/msg_hash_us.h | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 96ebffcf41..453e35ddb2 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -1612,9 +1612,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FILTER_FLICKER, MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FONT_ENABLE, "Enable Onscreen Notifications") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FONT_PATH, - "Onscreen Notification Font") + "Notification Font") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FONT_SIZE, - "Onscreen Notification Size") + "Notification Size") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_ASPECT, "Force aspect ratio") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_SRGB_DISABLE, @@ -1636,9 +1636,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_HARD_SYNC_FRAMES, MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MAX_SWAPCHAIN_IMAGES, "Max swapchain images") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_POS_X, - "Onscreen Notification X Position") + "Notification X Position") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_POS_Y, - "Onscreen Notification Y Position") + "Notification Y Position") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MONITOR_INDEX, "Monitor Index") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_POST_FILTER_RECORD, @@ -3238,15 +3238,15 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_INFORMATION, MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_INFORMATION, "Show/hide the 'Information' option.") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_ENABLE, - "Onscreen Notification Background Enable") + "Notification Background Enable") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_RED, - "Onscreen Notification Background Red Color") + "Notification Background Red Color") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_GREEN, - "Onscreen Notification Background Green Color") + "Notification Background Green Color") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_BLUE, - "Onscreen Notification Background Blue Color") + "Notification Background Blue Color") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_OPACITY, - "Onscreen Notification Background Opacity") + "Notification Background Opacity") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_DISABLE_KIOSK_MODE, "Disable Kiosk Mode") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_DISABLE_KIOSK_MODE, @@ -3266,11 +3266,11 @@ MSG_HASH(MSG_INPUT_KIOSK_MODE_PASSWORD_OK, MSG_HASH(MSG_INPUT_KIOSK_MODE_PASSWORD_NOK, "Password incorrect.") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_COLOR_RED, - "Onscreen Notification Red Color") + "Notification Red Color") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_COLOR_GREEN, - "Onscreen Notification Green Color") + "Notification Green Color") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_COLOR_BLUE, - "Onscreen Notification Blue Color") + "Notification Blue Color") MSG_HASH(MENU_ENUM_LABEL_VALUE_FRAMECOUNT_SHOW, "Show frame count on FPS display") MSG_HASH(MSG_CONFIG_OVERRIDE_LOADED, From 75e6ad53b6fd5dc21e7198a0c7a8917e55906882 Mon Sep 17 00:00:00 2001 From: orbea Date: Fri, 17 Nov 2017 18:36:01 -0800 Subject: [PATCH 024/177] qb: read without -r will mangle backslashes. --- qb/qb.params.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qb/qb.params.sh b/qb/qb.params.sh index 68048f2be6..82b39ca500 100644 --- a/qb/qb.params.sh +++ b/qb/qb.params.sh @@ -29,7 +29,7 @@ EOF echo "" echo "Custom options:" - while IFS='=#' read VAR VAL COMMENT; do + while IFS='=#' read -r VAR VAL COMMENT; do VAR=$(echo "${VAR##HAVE_}" | tr '[:upper:]' '[:lower:]') case "$VAR" in 'c89_'*) continue;; @@ -56,7 +56,7 @@ opt_exists() # $opt is returned if exists in OPTS } parse_input() # Parse stuff :V -{ OPTS=; while IFS='=' read VAR dummy; do OPTS="$OPTS ${VAR##HAVE_}"; done < 'qb/config.params.sh' +{ OPTS=; while IFS='=' read -r VAR _; do OPTS="$OPTS ${VAR##HAVE_}"; done < 'qb/config.params.sh' #OPTS contains all available options in config.params.sh - used to speedup #things in opt_exists() From 21ae4a29a163778cb725bbdb6ec35aaca6193947 Mon Sep 17 00:00:00 2001 From: orbea Date: Sat, 18 Nov 2017 01:17:00 -0800 Subject: [PATCH 025/177] qb: Fix --enable-* options for zsh. --- qb/qb.params.sh | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/qb/qb.params.sh b/qb/qb.params.sh index 68048f2be6..4cce59a00c 100644 --- a/qb/qb.params.sh +++ b/qb/qb.params.sh @@ -50,9 +50,11 @@ EOF } opt_exists() # $opt is returned if exists in OPTS -{ opt=$(echo "$1" | tr '[:lower:]' '[:upper:]') - for OPT in $OPTS; do [ "$opt" = "$OPT" ] && return; done - echo "Unknown option $2"; exit 1 +{ opt="$(echo "$1" | tr '[:lower:]' '[:upper:]')" + err="$2" + eval "set -- $OPTS" + for OPT do [ "$opt" = "$OPT" ] && return; done + echo "Unknown option $err"; exit 1 } parse_input() # Parse stuff :V From 84f61a8b467594d0f8d2b7e5554d1cb06351efb8 Mon Sep 17 00:00:00 2001 From: orbea Date: Sat, 18 Nov 2017 02:31:47 -0800 Subject: [PATCH 026/177] qb: Remove old submodule tests. RetroArch no longer uses submodules for various good reasons and now uses git subtrees instead. As a result these files will always exist and these tests will always be true. --- qb/config.libs.sh | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/qb/config.libs.sh b/qb/config.libs.sh index e4e48aebae..feadeb66f7 100644 --- a/qb/config.libs.sh +++ b/qb/config.libs.sh @@ -444,18 +444,6 @@ check_lib '' STRCASESTR "$CLIB" strcasestr check_lib '' MMAP "$CLIB" mmap check_lib '' VULKAN -lvulkan vkCreateInstance -if [ "$HAVE_VULKAN" != 'no' ] && [ ! -e deps/glslang/glslang/README.md ]; then - echo "Warning: glslang submodule not loaded, can't use Vulkan." - echo "To fix, use: git submodule init && git submodule update" - HAVE_VULKAN=no -fi - -if [ "$HAVE_VULKAN" != 'no' ] && [ ! -e deps/SPIRV-Cross/README.md ]; then - echo "Warning: SPIRV-Cross submodule not loaded, can't use Vulkan." - echo "To fix, use: git submodule init && git submodule update" - HAVE_VULKAN=no -fi - check_pkgconf PYTHON python3 if [ "$HAVE_MATERIALUI" != 'no' ] || [ "$HAVE_XMB" != 'no' ] || [ "$HAVE_ZARCH" != 'no' ]; then From bf8863d36055a12b8f2cd1fbd5be7f84d17b0dca Mon Sep 17 00:00:00 2001 From: orbea Date: Sun, 22 Oct 2017 00:33:27 -0700 Subject: [PATCH 027/177] qb: Add a function to print warning or exit messages. --- qb/config.libs.sh | 43 ++++++++++++++++++++----------------------- qb/qb.comp.sh | 10 ++++------ qb/qb.libs.sh | 29 +++++++++++------------------ qb/qb.params.sh | 17 ++++++++++++++--- 4 files changed, 49 insertions(+), 50 deletions(-) diff --git a/qb/config.libs.sh b/qb/config.libs.sh index feadeb66f7..ffe90a5d66 100644 --- a/qb/config.libs.sh +++ b/qb/config.libs.sh @@ -35,8 +35,7 @@ elif [ "$OS" = 'Win32' ]; then SOCKETHEADER="#include " DYLIB= elif [ "$OS" = 'Cygwin' ]; then - echo "Error: Cygwin is not a supported platform. See https://bot.libretro.com/docs/compilation/windows/" - exit 1 + die 1 'Error: Cygwin is not a supported platform. See https://bot.libretro.com/docs/compilation/windows/' fi add_define_make DYLIB_LIB "$DYLIB" @@ -79,7 +78,7 @@ if [ "$HAVE_7ZIP" = "yes" ]; then fi if [ "$HAVE_PRESERVE_DYLIB" = "yes" ]; then - echo "Notice: Disabling dlclose() of shared objects for Valgrind support." + die : 'Notice: Disabling dlclose() of shared objects for Valgrind support.' add_define_make HAVE_PRESERVE_DYLIB "1" fi @@ -143,7 +142,7 @@ if [ "$HAVE_DISPMANX" != "no" ]; then fi if [ "$LIBRETRO" ]; then - echo "Notice: Explicit libretro used, disabling dynamic libretro loading ..." + die : 'Notice: Explicit libretro used, disabling dynamic libretro loading ...' HAVE_DYNAMIC='no' else LIBRETRO="-lretro" fi @@ -197,7 +196,7 @@ if [ "$HAVE_NETWORKING" = 'yes' ]; then check_lib '' GETADDRINFO "$SOCKETLIB" getaddrinfo if [ "$HAVE_GETADDRINFO" != 'yes' ]; then HAVE_SOCKET_LEGACY=yes - echo "Notice: RetroArch will use legacy socket support" + die : 'Notice: RetroArch will use legacy socket support' fi fi HAVE_NETWORK_CMD=yes @@ -211,7 +210,7 @@ if [ "$HAVE_NETWORKING" = 'yes' ]; then HAVE_MINIUPNPC='yes' fi else - echo "Warning: All networking features have been disabled." + die : 'Warning: All networking features have been disabled.' HAVE_KEYMAPPER='no' HAVE_NETWORK_CMD='no' HAVE_NETWORKGAMEPAD='no' @@ -229,8 +228,7 @@ fi check_lib '' GETOPT_LONG "$CLIB" getopt_long if [ "$HAVE_DYLIB" = 'no' ] && [ "$HAVE_DYNAMIC" = 'yes' ]; then - echo "Error: Dynamic loading of libretro is enabled, but your platform does not appear to have dlopen(), use --disable-dynamic or --with-libretro=\"-lretro\"". - exit 1 + die 1 'Error: Dynamic loading of libretro is enabled, but your platform does not appear to have dlopen(), use --disable-dynamic or --with-libretro="-lretro".' fi check_pkgconf ALSA alsa @@ -266,10 +264,10 @@ check_pkgconf SDL2 sdl2 2.0.0 if [ "$HAVE_SDL2" = 'yes' ]; then if [ "$HAVE_SDL2" = 'yes' ] && [ "$HAVE_SDL" = 'yes' ]; then - echo "Notice: SDL drivers will be replaced by SDL2 ones." + die : 'Notice: SDL drivers will be replaced by SDL2 ones.' HAVE_SDL=no elif [ "$HAVE_SDL2" = 'no' ]; then - echo "Warning: SDL2 not found, skipping." + die : 'Warning: SDL2 not found, skipping.' HAVE_SDL2=no fi fi @@ -321,7 +319,7 @@ if [ "$HAVE_OPENGL" != 'no' ] && [ "$HAVE_OPENGLES" != 'yes' ]; then check_pkgconf OSMESA osmesa else - echo "Notice: Ignoring Cg. Desktop OpenGL is not enabled." + die : 'Notice: Ignoring Cg. Desktop OpenGL is not enabled.' HAVE_CG='no' fi fi @@ -349,11 +347,11 @@ if [ "$HAVE_THREADS" != 'no' ]; then HAVE_FFMPEG='yes' if [ "$HAVE_AVCODEC" = 'no' ] || [ "$HAVE_SWRESAMPLE" = 'no' ] || [ "$HAVE_AVFORMAT" = 'no' ] || [ "$HAVE_AVUTIL" = 'no' ] || [ "$HAVE_SWSCALE" = 'no' ]; then HAVE_FFMPEG='no' - echo "Notice: FFmpeg built-in support disabled due to missing or unsuitable packages." + die : 'Notice: FFmpeg built-in support disabled due to missing or unsuitable packages.' fi fi else - echo "Notice: Not building with threading support. Will skip FFmpeg." + die : 'Notice: Not building with threading support. Will skip FFmpeg.' HAVE_FFMPEG='no' fi @@ -367,8 +365,7 @@ if [ "$HAVE_KMS" != "no" ]; then if [ "$HAVE_GBM" = "yes" ] && [ "$HAVE_DRM" = "yes" ] && [ "$HAVE_EGL" = "yes" ]; then HAVE_KMS=yes elif [ "$HAVE_KMS" = "yes" ]; then - echo "Error: Cannot find libgbm, libdrm and EGL libraries required for KMS. Compile without --enable-kms." - exit 1 + die 1 'Error: Cannot find libgbm, libdrm and EGL libraries required for KMS. Compile without --enable-kms.' else HAVE_KMS=no fi @@ -379,7 +376,7 @@ check_pkgconf LIBXML2 libxml-2.0 if [ "$HAVE_EGL" = "yes" ]; then if [ "$HAVE_OPENGLES" != "no" ]; then if [ "$OPENGLES_LIBS" ] || [ "$OPENGLES_CFLAGS" ]; then - echo "Notice: Using custom OpenGLES CFLAGS ($OPENGLES_CFLAGS) and LDFLAGS ($OPENGLES_LIBS)." + 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" else @@ -419,7 +416,7 @@ check_pkgconf XINERAMA xinerama if [ "$HAVE_X11" = 'yes' ] && [ "$HAVE_XEXT" = 'yes' ] && [ "$HAVE_XF86VM" = 'yes' ]; then check_pkgconf XVIDEO xv else - echo "Notice: X11, Xext or xf86vm not present. Skipping X11 code paths." + die : 'Notice: X11, Xext or xf86vm not present. Skipping X11 code paths.' HAVE_X11='no' HAVE_XVIDEO='no' fi @@ -451,19 +448,19 @@ if [ "$HAVE_MATERIALUI" != 'no' ] || [ "$HAVE_XMB" != 'no' ] || [ "$HAVE_ZARCH" HAVE_MATERIALUI=no HAVE_XMB=no HAVE_ZARCH=no - echo "Notice: RGUI not available, MaterialUI, XMB and ZARCH will also be disabled." + die : 'Notice: RGUI not available, MaterialUI, XMB and ZARCH will also be disabled.' elif [ "$HAVE_OPENGL" = 'no' ] && [ "$HAVE_OPENGLES" = 'no' ] && [ "$HAVE_VULKAN" = 'no' ]; then if [ "$OS" = 'Win32' ]; then HAVE_SHADERPIPELINE=no HAVE_VULKAN=no - echo "Notice: Hardware rendering context not available." + die : 'Notice: Hardware rendering context not available.' elif [ "$HAVE_CACA" = 'yes' ]; then - echo "Notice: Hardware rendering context not available." + die : 'Notice: Hardware rendering context not available.' else HAVE_MATERIALUI=no HAVE_XMB=no HAVE_ZARCH=no - echo "Notice: Hardware rendering context not available, XMB, MaterialUI and ZARCH will also be disabled." + die : 'Notice: Hardware rendering context not available, XMB, MaterialUI and ZARCH will also be disabled.' fi fi fi @@ -474,12 +471,12 @@ add_define_make OS "$OS" if [ "$HAVE_ZLIB" = 'no' ] && [ "$HAVE_RPNG" != 'no' ]; then HAVE_RPNG=no - echo "Notice: zlib is not available, RPNG will also be disabled." + die : 'Notice: zlib is not available, RPNG will also be disabled.' fi if [ "$HAVE_THREADS" = 'no' ] && [ "$HAVE_LIBUSB" != 'no' ]; then HAVE_LIBUSB=no - echo "Notice: Threads are not available, libusb will also be disabled." + die : 'Notice: Threads are not available, libusb will also be disabled.' fi if [ "$HAVE_V4L2" != 'no' ] && [ "$HAVE_VIDEOPROCESSOR" != 'no' ]; then diff --git a/qb/qb.comp.sh b/qb/qb.comp.sh index fd27365517..01b3e8ffa6 100644 --- a/qb/qb.comp.sh +++ b/qb/qb.comp.sh @@ -31,8 +31,7 @@ fi echo "Checking for suitable working C compiler ... $CC $cc_status" if [ "$cc_works" = '0' ] && [ "$USE_LANG_C" = 'yes' ]; then - echo "Error: Cannot proceed without a working C compiler." - exit 1 + die 1 'Error: Cannot proceed without a working C compiler.' fi # Checking for working C++ @@ -62,15 +61,14 @@ fi echo "Checking for suitable working C++ compiler ... $CXX $cxx_status" if [ "$cxx_works" = '0' ] && [ "$USE_LANG_CXX" = 'yes' ]; then - echo "Error: Cannot proceed without a working C++ compiler." - exit 1 + die 1 'Error: Cannot proceed without a working C++ compiler.' fi if [ "$OS" = "Win32" ]; then echobuf="Checking for windres" if [ -z "$WINDRES" ]; then WINDRES=$(which ${CROSS_COMPILE}windres) - [ "$WINDRES" ] || { echo "$echobuf ... Not found. Exiting."; exit 1; } + [ "$WINDRES" ] || die 1 "$echobuf ... Not found. Exiting." fi echo "$echobuf ... $WINDRES" fi @@ -90,5 +88,5 @@ fi echo "Checking for pkg-config ... $PKG_CONF_PATH" if [ "$PKG_CONF_PATH" = "none" ]; then - echo "Warning: pkg-config not found, package checks will fail." + die : 'Warning: pkg-config not found, package checks will fail.' fi diff --git a/qb/qb.libs.sh b/qb/qb.libs.sh index 52ae472eca..79270c04e6 100644 --- a/qb/qb.libs.sh +++ b/qb/qb.libs.sh @@ -60,10 +60,9 @@ check_lib() # $1 = language $2 = HAVE_$2 $3 = lib $4 = function in lib $5 = rm -f -- "$TEMP_CODE" "$TEMP_EXE" [ "$answer" = 'no' ] && { - [ "$7" ] && { echo "$7"; exit 1;} + [ "$7" ] && die 1 "$7" [ "$tmpval" = 'yes' ] && { - echo "Forced to build with library $3, but cannot locate. Exiting ..." - exit 1 + die 1 "Forced to build with library $3, but cannot locate. Exiting ..." } } @@ -119,11 +118,9 @@ check_pkgconf() #$1 = HAVE_$1 $2 = package $3 = version $4 = critical error mess echo "$ECHOBUF ... $version" PKG_CONF_USED="$PKG_CONF_USED $1" [ "$answer" = 'no' ] && { - [ "$4" ] && { echo "$4"; exit 1;} - [ "$tmpval" = 'yes' ] && { - echo "Forced to build with package $2, but cannot locate. Exiting ..." - exit 1 - } + [ "$4" ] && die 1 "$4" + [ "$tmpval" = 'yes' ] && \ + die 1 "Forced to build with package $2, but cannot locate. Exiting ..." } } @@ -140,10 +137,8 @@ check_header() #$1 = HAVE_$1 $2..$5 = header files "$CC" -o "$TEMP_EXE" "$TEMP_C" $INCLUDE_DIRS >>config.log 2>&1 && answer='yes' eval HAVE_$1="$answer"; echo "Checking presence of header file $CHECKHEADER ... $answer" rm -f -- "$TEMP_C" "$TEMP_EXE" - [ "$tmpval" = 'yes' ] && [ "$answer" = 'no' ] && { - echo "Build assumed that $2 exists, but cannot locate. Exiting ..." - exit 1 - } + [ "$tmpval" = 'yes' ] && [ "$answer" = 'no' ] && \ + die 1 "Build assumed that $2 exists, but cannot locate. Exiting ..." } check_macro() #$1 = HAVE_$1 $2 = macro name @@ -160,10 +155,8 @@ EOF "$CC" -o "$TEMP_EXE" "$TEMP_C" $CFLAGS $INCLUDE_DIRS >>config.log 2>&1 && answer='yes' eval HAVE_$1="$answer"; echo "$ECHOBUF ... $answer" rm -f -- "$TEMP_C" "$TEMP_EXE" - [ "$tmpval" = 'yes' ] && [ "$answer" = 'no' ] && { - echo "Build assumed that $2 is defined, but it's not. Exiting ..." - exit 1 - } + [ "$tmpval" = 'yes' ] && [ "$answer" = 'no' ] && \ + 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] @@ -174,7 +167,7 @@ check_switch_c() #$1 = HAVE_$1 $2 = switch $3 = critical error message [checked eval HAVE_$1="$answer"; echo "$ECHOBUF ... $answer" rm -f -- "$TEMP_C" "$TEMP_EXE" [ "$answer" = 'no' ] && { - [ "$3" ] && { echo "$3"; exit 1;} + [ "$3" ] && die 1 "$3" } } @@ -186,7 +179,7 @@ check_switch_cxx() #$1 = HAVE_$1 $2 = switch $3 = critical error message [checke eval HAVE_$1="$answer"; echo "$ECHOBUF ... $answer" rm -f -- "$TEMP_CXX" "$TEMP_EXE" [ "$answer" = 'no' ] && { - [ "$3" ] && { echo "$3"; exit 1;} + [ "$3" ] && die 1 "$3" } } diff --git a/qb/qb.params.sh b/qb/qb.params.sh index a51ccafb21..c2ed9592fd 100644 --- a/qb/qb.params.sh +++ b/qb/qb.params.sh @@ -1,3 +1,14 @@ +die() # $1 = exit code, use : to not exit when printing warnings $@ = exit or warning messages +{ + ret="$1" + shift 1 + printf %s\\n "$@" >&2 + case "$ret" in + : ) return 0 ;; + * ) exit "$ret" ;; + esac +} + print_help_option() # $1 = option $@ = description { _opt="$1" @@ -54,7 +65,7 @@ opt_exists() # $opt is returned if exists in OPTS err="$2" eval "set -- $OPTS" for OPT do [ "$opt" = "$OPT" ] && return; done - echo "Unknown option $err"; exit 1 + die 1 "Unknown option $err" } parse_input() # Parse stuff :V @@ -83,7 +94,7 @@ parse_input() # Parse stuff :V eval "$opt=\"$val\"" ;; -h|--help) print_help; exit 0;; - *) echo "Unknown option $1"; exit 1;; + *) die 1 "Unknown option $1";; esac shift done @@ -91,4 +102,4 @@ parse_input() # Parse stuff :V . qb/config.params.sh -parse_input "$@" +parse_input "$@" From 0c65e6e4e9f7ea6ba66e6e3f6a2a60c974ef10e7 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 18 Nov 2017 12:21:25 +0100 Subject: [PATCH 028/177] Start bumping version to 1.6.8 --- pkg/android/phoenix/AndroidManifest.xml | 2 +- version.all | 4 ++-- version.dtd | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/android/phoenix/AndroidManifest.xml b/pkg/android/phoenix/AndroidManifest.xml index 5d82f1b08c..a892856fc3 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 7b71569142..2bea844e2c 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.7" +RARCH_VERSION="1.6.8" #endif #ifndef PACKAGE_VERSION -#define PACKAGE_VERSION "1.6.7" +#define PACKAGE_VERSION "1.6.8" #endif diff --git a/version.dtd b/version.dtd index 9520dcf0d2..d1fb503a4e 100644 --- a/version.dtd +++ b/version.dtd @@ -1 +1 @@ - + From 24324456415dc1ee8b0c08ed7f25178c64e4b88e Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 18 Nov 2017 12:23:25 +0100 Subject: [PATCH 029/177] Update CHANGES.md --- CHANGES.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 6de0f51c9e..1871993c80 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,4 +1,6 @@ -# 1.6.8 (future) +# 1.6.9 (future) + +# 1.6.8 - Audio: Fix the Audio DSP picker - CHEEVOS: Add support for Atari Lynx cheevos. - CHEEVOS: Add support for RetroAchievements Leaderboards. @@ -12,6 +14,8 @@ - GUI: Add menu option for OSD text color. - GUI: Add menu option to remove frame count from OSD. - GUI: Allow wraparound of int/float settings when pressing the left key +- INPUT/LIBRETRO: Add support for more mouse buttons (buttons 4/5) +- INPUT/LIBRETRO: Add support for analog buttons - INPUT: Always show the controls menu even if descriptors are not set - INPUT: Fix input descriptors not being set on cores that don't implement the controllers interface - INPUT: Apply descriptors only for the amount of cores the core supports From 7f381772468f1dd4d50765f884793dfbfaac801c Mon Sep 17 00:00:00 2001 From: Rob Loach Date: Sat, 18 Nov 2017 10:48:53 -0500 Subject: [PATCH 030/177] Revert "Revert "Display a "Fast forward." message"" This reverts commit f3c774a797688307cf0224909fc1aac4dddb3bba. --- intl/msg_hash_chs.h | 2 ++ intl/msg_hash_cht.h | 2 ++ intl/msg_hash_de.h | 2 ++ intl/msg_hash_eo.h | 2 ++ intl/msg_hash_es.c | 2 ++ intl/msg_hash_fr.h | 2 ++ intl/msg_hash_it.h | 2 ++ intl/msg_hash_ja.h | 2 ++ intl/msg_hash_ko.h | 2 ++ intl/msg_hash_nl.h | 2 ++ intl/msg_hash_pl.c | 4 +++- intl/msg_hash_pt_br.h | 3 +++ intl/msg_hash_pt_pt.h | 2 ++ intl/msg_hash_ru.h | 2 ++ intl/msg_hash_us.h | 2 ++ intl/msg_hash_vn.h | 2 ++ msg_hash.h | 1 + retroarch.c | 28 +++++++++++++++++++++------- 18 files changed, 56 insertions(+), 8 deletions(-) diff --git a/intl/msg_hash_chs.h b/intl/msg_hash_chs.h index ae11a94183..142ffad5d7 100644 --- a/intl/msg_hash_chs.h +++ b/intl/msg_hash_chs.h @@ -2165,6 +2165,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "跳过 SRAM 加载。") MSG_HASH(MSG_SLOW_MOTION, "慢动作。") +MSG_HASH(MSG_FAST_FORWARD, + "快进。") MSG_HASH(MSG_SLOW_MOTION_REWIND, "慢动作回溯。") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_cht.h b/intl/msg_hash_cht.h index 5396f121da..9e13d1de7d 100644 --- a/intl/msg_hash_cht.h +++ b/intl/msg_hash_cht.h @@ -2165,6 +2165,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "跳過 SRAM 戴入。") MSG_HASH(MSG_SLOW_MOTION, "慢動作。") +MSG_HASH(MSG_FAST_FORWARD, + "快進。") MSG_HASH(MSG_SLOW_MOTION_REWIND, "慢動作回溯。") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_de.h b/intl/msg_hash_de.h index 3244e73e83..44c710daff 100644 --- a/intl/msg_hash_de.h +++ b/intl/msg_hash_de.h @@ -2229,6 +2229,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Überspringe Laden des SRAM.") MSG_HASH(MSG_SLOW_MOTION, "Zeitlupe.") +MSG_HASH(MSG_FAST_FORWARD, + "Snel vooruit.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "In Zeitlupe zurückspulen.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_eo.h b/intl/msg_hash_eo.h index bf81076201..c17db311bb 100644 --- a/intl/msg_hash_eo.h +++ b/intl/msg_hash_eo.h @@ -2054,6 +2054,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Skipping SRAM load.") MSG_HASH(MSG_SLOW_MOTION, "Slow motion.") +MSG_HASH(MSG_FAST_FORWARD, + "Fast forward.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Slow motion rewind.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_es.c b/intl/msg_hash_es.c index 5f8ddab95a..631d53b609 100644 --- a/intl/msg_hash_es.c +++ b/intl/msg_hash_es.c @@ -1469,6 +1469,8 @@ const char *msg_hash_to_str_es(enum msg_hash_enums msg) return "Omitiendo carga de SRAM."; case MSG_SLOW_MOTION: return "Cámara lenta."; + case MSG_FAST_FORWARD: + return "Avance rápido."; case MSG_SLOW_MOTION_REWIND: return "Rebobinar cámara lenta."; case MSG_SRAM_WILL_NOT_BE_SAVED: diff --git a/intl/msg_hash_fr.h b/intl/msg_hash_fr.h index 0d26321549..fa1094a768 100644 --- a/intl/msg_hash_fr.h +++ b/intl/msg_hash_fr.h @@ -2185,6 +2185,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Ignore le chargement de la SRAM.") MSG_HASH(MSG_SLOW_MOTION, "Ralenti.") +MSG_HASH(MSG_FAST_FORWARD, + "Avance rapide.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Rembobinage ralenti.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_it.h b/intl/msg_hash_it.h index 87e306c237..c94ed5b0b8 100644 --- a/intl/msg_hash_it.h +++ b/intl/msg_hash_it.h @@ -2227,6 +2227,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Skipping SRAM load.") MSG_HASH(MSG_SLOW_MOTION, "Slow motion.") +MSG_HASH(MSG_FAST_FORWARD, + "Avanti veloce.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Riavvolgimento lento.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_ja.h b/intl/msg_hash_ja.h index 270b55d0dd..3c772118af 100644 --- a/intl/msg_hash_ja.h +++ b/intl/msg_hash_ja.h @@ -2239,6 +2239,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Skipping SRAM load.") MSG_HASH(MSG_SLOW_MOTION, "スローモーション。") +MSG_HASH(MSG_FAST_FORWARD, + "早送り。") MSG_HASH(MSG_SLOW_MOTION_REWIND, "スローモーション巻き戻し。") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_ko.h b/intl/msg_hash_ko.h index 78c15aa503..f4e980e451 100644 --- a/intl/msg_hash_ko.h +++ b/intl/msg_hash_ko.h @@ -2165,6 +2165,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "SRAM 불러오기 건너뛰는 중.") MSG_HASH(MSG_SLOW_MOTION, "슬로우 모션.") +MSG_HASH(MSG_FAST_FORWARD, + "빨리 감기.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "슬로우 모션 되감기.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_nl.h b/intl/msg_hash_nl.h index 3cb6562214..5be89c5f31 100644 --- a/intl/msg_hash_nl.h +++ b/intl/msg_hash_nl.h @@ -2052,6 +2052,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Skipping SRAM load.") MSG_HASH(MSG_SLOW_MOTION, "Slow motion.") +MSG_HASH(MSG_FAST_FORWARD, + "Fast forward.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Slow motion rewind.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_pl.c b/intl/msg_hash_pl.c index cf5300785a..a20415a68d 100644 --- a/intl/msg_hash_pl.c +++ b/intl/msg_hash_pl.c @@ -1,4 +1,4 @@ -/* RetroArch - A frontend for libretro. +/* 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 @@ -982,6 +982,8 @@ const char *msg_hash_to_str_pl(enum msg_hash_enums msg) return "Pomijanie wczytywania SRAM."; case MSG_SLOW_MOTION: return "Spowolnione tempo."; + case MSG_FAST_FORWARD: + return "Szybko do przodu."; case MSG_SLOW_MOTION_REWIND: return "Przewijanie w spowolnionym tempie."; case MSG_SRAM_WILL_NOT_BE_SAVED: diff --git a/intl/msg_hash_pt_br.h b/intl/msg_hash_pt_br.h index f2d6db8b39..dcaeaebd75 100644 --- a/intl/msg_hash_pt_br.h +++ b/intl/msg_hash_pt_br.h @@ -2971,6 +2971,9 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, MSG_HASH(MSG_SLOW_MOTION, "Câmera Lenta." ) +MSG_HASH(MSG_FAST_FORWARD, + "Avanço rápido." + ) MSG_HASH(MSG_SLOW_MOTION_REWIND, "Voltar Atrás em Câmera Lenta." ) diff --git a/intl/msg_hash_pt_pt.h b/intl/msg_hash_pt_pt.h index 48370268e1..800463bdc5 100644 --- a/intl/msg_hash_pt_pt.h +++ b/intl/msg_hash_pt_pt.h @@ -2155,6 +2155,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Ignorando carregamento de SRAM.") MSG_HASH(MSG_SLOW_MOTION, "Câmera lenta.") +MSG_HASH(MSG_FAST_FORWARD, + "Avanço rápido.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Função rewind em câmera lenta.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_ru.h b/intl/msg_hash_ru.h index c9770e1801..3cc733e238 100644 --- a/intl/msg_hash_ru.h +++ b/intl/msg_hash_ru.h @@ -2200,6 +2200,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Пропуск загрузки SRAM.") MSG_HASH(MSG_SLOW_MOTION, "Замедление.") +MSG_HASH(MSG_FAST_FORWARD, + "Перемотка вперед.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Замедленная перемотка.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 32cf049f65..a7f516c586 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -2235,6 +2235,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Skipping SRAM load.") MSG_HASH(MSG_SLOW_MOTION, "Slow motion.") +MSG_HASH(MSG_FAST_FORWARD, + "Fast forward.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Slow motion rewind.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_vn.h b/intl/msg_hash_vn.h index df3cf44b63..ca95e43315 100644 --- a/intl/msg_hash_vn.h +++ b/intl/msg_hash_vn.h @@ -2183,6 +2183,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Skipping SRAM load.") MSG_HASH(MSG_SLOW_MOTION, "Slow motion.") +MSG_HASH(MSG_FAST_FORWARD, + "Nhanh về phía trước.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Slow motion rewind.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/msg_hash.h b/msg_hash.h index 3235e92e18..25f83229b8 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -342,6 +342,7 @@ enum msg_hash_enums MSG_REWINDING, MSG_SLOW_MOTION_REWIND, MSG_SLOW_MOTION, + MSG_FAST_FORWARD, MSG_REWIND_REACHED_END, MSG_FAILED_TO_START_MOVIE_RECORD, MSG_CHEEVOS_HARDCORE_MODE_ENABLE, diff --git a/retroarch.c b/retroarch.c index 2a3598be88..da76e37c3c 100644 --- a/retroarch.c +++ b/retroarch.c @@ -219,6 +219,7 @@ static bool runloop_paused = false; static bool runloop_idle = false; static bool runloop_exec = false; static bool runloop_slowmotion = false; +static bool runloop_fastmotion = false; static bool runloop_shutdown_initiated = false; static bool runloop_core_shutdown_initiated = false; static bool runloop_perfcnt_enable = false; @@ -1380,10 +1381,10 @@ static bool rarch_game_specific_options(char **output) if (!retroarch_validate_game_options(game_path, game_path_size, false)) - goto error; + goto error; if (!config_file_exists(game_path)) - goto error; + goto error; RARCH_LOG("%s %s\n", msg_hash_to_str(MSG_GAME_SPECIFIC_CORE_OPTIONS_FOUND_AT), @@ -2765,21 +2766,35 @@ static enum runloop_state runloop_check_state( if (new_button_state && !old_button_state) { - if (input_nonblock_state) + if (input_nonblock_state){ input_driver_unset_nonblock_state(); - else + runloop_fastmotion = false; + } + else { input_driver_set_nonblock_state(); + runloop_fastmotion = true; + } driver_set_nonblock_state(); } else if (old_hold_button_state != new_hold_button_state) { - if (new_hold_button_state) + if (new_hold_button_state) { input_driver_set_nonblock_state(); - else + runloop_fastmotion = true; + } + else { input_driver_unset_nonblock_state(); + runloop_fastmotion = false; + } driver_set_nonblock_state(); } + // Display the fast forward state to the user, if needed. + if (runloop_fastmotion) { + runloop_msg_queue_push( + msg_hash_to_str(MSG_FAST_FORWARD), 2, 15, true); + } + old_button_state = new_button_state; old_hold_button_state = new_hold_button_state; } @@ -3130,7 +3145,6 @@ int runloop_iterate(unsigned *sleep_ms) if (settings->floats.fastforward_ratio) end: { - retro_time_t to_sleep_ms = ( (frame_limit_last_time + frame_limit_minimum_time) - cpu_features_get_time_usec()) / 1000; From 5a990841dc0753b6a3a218d345dad72ea6cf424b Mon Sep 17 00:00:00 2001 From: Rob Loach Date: Sat, 18 Nov 2017 11:05:38 -0500 Subject: [PATCH 031/177] Fix priority and timing of FPS and Fast Forward messages --- gfx/video_driver.c | 3 ++- retroarch.c | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/gfx/video_driver.c b/gfx/video_driver.c index 24dbe8525a..d9dd3ce7c4 100644 --- a/gfx/video_driver.c +++ b/gfx/video_driver.c @@ -2407,8 +2407,9 @@ void video_driver_frame(const void *data, unsigned width, video_driver_frame_count++; + // Display the FPS, with a higher priority. if (video_info.fps_show) - runloop_msg_queue_push(video_info.fps_text, 1, 1, false); + runloop_msg_queue_push(video_info.fps_text, 2, 1, true); } void video_driver_display_type_set(enum rarch_display_type type) diff --git a/retroarch.c b/retroarch.c index da76e37c3c..fe26822e14 100644 --- a/retroarch.c +++ b/retroarch.c @@ -2792,7 +2792,7 @@ static enum runloop_state runloop_check_state( // Display the fast forward state to the user, if needed. if (runloop_fastmotion) { runloop_msg_queue_push( - msg_hash_to_str(MSG_FAST_FORWARD), 2, 15, true); + msg_hash_to_str(MSG_FAST_FORWARD), 1, 1, false); } old_button_state = new_button_state; From b73a8750e4086918aefec0e0f3a81e2630d5344c Mon Sep 17 00:00:00 2001 From: Rob Loach Date: Sat, 18 Nov 2017 11:08:11 -0500 Subject: [PATCH 032/177] Fix coding style for fast forward message --- retroarch.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/retroarch.c b/retroarch.c index fe26822e14..307524775b 100644 --- a/retroarch.c +++ b/retroarch.c @@ -2766,7 +2766,7 @@ static enum runloop_state runloop_check_state( if (new_button_state && !old_button_state) { - if (input_nonblock_state){ + if (input_nonblock_state) { input_driver_unset_nonblock_state(); runloop_fastmotion = false; } From 8b360c90721f21eb32d122ccbf2d0944a97f4cf0 Mon Sep 17 00:00:00 2001 From: Rob Loach Date: Sat, 18 Nov 2017 11:54:24 -0500 Subject: [PATCH 033/177] Fix Slow Motion message timing and priority --- retroarch.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/retroarch.c b/retroarch.c index 307524775b..74fdac1479 100644 --- a/retroarch.c +++ b/retroarch.c @@ -2898,10 +2898,10 @@ static enum runloop_state runloop_check_state( if (state_manager_frame_is_reversed()) runloop_msg_queue_push( - msg_hash_to_str(MSG_SLOW_MOTION_REWIND), 2, 30, true); + msg_hash_to_str(MSG_SLOW_MOTION_REWIND), 1, 1, false); else runloop_msg_queue_push( - msg_hash_to_str(MSG_SLOW_MOTION), 2, 30, true); + msg_hash_to_str(MSG_SLOW_MOTION), 1, 1, false); } } From 6eb18ed03f34653b96b9a0e9c6e368d0534739ec Mon Sep 17 00:00:00 2001 From: Rob Loach Date: Sat, 18 Nov 2017 12:40:46 -0500 Subject: [PATCH 034/177] Fix some Cheevos free() memory calls --- cheevos/cheevos.c | 66 +++++++++++++++++++++++++++++------------------ 1 file changed, 41 insertions(+), 25 deletions(-) diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c index c373663af5..ea49f9af69 100644 --- a/cheevos/cheevos.c +++ b/cheevos/cheevos.c @@ -884,7 +884,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*) @@ -918,7 +918,7 @@ static int cheevos_parse_condition(cheevos_condition_t *condition, const char* m if ((void*)condset->conds) free((void*)condset->conds); } - + return -1; } @@ -939,12 +939,16 @@ static void cheevos_free_condition(cheevos_condition_t* condition) { for (i = 0; i < condition->count; i++) { - if ((void*)condition->condsets[i].conds) - free((void*)condition->condsets[i].conds); + if (condition->condsets[i].conds) { + free(condition->condsets[i].conds); + condition->condsets[i].conds = NULL; + } } - if ((void*)condition->condsets) - free((void*)condition->condsets); + if (condition->condsets) { + free(condition->condsets); + condition->condsets = NULL; + } } } @@ -995,14 +999,16 @@ 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 { - if ((void*)expr->terms) - free((void*)expr->terms); + if (expr->terms) { + free(expr->terms); + expr->terms = NULL; + } return -1; } } @@ -1078,8 +1084,10 @@ error: cheevos_free_condition(&lb->start); cheevos_free_condition(&lb->cancel); cheevos_free_condition(&lb->submit); - if ((void*)lb->value.terms) + if (lb->value.terms) { free((void*)lb->value.terms); + lb->value.terms = NULL; + } return -1; } @@ -1137,14 +1145,22 @@ static int cheevos_new_cheevo(cheevos_readud_t *ud) return 0; error: - if ((void*)cheevo->title) + if (cheevo->title) { free((void*)cheevo->title); - if ((void*)cheevo->description) + cheevo->title = NULL; + } + if (cheevo->description) { free((void*)cheevo->description); - if ((void*)cheevo->author) + cheevo->description = NULL; + } + if (cheevo->author) { free((void*)cheevo->author); - if ((void*)cheevo->badge) + cheevo->author = NULL; + } + if (cheevo->badge) { free((void*)cheevo->badge); + cheevo->badge = NULL; + } return -1; } @@ -1946,7 +1962,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)) @@ -1980,19 +1996,19 @@ Free the loaded achievements. static void cheevos_free_condset(const cheevos_condset_t *set) { - if ((void*)set->conds) + if (set->conds) free((void*)set->conds); } static void cheevos_free_cheevo(const cheevo_t *cheevo) { - if ((void*)cheevo->title) + if (cheevo->title) free((void*)cheevo->title); - if ((void*)cheevo->description) + if (cheevo->description) free((void*)cheevo->description); - if ((void*)cheevo->author) + if (cheevo->author) free((void*)cheevo->author); - if ((void*)cheevo->badge) + if (cheevo->badge) free((void*)cheevo->badge); cheevos_free_condset(cheevo->condition.condsets); } @@ -2005,7 +2021,7 @@ static void cheevos_free_cheevo_set(const cheevoset_t *set) while (cheevo < end) cheevos_free_cheevo(cheevo++); - if ((void*)set->cheevos) + if (set->cheevos) free((void*)set->cheevos); } @@ -2893,7 +2909,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; @@ -3215,7 +3231,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); @@ -3308,7 +3324,7 @@ 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"); - + if ((void*)CHEEVOS_VAR_JSON) free((void*)CHEEVOS_VAR_JSON); } @@ -3337,7 +3353,7 @@ 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"); - + if ((void*)CHEEVOS_VAR_JSON) free((void*)CHEEVOS_VAR_JSON); } From c89ed117b675e6ee93a4eb94a096d43c61e108fc Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 18 Nov 2017 19:11:14 +0100 Subject: [PATCH 035/177] Style nits --- cheevos/cheevos.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c index ea49f9af69..d04aafaf16 100644 --- a/cheevos/cheevos.c +++ b/cheevos/cheevos.c @@ -939,13 +939,15 @@ static void cheevos_free_condition(cheevos_condition_t* condition) { for (i = 0; i < condition->count; i++) { - if (condition->condsets[i].conds) { + if (condition->condsets[i].conds) + { free(condition->condsets[i].conds); condition->condsets[i].conds = NULL; } } - if (condition->condsets) { + if (condition->condsets) + { free(condition->condsets); condition->condsets = NULL; } @@ -1005,7 +1007,8 @@ static int cheevos_parse_expression(cheevos_expr_t *expr, const char* mem) /* invalid character in expression */ else { - if (expr->terms) { + if (expr->terms) + { free(expr->terms); expr->terms = NULL; } @@ -1084,7 +1087,8 @@ error: cheevos_free_condition(&lb->start); cheevos_free_condition(&lb->cancel); cheevos_free_condition(&lb->submit); - if (lb->value.terms) { + if (lb->value.terms) + { free((void*)lb->value.terms); lb->value.terms = NULL; } @@ -1145,19 +1149,23 @@ static int cheevos_new_cheevo(cheevos_readud_t *ud) return 0; error: - if (cheevo->title) { + if (cheevo->title) + { free((void*)cheevo->title); cheevo->title = NULL; } - if (cheevo->description) { + if (cheevo->description) + { free((void*)cheevo->description); cheevo->description = NULL; } - if (cheevo->author) { + if (cheevo->author) + { free((void*)cheevo->author); cheevo->author = NULL; } - if (cheevo->badge) { + if (cheevo->badge) + { free((void*)cheevo->badge); cheevo->badge = NULL; } From 6dc32ffe172f8c0b942f967ea2d4d14c997c0b82 Mon Sep 17 00:00:00 2001 From: orbea Date: Fri, 17 Nov 2017 19:08:36 -0800 Subject: [PATCH 036/177] qb: Don't set IFS. --- qb/qb.params.sh | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/qb/qb.params.sh b/qb/qb.params.sh index c2ed9592fd..4d79d9e177 100644 --- a/qb/qb.params.sh +++ b/qb/qb.params.sh @@ -40,8 +40,11 @@ EOF echo "" echo "Custom options:" - while IFS='=#' read -r VAR VAL COMMENT; do - VAR=$(echo "${VAR##HAVE_}" | tr '[:upper:]' '[:lower:]') + while read -r VAR COMMENT; do + TMPVAR="${VAR%=*}" + COMMENT="${COMMENT#*#}" + VAL="${VAR#*=}" + VAR="$(echo "${TMPVAR#HAVE_}" | tr '[:upper:]' '[:lower:]')" case "$VAR" in 'c89_'*) continue;; *) @@ -69,9 +72,12 @@ opt_exists() # $opt is returned if exists in OPTS } parse_input() # Parse stuff :V -{ OPTS=; while IFS='=' read -r VAR _; do OPTS="$OPTS ${VAR##HAVE_}"; done < 'qb/config.params.sh' -#OPTS contains all available options in config.params.sh - used to speedup -#things in opt_exists() +{ OPTS=; while read -r VAR _; do + TMPVAR="${VAR%=*}" + OPTS="$OPTS ${TMPVAR##HAVE_}" + done < 'qb/config.params.sh' + #OPTS contains all available options in config.params.sh - used to speedup + #things in opt_exists() while [ "$1" ]; do case "$1" in From 0114c7b0c49a6ea3637b5dd2bd4abf0395b84116 Mon Sep 17 00:00:00 2001 From: orbea Date: Sat, 18 Nov 2017 15:03:44 -0800 Subject: [PATCH 037/177] qb: Add some safe defaults. --- qb/qb.system.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/qb/qb.system.sh b/qb/qb.system.sh index 0589126905..45541ea1e4 100644 --- a/qb/qb.system.sh +++ b/qb/qb.system.sh @@ -1,3 +1,7 @@ +IFS=' +' +\unalias -a 2>/dev/null +PATH="$(command -p getconf PATH):$PATH" if [ -n "$CROSS_COMPILE" ]; then case "$CROSS_COMPILE" in @@ -26,4 +30,3 @@ if [ -e /etc/lsb-release ]; then fi echo "Checking operating system ... $OS ${DISTRO}" - From 149469515fc3c8c4a052230c2890b63031925c93 Mon Sep 17 00:00:00 2001 From: radius Date: Sat, 18 Nov 2017 22:43:47 -0500 Subject: [PATCH 038/177] Fix lan rooms Squashed commit of the following: commit 6e1fea3b16bb330ed2862eb00d2e911221c48a34 Author: radius Date: Sat Nov 18 22:16:02 2017 -0500 use the baked in address instead of sockaddr commit 84f2d389fd6352b3037f48c18d133d2f1063d461 Author: radius Date: Sat Nov 18 22:05:57 2017 -0500 send replies commit c6733009cc5a25e58391c5fc693b277ea27404b3 Author: radius Date: Sat Nov 18 21:53:12 2017 -0500 send replies commit a6816c9481f7ea89a3c97597233e54c6354716e7 Author: radius Date: Sat Nov 18 21:46:55 2017 -0500 send replies commit c2453b73ccafbd53192507affbc11d5f279c2e7c Author: radius Date: Sat Nov 18 21:26:34 2017 -0500 look for common interfaces commit fb42e6470242689f5e6160149ef91f0f0abf068d Author: radius Date: Sat Nov 18 20:06:50 2017 -0500 send broadcasts in all interfaces commit b7730596df9775fb815007689e9c7cc06b317b03 Author: radius Date: Sat Nov 18 20:00:17 2017 -0500 send broadcasts in all interfaces commit b620a78052d1b95e81d346f3e5efb233e0547793 Author: radius Date: Sat Nov 18 14:30:31 2017 -0500 add more logging commit c016c7d559cd631172a58f99cd3e1a1365965b8e Author: radius Date: Sat Nov 18 14:12:03 2017 -0500 update log messages commit 0a49ba61f56f2ca483fa76c7a04f0709c68b95ad Author: radius Date: Sat Nov 18 13:50:47 2017 -0500 fix lan room listing for rooms > 1, allow connecting in arbitrary ports --- menu/cbs/menu_cbs_ok.c | 33 +++--- network/netplay/netplay_discovery.c | 159 ++++++++++++++++++++-------- network/netplay/netplay_discovery.h | 3 + 3 files changed, 129 insertions(+), 66 deletions(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 00725f6909..69e37f8d3e 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -3735,8 +3735,8 @@ static void netplay_refresh_rooms_cb(void *task_data, void *user_data, const cha else { char s[PATH_MAX_LENGTH]; - int i = 0; - int k = 0; + unsigned i = 0; + unsigned j = 0; file_list_t *file_list = menu_entries_get_selection_buf_ptr(0); netplay_discovery_driver_ctl(RARCH_NETPLAY_DISCOVERY_CTL_LAN_GET_RESPONSES, &lan_hosts); @@ -3760,34 +3760,23 @@ static void netplay_refresh_rooms_cb(void *task_data, void *user_data, const cha for (i = 0; i < netplay_room_count; i++) memcpy(&netplay_room_list[i], netplay_room_get(i), sizeof(netplay_room_list[i])); + + if (lan_room_count != 0) { struct netplay_host *host = NULL; - for (host = &lan_hosts->hosts[k]; i < netplay_room_count + lan_room_count; i++) + for (j = 0; i < netplay_room_count + lan_room_count; i++) { - struct sockaddr *address = NULL; + struct netplay_host *host = NULL; + host = &lan_hosts->hosts[j]; + strlcpy(netplay_room_list[i].nickname, host->nick, sizeof(netplay_room_list[i].nickname)); - address = &host->addr; - - if (address->sa_family == AF_INET) - { - struct sockaddr_in *sin = (struct sockaddr_in *) address; - inet_ntop_compat(AF_INET, &sin->sin_addr, - netplay_room_list[i].address, INET6_ADDRSTRLEN); - } -#if defined(AF_INET6) && !defined(HAVE_SOCKET_LEGACY) - else if (address->sa_family == AF_INET6) - { - struct sockaddr_in6 *sin = (struct sockaddr_in6 *) address; - inet_ntop_compat(AF_INET6, &sin->sin6_addr, - netplay_room_list[i].address, INET6_ADDRSTRLEN); - } -#endif + strlcpy(netplay_room_list[i].address, host->address, INET6_ADDRSTRLEN); strlcpy(netplay_room_list[i].corename, host->core, @@ -3802,7 +3791,7 @@ static void netplay_refresh_rooms_cb(void *task_data, void *user_data, const cha host->content, sizeof(netplay_room_list[i].gamename)); - netplay_room_list[i].port = 55435; + netplay_room_list[i].port = host->port; netplay_room_list[i].gamecrc = host->content_crc; netplay_room_list[i].timestamp = 0; netplay_room_list[i].lan = true; @@ -3810,8 +3799,10 @@ static void netplay_refresh_rooms_cb(void *task_data, void *user_data, const cha snprintf(s, sizeof(s), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME), netplay_room_list[i].nickname); + j++; } netplay_room_count += lan_room_count; + } netplay_refresh_rooms_menu(file_list); } diff --git a/network/netplay/netplay_discovery.c b/network/netplay/netplay_discovery.c index e3ad842842..4db7177b45 100644 --- a/network/netplay/netplay_discovery.c +++ b/network/netplay/netplay_discovery.c @@ -60,6 +60,7 @@ struct ad_packet uint32_t header; uint32_t protocol_version; uint32_t port; + char address[NETPLAY_HOST_STR_LEN]; char retroarch_version[NETPLAY_HOST_STR_LEN]; char nick[NETPLAY_HOST_STR_LEN]; char core[NETPLAY_HOST_STR_LEN]; @@ -90,6 +91,7 @@ bool init_netplay_discovery(void) { struct addrinfo *addr = NULL; int fd = socket_init((void **) &addr, 0, NULL, SOCKET_TYPE_DATAGRAM); + char s[NETPLAY_HOST_STR_LEN]; if (fd < 0) goto error; @@ -100,6 +102,9 @@ bool init_netplay_discovery(void) goto error; } + inet_ntop_compat(AF_INET, &((struct sockaddr_in *)addr->ai_addr)->sin_addr, + s, INET6_ADDRSTRLEN); + RARCH_WARN("[discovery] Initialized discovery on %s\n", s); lan_ad_client_fd = fd; freeaddrinfo_retro(addr); return true; @@ -107,7 +112,7 @@ bool init_netplay_discovery(void) error: if (addr) freeaddrinfo_retro(addr); - RARCH_ERR("Failed to initialize netplay advertisement client socket.\n"); + RARCH_ERR("[discovery] Failed to initialize netplay advertisement client socket.\n"); return false; } @@ -136,6 +141,11 @@ bool netplay_discovery_driver_ctl(enum rarch_netplay_discovery_ctl_state state, struct addrinfo hints = {0}, *addr; int canBroadcast = 1; + net_ifinfo_t interfaces; + + if (!net_ifinfo_new(&interfaces)) + return false; + /* Get the broadcast address (IPv4 only for now) */ snprintf(port_str, 6, "%hu", (unsigned short) RARCH_DEFAULT_PORT); if (getaddrinfo_retro("255.255.255.255", port_str, &hints, &addr) < 0) @@ -145,20 +155,27 @@ bool netplay_discovery_driver_ctl(enum rarch_netplay_discovery_ctl_state state, #if defined(SOL_SOCKET) && defined(SO_BROADCAST) if (setsockopt(lan_ad_client_fd, SOL_SOCKET, SO_BROADCAST, (const char *)&canBroadcast, sizeof(canBroadcast)) < 0) - RARCH_WARN("Failed to set netplay discovery port to broadcast.\n"); + RARCH_WARN("[discovery] Failed to set netplay discovery port to broadcast.\n"); #endif /* Put together the request */ memcpy((void *) &ad_packet_buffer, "RANQ", 4); ad_packet_buffer.protocol_version = htonl(NETPLAY_PROTOCOL_VERSION); - /* And send it off */ - if (sendto(lan_ad_client_fd, (const char *) &ad_packet_buffer, - 2*sizeof(uint32_t), 0, addr->ai_addr, addr->ai_addrlen) < - (ssize_t) (2*sizeof(uint32_t))) - RARCH_WARN("Failed to send netplay discovery response.\n"); + for (int k = 0; k < interfaces.size; k++) + { + strlcpy(ad_packet_buffer.address, interfaces.entries[k].host, + NETPLAY_HOST_STR_LEN); + /* And send it off */ + if (sendto(lan_ad_client_fd, (const char *) &ad_packet_buffer, + 2*sizeof(uint32_t) + NETPLAY_HOST_STR_LEN, 0, addr->ai_addr, addr->ai_addrlen) < + (ssize_t) (2*sizeof(uint32_t))) + RARCH_WARN("[discovery] Failed to send netplay discovery response.\n"); + } freeaddrinfo_retro(addr); + net_ifinfo_free(&interfaces); + break; } @@ -201,7 +218,7 @@ static bool init_lan_ad_server_socket(netplay_t *netplay, uint16_t port) error: if (addr) freeaddrinfo_retro(addr); - RARCH_ERR("Failed to initialize netplay advertisement socket.\n"); + RARCH_ERR("[discovery] Failed to initialize netplay advertisement socket.\n"); return false; } @@ -217,9 +234,13 @@ bool netplay_lan_ad_server(netplay_t *netplay) struct sockaddr their_addr; socklen_t addr_size; rarch_system_info_t *info = NULL; + int ret; + char reply_addr[NETPLAY_HOST_STR_LEN]; + char our_addr[NETPLAY_HOST_STR_LEN]; if (lan_ad_server_fd < 0 && !init_lan_ad_server_socket(netplay, RARCH_DEFAULT_PORT)) return false; + /* Check for any ad queries */ while (1) @@ -234,57 +255,102 @@ bool netplay_lan_ad_server(netplay_t *netplay) /* Somebody queried, so check that it's valid */ addr_size = sizeof(their_addr); - if (recvfrom(lan_ad_server_fd, (char*)&ad_packet_buffer, - sizeof(struct ad_packet), 0, &their_addr, &addr_size) >= - (ssize_t) (2*sizeof(uint32_t))) + ret = recvfrom(lan_ad_server_fd, (char*)&ad_packet_buffer, + sizeof(struct ad_packet), 0, &their_addr, &addr_size); + if (ret >= (ssize_t) (2 * sizeof(uint32_t))) { char s[NETPLAY_HOST_STR_LEN]; uint32_t content_crc = 0; /* Make sure it's a valid query */ if (memcmp((void *) &ad_packet_buffer, "RANQ", 4)) + { + RARCH_LOG("[discovery] invalid query\n"); continue; + } /* For this version */ if (ntohl(ad_packet_buffer.protocol_version) != NETPLAY_PROTOCOL_VERSION) - continue; - - info = runloop_get_system_info(); - - /* Now build our response */ - content_crc = content_get_crc(); - - memset(&ad_packet_buffer, 0, sizeof(struct ad_packet)); - memcpy(&ad_packet_buffer, "RANS", 4); - - ad_packet_buffer.protocol_version = - htonl(NETPLAY_PROTOCOL_VERSION); - ad_packet_buffer.port = htonl(netplay->tcp_port); - strlcpy(ad_packet_buffer.retroarch_version, PACKAGE_VERSION, - NETPLAY_HOST_STR_LEN); - strlcpy(ad_packet_buffer.content, !string_is_empty( - path_basename(path_get(RARCH_PATH_BASENAME))) - ? path_basename(path_get(RARCH_PATH_BASENAME)) : "N/A", - NETPLAY_HOST_LONGSTR_LEN); - strlcpy(ad_packet_buffer.nick, netplay->nick, NETPLAY_HOST_STR_LEN); - - if (info) { - strlcpy(ad_packet_buffer.core, info->info.library_name, - NETPLAY_HOST_STR_LEN); - strlcpy(ad_packet_buffer.core_version, info->info.library_version, - NETPLAY_HOST_STR_LEN); + RARCH_LOG("[discovery] invalid protocol version\n"); + continue; } - snprintf(s, sizeof(s), "%d", content_crc); - strlcpy(ad_packet_buffer.content_crc, s, - NETPLAY_HOST_STR_LEN); + strlcpy(reply_addr, ad_packet_buffer.address, NETPLAY_HOST_STR_LEN); - /* And send it */ - sendto(lan_ad_server_fd, (const char*)&ad_packet_buffer, - sizeof(struct ad_packet), 0, &their_addr, addr_size); + net_ifinfo_t interfaces; + + if (!net_ifinfo_new(&interfaces)) + return false; + + for (int k = 0; k < interfaces.size; k++) + { + char *p; + char sub[NETPLAY_HOST_STR_LEN]; + + p=strrchr(reply_addr,'.'); + if (p) + { + strlcpy(sub, reply_addr, p - reply_addr + 1); + if (strstr(interfaces.entries[k].host, sub) && !strstr(interfaces.entries[k].host, "127.0.0.1")) + { + RARCH_LOG ("[discovery] query received on common interface: %s/%s (theirs / ours) \n", reply_addr, interfaces.entries[k].host); + + info = runloop_get_system_info(); + + /* Now build our response */ + content_crc = content_get_crc(); + + memset(&ad_packet_buffer, 0, sizeof(struct ad_packet)); + memcpy(&ad_packet_buffer, "RANS", 4); + + strlcpy(ad_packet_buffer.address, interfaces.entries[k].host, + NETPLAY_HOST_STR_LEN); + ad_packet_buffer.protocol_version = + htonl(NETPLAY_PROTOCOL_VERSION); + ad_packet_buffer.port = htonl(netplay->tcp_port); + strlcpy(ad_packet_buffer.retroarch_version, PACKAGE_VERSION, + NETPLAY_HOST_STR_LEN); + strlcpy(ad_packet_buffer.content, !string_is_empty( + path_basename(path_get(RARCH_PATH_BASENAME))) + ? path_basename(path_get(RARCH_PATH_BASENAME)) : "N/A", + NETPLAY_HOST_LONGSTR_LEN); + strlcpy(ad_packet_buffer.nick, netplay->nick, NETPLAY_HOST_STR_LEN); + + if (info) + { + strlcpy(ad_packet_buffer.core, info->info.library_name, + NETPLAY_HOST_STR_LEN); + strlcpy(ad_packet_buffer.core_version, info->info.library_version, + NETPLAY_HOST_STR_LEN); + } + + snprintf(s, sizeof(s), "%d", content_crc); + strlcpy(ad_packet_buffer.content_crc, s, + NETPLAY_HOST_STR_LEN); + + /* Build up the destination address*/ + struct addrinfo hints = {0}, *addr; + char port_str[6]; + + snprintf(port_str, 6, "%hu", ntohs(((struct sockaddr_in*)(&their_addr))->sin_port)); + if (getaddrinfo_retro(reply_addr, port_str, &hints, &addr) < 0) + continue; + 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, addr->ai_addr, addr_size); + } + else + continue; + } + else + continue; + } } + } return true; @@ -350,7 +416,7 @@ static bool netplay_lan_ad_client(void) { struct sockaddr_in *sin = NULL; - RARCH_WARN ("[lobby] using IPv4 for discovery\n"); + RARCH_WARN ("[discovery] using IPv4 for discovery\n"); sin = (struct sockaddr_in *) &their_addr; sin->sin_port = htons(ntohl(ad_packet_buffer.port)); @@ -359,7 +425,7 @@ static bool netplay_lan_ad_client(void) else if (their_addr.sa_family == AF_INET6) { struct sockaddr_in6 *sin6 = NULL; - RARCH_WARN ("[lobby] using IPv6 for discovery\n"); + RARCH_WARN ("[discovery] using IPv6 for discovery\n"); sin6 = (struct sockaddr_in6 *) &their_addr; sin6->sin6_port = htons(ad_packet_buffer.port); @@ -402,6 +468,9 @@ static bool netplay_lan_ad_client(void) host->addr = their_addr; host->addrlen = addr_size; + host->port = ntohl(ad_packet_buffer.port); + + strlcpy(host->address, ad_packet_buffer.address, NETPLAY_HOST_STR_LEN); strlcpy(host->nick, ad_packet_buffer.nick, NETPLAY_HOST_STR_LEN); strlcpy(host->core, ad_packet_buffer.core, NETPLAY_HOST_STR_LEN); strlcpy(host->retroarch_version, ad_packet_buffer.retroarch_version, diff --git a/network/netplay/netplay_discovery.h b/network/netplay/netplay_discovery.h index 2260e7d6d6..57bb153f97 100644 --- a/network/netplay/netplay_discovery.h +++ b/network/netplay/netplay_discovery.h @@ -18,6 +18,7 @@ #define __RARCH_NETPLAY_DISCOVERY_H #include +#include #include #define NETPLAY_HOST_STR_LEN 32 @@ -36,12 +37,14 @@ struct netplay_host struct sockaddr addr; socklen_t addrlen; + char address[NETPLAY_HOST_STR_LEN]; char nick[NETPLAY_HOST_STR_LEN]; char core[NETPLAY_HOST_STR_LEN]; char core_version[NETPLAY_HOST_STR_LEN]; char retroarch_version[NETPLAY_HOST_STR_LEN]; char content[NETPLAY_HOST_LONGSTR_LEN]; int content_crc; + int port; }; struct netplay_host_list From 885f5e7ed7111a02ed30b64b2a631629ceae4d63 Mon Sep 17 00:00:00 2001 From: radius Date: Sat, 18 Nov 2017 22:54:38 -0500 Subject: [PATCH 039/177] update Changelog --- CHANGES.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 1871993c80..e4e02ef432 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -33,6 +33,8 @@ - LINUX/PI: Broadcom VC4: Add Videocore config option - LINUX/UDEV: Fix - RetroArch reads keyboard input when not focused with the udev input driver. - NETPLAY: Fix disconnection not fully deinitializing Netplay. +- NETPLAY: Fix lan rooms when there is more than one room +- NETPLAY: Fix lan rooms on systems were all addresses are treated as IPv6 - COMMON: Fix clear/free loop conditionals in playlists. - WINDOWS/GDI: Fix flickering of text. - WINDOWS/GDI: Fix graphics corruption on Windows 98 From efad07e89f6de433a6b0a9f1125d9a7412b892c7 Mon Sep 17 00:00:00 2001 From: Ash Date: Sun, 19 Nov 2017 17:18:03 +1100 Subject: [PATCH 040/177] [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 9b673152f74ee1de073af19d49f2d6f8f1fb7369 Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 19 Nov 2017 09:41:36 -0500 Subject: [PATCH 041/177] fix C89 errors --- CHANGES.md | 2 +- menu/cbs/menu_cbs_ok.c | 3 +- network/netplay/netplay_discovery.c | 43 ++++++++++++++--------------- 3 files changed, 22 insertions(+), 26 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index e4e02ef432..5e9c075ff2 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -34,7 +34,7 @@ - LINUX/UDEV: Fix - RetroArch reads keyboard input when not focused with the udev input driver. - NETPLAY: Fix disconnection not fully deinitializing Netplay. - NETPLAY: Fix lan rooms when there is more than one room -- NETPLAY: Fix lan rooms on systems were all addresses are treated as IPv6 +- NETPLAY: Fix lan rooms on systems where all addresses are treated as IPv6 - COMMON: Fix clear/free loop conditionals in playlists. - WINDOWS/GDI: Fix flickering of text. - WINDOWS/GDI: Fix graphics corruption on Windows 98 diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 69e37f8d3e..78239d5697 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -3769,7 +3769,7 @@ static void netplay_refresh_rooms_cb(void *task_data, void *user_data, const cha for (j = 0; i < netplay_room_count + lan_room_count; i++) { struct netplay_host *host = NULL; - host = &lan_hosts->hosts[j]; + host = &lan_hosts->hosts[j++]; strlcpy(netplay_room_list[i].nickname, @@ -3799,7 +3799,6 @@ static void netplay_refresh_rooms_cb(void *task_data, void *user_data, const cha snprintf(s, sizeof(s), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME), netplay_room_list[i].nickname); - j++; } netplay_room_count += lan_room_count; diff --git a/network/netplay/netplay_discovery.c b/network/netplay/netplay_discovery.c index 4db7177b45..b7aae680b4 100644 --- a/network/netplay/netplay_discovery.c +++ b/network/netplay/netplay_discovery.c @@ -91,7 +91,6 @@ bool init_netplay_discovery(void) { struct addrinfo *addr = NULL; int fd = socket_init((void **) &addr, 0, NULL, SOCKET_TYPE_DATAGRAM); - char s[NETPLAY_HOST_STR_LEN]; if (fd < 0) goto error; @@ -102,9 +101,6 @@ bool init_netplay_discovery(void) goto error; } - inet_ntop_compat(AF_INET, &((struct sockaddr_in *)addr->ai_addr)->sin_addr, - s, INET6_ADDRSTRLEN); - RARCH_WARN("[discovery] Initialized discovery on %s\n", s); lan_ad_client_fd = fd; freeaddrinfo_retro(addr); return true; @@ -130,6 +126,8 @@ void deinit_netplay_discovery(void) bool netplay_discovery_driver_ctl(enum rarch_netplay_discovery_ctl_state state, void *data) { char port_str[6]; + int k = 0; + int ret; if (lan_ad_client_fd < 0) return false; @@ -155,22 +153,23 @@ bool netplay_discovery_driver_ctl(enum rarch_netplay_discovery_ctl_state state, #if defined(SOL_SOCKET) && defined(SO_BROADCAST) if (setsockopt(lan_ad_client_fd, SOL_SOCKET, SO_BROADCAST, (const char *)&canBroadcast, sizeof(canBroadcast)) < 0) - RARCH_WARN("[discovery] Failed to set netplay discovery port to broadcast.\n"); + RARCH_WARN("[discovery] Failed to set netplay discovery port to broadcast\n"); #endif /* Put together the request */ memcpy((void *) &ad_packet_buffer, "RANQ", 4); ad_packet_buffer.protocol_version = htonl(NETPLAY_PROTOCOL_VERSION); - for (int k = 0; k < interfaces.size; k++) + for (k=0; k < interfaces.size; k++) { strlcpy(ad_packet_buffer.address, interfaces.entries[k].host, NETPLAY_HOST_STR_LEN); + /* And send it off */ - if (sendto(lan_ad_client_fd, (const char *) &ad_packet_buffer, - 2*sizeof(uint32_t) + NETPLAY_HOST_STR_LEN, 0, addr->ai_addr, addr->ai_addrlen) < - (ssize_t) (2*sizeof(uint32_t))) - RARCH_WARN("[discovery] Failed to send netplay discovery response.\n"); + ret = sendto(lan_ad_client_fd, (const char *) &ad_packet_buffer, + 2*sizeof(uint32_t) + NETPLAY_HOST_STR_LEN, 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); } freeaddrinfo_retro(addr); @@ -218,7 +217,7 @@ static bool init_lan_ad_server_socket(netplay_t *netplay, uint16_t port) error: if (addr) freeaddrinfo_retro(addr); - RARCH_ERR("[discovery] Failed to initialize netplay advertisement socket.\n"); + RARCH_ERR("[discovery] Failed to initialize netplay advertisement socket\n"); return false; } @@ -234,14 +233,13 @@ bool netplay_lan_ad_server(netplay_t *netplay) struct sockaddr their_addr; socklen_t addr_size; rarch_system_info_t *info = NULL; - int ret; - char reply_addr[NETPLAY_HOST_STR_LEN]; - char our_addr[NETPLAY_HOST_STR_LEN]; + int ret, k = 0; + char reply_addr[NETPLAY_HOST_STR_LEN], port_str[6]; + struct addrinfo *our_addr, hints = {0}; if (lan_ad_server_fd < 0 && !init_lan_ad_server_socket(netplay, RARCH_DEFAULT_PORT)) return false; - /* Check for any ad queries */ while (1) { @@ -284,7 +282,7 @@ bool netplay_lan_ad_server(netplay_t *netplay) if (!net_ifinfo_new(&interfaces)) return false; - for (int k = 0; k < interfaces.size; k++) + for (k = 0; k < interfaces.size; k++) { char *p; char sub[NETPLAY_HOST_STR_LEN]; @@ -293,9 +291,11 @@ bool netplay_lan_ad_server(netplay_t *netplay) if (p) { strlcpy(sub, reply_addr, p - reply_addr + 1); - if (strstr(interfaces.entries[k].host, sub) && !strstr(interfaces.entries[k].host, "127.0.0.1")) + if (strstr(interfaces.entries[k].host, sub) && + !strstr(interfaces.entries[k].host, "127.0.0.1")) { - RARCH_LOG ("[discovery] query received on common interface: %s/%s (theirs / ours) \n", reply_addr, interfaces.entries[k].host); + RARCH_LOG ("[discovery] query received on common interface: %s/%s (theirs / ours) \n", + reply_addr, interfaces.entries[k].host); info = runloop_get_system_info(); @@ -331,17 +331,14 @@ bool netplay_lan_ad_server(netplay_t *netplay) NETPLAY_HOST_STR_LEN); /* Build up the destination address*/ - struct addrinfo hints = {0}, *addr; - char port_str[6]; - snprintf(port_str, 6, "%hu", ntohs(((struct sockaddr_in*)(&their_addr))->sin_port)); - if (getaddrinfo_retro(reply_addr, port_str, &hints, &addr) < 0) + if (getaddrinfo_retro(reply_addr, port_str, &hints, &our_addr) < 0) continue; 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, addr->ai_addr, addr_size); + sizeof(struct ad_packet), 0, our_addr->ai_addr, our_addr->ai_addrlen); } else continue; From 11611acbe437878ebe7d97adf99bfefd70418e38 Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 19 Nov 2017 09:43:51 -0500 Subject: [PATCH 042/177] use correct size here --- 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 b7aae680b4..8f9104251b 100644 --- a/network/netplay/netplay_discovery.c +++ b/network/netplay/netplay_discovery.c @@ -167,7 +167,7 @@ bool netplay_discovery_driver_ctl(enum rarch_netplay_discovery_ctl_state state, /* And send it off */ ret = sendto(lan_ad_client_fd, (const char *) &ad_packet_buffer, - 2*sizeof(uint32_t) + NETPLAY_HOST_STR_LEN, 0, addr->ai_addr, addr->ai_addrlen); + 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); } From b430b772b572e4117d2da6c95878408737f9d0d7 Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 19 Nov 2017 09:54:28 -0500 Subject: [PATCH 043/177] j is initialized as zero already, i should be netplay_room_count --- menu/cbs/menu_cbs_ok.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 78239d5697..1b88e85f9d 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -3766,7 +3766,7 @@ static void netplay_refresh_rooms_cb(void *task_data, void *user_data, const cha { struct netplay_host *host = NULL; - for (j = 0; i < netplay_room_count + lan_room_count; i++) + for (i = netplay_room_count; i < netplay_room_count + lan_room_count; i++) { struct netplay_host *host = NULL; host = &lan_hosts->hosts[j++]; From e9afdb327e61b8c9fcb6af79485ff66b5cd0b947 Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 19 Nov 2017 09:56:20 -0500 Subject: [PATCH 044/177] styling fixes --- menu/cbs/menu_cbs_ok.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 1b88e85f9d..145bcf013c 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -3760,8 +3760,6 @@ static void netplay_refresh_rooms_cb(void *task_data, void *user_data, const cha for (i = 0; i < netplay_room_count; i++) memcpy(&netplay_room_list[i], netplay_room_get(i), sizeof(netplay_room_list[i])); - - if (lan_room_count != 0) { struct netplay_host *host = NULL; @@ -3801,7 +3799,6 @@ static void netplay_refresh_rooms_cb(void *task_data, void *user_data, const cha netplay_room_list[i].nickname); } netplay_room_count += lan_room_count; - } netplay_refresh_rooms_menu(file_list); } From 29289011c2976fec22ec9ba7e5c724ca549dfbfd Mon Sep 17 00:00:00 2001 From: hyarsan <32988993+hyarsan@users.noreply.github.com> Date: Sun, 19 Nov 2017 16:43:53 +0100 Subject: [PATCH 045/177] Translated new "Fast forward." message :) --- intl/msg_hash_nl.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/intl/msg_hash_nl.h b/intl/msg_hash_nl.h index 251c32c283..d414566d66 100644 --- a/intl/msg_hash_nl.h +++ b/intl/msg_hash_nl.h @@ -1568,6 +1568,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, "Pixel") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "RetroActive") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "Dot-Art") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, @@ -2050,6 +2052,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Skipping SRAM load.") MSG_HASH(MSG_SLOW_MOTION, "Slow motion.") +MSG_HASH(MSG_FAST_FORWARD, + "Snel vooruit.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Slow motion rewind.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, From a1539e432ccc7861eb67ad993c1c014488b14d31 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 19 Nov 2017 17:23:00 +0100 Subject: [PATCH 046/177] 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 047/177] 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 048/177] 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 049/177] 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 050/177] 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 051/177] 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 052/177] 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 053/177] 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 4a09dfdb30022b9a022b05999ea39cd5d143c956 Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 19 Nov 2017 16:47:34 -0500 Subject: [PATCH 054/177] 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 055/177] 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 056/177] 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 057/177] 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 058/177] 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 059/177] 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 060/177] 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 061/177] 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 062/177] 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 063/177] 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 064/177] 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 065/177] 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 066/177] 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 067/177] 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 068/177] 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 069/177] 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 070/177] 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 071/177] 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 072/177] 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 073/177] 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 074/177] 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 075/177] 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 076/177] 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 077/177] 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 078/177] 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 079/177] 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 080/177] 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 081/177] 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 082/177] 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 083/177] 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 084/177] 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 085/177] 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 086/177] 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 087/177] 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 088/177] 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 089/177] 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 090/177] (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 091/177] 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 092/177] 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 093/177] 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 094/177] 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 095/177] 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 096/177] 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 097/177] 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 098/177] 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 099/177] 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 100/177] 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 101/177] 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 102/177] 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 103/177] 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 104/177] 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 105/177] 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 106/177] 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 107/177] 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 108/177] 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 109/177] 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 110/177] 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 111/177] 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 112/177] 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 113/177] 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 114/177] 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 115/177] 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 116/177] 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 117/177] 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 118/177] 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 119/177] 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 120/177] 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 121/177] 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 122/177] 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 123/177] 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 892c6b864a6290f010cd7984c9e004f579bb3199 Mon Sep 17 00:00:00 2001 From: orbea Date: Fri, 24 Nov 2017 09:57:07 -0800 Subject: [PATCH 124/177] 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 125/177] 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 126/177] 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 127/177] 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 128/177] 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 129/177] 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 130/177] 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 131/177] 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 132/177] 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 133/177] 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 134/177] 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 135/177] 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 136/177] 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 137/177] 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 138/177] 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 139/177] 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 140/177] 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 141/177] 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 142/177] 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 143/177] 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 144/177] 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 145/177] 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 146/177] 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 147/177] 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 148/177] 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 149/177] 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 150/177] 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 151/177] 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 152/177] 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 153/177] 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 154/177] 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 155/177] 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 156/177] 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 157/177] 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 158/177] 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 159/177] 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 160/177] 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 161/177] 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 162/177] 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 163/177] 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 164/177] 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 165/177] 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 166/177] 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 167/177] 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 168/177] 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 169/177] 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 170/177] 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 171/177] 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 172/177] 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 173/177] 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 174/177] 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 175/177] 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 176/177] 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 177/177] 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;