diff --git a/.gitignore b/.gitignore index 1a100e9fea..ad6ea6ab19 100644 --- a/.gitignore +++ b/.gitignore @@ -95,8 +95,6 @@ pkg/apple/iOS/modules/ obj-unix/ .vagrant/ -.MAKEFILE_DEFINES -.CONFIG_DEFINES /pkg/msvc/Release Cg/*.exe /pkg/msvc/Release Cg/*.iobj /pkg/msvc/Release Cg/*.ipdb diff --git a/CHANGES.md b/CHANGES.md index 5e9c075ff2..17bb6ec41b 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,4 +1,9 @@ -# 1.6.9 (future) +# 1.7.0 (future) +- CHEEVOS: Add badges + +# 1.6.9 +- COMMON: Small memory leak. +- NETPLAY: Fix network command only working once. # 1.6.8 - Audio: Fix the Audio DSP picker @@ -51,6 +56,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. 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),) diff --git a/Makefile.common b/Makefile.common index 95012320df..ace2a5c4a6 100644 --- a/Makefile.common +++ b/Makefile.common @@ -184,6 +184,10 @@ 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 \ file_path_str.o \ @@ -318,7 +322,7 @@ endif endif ifeq ($(HAVE_SSA),1) -LIBS += -lass +LIBS += $(SSA_LIBS) endif # LibretroDB @@ -597,7 +601,7 @@ ifeq ($(HAVE_AL), 1) ifeq ($(OSX),1) LIBS += -framework OpenAL else - LIBS += -lopenal + LIBS += $(AL_LIBS) endif endif @@ -808,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 @@ -1062,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 @@ -1476,6 +1480,7 @@ ifeq ($(HAVE_NETWORKING), 1) OBJ += cheevos/cheevos.o \ cheevos/var.o \ cheevos/cond.o \ + cheevos/badges.o \ $(LIBRETRO_COMM_DIR)/utils/md5.o endif @@ -1507,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 diff --git a/Makefile.ctr b/Makefile.ctr index 308c5bf62f..c277d3df77 100644 --- a/Makefile.ctr +++ b/Makefile.ctr @@ -14,16 +14,16 @@ APP_DESCRIPTION = Retroarch 3DS APP_AUTHOR = Team Libretro APP_PRODUCT_CODE = RETROARCH-3DS APP_UNIQUE_ID = 0xBAC00 -APP_ICON = ctr/assets/default.png -APP_BANNER = ctr/assets/libretro_banner.png -APP_AUDIO = ctr/assets/silent.wav -APP_RSF = ctr/tools/template.rsf +APP_ICON = pkg/ctr/assets/default.png +APP_BANNER = pkg/ctr/assets/libretro_banner.png +APP_AUDIO = pkg/ctr/assets/silent.wav +APP_RSF = pkg/ctr/tools/template.rsf APP_SYSTEM_MODE = 64MB APP_SYSTEM_MODE_EXT = 124MB APP_BIG_TEXT_SECTION = 0 APP_USE_SVCHAX = 0 -include ctr/Makefile.cores +include pkg/ctr/Makefile.cores OBJ := OBJ += gfx/drivers/ctr_shaders/ctr_sprite.o @@ -190,14 +190,14 @@ NM := $(PREFIX)nm LD := $(CXX) ifneq ($(findstring Linux,$(shell uname -a)),) - MAKEROM = ctr/tools/makerom-linux - BANNERTOOL = ctr/tools/bannertool-linux + MAKEROM = pkg/ctr/tools/makerom-linux + BANNERTOOL = pkg/ctr/tools/bannertool-linux else ifneq ($(findstring Darwin,$(shell uname -a)),) - MAKEROM = ctr/tools/makerom-mac - BANNERTOOL = ctr/tools/bannertool-mac + MAKEROM = pkg/ctr/tools/makerom-mac + BANNERTOOL = pkg/ctr/tools/bannertool-mac else - MAKEROM = ctr/tools/makerom.exe - BANNERTOOL = ctr/tools/bannertool.exe + MAKEROM = pkg/ctr/tools/makerom.exe + BANNERTOOL = pkg/ctr/tools/bannertool.exe endif %.o: %.vsh %.gsh @@ -228,15 +228,15 @@ endif %.vsh: $(TARGET).smdh: $(APP_ICON) - smdhtool --create "$(APP_TITLE)" "$(APP_DESCRIPTION)" "$(APP_AUTHOR)" $(APP_ICON) $@ + $(DEVKITPRO)/devkitARM/bin/smdhtool --create "$(APP_TITLE)" "$(APP_DESCRIPTION)" "$(APP_AUTHOR)" $(APP_ICON) $@ $(TARGET).3dsx: $(TARGET).elf ifeq ($(APP_BIG_TEXT_SECTION), 1) - cp ctr/big_text_section.xml $(TARGET).xml + cp pkg/ctr/big_text_section.xml $(TARGET).xml else rm -f $(TARGET).xml endif - -3dsxtool $< $@ $(_3DSXFLAGS) + $(DEVKITPRO)/devkitARM/bin/3dsxtool $< $@ $(_3DSXFLAGS) $(TARGET).elf: ctr/3dsx_custom_crt0.o $(LD) $(LDFLAGS) $(OBJ) $(LIBDIRS) $(LIBS) -o $@ diff --git a/Makefile.ctr.salamander b/Makefile.ctr.salamander index b53a31ff43..930b5badc7 100644 --- a/Makefile.ctr.salamander +++ b/Makefile.ctr.salamander @@ -11,10 +11,10 @@ APP_DESCRIPTION = Retroarch 3DS APP_AUTHOR = Team Libretro APP_PRODUCT_CODE = RETROARCH-3DS APP_UNIQUE_ID = 0xBAC00 -APP_ICON = ctr/assets/default.png -APP_BANNER = ctr/assets/libretro_banner.png -APP_AUDIO = ctr/assets/silent.wav -APP_RSF = ctr/tools/template.rsf +APP_ICON = pkg/ctr/assets/default.png +APP_BANNER = pkg/ctr/assets/libretro_banner.png +APP_AUDIO = pkg/ctr/assets/silent.wav +APP_RSF = pkg/ctr/tools/template.rsf APP_SYSTEM_MODE = 64MB APP_SYSTEM_MODE_EXT = 124MB @@ -44,7 +44,7 @@ ifeq ($(strip $(DEVKITPRO)),) endif ifeq ($(strip $(CTRULIB)),) - CTRULIB = $(DEVKITPRO)/ctrulib + CTRULIB = $(DEVKITPRO)/libctru endif APP_TITLE := $(shell echo "$(APP_TITLE)" | cut -c1-128) @@ -122,14 +122,14 @@ NM := $(PREFIX)nm LD := $(CXX) ifneq ($(findstring Linux,$(shell uname -a)),) - MAKEROM = ctr/tools/makerom-linux - BANNERTOOL = ctr/tools/bannertool-linux + MAKEROM = pkg/ctr/tools/makerom-linux + BANNERTOOL = pkg/ctr/tools/bannertool-linux else ifneq ($(findstring Darwin,$(shell uname -a)),) - MAKEROM = ctr/tools/makerom-mac - BANNERTOOL = ctr/tools/bannertool-mac + MAKEROM = pkg/ctr/tools/makerom-mac + BANNERTOOL = pkg/ctr/tools/bannertool-mac else - MAKEROM = ctr/tools/makerom.exe - BANNERTOOL = ctr/tools/bannertool.exe + MAKEROM = pkg/ctr/tools/makerom.exe + BANNERTOOL = pkg/ctr/tools/bannertool.exe endif %.o: %.vsh %.gsh @@ -160,11 +160,11 @@ endif %.vsh: $(TARGET).smdh: $(APP_ICON) - smdhtool --create "$(APP_TITLE)" "$(APP_DESCRIPTION)" "$(APP_AUTHOR)" $(APP_ICON) $@ + $(DEVKITPRO)/devkitARM/bin/smdhtool --create "$(APP_TITLE)" "$(APP_DESCRIPTION)" "$(APP_AUTHOR)" $(APP_ICON) $@ $(TARGET).3dsx: $(TARGET).elf ifeq ($(APP_BIG_TEXT_SECTION), 1) - cp ctr/big_text_section.xml $(TARGET).xml + cp pkg/ctr/big_text_section.xml $(TARGET).xml else rm -f $(TARGET).xml endif diff --git a/cheevos/badges.c b/cheevos/badges.c new file mode 100644 index 0000000000..961fbc600e --- /dev/null +++ b/cheevos/badges.c @@ -0,0 +1,54 @@ +#include +#include +#include + +#include "../file_path_special.h" +#include "../configuration.h" +#include "../verbosity.h" +#include "../network/net_http_special.h" + +#include "badges.h" + +badges_ctx_t badges_ctx; + +bool badge_exists(const char* filepath) +{ + if(path_file_exists(filepath)) + return true; + else + return false; +} + +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); + + 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) +{ + 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) +{ + 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 new file mode 100644 index 0000000000..57a8de6ed2 --- /dev/null +++ b/cheevos/badges.h @@ -0,0 +1,29 @@ +#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; + +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 badges_ctx_t badges_ctx; +static badges_ctx_t new_badges_ctx; + +RETRO_END_DECLS + +#endif diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c index d1f392885d..662c8b6dea 100644 --- a/cheevos/cheevos.c +++ b/cheevos/cheevos.c @@ -16,6 +16,8 @@ #include #include +#include +#include #include #include #include @@ -35,10 +37,12 @@ #include "../menu/menu_entries.h" #endif +#include "badges.h" #include "cheevos.h" #include "var.h" #include "cond.h" +#include "../file_path_special.h" #include "../command.h" #include "../dynamic.h" #include "../configuration.h" @@ -76,6 +80,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 @@ -498,6 +505,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); @@ -840,24 +849,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++) { @@ -930,8 +942,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)); @@ -1005,10 +1021,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 (;;) { @@ -1032,8 +1048,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++) { @@ -2098,7 +2112,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; @@ -2111,39 +2125,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)); } } @@ -2155,39 +2160,29 @@ void cheevos_populate_menu(void *data, bool hardcore) for (i = cheevos_locals.core.count; 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)); } } } @@ -2479,37 +2474,47 @@ 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" -#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_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) static int cheevos_iterate(coro_t* coro) { @@ -2530,11 +2535,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[] = @@ -2774,6 +2780,7 @@ static int cheevos_iterate(coro_t* coro) if ((void*)CHEEVOS_VAR_JSON) free((void*)CHEEVOS_VAR_JSON); + cheevos_loaded = true; /* @@ -2790,25 +2797,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 has no achievements.", 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); } if ( cheevos_locals.core.count == 0 @@ -3089,14 +3102,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; @@ -3115,6 +3126,62 @@ 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) + + 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)) + { +#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)) + RARCH_ERR("[CHEEVOS]: error writing badge %s\n", CHEEVOS_VAR_BADGE_PATH); + else + free(CHEEVOS_VAR_JSON); + } + } + } + } + + CORO_RET(); + /************************************************************************** * Info Logs in the user at Retro Achievements *************************************************************************/ @@ -3256,6 +3323,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/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/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; diff --git a/command.c b/command.c index e458b1d640..41f23e6ff7 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 @@ -1101,7 +1102,7 @@ static void command_event_load_auto_state(void) #endif #ifdef HAVE_CHEEVOS - if (settings->bools.cheevos_hardcore_mode_enable) + if (cheevos_loaded && settings->bools.cheevos_hardcore_mode_enable) goto error; #endif @@ -1307,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); @@ -1351,7 +1356,7 @@ static bool command_event_save_auto_state(void) goto error; #ifdef HAVE_CHEEVOS - if (settings->bools.cheevos_hardcore_mode_enable) + if (cheevos_loaded && settings->bools.cheevos_hardcore_mode_enable) goto error; #endif @@ -1373,24 +1378,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)) + { + 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), - path_get(RARCH_PATH_CONFIG)); + 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)); - RARCH_LOG("%s\n", s); - return true; + return false; } /** @@ -1407,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)); @@ -1429,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)); @@ -1442,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, @@ -1489,7 +1505,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); @@ -1685,6 +1702,62 @@ 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 *playlist = (playlist_t*)data; + + if (!playlist) + return; + + if (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, + 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. @@ -1733,18 +1806,25 @@ bool command_event(enum event_command cmd, void *data) { #ifdef HAVE_MENU 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; + rarch_system_info_t *system_info = NULL; + struct retro_system_info *system = NULL; + const char *core_path = NULL; + + path_clear(RARCH_PATH_BASENAME); + system_info = runloop_get_system_info(); + system = &system_info->info; + core_path = path_get(RARCH_PATH_CORE); #if defined(HAVE_DYNAMIC) - if (string_is_empty(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)) { @@ -1770,7 +1850,7 @@ bool command_event(enum event_command cmd, void *data) #ifdef HAVE_CHEEVOS { settings_t *settings = config_get_ptr(); - if (settings->bools.cheevos_hardcore_mode_enable) + if (cheevos_loaded && settings->bools.cheevos_hardcore_mode_enable) return false; } #endif @@ -1812,7 +1892,7 @@ bool command_event(enum event_command cmd, void *data) { settings_t *settings = config_get_ptr(); #ifdef HAVE_CHEEVOS - if (settings->bools.cheevos_hardcore_mode_enable) + if (cheevos_loaded && settings->bools.cheevos_hardcore_mode_enable) return false; #endif @@ -1903,7 +1983,7 @@ bool command_event(enum event_command cmd, void *data) { #ifdef HAVE_CHEEVOS settings_t *settings = config_get_ptr(); - if (settings->bools.cheevos_hardcore_mode_enable) + if (cheevos_loaded && settings->bools.cheevos_hardcore_mode_enable) return false; #endif @@ -1914,7 +1994,7 @@ bool command_event(enum event_command cmd, void *data) { settings_t *settings = config_get_ptr(); #ifdef HAVE_CHEEVOS - if (settings->bools.cheevos_hardcore_mode_enable) + if (cheevos_loaded && settings->bools.cheevos_hardcore_mode_enable) return false; #endif if (settings->bools.rewind_enable) @@ -2237,18 +2317,32 @@ TODO: Add a setting for these tweaks */ ui_companion_driver_toggle(); break; case CMD_EVENT_ADD_TO_FAVORITES: - playlist_push( + { + 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; + + command_playlist_push_write( g_defaults.content_favorites, (const char*)data, - NULL, - file_path_str(FILE_PATH_DETECT), - file_path_str(FILE_PATH_DETECT), - NULL, - NULL + label, + core_path, + 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; + } case CMD_EVENT_RESTART_RETROARCH: if (!frontend_driver_set_fork(FRONTEND_FORK_RESTART)) return false; diff --git a/command.h b/command.h index 33c408638f..286383fc83 100644 --- a/command.h +++ b/command.h @@ -259,6 +259,20 @@ 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, + const char *core_display_name, + const char *label, + const char *path); + RETRO_END_DECLS #endif 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; diff --git a/config.def.keybinds.h b/config.def.keybinds.h index 5ed2203f51..b7f0a32e86 100644 --- a/config.def.keybinds.h +++ b/config.def.keybinds.h @@ -22,163 +22,202 @@ /* User 1 */ static const struct retro_keybind retro_keybinds_1[] = { - /* | RetroPad button | enum | keyboard key | js btn | js axis | */ + /* | RetroPad button | enum | keyboard key | m-btn | js btn | js axis | */ #ifdef __QNX__ - { true, RETRO_DEVICE_ID_JOYPAD_B, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, RETROK_k, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_Y, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, RETROK_i, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_SELECT, RETROK_v, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_START, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_START, RETROK_b, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_UP, RETROK_e, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_DOWN, RETROK_s, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_LEFT, RETROK_w, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_RIGHT, RETROK_d, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_A, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_A, RETROK_l, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_X, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_X, RETROK_o, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_L, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L, RETROK_f, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_R, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R, RETROK_j, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_L2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L2, RETROK_r, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_R2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R2, RETROK_u, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_L3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L3, RETROK_g, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_R3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R3, RETROK_h, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_B, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, RETROK_k, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_Y, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, RETROK_i, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_SELECT, RETROK_v, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_START, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_START, RETROK_b, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_UP, RETROK_e, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_DOWN, RETROK_s, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_LEFT, RETROK_w, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_RIGHT, RETROK_d, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_A, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_A, RETROK_l, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_X, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_X, RETROK_o, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_L, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L, RETROK_f, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_R, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R, RETROK_j, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_L2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L2, RETROK_r, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_R2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R2, RETROK_u, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_L3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L3, RETROK_g, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_R3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R3, RETROK_h, NO_BTN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_LEFT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_LEFT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_LEFT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_LEFT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_RIGHT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_RIGHT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_RIGHT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_RIGHT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_LEFT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_LEFT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_LEFT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_LEFT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_RIGHT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_RIGHT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_RIGHT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_RIGHT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_TURBO_ENABLE, MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_FAST_FORWARD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_KEY, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_FAST_FORWARD_HOLD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_HOLD_KEY,RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_LOAD_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_SAVE_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_SAVE_STATE_KEY, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_FULLSCREEN_TOGGLE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FULLSCREEN_TOGGLE_KEY,RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_QUIT_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_STATE_SLOT_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_STATE_SLOT_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_REWIND, MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_MOVIE_RECORD_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_PAUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_FRAMEADVANCE, MENU_ENUM_LABEL_VALUE_INPUT_META_FRAMEADVANCE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_RESET, MENU_ENUM_LABEL_VALUE_INPUT_META_RESET, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_SHADER_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_SHADER_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_PREV, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_CHEAT_INDEX_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_CHEAT_INDEX_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_CHEAT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_TOGGLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_SCREENSHOT, MENU_ENUM_LABEL_VALUE_INPUT_META_SCREENSHOT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_MUTE, MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_OSK, MENU_ENUM_LABEL_VALUE_INPUT_META_OSK, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_NETPLAY_FLIP, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_FLIP, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_NETPLAY_GAME_WATCH, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_GAME_WATCH, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_SLOWMOTION, MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ENABLE_HOTKEY, MENU_ENUM_LABEL_VALUE_INPUT_META_ENABLE_HOTKEY, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_VOLUME_UP, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_UP, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_VOLUME_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_DOWN, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_OVERLAY_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_OVERLAY_NEXT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_DISK_EJECT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_EJECT_TOGGLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_DISK_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_NEXT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_DISK_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_PREV, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_GRAB_MOUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GRAB_MOUSE_TOGGLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_GAME_FOCUS_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GAME_FOCUS_TOGGLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_MENU_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, RETROK_SPACE, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_TRIGGER, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_RELOAD, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_AUX_A, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_AUX_B, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_AUX_C, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_START, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_DPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_DPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_DPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_DPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + + { true, RARCH_TURBO_ENABLE, MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + + { true, RARCH_FAST_FORWARD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_FAST_FORWARD_HOLD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_HOLD_KEY,RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LOAD_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_SAVE_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_SAVE_STATE_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_FULLSCREEN_TOGGLE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FULLSCREEN_TOGGLE_KEY,RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_QUIT_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_STATE_SLOT_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_STATE_SLOT_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_REWIND, MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_MOVIE_RECORD_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_PAUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_FRAMEADVANCE, MENU_ENUM_LABEL_VALUE_INPUT_META_FRAMEADVANCE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_RESET, MENU_ENUM_LABEL_VALUE_INPUT_META_RESET, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_SHADER_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_SHADER_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_PREV, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_CHEAT_INDEX_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_CHEAT_INDEX_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_CHEAT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_SCREENSHOT, MENU_ENUM_LABEL_VALUE_INPUT_META_SCREENSHOT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_MUTE, MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_OSK, MENU_ENUM_LABEL_VALUE_INPUT_META_OSK, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_NETPLAY_FLIP, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_FLIP, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_NETPLAY_GAME_WATCH, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_GAME_WATCH, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_SLOWMOTION, MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ENABLE_HOTKEY, MENU_ENUM_LABEL_VALUE_INPUT_META_ENABLE_HOTKEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_VOLUME_UP, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_UP, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_VOLUME_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_DOWN, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_OVERLAY_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_OVERLAY_NEXT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_DISK_EJECT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_EJECT_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_DISK_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_NEXT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_DISK_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_PREV, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_GRAB_MOUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GRAB_MOUSE_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_GAME_FOCUS_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GAME_FOCUS_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_MENU_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, RETROK_SPACE, NO_BTN, NO_BTN, 0, AXIS_NONE }, #else - { true, RETRO_DEVICE_ID_JOYPAD_B, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, RETROK_z, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_Y, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, RETROK_a, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_SELECT, RETROK_RSHIFT, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_START, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_START, RETROK_RETURN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_UP, RETROK_UP, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_DOWN, RETROK_DOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_LEFT, RETROK_LEFT, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_RIGHT, RETROK_RIGHT, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_A, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_A, RETROK_x, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_X, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_X, RETROK_s, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_L, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L, RETROK_q, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_R, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R, RETROK_w, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_L2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L2, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_R2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R2, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_L3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L3, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_R3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R3, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_B, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, RETROK_z, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_Y, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, RETROK_a, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_SELECT, RETROK_RSHIFT, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_START, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_START, RETROK_RETURN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_UP, RETROK_UP, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_DOWN, RETROK_DOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_LEFT, RETROK_LEFT, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_RIGHT, RETROK_RIGHT, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_A, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_A, RETROK_x, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_X, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_X, RETROK_s, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_L, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L, RETROK_q, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_R, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R, RETROK_w, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_L2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L2, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_R2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R2, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_L3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L3, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_R3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R3, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_LEFT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_LEFT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_LEFT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_LEFT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_RIGHT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_RIGHT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_RIGHT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_RIGHT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_LEFT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_LEFT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_LEFT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_LEFT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_RIGHT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_RIGHT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_RIGHT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_RIGHT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_TURBO_ENABLE, MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_FAST_FORWARD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_KEY, RETROK_SPACE, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_FAST_FORWARD_HOLD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_HOLD_KEY,RETROK_l, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_LOAD_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, RETROK_F4, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_SAVE_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_SAVE_STATE_KEY, RETROK_F2, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_FULLSCREEN_TOGGLE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FULLSCREEN_TOGGLE_KEY,RETROK_f, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_QUIT_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, RETROK_ESCAPE, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_STATE_SLOT_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS, RETROK_F7, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_STATE_SLOT_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS, RETROK_F6, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_REWIND, MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND, RETROK_r, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_MOVIE_RECORD_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE, RETROK_o, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_PAUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE, RETROK_p, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_FRAMEADVANCE, MENU_ENUM_LABEL_VALUE_INPUT_META_FRAMEADVANCE, RETROK_k, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_RESET, MENU_ENUM_LABEL_VALUE_INPUT_META_RESET, RETROK_h, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_SHADER_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, RETROK_m, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_SHADER_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_PREV, RETROK_n, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_CHEAT_INDEX_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_PLUS, RETROK_y, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_CHEAT_INDEX_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_MINUS, RETROK_t, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_CHEAT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_TOGGLE, RETROK_u, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_SCREENSHOT, MENU_ENUM_LABEL_VALUE_INPUT_META_SCREENSHOT, RETROK_F8, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_MUTE, MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, RETROK_F9, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_OSK, MENU_ENUM_LABEL_VALUE_INPUT_META_OSK, RETROK_F12, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_NETPLAY_FLIP, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_FLIP, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_NETPLAY_GAME_WATCH, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_GAME_WATCH, RETROK_i, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_SLOWMOTION, MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION, RETROK_e, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ENABLE_HOTKEY, MENU_ENUM_LABEL_VALUE_INPUT_META_ENABLE_HOTKEY, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_VOLUME_UP, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_UP, RETROK_KP_PLUS, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_VOLUME_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_DOWN, RETROK_KP_MINUS,NO_BTN, 0, AXIS_NONE }, - { true, RARCH_OVERLAY_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_OVERLAY_NEXT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_DISK_EJECT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_EJECT_TOGGLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_DISK_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_NEXT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_DISK_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_PREV, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_GRAB_MOUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GRAB_MOUSE_TOGGLE, RETROK_F11, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_GAME_FOCUS_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GAME_FOCUS_TOGGLE, RETROK_SCROLLOCK, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_MENU_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, RETROK_F1, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_TRIGGER, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_RELOAD, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_AUX_A, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_AUX_B, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_AUX_C, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_START, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_DPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_DPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_DPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_DPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + + { true, RARCH_TURBO_ENABLE, MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + + { true, RARCH_FAST_FORWARD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_KEY, RETROK_SPACE, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_FAST_FORWARD_HOLD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_HOLD_KEY,RETROK_l, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LOAD_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, RETROK_F4, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_SAVE_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_SAVE_STATE_KEY, RETROK_F2, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_FULLSCREEN_TOGGLE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FULLSCREEN_TOGGLE_KEY,RETROK_f, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_QUIT_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, RETROK_ESCAPE, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_STATE_SLOT_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS, RETROK_F7, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_STATE_SLOT_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS, RETROK_F6, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_REWIND, MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND, RETROK_r, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_MOVIE_RECORD_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE, RETROK_o, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_PAUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE, RETROK_p, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_FRAMEADVANCE, MENU_ENUM_LABEL_VALUE_INPUT_META_FRAMEADVANCE, RETROK_k, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_RESET, MENU_ENUM_LABEL_VALUE_INPUT_META_RESET, RETROK_h, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_SHADER_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, RETROK_m, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_SHADER_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_PREV, RETROK_n, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_CHEAT_INDEX_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_PLUS, RETROK_y, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_CHEAT_INDEX_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_MINUS, RETROK_t, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_CHEAT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_TOGGLE, RETROK_u, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_SCREENSHOT, MENU_ENUM_LABEL_VALUE_INPUT_META_SCREENSHOT, RETROK_F8, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_MUTE, MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, RETROK_F9, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_OSK, MENU_ENUM_LABEL_VALUE_INPUT_META_OSK, RETROK_F12, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_NETPLAY_FLIP, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_FLIP, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_NETPLAY_GAME_WATCH, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_GAME_WATCH, RETROK_i, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_SLOWMOTION, MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION, RETROK_e, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ENABLE_HOTKEY, MENU_ENUM_LABEL_VALUE_INPUT_META_ENABLE_HOTKEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_VOLUME_UP, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_UP, RETROK_KP_PLUS, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_VOLUME_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_DOWN, RETROK_KP_MINUS,NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_OVERLAY_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_OVERLAY_NEXT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_DISK_EJECT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_EJECT_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_DISK_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_NEXT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_DISK_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_PREV, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_GRAB_MOUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GRAB_MOUSE_TOGGLE, RETROK_F11, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_GAME_FOCUS_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GAME_FOCUS_TOGGLE, RETROK_SCROLLOCK, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_MENU_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, RETROK_F1, NO_BTN, NO_BTN, 0, AXIS_NONE }, #endif }; /* Users 2 to MAX_USERS */ static const struct retro_keybind retro_keybinds_rest[] = { - /* | RetroPad button | desc | keyboard key | js btn | js axis | */ - { true, RETRO_DEVICE_ID_JOYPAD_B, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_Y, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_SELECT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_START, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_START, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_UP, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_DOWN, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_LEFT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_RIGHT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_A, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_A, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_X, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_X, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_L, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_R, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_L2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L2, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_R2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R2, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_L3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L3, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_R3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R3, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, + /* | RetroPad button | desc | keyboard key | js btn | js axis | */ + { true, RETRO_DEVICE_ID_JOYPAD_B, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_Y, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_SELECT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_START, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_START, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_UP, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_DOWN, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_LEFT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_RIGHT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_A, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_A, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_X, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_X, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_L, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_R, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_L2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L2, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_R2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R2, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_L3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L3, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_R3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R3, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_LEFT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_LEFT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_LEFT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_LEFT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_RIGHT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_RIGHT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_RIGHT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_RIGHT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_TURBO_ENABLE, MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_LEFT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_LEFT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_LEFT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_LEFT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_RIGHT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_RIGHT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_RIGHT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_RIGHT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + + { true, RARCH_LIGHTGUN_TRIGGER, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_RELOAD, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_AUX_A, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_AUX_B, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_AUX_C, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_START, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_DPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_DPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_DPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_DPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + + { true, RARCH_TURBO_ENABLE, MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, }; #endif diff --git a/configuration.c b/configuration.c index 21ce17f95d..7f2fa1fc91 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); @@ -2140,6 +2143,24 @@ static void read_keybinds_axis(config_file_t *conf, unsigned user, input_config_bind_map_get_base(idx), bind); } +static void read_keybinds_mbutton(config_file_t *conf, unsigned user, + unsigned idx, struct retro_keybind *bind) +{ + const char *prefix = NULL; + + if (!input_config_bind_map_get_valid(idx)) + return; + if (!input_config_bind_map_get_base(idx)) + return; + + prefix = input_config_get_prefix(user, + input_config_bind_map_get_meta(idx)); + + if (prefix) + input_config_parse_mouse_button(conf, prefix, + input_config_bind_map_get_base(idx), bind); +} + static void read_keybinds_user(config_file_t *conf, unsigned user) { unsigned i; @@ -2154,6 +2175,7 @@ static void read_keybinds_user(config_file_t *conf, unsigned user) read_keybinds_keyboard(conf, user, i, bind); read_keybinds_button(conf, user, i, bind); read_keybinds_axis(conf, user, i, bind); + read_keybinds_mbutton(conf, user, i, bind); } } @@ -2262,6 +2284,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); @@ -2534,13 +2558,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)); } @@ -2559,7 +2586,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)); } @@ -2578,7 +2605,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)); } @@ -2597,7 +2624,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)); } @@ -2616,7 +2643,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)); } @@ -2642,14 +2669,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); } @@ -2690,9 +2717,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) */ @@ -3343,6 +3368,38 @@ static void save_keybind_axis(config_file_t *conf, const char *prefix, } } +static void save_keybind_mbutton(config_file_t *conf, const char *prefix, + const char *base, const struct retro_keybind *bind, bool save_empty) +{ + char key[64]; + + key[0] = '\0'; + + fill_pathname_join_delim_concat(key, prefix, + base, '_', "_mbtn", sizeof(key)); + + switch ( bind->mbutton ) + { + + case RETRO_DEVICE_ID_MOUSE_LEFT: config_set_uint64(conf, key, 1); break; + case RETRO_DEVICE_ID_MOUSE_RIGHT: config_set_uint64(conf, key, 2); break; + case RETRO_DEVICE_ID_MOUSE_MIDDLE: config_set_uint64(conf, key, 3); break; + case RETRO_DEVICE_ID_MOUSE_BUTTON_4: config_set_uint64(conf, key, 4); break; + case RETRO_DEVICE_ID_MOUSE_BUTTON_5: config_set_uint64(conf, key, 5); break; + + case RETRO_DEVICE_ID_MOUSE_WHEELUP: config_set_string(conf, key, "wu"); break; + case RETRO_DEVICE_ID_MOUSE_WHEELDOWN: config_set_string(conf, key, "wd"); break; + case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP: config_set_string(conf, key, "whu"); break; + case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN: config_set_string(conf, key, "whd"); break; + + default: + if ( save_empty ) { + config_set_string(conf, key, file_path_str(FILE_PATH_NUL)); + } + break; + } +} + /** * save_keybind: * @conf : pointer to config file object @@ -3363,6 +3420,7 @@ static void save_keybind(config_file_t *conf, const char *prefix, save_keybind_key(conf, prefix, base, bind); save_keybind_joykey(conf, prefix, base, bind, save_empty); save_keybind_axis(conf, prefix, base, bind, save_empty); + save_keybind_mbutton(conf, prefix, base, bind, save_empty); } /** @@ -3543,8 +3601,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/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/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/file_path_special.c b/file_path_special.c index 3d5231a63f..9113f27dc6 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. @@ -28,6 +28,10 @@ #include #endif +#ifdef __HAIKU__ +#include +#endif + #include #include #include @@ -119,7 +123,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 +133,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 +246,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 +273,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 +291,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 +339,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 +353,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 +505,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/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", 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) 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 }; - diff --git a/gfx/video_driver.c b/gfx/video_driver.c index d9dd3ce7c4..1656d11bab 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) { @@ -2407,7 +2409,7 @@ void video_driver_frame(const void *data, unsigned width, video_driver_frame_count++; - // Display the FPS, with a higher priority. + /* Display the FPS, with a higher priority. */ if (video_info.fps_show) runloop_msg_queue_push(video_info.fps_text, 2, 1, true); } diff --git a/griffin/griffin.c b/griffin/griffin.c index 9b4a08f305..2bbb31a47b 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 @@ -821,6 +822,10 @@ 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" /*============================================================ MESSAGE diff --git a/input/drivers/dinput.c b/input/drivers/dinput.c index f890444e46..9b2e14f66e 100644 --- a/input/drivers/dinput.c +++ b/input/drivers/dinput.c @@ -49,6 +49,7 @@ #include "../../gfx/video_driver.h" +#include "../../configuration.h" #include "../../verbosity.h" /* Keep track of which pad indexes are 360 controllers. @@ -267,6 +268,58 @@ static bool dinput_keyboard_pressed(struct dinput_input *di, unsigned key) return di->state[sym] & 0x80; } +static bool dinput_mbutton_pressed(struct dinput_input *di, unsigned port, unsigned key) +{ + bool result; + settings_t *settings = config_get_ptr(); + + if (port >= MAX_USERS) + return false; + + /* the driver only supports one mouse */ + if ( settings->uints.input_mouse_index[ port ] != 0 ) { + return false; + } + + switch ( key ) + { + + case RETRO_DEVICE_ID_MOUSE_LEFT: + return di->mouse_l; + case RETRO_DEVICE_ID_MOUSE_RIGHT: + return di->mouse_r; + case RETRO_DEVICE_ID_MOUSE_MIDDLE: + return di->mouse_m; + case RETRO_DEVICE_ID_MOUSE_BUTTON_4: + return di->mouse_b4; + case RETRO_DEVICE_ID_MOUSE_BUTTON_5: + return di->mouse_b5; + + case RETRO_DEVICE_ID_MOUSE_WHEELUP: + result = di->mouse_wu; + di->mouse_wu = false; + return result; + + case RETRO_DEVICE_ID_MOUSE_WHEELDOWN: + result = di->mouse_wd; + di->mouse_wd = false; + return result; + + case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP: + result = di->mouse_hwu; + di->mouse_hwu = false; + return result; + + case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN: + result = di->mouse_hwd; + di->mouse_hwd = false; + return result; + + } + + return false; +} + static bool dinput_is_pressed(struct dinput_input *di, rarch_joypad_info_t joypad_info, const struct retro_keybind *binds, @@ -276,8 +329,13 @@ static bool dinput_is_pressed(struct dinput_input *di, if (!di->blocked && (bind->key < RETROK_LAST) && dinput_keyboard_pressed(di, bind->key)) return true; - if (binds && binds[id].valid && input_joypad_pressed(di->joypad, joypad_info, port, binds, id)) - return true; + if (binds && binds[id].valid) + { + if (dinput_mbutton_pressed(di, port, bind->mbutton)) + return true; + if (input_joypad_pressed(di->joypad, joypad_info, port, binds, id)) + return true; + } return false; } @@ -311,33 +369,83 @@ static bool dinput_meta_key_pressed(void *data, int key) return false; } -static int16_t dinput_lightgun_state(struct dinput_input *di, unsigned id) +static int16_t dinput_lightgun_aiming_state( struct dinput_input *di, unsigned idx, unsigned id ) { - switch (id) - { - case RETRO_DEVICE_ID_LIGHTGUN_X: - return di->mouse_rel_x; - case RETRO_DEVICE_ID_LIGHTGUN_Y: - return di->mouse_rel_y; - case RETRO_DEVICE_ID_LIGHTGUN_TRIGGER: - return di->mouse_l; - case RETRO_DEVICE_ID_LIGHTGUN_CURSOR: - return di->mouse_m; - case RETRO_DEVICE_ID_LIGHTGUN_TURBO: - return di->mouse_r; - case RETRO_DEVICE_ID_LIGHTGUN_START: - return di->mouse_m && di->mouse_r; - case RETRO_DEVICE_ID_LIGHTGUN_PAUSE: - return di->mouse_m && di->mouse_l; - } + const int edge_detect = 32700; + struct video_viewport vp; + bool inside = false; + int x = 0; + int y = 0; + int16_t res_x = 0; + int16_t res_y = 0; + int16_t res_screen_x = 0; + int16_t res_screen_y = 0; + unsigned num = 0; - return 0; + struct pointer_status* check_pos = di->pointer_head.next; + + vp.x = 0; + vp.y = 0; + vp.width = 0; + vp.height = 0; + vp.full_width = 0; + vp.full_height = 0; + + while ( check_pos && num < idx ) + { + num++; + check_pos = check_pos->next; + } + + if ( !check_pos && idx > 0 ) /* idx = 0 has mouse fallback. */ + return 0; + + x = di->mouse_x; + y = di->mouse_y; + + if ( check_pos ) + { + x = check_pos->pointer_x; + y = check_pos->pointer_y; + } + + if ( !( video_driver_translate_coord_viewport_wrap( + &vp, x, y, &res_x, &res_y, &res_screen_x, &res_screen_y ) ) ) + { + return 0; + } + + inside = (res_x >= -edge_detect) && (res_y >= -edge_detect) && (res_x <= edge_detect) && (res_y <= edge_detect); + + switch ( id ) + { + case RETRO_DEVICE_ID_LIGHTGUN_SCREEN_X: + return inside ? res_x : 0; + case RETRO_DEVICE_ID_LIGHTGUN_SCREEN_Y: + return inside ? res_y : 0; + case RETRO_DEVICE_ID_LIGHTGUN_IS_OFFSCREEN: + return !inside; + default: + break; + } + + return 0; } -static int16_t dinput_mouse_state(struct dinput_input *di, unsigned id) +static int16_t dinput_mouse_state(struct dinput_input *di, unsigned port, unsigned id) { int16_t state = 0; + settings_t *settings = config_get_ptr(); + + if (port >= MAX_USERS) + return false; + + /* the driver only supports one mouse */ + if ( settings->uints.input_mouse_index[ port ] != 0 ) { + return 0; + } + switch (id) { case RETRO_DEVICE_ID_MOUSE_X: @@ -379,8 +487,18 @@ static int16_t dinput_mouse_state(struct dinput_input *di, unsigned id) return 0; } -static int16_t dinput_mouse_state_screen(struct dinput_input *di, unsigned id) +static int16_t dinput_mouse_state_screen(struct dinput_input *di, unsigned port, unsigned id) { + settings_t *settings = config_get_ptr(); + + if (port >= MAX_USERS) + return false; + + /* the driver only supports one mouse */ + if ( settings->uints.input_mouse_index[ port ] != 0 ) { + return 0; + } + switch (id) { case RETRO_DEVICE_ID_MOUSE_X: @@ -391,7 +509,7 @@ static int16_t dinput_mouse_state_screen(struct dinput_input *di, unsigned id) break; } - return dinput_mouse_state(di, id); + return dinput_mouse_state(di, port, id); } static int16_t dinput_pointer_state(struct dinput_input *di, @@ -494,10 +612,10 @@ static int16_t dinput_input_state(void *data, return 0; case RETRO_DEVICE_MOUSE: - return dinput_mouse_state(di, id); + return dinput_mouse_state(di, port, id); case RARCH_DEVICE_MOUSE_SCREEN: - return dinput_mouse_state_screen(di, id); + return dinput_mouse_state_screen(di, port, id); case RETRO_DEVICE_POINTER: case RARCH_DEVICE_POINTER_SCREEN: @@ -505,7 +623,48 @@ static int16_t dinput_input_state(void *data, device == RARCH_DEVICE_POINTER_SCREEN); case RETRO_DEVICE_LIGHTGUN: - return dinput_lightgun_state(di, id); + switch ( id ) + { + /*aiming*/ + case RETRO_DEVICE_ID_LIGHTGUN_SCREEN_X: + case RETRO_DEVICE_ID_LIGHTGUN_SCREEN_Y: + case RETRO_DEVICE_ID_LIGHTGUN_IS_OFFSCREEN: + return dinput_lightgun_aiming_state( di, idx, id ); + + /*buttons*/ + case RETRO_DEVICE_ID_LIGHTGUN_TRIGGER: + return dinput_is_pressed(di, joypad_info, binds[port], port, RARCH_LIGHTGUN_TRIGGER); + case RETRO_DEVICE_ID_LIGHTGUN_RELOAD: + return dinput_is_pressed(di, joypad_info, binds[port], port, RARCH_LIGHTGUN_RELOAD); + case RETRO_DEVICE_ID_LIGHTGUN_AUX_A: + return dinput_is_pressed(di, joypad_info, binds[port], port, RARCH_LIGHTGUN_AUX_A); + case RETRO_DEVICE_ID_LIGHTGUN_AUX_B: + return dinput_is_pressed(di, joypad_info, binds[port], port, RARCH_LIGHTGUN_AUX_B); + case RETRO_DEVICE_ID_LIGHTGUN_AUX_C: + return dinput_is_pressed(di, joypad_info, binds[port], port, RARCH_LIGHTGUN_AUX_C); + case RETRO_DEVICE_ID_LIGHTGUN_START: + return dinput_is_pressed(di, joypad_info, binds[port], port, RARCH_LIGHTGUN_START); + case RETRO_DEVICE_ID_LIGHTGUN_SELECT: + return dinput_is_pressed(di, joypad_info, binds[port], port, RARCH_LIGHTGUN_SELECT); + case RETRO_DEVICE_ID_LIGHTGUN_DPAD_UP: + return dinput_is_pressed(di, joypad_info, binds[port], port, RARCH_LIGHTGUN_DPAD_UP); + case RETRO_DEVICE_ID_LIGHTGUN_DPAD_DOWN: + return dinput_is_pressed(di, joypad_info, binds[port], port, RARCH_LIGHTGUN_DPAD_DOWN); + case RETRO_DEVICE_ID_LIGHTGUN_DPAD_LEFT: + return dinput_is_pressed(di, joypad_info, binds[port], port, RARCH_LIGHTGUN_DPAD_LEFT); + case RETRO_DEVICE_ID_LIGHTGUN_DPAD_RIGHT: + return dinput_is_pressed(di, joypad_info, binds[port], port, RARCH_LIGHTGUN_DPAD_RIGHT); + + /*deprecated*/ + case RETRO_DEVICE_ID_LIGHTGUN_X: + return di->mouse_rel_x; + case RETRO_DEVICE_ID_LIGHTGUN_Y: + return di->mouse_rel_y; + case RETRO_DEVICE_ID_LIGHTGUN_PAUSE: + return dinput_is_pressed(di, joypad_info, binds[port], port, RARCH_LIGHTGUN_START); + + } + break; } return 0; diff --git a/input/drivers/winraw_input.c b/input/drivers/winraw_input.c index cd844e838e..c7397d39d8 100644 --- a/input/drivers/winraw_input.c +++ b/input/drivers/winraw_input.c @@ -1,717 +1,764 @@ -/* RetroArch - A frontend for libretro. - * Copyright (C) 2011-2017 - Daniel De Matteis - * - * RetroArch is free software: you can redistribute it and/or modify it under the terms - * of the GNU General Public License as published by the Free Software Found- - * ation, either version 3 of the License, or (at your option) any later version. - * - * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with RetroArch. - * If not, see . - */ - -#include - -#include "../input_driver.h" -#include "../input_keymaps.h" - -#include "../../configuration.h" -#include "../../gfx/video_driver.h" -#include "../../verbosity.h" - -typedef struct -{ - uint8_t keys[256]; -} winraw_keyboard_t; - -typedef struct -{ - HANDLE hnd; - LONG x, y, dlt_x, dlt_y; - LONG whl_u, whl_d; - bool btn_l, btn_m, btn_r, btn_b4, btn_b5; -} winraw_mouse_t; - -typedef struct -{ - bool kbd_mapp_block; - bool mouse_grab; - winraw_keyboard_t keyboard; - HWND window; - winraw_mouse_t *mice; - const input_device_driver_t *joypad; -} winraw_input_t; - -static winraw_keyboard_t *g_keyboard = NULL; -static winraw_mouse_t *g_mice = NULL; -static unsigned g_mouse_cnt = 0; -static bool g_mouse_xy_mapping_ready = false; -static double g_view_abs_ratio_x = 0.0; -static double g_view_abs_ratio_y = 0.0; - -static HWND winraw_create_window(WNDPROC wnd_proc) -{ - HWND wnd; - WNDCLASSA wc = {0}; - - wc.hInstance = GetModuleHandleA(NULL); - - if (!wc.hInstance) - { - RARCH_ERR("[WINRAW]: GetModuleHandleA failed with error %lu.\n", GetLastError()); - return NULL; - } - - wc.lpfnWndProc = wnd_proc; - wc.lpszClassName = "winraw-input"; - if (!RegisterClassA(&wc) && GetLastError() != ERROR_CLASS_ALREADY_EXISTS) - { - RARCH_ERR("[WINRAW]: RegisterClassA failed with error %lu.\n", GetLastError()); - return NULL; - } - - wnd = CreateWindowExA(0, wc.lpszClassName, NULL, 0, 0, 0, 0, 0, - HWND_MESSAGE, NULL, NULL, NULL); - if (!wnd) - { - RARCH_ERR("[WINRAW]: CreateWindowExA failed with error %lu.\n", GetLastError()); - goto error; - } - - return wnd; - -error: - UnregisterClassA(wc.lpszClassName, NULL); - return NULL; -} - -static void winraw_destroy_window(HWND wnd) -{ - BOOL r; - - if (!wnd) - return; - - r = DestroyWindow(wnd); - - if (!r) - { - RARCH_WARN("[WINRAW]: DestroyWindow failed with error %lu.\n", GetLastError()); - } - - r = UnregisterClassA("winraw-input", NULL); - - if (!r) - { - RARCH_WARN("[WINRAW]: UnregisterClassA failed with error %lu.\n", GetLastError()); - } -} - -static bool winraw_set_keyboard_input(HWND window) -{ - RAWINPUTDEVICE rid; - BOOL r; - - rid.dwFlags = window ? 0 : RIDEV_REMOVE; - rid.hwndTarget = window; - rid.usUsagePage = 0x01; /* generic desktop */ - rid.usUsage = 0x06; /* keyboard */ - - r = RegisterRawInputDevices(&rid, 1, sizeof(RAWINPUTDEVICE)); - - if (!r) - { - RARCH_ERR("[WINRAW]: RegisterRawInputDevices failed with error %lu.\n", GetLastError()); - return false; - } - - return true; -} - -static void winraw_log_mice_info(winraw_mouse_t *mice, unsigned mouse_cnt) -{ - UINT r; - unsigned i; - char name[256]; - UINT name_size = sizeof(name); - - for (i = 0; i < mouse_cnt; ++i) - { - r = GetRawInputDeviceInfoA(mice[i].hnd, RIDI_DEVICENAME, name, &name_size); - if (r == (UINT)-1 || r == 0) - name[0] = '\0'; - RARCH_LOG("[WINRAW]: Mouse #%u %s.\n", i, name); - } -} - -static bool winraw_init_devices(winraw_mouse_t **mice, unsigned *mouse_cnt) -{ - UINT i; - POINT crs_pos; - winraw_mouse_t *mice_r = NULL; - unsigned mouse_cnt_r = 0; - RAWINPUTDEVICELIST *devs = NULL; - UINT dev_cnt = 0; - UINT r = GetRawInputDeviceList( - NULL, &dev_cnt, sizeof(RAWINPUTDEVICELIST)); - - if (r == (UINT)-1) - { - RARCH_ERR("[WINRAW]: GetRawInputDeviceList failed with error %lu.\n", GetLastError()); - goto error; - } - - devs = (RAWINPUTDEVICELIST*)malloc(dev_cnt * sizeof(RAWINPUTDEVICELIST)); - if (!devs) - goto error; - - dev_cnt = GetRawInputDeviceList(devs, &dev_cnt, sizeof(RAWINPUTDEVICELIST)); - if (dev_cnt == (UINT)-1) - { - RARCH_ERR("[WINRAW]: GetRawInputDeviceList failed with error %lu.\n", GetLastError()); - goto error; - } - - for (i = 0; i < dev_cnt; ++i) - mouse_cnt_r += devs[i].dwType == RIM_TYPEMOUSE ? 1 : 0; - - if (mouse_cnt_r) - { - mice_r = (winraw_mouse_t*)calloc(1, mouse_cnt_r * sizeof(winraw_mouse_t)); - if (!mice_r) - goto error; - - if (!GetCursorPos(&crs_pos)) - goto error; - - for (i = 0; i < mouse_cnt_r; ++i) - { - mice_r[i].x = crs_pos.x; - mice_r[i].y = crs_pos.y; - } - } - - /* count is already checked, so this is safe */ - for (i = mouse_cnt_r = 0; i < dev_cnt; ++i) - { - if (devs[i].dwType == RIM_TYPEMOUSE) - mice_r[mouse_cnt_r++].hnd = devs[i].hDevice; - } - - winraw_log_mice_info(mice_r, mouse_cnt_r); - - *mice = mice_r; - *mouse_cnt = mouse_cnt_r; - - return true; - -error: - free(devs); - free(mice_r); - *mice = NULL; - *mouse_cnt = 0; - return false; -} - -static bool winraw_set_mouse_input(HWND window, bool grab) -{ - RAWINPUTDEVICE rid; - BOOL r; - - if (window) - rid.dwFlags = grab ? RIDEV_CAPTUREMOUSE : 0; - else - rid.dwFlags = RIDEV_REMOVE; - - rid.hwndTarget = window; - rid.usUsagePage = 0x01; /* generic desktop */ - rid.usUsage = 0x02; /* mouse */ - - r = RegisterRawInputDevices(&rid, 1, sizeof(RAWINPUTDEVICE)); - - if (!r) - { - RARCH_ERR("[WINRAW]: RegisterRawInputDevice failed with error %lu.\n", GetLastError()); - return false; - } - - return true; -} - -static int16_t winraw_mouse_state(winraw_input_t *wr, - unsigned port, bool abs, unsigned id) -{ - unsigned i; - settings_t *settings = config_get_ptr(); - winraw_mouse_t *mouse = NULL; - - if (port >= MAX_USERS) - return 0; - - for (i = 0; i < g_mouse_cnt; ++i) - { - if (i == settings->uints.input_mouse_index[port]) - { - mouse = &wr->mice[i]; - break; - } - } - - if (!mouse) - return 0; - - switch (id) - { - case RETRO_DEVICE_ID_MOUSE_X: - return abs ? mouse->x : mouse->dlt_x; - case RETRO_DEVICE_ID_MOUSE_Y: - return abs ? mouse->y : mouse->dlt_y; - case RETRO_DEVICE_ID_MOUSE_LEFT: - return mouse->btn_l ? 1 : 0; - case RETRO_DEVICE_ID_MOUSE_RIGHT: - return mouse->btn_r ? 1 : 0; - case RETRO_DEVICE_ID_MOUSE_WHEELUP: - return mouse->whl_u ? 1 : 0; - case RETRO_DEVICE_ID_MOUSE_WHEELDOWN: - return mouse->whl_d ? 1 : 0; - case RETRO_DEVICE_ID_MOUSE_MIDDLE: - return mouse->btn_m ? 1 : 0; - case RETRO_DEVICE_ID_MOUSE_BUTTON_4: - return mouse->btn_b4 ? 1 : 0; - case RETRO_DEVICE_ID_MOUSE_BUTTON_5: - return mouse->btn_b5 ? 1 : 0; - } - - return 0; -} - -static int16_t winraw_joypad_state(winraw_input_t *wr, - rarch_joypad_info_t joypad_info, - const struct retro_keybind *binds, - unsigned port, unsigned id) -{ - const struct retro_keybind *bind = &binds[id]; - unsigned key = rarch_keysym_lut[(enum retro_key)bind->key]; - - if (!wr->kbd_mapp_block && (bind->key < RETROK_LAST) && wr->keyboard.keys[key]) - return 1; - - return input_joypad_pressed(wr->joypad, joypad_info, port, binds, id); -} - -static void winraw_init_mouse_xy_mapping() -{ - struct video_viewport viewport; - int center_x; - int center_y; - unsigned i; - - if (video_driver_get_viewport_info(&viewport)) - { - center_x = viewport.x + viewport.width / 2; - center_y = viewport.y + viewport.height / 2; - - for (i = 0; i < g_mouse_cnt; ++i) - { - g_mice[i].x = center_x; - g_mice[i].y = center_y; - } - - g_view_abs_ratio_x = (double)viewport.full_width / 65535.0; - g_view_abs_ratio_y = (double)viewport.full_height / 65535.0; - - g_mouse_xy_mapping_ready = true; - } -} - -static int16_t winraw_lightgun_state(winraw_input_t *wr, - unsigned port, unsigned id) -{ - unsigned i; - settings_t *settings = config_get_ptr(); - winraw_mouse_t *mouse = NULL; - - if (port >= MAX_USERS) - return 0; - - for (i = 0; i < g_mouse_cnt; ++i) - { - if (i == settings->uints.input_mouse_index[port]) - { - mouse = &wr->mice[i]; - break; - } - } - - if (!mouse) - return 0; - - switch (id) - { - case RETRO_DEVICE_ID_LIGHTGUN_X: - return mouse->dlt_x; - case RETRO_DEVICE_ID_LIGHTGUN_Y: - return mouse->dlt_y; - case RETRO_DEVICE_ID_LIGHTGUN_TRIGGER: - return mouse->btn_l ? 1 : 0; - case RETRO_DEVICE_ID_LIGHTGUN_CURSOR: - return mouse->btn_m ? 1 : 0; - case RETRO_DEVICE_ID_LIGHTGUN_TURBO: - return mouse->btn_r ? 1 : 0; - case RETRO_DEVICE_ID_LIGHTGUN_START: - return (mouse->btn_m && mouse->btn_r) ? 1 : 0; - case RETRO_DEVICE_ID_LIGHTGUN_PAUSE: - return mouse->btn_m && mouse->btn_l ? 1 : 0; - } - - return 0; -} - -static void winraw_update_mouse_state(winraw_mouse_t *mouse, RAWMOUSE *state) -{ - POINT crs_pos; - - if (state->usFlags & MOUSE_MOVE_ABSOLUTE) - { - if (g_mouse_xy_mapping_ready) - { - state->lLastX = (LONG)(g_view_abs_ratio_x * state->lLastX); - state->lLastY = (LONG)(g_view_abs_ratio_y * state->lLastY); - InterlockedExchangeAdd(&mouse->dlt_x, state->lLastX - mouse->x); - InterlockedExchangeAdd(&mouse->dlt_y, state->lLastY - mouse->y); - mouse->x = state->lLastX; - mouse->y = state->lLastY; - } - else - winraw_init_mouse_xy_mapping(); - } - else if (state->lLastX || state->lLastY) - { - InterlockedExchangeAdd(&mouse->dlt_x, state->lLastX); - InterlockedExchangeAdd(&mouse->dlt_y, state->lLastY); - - if (!GetCursorPos(&crs_pos)) - { - RARCH_WARN("[WINRAW]: GetCursorPos failed with error %lu.\n", GetLastError()); - } - else if (!ScreenToClient((HWND)video_driver_window_get(), &crs_pos)) - { - RARCH_WARN("[WINRAW]: ScreenToClient failed with error %lu.\n", GetLastError()); - } - else - { - mouse->x = crs_pos.x; - mouse->y = crs_pos.y; - } - } - - if (state->usButtonFlags & RI_MOUSE_LEFT_BUTTON_DOWN) - mouse->btn_l = true; - else if (state->usButtonFlags & RI_MOUSE_LEFT_BUTTON_UP) - mouse->btn_l = false; - - if (state->usButtonFlags & RI_MOUSE_MIDDLE_BUTTON_DOWN) - mouse->btn_m = true; - else if (state->usButtonFlags & RI_MOUSE_MIDDLE_BUTTON_UP) - mouse->btn_m = false; - - if (state->usButtonFlags & RI_MOUSE_RIGHT_BUTTON_DOWN) - mouse->btn_r = true; - else if (state->usButtonFlags & RI_MOUSE_RIGHT_BUTTON_UP) - mouse->btn_r = false; - - if (state->usButtonFlags & RI_MOUSE_BUTTON_4_DOWN) - mouse->btn_b4 = true; - else if (state->usButtonFlags & RI_MOUSE_BUTTON_4_UP) - mouse->btn_b4 = false; - - if (state->usButtonFlags & RI_MOUSE_BUTTON_5_DOWN) - mouse->btn_b5 = true; - else if (state->usButtonFlags & RI_MOUSE_BUTTON_5_UP) - mouse->btn_b5 = false; - - if (state->usButtonFlags & RI_MOUSE_WHEEL) - { - if ((SHORT)state->usButtonData > 0) - InterlockedExchange(&mouse->whl_u, 1); - else if ((SHORT)state->usButtonData < 0) - InterlockedExchange(&mouse->whl_d, 1); - } -} - -static LRESULT CALLBACK winraw_callback(HWND wnd, UINT msg, WPARAM wpar, LPARAM lpar) -{ - static uint8_t data[1024]; - UINT r; - unsigned i; - RAWINPUT *ri = (RAWINPUT*)data; - UINT size = sizeof(data); - - if (msg != WM_INPUT) - return DefWindowProcA(wnd, msg, wpar, lpar); - - /* app is in the background */ - if (GET_RAWINPUT_CODE_WPARAM(wpar) != RIM_INPUT) - goto end; - - r = GetRawInputData((HRAWINPUT)lpar, RID_INPUT, - data, &size, sizeof(RAWINPUTHEADER)); - if (r == (UINT)-1) - { - RARCH_WARN("[WINRAW]: GetRawInputData failed with error %lu.\n", - GetLastError()); - goto end; - } - - if (ri->header.dwType == RIM_TYPEKEYBOARD) - { - if (ri->data.keyboard.Message == WM_KEYDOWN) - g_keyboard->keys[ri->data.keyboard.VKey] = 1; - else if (ri->data.keyboard.Message == WM_KEYUP) - g_keyboard->keys[ri->data.keyboard.VKey] = 0; - } - else if (ri->header.dwType == RIM_TYPEMOUSE) - { - for (i = 0; i < g_mouse_cnt; ++i) - { - if (g_mice[i].hnd == ri->header.hDevice) - { - winraw_update_mouse_state(&g_mice[i], &ri->data.mouse); - break; - } - } - } - -end: - DefWindowProcA(wnd, msg, wpar, lpar); - return 0; -} - -static void *winraw_init(const char *joypad_driver) -{ - bool r; - winraw_input_t *wr = (winraw_input_t *) - calloc(1, sizeof(winraw_input_t)); - g_keyboard = (winraw_keyboard_t*) - calloc(1, sizeof(winraw_keyboard_t)); - - if (!wr || !g_keyboard) - goto error; - - RARCH_LOG("[WINRAW]: Initializing input driver... \n"); - - input_keymaps_init_keyboard_lut(rarch_key_map_winraw); - - wr->window = winraw_create_window(winraw_callback); - if (!wr->window) - goto error; - - r = winraw_init_devices(&g_mice, &g_mouse_cnt); - if (!r) - goto error; - - if (!g_mouse_cnt) - { - RARCH_LOG("[WINRAW]: Mouse unavailable.\n"); - } - else - { - wr->mice = (winraw_mouse_t*) - malloc(g_mouse_cnt * sizeof(winraw_mouse_t)); - if (!wr->mice) - goto error; - - memcpy(wr->mice, g_mice, g_mouse_cnt * sizeof(winraw_mouse_t)); - } - - r = winraw_set_keyboard_input(wr->window); - if (!r) - goto error; - - r = winraw_set_mouse_input(wr->window, false); - if (!r) - goto error; - - wr->joypad = input_joypad_init_driver(joypad_driver, wr); - - return wr; - -error: - if (wr && wr->window) - { - winraw_set_mouse_input(NULL, false); - winraw_set_keyboard_input(NULL); - winraw_destroy_window(wr->window); - } - free(g_keyboard); - free(g_mice); - if (wr) - free(wr->mice); - free(wr); - return NULL; -} - -static void winraw_poll(void *d) -{ - unsigned i; - winraw_input_t *wr = (winraw_input_t*)d; - - memcpy(&wr->keyboard, g_keyboard, sizeof(winraw_keyboard_t)); - - /* following keys are not handled by windows raw input api */ - wr->keyboard.keys[VK_LCONTROL] = GetAsyncKeyState(VK_LCONTROL) >> 1 ? 1 : 0; - wr->keyboard.keys[VK_RCONTROL] = GetAsyncKeyState(VK_RCONTROL) >> 1 ? 1 : 0; - wr->keyboard.keys[VK_LMENU] = GetAsyncKeyState(VK_LMENU) >> 1 ? 1 : 0; - wr->keyboard.keys[VK_RMENU] = GetAsyncKeyState(VK_RMENU) >> 1 ? 1 : 0; - wr->keyboard.keys[VK_LSHIFT] = GetAsyncKeyState(VK_LSHIFT) >> 1 ? 1 : 0; - wr->keyboard.keys[VK_RSHIFT] = GetAsyncKeyState(VK_RSHIFT) >> 1 ? 1 : 0; - - for (i = 0; i < g_mouse_cnt; ++i) - { - wr->mice[i].x = g_mice[i].x; - wr->mice[i].y = g_mice[i].y; - wr->mice[i].dlt_x = InterlockedExchange(&g_mice[i].dlt_x, 0); - wr->mice[i].dlt_y = InterlockedExchange(&g_mice[i].dlt_y, 0); - wr->mice[i].whl_u = InterlockedExchange(&g_mice[i].whl_u, 0); - wr->mice[i].whl_d = InterlockedExchange(&g_mice[i].whl_d, 0); - wr->mice[i].btn_l = g_mice[i].btn_l; - wr->mice[i].btn_m = g_mice[i].btn_m; - wr->mice[i].btn_r = g_mice[i].btn_r; - wr->mice[i].btn_b4 = g_mice[i].btn_b4; - wr->mice[i].btn_b5 = g_mice[i].btn_b5; - } - - if (wr->joypad) - wr->joypad->poll(); -} - -static int16_t winraw_input_state(void *d, - rarch_joypad_info_t joypad_info, - const struct retro_keybind **binds, - unsigned port, unsigned device, unsigned index, unsigned id) -{ - winraw_input_t *wr = (winraw_input_t*)d; - - switch (device) - { - case RETRO_DEVICE_KEYBOARD: - if (id < RETROK_LAST) - { - unsigned key = rarch_keysym_lut[(enum retro_key)id]; - return wr->keyboard.keys[key]; - } - break; - case RETRO_DEVICE_MOUSE: - return winraw_mouse_state(wr, port, false, id); - case RARCH_DEVICE_MOUSE_SCREEN: - return winraw_mouse_state(wr, port, true, id); - case RETRO_DEVICE_JOYPAD: - return winraw_joypad_state(wr, joypad_info, binds[port], port, id); - case RETRO_DEVICE_ANALOG: - if (binds[port]) - return input_joypad_analog(wr->joypad, joypad_info, - port, index, id, binds[port]); - break; - case RETRO_DEVICE_LIGHTGUN: - return winraw_lightgun_state(wr, port, id); - } - - return 0; -} - -static bool winraw_meta_key_pressed(void *u1, int u2) -{ - return false; -} - -static void winraw_free(void *d) -{ - winraw_input_t *wr = (winraw_input_t*)d; - - if (wr->joypad) - wr->joypad->destroy(); - winraw_set_mouse_input(NULL, false); - winraw_set_keyboard_input(NULL); - winraw_destroy_window(wr->window); - free(g_mice); - free(g_keyboard); - free(wr->mice); - free(wr); - - g_mouse_xy_mapping_ready = false; -} - -static uint64_t winraw_get_capabilities(void *u) -{ - return (1 << RETRO_DEVICE_KEYBOARD) | - (1 << RETRO_DEVICE_MOUSE) | - (1 << RETRO_DEVICE_JOYPAD) | - (1 << RETRO_DEVICE_ANALOG) | - (1 << RETRO_DEVICE_LIGHTGUN); -} - -static void winraw_grab_mouse(void *d, bool grab) -{ - bool r = false; - winraw_input_t *wr = (winraw_input_t*)d; - - if (grab == wr->mouse_grab) - return; - - r = winraw_set_mouse_input(wr->window, grab); - if (!r) - return; - - wr->mouse_grab = grab; -} - -static bool winraw_set_rumble(void *d, unsigned port, - enum retro_rumble_effect effect, uint16_t strength) -{ - winraw_input_t *wr = (winraw_input_t*)d; - - return input_joypad_set_rumble(wr->joypad, port, effect, strength); -} - -static const input_device_driver_t *winraw_get_joypad_driver(void *d) -{ - winraw_input_t *wr = (winraw_input_t*)d; - - return wr->joypad; -} - -static bool winraw_keyboard_mapping_is_blocked(void *d) -{ - winraw_input_t *wr = (winraw_input_t*)d; - - return wr->kbd_mapp_block; -} - -static void winraw_keyboard_mapping_set_block(void *d, bool block) -{ - winraw_input_t *wr = (winraw_input_t*)d; - - wr->kbd_mapp_block = block; -} - -input_driver_t input_winraw = { - winraw_init, - winraw_poll, - winraw_input_state, - winraw_meta_key_pressed, - winraw_free, - NULL, - NULL, - winraw_get_capabilities, - "raw", - winraw_grab_mouse, - NULL, - winraw_set_rumble, - winraw_get_joypad_driver, - NULL, - winraw_keyboard_mapping_is_blocked, - winraw_keyboard_mapping_set_block, -}; +/* RetroArch - A frontend for libretro. + * Copyright (C) 2011-2017 - Daniel De Matteis + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + +#include + +#include "../input_driver.h" +#include "../input_keymaps.h" + +#include "../../configuration.h" +#include "../../gfx/video_driver.h" +#include "../../verbosity.h" + +typedef struct +{ + uint8_t keys[256]; +} winraw_keyboard_t; + +typedef struct +{ + HANDLE hnd; + LONG x, y, dlt_x, dlt_y; + LONG whl_u, whl_d; + bool btn_l, btn_m, btn_r, btn_b4, btn_b5; +} winraw_mouse_t; + +typedef struct +{ + bool kbd_mapp_block; + bool mouse_grab; + winraw_keyboard_t keyboard; + HWND window; + winraw_mouse_t *mice; + const input_device_driver_t *joypad; +} winraw_input_t; + +static winraw_keyboard_t *g_keyboard = NULL; +static winraw_mouse_t *g_mice = NULL; +static unsigned g_mouse_cnt = 0; +static bool g_mouse_xy_mapping_ready = false; +static double g_view_abs_ratio_x = 0.0; +static double g_view_abs_ratio_y = 0.0; + +static HWND winraw_create_window(WNDPROC wnd_proc) +{ + HWND wnd; + WNDCLASSA wc = {0}; + + wc.hInstance = GetModuleHandleA(NULL); + + if (!wc.hInstance) + { + RARCH_ERR("[WINRAW]: GetModuleHandleA failed with error %lu.\n", GetLastError()); + return NULL; + } + + wc.lpfnWndProc = wnd_proc; + wc.lpszClassName = "winraw-input"; + if (!RegisterClassA(&wc) && GetLastError() != ERROR_CLASS_ALREADY_EXISTS) + { + RARCH_ERR("[WINRAW]: RegisterClassA failed with error %lu.\n", GetLastError()); + return NULL; + } + + wnd = CreateWindowExA(0, wc.lpszClassName, NULL, 0, 0, 0, 0, 0, + HWND_MESSAGE, NULL, NULL, NULL); + if (!wnd) + { + RARCH_ERR("[WINRAW]: CreateWindowExA failed with error %lu.\n", GetLastError()); + goto error; + } + + return wnd; + +error: + UnregisterClassA(wc.lpszClassName, NULL); + return NULL; +} + +static void winraw_destroy_window(HWND wnd) +{ + BOOL r; + + if (!wnd) + return; + + r = DestroyWindow(wnd); + + if (!r) + { + RARCH_WARN("[WINRAW]: DestroyWindow failed with error %lu.\n", GetLastError()); + } + + r = UnregisterClassA("winraw-input", NULL); + + if (!r) + { + RARCH_WARN("[WINRAW]: UnregisterClassA failed with error %lu.\n", GetLastError()); + } +} + +static bool winraw_set_keyboard_input(HWND window) +{ + RAWINPUTDEVICE rid; + BOOL r; + + rid.dwFlags = window ? 0 : RIDEV_REMOVE; + rid.hwndTarget = window; + rid.usUsagePage = 0x01; /* generic desktop */ + rid.usUsage = 0x06; /* keyboard */ + + r = RegisterRawInputDevices(&rid, 1, sizeof(RAWINPUTDEVICE)); + + if (!r) + { + RARCH_ERR("[WINRAW]: RegisterRawInputDevices failed with error %lu.\n", GetLastError()); + return false; + } + + return true; +} + +static void winraw_log_mice_info(winraw_mouse_t *mice, unsigned mouse_cnt) +{ + UINT r; + unsigned i; + char name[256]; + UINT name_size = sizeof(name); + + for (i = 0; i < mouse_cnt; ++i) + { + r = GetRawInputDeviceInfoA(mice[i].hnd, RIDI_DEVICENAME, name, &name_size); + if (r == (UINT)-1 || r == 0) + name[0] = '\0'; + RARCH_LOG("[WINRAW]: Mouse #%u %s.\n", i, name); + } +} + +static bool winraw_init_devices(winraw_mouse_t **mice, unsigned *mouse_cnt) +{ + UINT i; + POINT crs_pos; + winraw_mouse_t *mice_r = NULL; + unsigned mouse_cnt_r = 0; + RAWINPUTDEVICELIST *devs = NULL; + UINT dev_cnt = 0; + UINT r = GetRawInputDeviceList( + NULL, &dev_cnt, sizeof(RAWINPUTDEVICELIST)); + + if (r == (UINT)-1) + { + RARCH_ERR("[WINRAW]: GetRawInputDeviceList failed with error %lu.\n", GetLastError()); + goto error; + } + + devs = (RAWINPUTDEVICELIST*)malloc(dev_cnt * sizeof(RAWINPUTDEVICELIST)); + if (!devs) + goto error; + + dev_cnt = GetRawInputDeviceList(devs, &dev_cnt, sizeof(RAWINPUTDEVICELIST)); + if (dev_cnt == (UINT)-1) + { + RARCH_ERR("[WINRAW]: GetRawInputDeviceList failed with error %lu.\n", GetLastError()); + goto error; + } + + for (i = 0; i < dev_cnt; ++i) + mouse_cnt_r += devs[i].dwType == RIM_TYPEMOUSE ? 1 : 0; + + if (mouse_cnt_r) + { + mice_r = (winraw_mouse_t*)calloc(1, mouse_cnt_r * sizeof(winraw_mouse_t)); + if (!mice_r) + goto error; + + if (!GetCursorPos(&crs_pos)) + goto error; + + for (i = 0; i < mouse_cnt_r; ++i) + { + mice_r[i].x = crs_pos.x; + mice_r[i].y = crs_pos.y; + } + } + + /* count is already checked, so this is safe */ + for (i = mouse_cnt_r = 0; i < dev_cnt; ++i) + { + if (devs[i].dwType == RIM_TYPEMOUSE) + mice_r[mouse_cnt_r++].hnd = devs[i].hDevice; + } + + winraw_log_mice_info(mice_r, mouse_cnt_r); + + *mice = mice_r; + *mouse_cnt = mouse_cnt_r; + + return true; + +error: + free(devs); + free(mice_r); + *mice = NULL; + *mouse_cnt = 0; + return false; +} + +static bool winraw_set_mouse_input(HWND window, bool grab) +{ + RAWINPUTDEVICE rid; + BOOL r; + + if (window) + rid.dwFlags = grab ? RIDEV_CAPTUREMOUSE : 0; + else + rid.dwFlags = RIDEV_REMOVE; + + rid.hwndTarget = window; + rid.usUsagePage = 0x01; /* generic desktop */ + rid.usUsage = 0x02; /* mouse */ + + r = RegisterRawInputDevices(&rid, 1, sizeof(RAWINPUTDEVICE)); + + if (!r) + { + RARCH_ERR("[WINRAW]: RegisterRawInputDevice failed with error %lu.\n", GetLastError()); + return false; + } + + return true; +} + +static int16_t winraw_mouse_state(winraw_input_t *wr, + unsigned port, bool abs, unsigned id) +{ + unsigned i; + settings_t *settings = config_get_ptr(); + winraw_mouse_t *mouse = NULL; + + if (port >= MAX_USERS) + return 0; + + for (i = 0; i < g_mouse_cnt; ++i) + { + if (i == settings->uints.input_mouse_index[port]) + { + mouse = &wr->mice[i]; + break; + } + } + + if (!mouse) + return 0; + + switch (id) + { + case RETRO_DEVICE_ID_MOUSE_X: + return abs ? mouse->x : mouse->dlt_x; + case RETRO_DEVICE_ID_MOUSE_Y: + return abs ? mouse->y : mouse->dlt_y; + case RETRO_DEVICE_ID_MOUSE_LEFT: + return mouse->btn_l ? 1 : 0; + case RETRO_DEVICE_ID_MOUSE_RIGHT: + return mouse->btn_r ? 1 : 0; + case RETRO_DEVICE_ID_MOUSE_WHEELUP: + return mouse->whl_u ? 1 : 0; + case RETRO_DEVICE_ID_MOUSE_WHEELDOWN: + return mouse->whl_d ? 1 : 0; + case RETRO_DEVICE_ID_MOUSE_MIDDLE: + return mouse->btn_m ? 1 : 0; + case RETRO_DEVICE_ID_MOUSE_BUTTON_4: + return mouse->btn_b4 ? 1 : 0; + case RETRO_DEVICE_ID_MOUSE_BUTTON_5: + return mouse->btn_b5 ? 1 : 0; + } + + return 0; +} + +static bool winraw_mbutton_pressed(winraw_input_t *wr, unsigned port, unsigned key) +{ + unsigned i; + bool result; + winraw_mouse_t *mouse = NULL; + settings_t *settings = config_get_ptr(); + + if (port >= MAX_USERS) + return false; + + for (i = 0; i < g_mouse_cnt; ++i) + { + if (i == settings->uints.input_mouse_index[port]) + { + mouse = &wr->mice[i]; + break; + } + } + + if (!mouse) + return false; + + switch ( key ) + { + + case RETRO_DEVICE_ID_MOUSE_LEFT: + return mouse->btn_l; + case RETRO_DEVICE_ID_MOUSE_RIGHT: + return mouse->btn_r; + case RETRO_DEVICE_ID_MOUSE_MIDDLE: + return mouse->btn_m; + case RETRO_DEVICE_ID_MOUSE_BUTTON_4: + return mouse->btn_b4; + case RETRO_DEVICE_ID_MOUSE_BUTTON_5: + return mouse->btn_b5; + case RETRO_DEVICE_ID_MOUSE_WHEELUP: + return mouse->whl_u; + case RETRO_DEVICE_ID_MOUSE_WHEELDOWN: + return mouse->whl_d; + } + + return false; +} + +static int16_t winraw_joypad_state(winraw_input_t *wr, + rarch_joypad_info_t joypad_info, + const struct retro_keybind *binds, + unsigned port, unsigned id) +{ + const struct retro_keybind *bind = &binds[id]; + unsigned key = rarch_keysym_lut[(enum retro_key)bind->key]; + + if (!wr->kbd_mapp_block && (bind->key < RETROK_LAST) && wr->keyboard.keys[key]) + return 1; + + if (binds && binds[id].valid && winraw_mbutton_pressed(wr, port, bind->mbutton)) + return 1; + + return input_joypad_pressed(wr->joypad, joypad_info, port, binds, id); +} + +static void winraw_init_mouse_xy_mapping() +{ + struct video_viewport viewport; + int center_x; + int center_y; + unsigned i; + + if (video_driver_get_viewport_info(&viewport)) + { + center_x = viewport.x + viewport.width / 2; + center_y = viewport.y + viewport.height / 2; + + for (i = 0; i < g_mouse_cnt; ++i) + { + g_mice[i].x = center_x; + g_mice[i].y = center_y; + } + + g_view_abs_ratio_x = (double)viewport.full_width / 65535.0; + g_view_abs_ratio_y = (double)viewport.full_height / 65535.0; + + g_mouse_xy_mapping_ready = true; + } +} + +static int16_t winraw_lightgun_state(winraw_input_t *wr, + unsigned port, unsigned id) +{ + unsigned i; + settings_t *settings = config_get_ptr(); + winraw_mouse_t *mouse = NULL; + + if (port >= MAX_USERS) + return 0; + + for (i = 0; i < g_mouse_cnt; ++i) + { + if (i == settings->uints.input_mouse_index[port]) + { + mouse = &wr->mice[i]; + break; + } + } + + if (!mouse) + return 0; + + switch (id) + { + case RETRO_DEVICE_ID_LIGHTGUN_X: + return mouse->dlt_x; + case RETRO_DEVICE_ID_LIGHTGUN_Y: + return mouse->dlt_y; + case RETRO_DEVICE_ID_LIGHTGUN_TRIGGER: + return mouse->btn_l ? 1 : 0; + case RETRO_DEVICE_ID_LIGHTGUN_CURSOR: + return mouse->btn_m ? 1 : 0; + case RETRO_DEVICE_ID_LIGHTGUN_TURBO: + return mouse->btn_r ? 1 : 0; + case RETRO_DEVICE_ID_LIGHTGUN_START: + return (mouse->btn_m && mouse->btn_r) ? 1 : 0; + case RETRO_DEVICE_ID_LIGHTGUN_PAUSE: + return mouse->btn_m && mouse->btn_l ? 1 : 0; + } + + return 0; +} + +static void winraw_update_mouse_state(winraw_mouse_t *mouse, RAWMOUSE *state) +{ + POINT crs_pos; + + if (state->usFlags & MOUSE_MOVE_ABSOLUTE) + { + if (g_mouse_xy_mapping_ready) + { + state->lLastX = (LONG)(g_view_abs_ratio_x * state->lLastX); + state->lLastY = (LONG)(g_view_abs_ratio_y * state->lLastY); + InterlockedExchangeAdd(&mouse->dlt_x, state->lLastX - mouse->x); + InterlockedExchangeAdd(&mouse->dlt_y, state->lLastY - mouse->y); + mouse->x = state->lLastX; + mouse->y = state->lLastY; + } + else + winraw_init_mouse_xy_mapping(); + } + else if (state->lLastX || state->lLastY) + { + InterlockedExchangeAdd(&mouse->dlt_x, state->lLastX); + InterlockedExchangeAdd(&mouse->dlt_y, state->lLastY); + + if (!GetCursorPos(&crs_pos)) + { + RARCH_WARN("[WINRAW]: GetCursorPos failed with error %lu.\n", GetLastError()); + } + else if (!ScreenToClient((HWND)video_driver_window_get(), &crs_pos)) + { + RARCH_WARN("[WINRAW]: ScreenToClient failed with error %lu.\n", GetLastError()); + } + else + { + mouse->x = crs_pos.x; + mouse->y = crs_pos.y; + } + } + + if (state->usButtonFlags & RI_MOUSE_LEFT_BUTTON_DOWN) + mouse->btn_l = true; + else if (state->usButtonFlags & RI_MOUSE_LEFT_BUTTON_UP) + mouse->btn_l = false; + + if (state->usButtonFlags & RI_MOUSE_MIDDLE_BUTTON_DOWN) + mouse->btn_m = true; + else if (state->usButtonFlags & RI_MOUSE_MIDDLE_BUTTON_UP) + mouse->btn_m = false; + + if (state->usButtonFlags & RI_MOUSE_RIGHT_BUTTON_DOWN) + mouse->btn_r = true; + else if (state->usButtonFlags & RI_MOUSE_RIGHT_BUTTON_UP) + mouse->btn_r = false; + + if (state->usButtonFlags & RI_MOUSE_BUTTON_4_DOWN) + mouse->btn_b4 = true; + else if (state->usButtonFlags & RI_MOUSE_BUTTON_4_UP) + mouse->btn_b4 = false; + + if (state->usButtonFlags & RI_MOUSE_BUTTON_5_DOWN) + mouse->btn_b5 = true; + else if (state->usButtonFlags & RI_MOUSE_BUTTON_5_UP) + mouse->btn_b5 = false; + + if (state->usButtonFlags & RI_MOUSE_WHEEL) + { + if ((SHORT)state->usButtonData > 0) + InterlockedExchange(&mouse->whl_u, 1); + else if ((SHORT)state->usButtonData < 0) + InterlockedExchange(&mouse->whl_d, 1); + } +} + +static LRESULT CALLBACK winraw_callback(HWND wnd, UINT msg, WPARAM wpar, LPARAM lpar) +{ + static uint8_t data[1024]; + UINT r; + unsigned i; + RAWINPUT *ri = (RAWINPUT*)data; + UINT size = sizeof(data); + + if (msg != WM_INPUT) + return DefWindowProcA(wnd, msg, wpar, lpar); + + /* app is in the background */ + if (GET_RAWINPUT_CODE_WPARAM(wpar) != RIM_INPUT) + goto end; + + r = GetRawInputData((HRAWINPUT)lpar, RID_INPUT, + data, &size, sizeof(RAWINPUTHEADER)); + if (r == (UINT)-1) + { + RARCH_WARN("[WINRAW]: GetRawInputData failed with error %lu.\n", + GetLastError()); + goto end; + } + + if (ri->header.dwType == RIM_TYPEKEYBOARD) + { + if (ri->data.keyboard.Message == WM_KEYDOWN) + g_keyboard->keys[ri->data.keyboard.VKey] = 1; + else if (ri->data.keyboard.Message == WM_KEYUP) + g_keyboard->keys[ri->data.keyboard.VKey] = 0; + } + else if (ri->header.dwType == RIM_TYPEMOUSE) + { + for (i = 0; i < g_mouse_cnt; ++i) + { + if (g_mice[i].hnd == ri->header.hDevice) + { + winraw_update_mouse_state(&g_mice[i], &ri->data.mouse); + break; + } + } + } + +end: + DefWindowProcA(wnd, msg, wpar, lpar); + return 0; +} + +static void *winraw_init(const char *joypad_driver) +{ + bool r; + winraw_input_t *wr = (winraw_input_t *) + calloc(1, sizeof(winraw_input_t)); + g_keyboard = (winraw_keyboard_t*) + calloc(1, sizeof(winraw_keyboard_t)); + + if (!wr || !g_keyboard) + goto error; + + RARCH_LOG("[WINRAW]: Initializing input driver... \n"); + + input_keymaps_init_keyboard_lut(rarch_key_map_winraw); + + wr->window = winraw_create_window(winraw_callback); + if (!wr->window) + goto error; + + r = winraw_init_devices(&g_mice, &g_mouse_cnt); + if (!r) + goto error; + + if (!g_mouse_cnt) + { + RARCH_LOG("[WINRAW]: Mouse unavailable.\n"); + } + else + { + wr->mice = (winraw_mouse_t*) + malloc(g_mouse_cnt * sizeof(winraw_mouse_t)); + if (!wr->mice) + goto error; + + memcpy(wr->mice, g_mice, g_mouse_cnt * sizeof(winraw_mouse_t)); + } + + r = winraw_set_keyboard_input(wr->window); + if (!r) + goto error; + + r = winraw_set_mouse_input(wr->window, false); + if (!r) + goto error; + + wr->joypad = input_joypad_init_driver(joypad_driver, wr); + + return wr; + +error: + if (wr && wr->window) + { + winraw_set_mouse_input(NULL, false); + winraw_set_keyboard_input(NULL); + winraw_destroy_window(wr->window); + } + free(g_keyboard); + free(g_mice); + if (wr) + free(wr->mice); + free(wr); + return NULL; +} + +static void winraw_poll(void *d) +{ + unsigned i; + winraw_input_t *wr = (winraw_input_t*)d; + + memcpy(&wr->keyboard, g_keyboard, sizeof(winraw_keyboard_t)); + + /* following keys are not handled by windows raw input api */ + wr->keyboard.keys[VK_LCONTROL] = GetAsyncKeyState(VK_LCONTROL) >> 1 ? 1 : 0; + wr->keyboard.keys[VK_RCONTROL] = GetAsyncKeyState(VK_RCONTROL) >> 1 ? 1 : 0; + wr->keyboard.keys[VK_LMENU] = GetAsyncKeyState(VK_LMENU) >> 1 ? 1 : 0; + wr->keyboard.keys[VK_RMENU] = GetAsyncKeyState(VK_RMENU) >> 1 ? 1 : 0; + wr->keyboard.keys[VK_LSHIFT] = GetAsyncKeyState(VK_LSHIFT) >> 1 ? 1 : 0; + wr->keyboard.keys[VK_RSHIFT] = GetAsyncKeyState(VK_RSHIFT) >> 1 ? 1 : 0; + + for (i = 0; i < g_mouse_cnt; ++i) + { + wr->mice[i].x = g_mice[i].x; + wr->mice[i].y = g_mice[i].y; + wr->mice[i].dlt_x = InterlockedExchange(&g_mice[i].dlt_x, 0); + wr->mice[i].dlt_y = InterlockedExchange(&g_mice[i].dlt_y, 0); + wr->mice[i].whl_u = InterlockedExchange(&g_mice[i].whl_u, 0); + wr->mice[i].whl_d = InterlockedExchange(&g_mice[i].whl_d, 0); + wr->mice[i].btn_l = g_mice[i].btn_l; + wr->mice[i].btn_m = g_mice[i].btn_m; + wr->mice[i].btn_r = g_mice[i].btn_r; + wr->mice[i].btn_b4 = g_mice[i].btn_b4; + wr->mice[i].btn_b5 = g_mice[i].btn_b5; + } + + if (wr->joypad) + wr->joypad->poll(); +} + +static int16_t winraw_input_state(void *d, + rarch_joypad_info_t joypad_info, + const struct retro_keybind **binds, + unsigned port, unsigned device, unsigned index, unsigned id) +{ + winraw_input_t *wr = (winraw_input_t*)d; + + switch (device) + { + case RETRO_DEVICE_KEYBOARD: + if (id < RETROK_LAST) + { + unsigned key = rarch_keysym_lut[(enum retro_key)id]; + return wr->keyboard.keys[key]; + } + break; + case RETRO_DEVICE_MOUSE: + return winraw_mouse_state(wr, port, false, id); + case RARCH_DEVICE_MOUSE_SCREEN: + return winraw_mouse_state(wr, port, true, id); + case RETRO_DEVICE_JOYPAD: + return winraw_joypad_state(wr, joypad_info, binds[port], port, id); + case RETRO_DEVICE_ANALOG: + if (binds[port]) + return input_joypad_analog(wr->joypad, joypad_info, + port, index, id, binds[port]); + break; + case RETRO_DEVICE_LIGHTGUN: + return winraw_lightgun_state(wr, port, id); + } + + return 0; +} + +static bool winraw_meta_key_pressed(void *u1, int u2) +{ + return false; +} + +static void winraw_free(void *d) +{ + winraw_input_t *wr = (winraw_input_t*)d; + + if (wr->joypad) + wr->joypad->destroy(); + winraw_set_mouse_input(NULL, false); + winraw_set_keyboard_input(NULL); + winraw_destroy_window(wr->window); + free(g_mice); + free(g_keyboard); + free(wr->mice); + free(wr); + + g_mouse_xy_mapping_ready = false; +} + +static uint64_t winraw_get_capabilities(void *u) +{ + return (1 << RETRO_DEVICE_KEYBOARD) | + (1 << RETRO_DEVICE_MOUSE) | + (1 << RETRO_DEVICE_JOYPAD) | + (1 << RETRO_DEVICE_ANALOG) | + (1 << RETRO_DEVICE_LIGHTGUN); +} + +static void winraw_grab_mouse(void *d, bool grab) +{ + bool r = false; + winraw_input_t *wr = (winraw_input_t*)d; + + if (grab == wr->mouse_grab) + return; + + r = winraw_set_mouse_input(wr->window, grab); + if (!r) + return; + + wr->mouse_grab = grab; +} + +static bool winraw_set_rumble(void *d, unsigned port, + enum retro_rumble_effect effect, uint16_t strength) +{ + winraw_input_t *wr = (winraw_input_t*)d; + + return input_joypad_set_rumble(wr->joypad, port, effect, strength); +} + +static const input_device_driver_t *winraw_get_joypad_driver(void *d) +{ + winraw_input_t *wr = (winraw_input_t*)d; + + return wr->joypad; +} + +static bool winraw_keyboard_mapping_is_blocked(void *d) +{ + winraw_input_t *wr = (winraw_input_t*)d; + + return wr->kbd_mapp_block; +} + +static void winraw_keyboard_mapping_set_block(void *d, bool block) +{ + winraw_input_t *wr = (winraw_input_t*)d; + + wr->kbd_mapp_block = block; +} + +input_driver_t input_winraw = { + winraw_init, + winraw_poll, + winraw_input_state, + winraw_meta_key_pressed, + winraw_free, + NULL, + NULL, + winraw_get_capabilities, + "raw", + winraw_grab_mouse, + NULL, + winraw_set_rumble, + winraw_get_joypad_driver, + NULL, + winraw_keyboard_mapping_is_blocked, + winraw_keyboard_mapping_set_block, +}; 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 */ diff --git a/input/input_defines.h b/input/input_defines.h index 2d1d88d3f3..d9ef13cc37 100644 --- a/input/input_defines.h +++ b/input/input_defines.h @@ -26,6 +26,8 @@ RETRO_BEGIN_DECLS #define MAX_USERS 16 #define RARCH_FIRST_CUSTOM_BIND 16 +#define RARCH_FIRST_LIGHTGUN_BIND RARCH_ANALOG_BIND_LIST_END +#define RARCH_FIRST_MISC_CUSTOM_BIND RARCH_LIGHTGUN_BIND_LIST_END #define RARCH_FIRST_META_KEY RARCH_CUSTOM_BIND_LIST_END /* RetroArch specific bind IDs. */ @@ -42,9 +44,24 @@ enum RARCH_ANALOG_RIGHT_X_MINUS, RARCH_ANALOG_RIGHT_Y_PLUS, RARCH_ANALOG_RIGHT_Y_MINUS, + RARCH_ANALOG_BIND_LIST_END, + + /* Lightgun */ + RARCH_LIGHTGUN_TRIGGER = RARCH_FIRST_LIGHTGUN_BIND, + RARCH_LIGHTGUN_RELOAD, + RARCH_LIGHTGUN_AUX_A, + RARCH_LIGHTGUN_AUX_B, + RARCH_LIGHTGUN_AUX_C, + RARCH_LIGHTGUN_START, + RARCH_LIGHTGUN_SELECT, + RARCH_LIGHTGUN_DPAD_UP, + RARCH_LIGHTGUN_DPAD_DOWN, + RARCH_LIGHTGUN_DPAD_LEFT, + RARCH_LIGHTGUN_DPAD_RIGHT, + RARCH_LIGHTGUN_BIND_LIST_END, /* Turbo */ - RARCH_TURBO_ENABLE, + RARCH_TURBO_ENABLE = RARCH_FIRST_MISC_CUSTOM_BIND, RARCH_CUSTOM_BIND_LIST_END, diff --git a/input/input_driver.c b/input/input_driver.c index a4af4525cb..eabb1bd733 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -267,6 +267,18 @@ const struct input_bind_map input_config_bind_map[RARCH_BIND_LIST_END_NULL] = { DECLARE_BIND(r_y_plus, RARCH_ANALOG_RIGHT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS), DECLARE_BIND(r_y_minus, RARCH_ANALOG_RIGHT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS), + DECLARE_BIND( gun_trigger, RARCH_LIGHTGUN_TRIGGER, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER ), + DECLARE_BIND( gun_offscreen_shot, RARCH_LIGHTGUN_RELOAD, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD ), + DECLARE_BIND( gun_aux_a, RARCH_LIGHTGUN_AUX_A, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A ), + DECLARE_BIND( gun_aux_b, RARCH_LIGHTGUN_AUX_B, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B ), + DECLARE_BIND( gun_aux_c, RARCH_LIGHTGUN_AUX_C, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C ), + DECLARE_BIND( gun_start, RARCH_LIGHTGUN_START, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START ), + DECLARE_BIND( gun_select, RARCH_LIGHTGUN_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT ), + DECLARE_BIND( gun_dpad_up, RARCH_LIGHTGUN_DPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP ), + DECLARE_BIND( gun_dpad_down, RARCH_LIGHTGUN_DPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN ), + DECLARE_BIND( gun_dpad_left, RARCH_LIGHTGUN_DPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT ), + DECLARE_BIND( gun_dpad_right, RARCH_LIGHTGUN_DPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT ), + DECLARE_BIND(turbo, RARCH_TURBO_ENABLE, MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE), DECLARE_META_BIND(1, toggle_fast_forward, RARCH_FAST_FORWARD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_KEY), @@ -381,6 +393,7 @@ static const void *hid_data = NULL; #define check_input_driver_block_hotkey(normal_bind, autoconf_bind) \ ( \ (((normal_bind)->key != RETROK_UNKNOWN) \ + || ((normal_bind)->mbutton != NO_BTN) \ || ((normal_bind)->joykey != NO_BTN) \ || ((normal_bind)->joyaxis != AXIS_NONE) \ || ((autoconf_bind)->key != RETROK_UNKNOWN ) \ @@ -669,7 +682,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. */ @@ -778,17 +792,12 @@ 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) +void input_menu_keys_pressed(void *data, retro_bits_t* p_new_state) { unsigned i, port; rarch_joypad_info_t joypad_info; - uint64_t ret = 0; const struct retro_keybind *binds[MAX_USERS] = {NULL}; settings_t *settings = (settings_t*)data; const struct retro_keybind *binds_norm = NULL; @@ -798,6 +807,8 @@ uint64_t input_menu_keys_pressed(void *data, uint64_t last_input) 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; @@ -898,7 +909,7 @@ uint64_t input_menu_keys_pressed(void *data, uint64_t last_input) if (pressed) { - BIT64_SET(ret, i); + RARCH_INPUT_STATE_BIT_SET_PTR(p_new_state, i); continue; } } @@ -908,7 +919,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_PTR(p_new_state, i); continue; } } @@ -916,7 +927,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_PTR(p_new_state, i); continue; } #endif @@ -931,7 +942,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_PTR(p_new_state, i); continue; } } @@ -940,7 +951,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_PTR(p_new_state, i); continue; } #endif @@ -995,11 +1006,9 @@ 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_PTR(p_new_state, ids[i][1]); } } - - return ret; } #endif @@ -1008,17 +1017,12 @@ 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) +void input_keys_pressed(void *data, retro_bits_t* p_new_state) { unsigned i; rarch_joypad_info_t joypad_info; - uint64_t ret = 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]; @@ -1029,6 +1033,8 @@ uint64_t input_keys_pressed(void *data, uint64_t last_input) 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; @@ -1073,7 +1079,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_PTR(p_new_state, i); continue; } @@ -1081,7 +1087,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_PTR(p_new_state, i); continue; } @@ -1089,7 +1095,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_PTR(p_new_state, i); continue; } #endif @@ -1104,7 +1110,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_PTR(p_new_state, i); continue; } } @@ -1114,13 +1120,11 @@ 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_PTR(p_new_state, i); continue; } #endif } - - return ret; } @@ -1753,6 +1757,39 @@ bool input_joypad_hat_raw(const input_device_driver_t *drv, return drv->button(port, HAT_MAP(hat, hat_dir)); } +/** + * input_mouse_button_raw: + * @port : Mouse number. + * @button : Identifier of key (libretro mouse constant). + * + * Checks if key (@button) was being pressed by user + * with mouse number @port. + * + * Returns: true (1) if key was pressed, otherwise + * false (0). + **/ +bool input_mouse_button_raw(unsigned port, unsigned id) +{ + int16_t res; + rarch_joypad_info_t joypad_info; + settings_t *settings = config_get_ptr(); + + /*ignore axes*/ + if ( id == RETRO_DEVICE_ID_MOUSE_X || id == RETRO_DEVICE_ID_MOUSE_Y ) + return false; + + joypad_info.axis_threshold = input_driver_axis_threshold; + joypad_info.joy_idx = settings->uints.input_joypad_map[port]; + joypad_info.auto_binds = input_autoconf_binds[joypad_info.joy_idx]; + + res = current_input->input_state(current_input_data, + joypad_info, libretro_input_binds, port, RETRO_DEVICE_MOUSE, 0, id); + + if (res) + return true; + return false; +} + /** * input_conv_analog_id_to_bind_id: * @idx : Analog key index. @@ -2419,6 +2456,74 @@ void input_config_parse_joy_axis(void *data, const char *prefix, } } +void input_config_parse_mouse_button(void *data, const char *prefix, + const char *btn, struct retro_keybind *bind) +{ + int val; + char str[256]; + char tmp[64]; + char key[64]; + config_file_t *conf = (config_file_t*)data; + + str[0] = tmp[0] = key[0] = '\0'; + + fill_pathname_join_delim(str, prefix, btn, + '_', sizeof(str)); + fill_pathname_join_delim(key, str, + "mbtn", '_', sizeof(key)); + + if ( bind && config_get_array(conf, key, tmp, sizeof(tmp)) ) + { + bind->mbutton = NO_BTN; + + if ( tmp[0]=='w' ) + { + switch ( tmp[1] ) + { + case 'u': + bind->mbutton = RETRO_DEVICE_ID_MOUSE_WHEELUP; + break; + case 'd': + bind->mbutton = RETRO_DEVICE_ID_MOUSE_WHEELDOWN; + break; + case 'h': + switch ( tmp[2] ) + { + case 'u': + bind->mbutton = RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP; + break; + case 'd': + bind->mbutton = RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN; + break; + } + break; + } + } + else + { + val = atoi(tmp); + switch ( val ) + { + case 1: + bind->mbutton = RETRO_DEVICE_ID_MOUSE_LEFT; + break; + case 2: + bind->mbutton = RETRO_DEVICE_ID_MOUSE_RIGHT; + break; + case 3: + bind->mbutton = RETRO_DEVICE_ID_MOUSE_MIDDLE; + break; + case 4: + bind->mbutton = RETRO_DEVICE_ID_MOUSE_BUTTON_4; + break; + case 5: + bind->mbutton = RETRO_DEVICE_ID_MOUSE_BUTTON_5; + break; + } + } + } +} + static void input_config_get_bind_string_joykey( char *buf, const char *prefix, const struct retro_keybind *bind, size_t size) @@ -2461,9 +2566,9 @@ static void input_config_get_bind_string_joykey( { if (bind->joykey_label && !string_is_empty(bind->joykey_label) && label_show) - snprintf(buf, size, "%s%s (btn) ", prefix, bind->joykey_label); + snprintf(buf, size, "%s%s (btn)", prefix, bind->joykey_label); else - snprintf(buf, size, "%s%u (%s) ", prefix, (unsigned)bind->joykey, + snprintf(buf, size, "%s%u (%s)", prefix, (unsigned)bind->joykey, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE)); } } @@ -2491,7 +2596,7 @@ static void input_config_get_bind_string_joyaxis(char *buf, const char *prefix, dir = '+'; axis = AXIS_POS_GET(bind->joyaxis); } - snprintf(buf, size, "%s%c%u (%s) ", prefix, dir, axis, + snprintf(buf, size, "%s%c%u (%s)", prefix, dir, axis, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE)); } } @@ -2499,6 +2604,7 @@ static void input_config_get_bind_string_joyaxis(char *buf, const char *prefix, void input_config_get_bind_string(char *buf, const struct retro_keybind *bind, const struct retro_keybind *auto_bind, size_t size) { + int delim = 0; #ifndef RARCH_CONSOLE char key[64]; char keybuf[64]; @@ -2516,14 +2622,70 @@ void input_config_get_bind_string(char *buf, const struct retro_keybind *bind, else if (auto_bind && auto_bind->joyaxis != AXIS_NONE) input_config_get_bind_string_joyaxis(buf, "Auto: ", auto_bind, size); + if (*buf) + delim = 1; + #ifndef RARCH_CONSOLE input_keymaps_translate_rk_to_str(bind->key, key, sizeof(key)); if (string_is_equal(key, file_path_str(FILE_PATH_NUL))) *key = '\0'; - - snprintf(keybuf, sizeof(keybuf), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_KEY), key); - strlcat(buf, keybuf, size); + /*empty?*/ + if (*key != '\0') + { + if (delim ) + strlcat(buf, ", ", size); + snprintf(keybuf, sizeof(keybuf), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_KEY), key); + strlcat(buf, keybuf, size); + delim = 1; + } #endif + + if ( bind->mbutton != NO_BTN ) + { + int tag = 0; + switch ( bind->mbutton ) + { + case RETRO_DEVICE_ID_MOUSE_LEFT: + tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT; + break; + case RETRO_DEVICE_ID_MOUSE_RIGHT: + tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT; + break; + case RETRO_DEVICE_ID_MOUSE_MIDDLE: + tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE; + break; + case RETRO_DEVICE_ID_MOUSE_BUTTON_4: + tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4; + break; + case RETRO_DEVICE_ID_MOUSE_BUTTON_5: + tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5; + break; + case RETRO_DEVICE_ID_MOUSE_WHEELUP: + tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP; + break; + case RETRO_DEVICE_ID_MOUSE_WHEELDOWN: + tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN; + break; + case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP: + tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP; + break; + case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN: + tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN; + break; + } /* switch ( bind->mbutton ) */ + + if (tag != 0) + { + if (delim) + strlcat(buf, ", ", size); + strlcat(buf, msg_hash_to_str((enum msg_hash_enums)tag), size ); + delim = 1; + } + } + + /*completely empty?*/ + if ( *buf == '\0' ) + strlcat(buf, "---", size); } const char *input_config_get_device_name(unsigned port) @@ -2536,11 +2698,9 @@ const char *input_config_get_device_name(unsigned port) void input_config_set_device_name(unsigned port, const char *name) { if (!string_is_empty(name)) - { strlcpy(input_device_names[port], name, sizeof(input_device_names[port])); - } } void input_config_clear_device_name(unsigned port) @@ -2580,7 +2740,8 @@ bool input_config_get_bind_idx(unsigned port, unsigned *joy_idx_real) return true; } -const struct retro_keybind *input_config_get_bind_auto(unsigned port, unsigned id) +const struct retro_keybind *input_config_get_bind_auto( + unsigned port, unsigned id) { settings_t *settings = config_get_ptr(); unsigned joy_idx = settings->uints.input_joypad_map[port]; diff --git a/input/input_driver.h b/input/input_driver.h index 3267efeacd..c3084979a9 100644 --- a/input/input_driver.h +++ b/input/input_driver.h @@ -30,6 +30,7 @@ #include #include #include +#include #include "input_defines.h" @@ -95,6 +96,8 @@ struct retro_keybind enum msg_hash_enums enum_idx; enum retro_key key; + uint16_t mbutton; + /* Joypad key. Joypad POV (hats) * are embedded into this key as well. */ uint64_t joykey; @@ -333,10 +336,30 @@ 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); +#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).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])); + +void input_keys_pressed(void *data, retro_bits_t* new_state); #ifdef HAVE_MENU -uint64_t input_menu_keys_pressed(void *data, uint64_t last_input); +void input_menu_keys_pressed(void *data, retro_bits_t* new_state); #endif void *input_driver_get_data(void); @@ -585,7 +608,20 @@ bool input_joypad_hat_raw(const input_device_driver_t *driver, unsigned joypad, unsigned hat_dir, unsigned hat); /** - * input_joypad_name: + * input_mouse_button_raw: + * @port : Mouse number. + * @button : Identifier of key (libretro mouse constant). + * + * Checks if key (@button) was being pressed by user + * with mouse number @port. + * + * Returns: true (1) if key was pressed, otherwise + * false (0). + **/ +bool input_mouse_button_raw(unsigned port, unsigned button); + +/** + * input_joypad_name: * @drv : Input device driver handle. * @port : Joystick number. * @@ -738,6 +774,9 @@ void input_config_parse_joy_button(void *data, const char *prefix, void input_config_parse_joy_axis(void *data, const char *prefix, const char *axis, struct retro_keybind *bind); +void input_config_parse_mouse_button(void *data, const char *prefix, + const char *btn, struct retro_keybind *bind); + void input_config_set_device_name(unsigned port, const char *name); void input_config_clear_device_name(unsigned port); 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, diff --git a/intl/msg_hash_chs.h b/intl/msg_hash_chs.h index 142ffad5d7..d9d5f633c1 100644 --- a/intl/msg_hash_chs.h +++ b/intl/msg_hash_chs.h @@ -682,6 +682,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, "右摇杆Y- (上)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, "右摇杆Y+ (下)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "启用自动配置") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, @@ -744,6 +766,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, "Y键(左侧)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(键: %s)") /*FIXME:"(Key: %s)"*/ +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "Mouse 1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "Mouse 2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "Mouse 3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "Mouse 4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "Mouse 5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "Wheel Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "Wheel Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "Wheel Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "键盘控制器映射类型") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, diff --git a/intl/msg_hash_cht.h b/intl/msg_hash_cht.h index 9e13d1de7d..3074dc5f32 100644 --- a/intl/msg_hash_cht.h +++ b/intl/msg_hash_cht.h @@ -682,6 +682,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, "右搖桿Y- (上)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, "右搖桿Y+ (下)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "啟用自動設定") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, @@ -744,6 +766,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, "Y鍵(左側)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(鍵: %s)") /*FIXME:"(Key: %s)"*/ +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "Mouse 1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "Mouse 2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "Mouse 3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "Mouse 4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "Mouse 5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "Wheel Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "Wheel Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "Wheel Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "鍵盤控制器映射類型") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, diff --git a/intl/msg_hash_de.h b/intl/msg_hash_de.h index 44c710daff..e5bf9687e8 100644 --- a/intl/msg_hash_de.h +++ b/intl/msg_hash_de.h @@ -687,6 +687,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, "Rechter Analogstick Y- (nach oben)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, "Rechter Analogstick Y+ (nach unten)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Automatische Konfiguration aktivieren") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, @@ -751,6 +773,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, "Y-Knopf (links)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Taste: %s)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "Mouse 1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "Mouse 2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "Mouse 3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "Mouse 4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "Mouse 5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "Wheel Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "Wheel Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "Wheel Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "Typ der Keyboard-Controller-Abbildung") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, diff --git a/intl/msg_hash_eo.h b/intl/msg_hash_eo.h index c17db311bb..3f16073e95 100644 --- a/intl/msg_hash_eo.h +++ b/intl/msg_hash_eo.h @@ -598,6 +598,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, "Right analog Y- (up)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, "Right analog Y+ (down)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Autoconfig Enable") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, @@ -660,6 +682,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, "Y button (left)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Key: %s)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "Mouse 1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "Mouse 2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "Mouse 3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "Mouse 4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "Mouse 5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "Wheel Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "Wheel Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "Wheel Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "Keyboard Gamepad Mapping Type") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, diff --git a/intl/msg_hash_fr.h b/intl/msg_hash_fr.h index fa1094a768..1920e13ad8 100644 --- a/intl/msg_hash_fr.h +++ b/intl/msg_hash_fr.h @@ -681,6 +681,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, "Analogique droit Y- (haut)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, "Analogique droit Y+ (bas)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Activer l'autoconfiguration") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, @@ -745,6 +767,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, "Bouton Y (gauche)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Touche : %s)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "Mouse 1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "Mouse 2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "Mouse 3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "Mouse 4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "Mouse 5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "Wheel Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "Wheel Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "Wheel Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "Type de mappage manette/clavier") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, diff --git a/intl/msg_hash_it.h b/intl/msg_hash_it.h index c94ed5b0b8..22232ed4f4 100644 --- a/intl/msg_hash_it.h +++ b/intl/msg_hash_it.h @@ -687,6 +687,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, "Analogico Destro Y- (su)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, "Analogico Destro Y+ (giù)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Abilita Autoconfigurazione") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, @@ -751,6 +773,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, "Pulsante Y (sinistro)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Tasto: %s)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "Mouse 1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "Mouse 2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "Mouse 3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "Mouse 4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "Mouse 5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "Wheel Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "Wheel Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "Wheel Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "Tipo di mappatura del gamepad della tastiera") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, @@ -2228,7 +2268,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, diff --git a/intl/msg_hash_ja.h b/intl/msg_hash_ja.h index 3c772118af..ebae8a65ed 100644 --- a/intl/msg_hash_ja.h +++ b/intl/msg_hash_ja.h @@ -705,6 +705,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, "右アナログY- (上)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, "右アナログY+ (下)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "自動コンフィグを有効") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, @@ -769,6 +791,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, "Yボタン(左)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(キー: %s)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "Mouse 1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "Mouse 2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "Mouse 3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "Mouse 4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "Mouse 5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "Wheel Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "Wheel Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "Wheel Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "キーボードのゲームパッドマッピング式") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, diff --git a/intl/msg_hash_ko.h b/intl/msg_hash_ko.h index f4e980e451..9a22edd4c8 100644 --- a/intl/msg_hash_ko.h +++ b/intl/msg_hash_ko.h @@ -669,6 +669,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, "우 아날로그 Y- (상)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, "우 아날로그 Y+ (하)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "자동설정 사용") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, @@ -731,6 +753,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, "Y 버튼 (좌)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(키: %s)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "Mouse 1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "Mouse 2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "Mouse 3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "Mouse 4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "Mouse 5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "Wheel Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "Wheel Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "Wheel Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "키보드 게임패드 설정 형식") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index fbf28f4ca6..32cd47b828 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, @@ -148,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_nl.h b/intl/msg_hash_nl.h index d414566d66..dcd21e2962 100644 --- a/intl/msg_hash_nl.h +++ b/intl/msg_hash_nl.h @@ -598,6 +598,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, "Right analog Y- (up)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, "Right analog Y+ (down)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Autoconfiguratie Activeren") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, @@ -660,6 +682,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, "Y knop (left)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Key: %s)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "Mouse 1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "Mouse 2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "Mouse 3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "Mouse 4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "Mouse 5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "Wheel Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "Wheel Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "Wheel Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "Keyboard Gamepad Mapping Type") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, diff --git a/intl/msg_hash_pt_br.h b/intl/msg_hash_pt_br.h index dcaeaebd75..2603504428 100644 --- a/intl/msg_hash_pt_br.h +++ b/intl/msg_hash_pt_br.h @@ -661,6 +661,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, "Analógico Direito Y+ (baixo)" ) +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Habilitar Autoconfiguração" ) @@ -757,6 +779,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Tecla: %s)" ) +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "Mouse 1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "Mouse 2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "Mouse 3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "Mouse 4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "Mouse 5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "Wheel Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "Wheel Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "Wheel Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "Tipo de Mapeamento para Gamepad no Teclado" ) diff --git a/intl/msg_hash_pt_pt.h b/intl/msg_hash_pt_pt.h index 800463bdc5..9e6cb8641d 100644 --- a/intl/msg_hash_pt_pt.h +++ b/intl/msg_hash_pt_pt.h @@ -669,6 +669,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, "Analógico Direito Y- (cima)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, "Analógico Direito Y+ (baixo)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Habilitar Auto-configuração") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, @@ -731,6 +753,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, "Botão Y (esquerda)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Tecla: %s)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "Mouse 1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "Mouse 2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "Mouse 3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "Mouse 4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "Mouse 5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "Wheel Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "Wheel Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "Wheel Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "Tipo de Mapeamento do Gamepad no Teclado") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, diff --git a/intl/msg_hash_ru.h b/intl/msg_hash_ru.h index 3cc733e238..84aec3c7ba 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,69 @@ 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_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, - "Авто-конфигурация включена") + "Автоматическая настройка включена") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, "Мертвая зона у стиков") 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, @@ -754,6 +776,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, "Кнопка Y") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Клавиша: %s)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "Mouse 1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "Mouse 2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "Mouse 3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "Mouse 4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "Mouse 5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "Wheel Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "Wheel Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "Wheel Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "Тип отображения клавиатуры для геймпада") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, @@ -761,9 +801,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 +835,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 +887,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 +895,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 +917,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 +931,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 +941,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 +959,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 +1011,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 +1023,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 +1057,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 +1071,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 +1109,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 +1251,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 +1371,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 +1389,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 +1411,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 +1479,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 +1541,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 +1571,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 +1599,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 +1611,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 +1639,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 +1671,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 +1723,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 +1753,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 +1763,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 +1799,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 +1859,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 +1871,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 +1887,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 +1911,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 +1927,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 +1941,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 +1955,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 +2199,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 +2289,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 +2320,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 +2344,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 +2356,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 +2380,7 @@ MSG_HASH( ) MSG_HASH( MSG_FAILED, - "Не вышло" + "Не удалось" ) MSG_HASH( MSG_SUCCEEDED, @@ -2360,11 +2400,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 +2420,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 +2464,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 +2482,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 +2496,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 +2510,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 +2534,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 +2544,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 +2575,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 +2623,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 +2727,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 +2735,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 +2791,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 +2853,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 +2931,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 +2939,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 +2971,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 +2983,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 +3010,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 +3031,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 +3040,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 +3086,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_MIXER_VOLUME, - "Уровень громкости звукового микшера (dB)" + "Уровень громкости звукового микшера (дБ)" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_MIXER_MUTE, @@ -3103,114 +3143,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.") + "Пароль неверен.") diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index a7f516c586..f877546905 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:" @@ -458,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" @@ -691,6 +699,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, "Right analog Y- (up)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, "Right analog Y+ (down)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Autoconfig Enable") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, @@ -755,6 +785,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, "Y button (left)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Key: %s)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "Mouse 1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "Mouse 2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "Mouse 3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "Mouse 4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "Mouse 5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "Wheel Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "Wheel Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "Wheel Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "Keyboard Gamepad Mapping Type") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, @@ -1791,6 +1839,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/intl/msg_hash_vn.h b/intl/msg_hash_vn.h index ca95e43315..efea88ed20 100644 --- a/intl/msg_hash_vn.h +++ b/intl/msg_hash_vn.h @@ -681,6 +681,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, "Right analog Y- (up)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, "Right analog Y+ (down)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Kích hoạt Autoconfig") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, @@ -743,6 +765,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, "Y button (left)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Key: %s)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "Mouse 1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "Mouse 2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "Mouse 3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "Mouse 4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "Mouse 5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "Wheel Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "Wheel Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "Wheel Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "Keyboard Gamepad Mapping Type") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, diff --git a/libretro-common/compat/compat_strl.c b/libretro-common/compat/compat_strl.c index 668b3d9236..9886b22ed2 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 @@ -60,3 +61,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 = (char*)malloc(sizeof(char) * (n + 1)); + strlcpy(dst, s, n); + return dst; +} 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 diff --git a/libretro-common/file/nbio/nbio_intf.c b/libretro-common/file/nbio/nbio_intf.c new file mode 100644 index 0000000000..57d3eb6484 --- /dev/null +++ b/libretro-common/file/nbio/nbio_intf.c @@ -0,0 +1,85 @@ +/* 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 + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#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(_linux__) +static nbio_intf_t *internal_nbio = &nbio_linux; +#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; +#else +static nbio_intf_t *internal_nbio = &nbio_stdio; +#endif + +void *nbio_open(const char * filename, unsigned mode) +{ + return internal_nbio->open(filename, mode); +} + +void nbio_begin_read(void *data) +{ + internal_nbio->begin_read(data); +} + +void nbio_begin_write(void *data) +{ + internal_nbio->begin_write(data); +} + +bool nbio_iterate(void *data) +{ + return internal_nbio->iterate(data); +} + +void nbio_resize(void *data, size_t len) +{ + internal_nbio->resize(data, len); +} + +void *nbio_get_ptr(void *data, size_t* len) +{ + return internal_nbio->get_ptr(data, len); +} + +void nbio_cancel(void *data) +{ + internal_nbio->cancel(data); +} + +void nbio_free(void *data) +{ + internal_nbio->free(data); +} diff --git a/libretro-common/file/nbio/nbio_linux.c b/libretro-common/file/nbio/nbio_linux.c new file mode 100644 index 0000000000..7b40551194 --- /dev/null +++ b/libretro-common/file/nbio/nbio_linux.c @@ -0,0 +1,243 @@ +/* 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. + */ + +#include + +#if defined(__linux__) + +#define _GNU_SOURCE +#include +#include +#include +#include + + +#include +#include +#include +#include + +struct nbio_linux_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); +} + +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); +} + +static void nbio_begin_op(struct nbio_linux_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; +} + +static void *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_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_read(void *data) +{ + struct nbio_linux_t* handle = (struct nbio_linux_t*)data; + if (handle) + nbio_begin_op(handle, IOCB_CMD_PREAD); +} + +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; + if (io_getevents(handle->ctx, 0, 1, &ev, NULL) == 1) + handle->busy = false; + } + return !handle->busy; +} + +static void nbio_linux_resize(void *data, size_t len) +{ + struct nbio_linux_t* handle = (struct nbio_linux_t*)data; + if (!handle) + return; + + 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; +} + +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) + *len = handle->len; + if (!handle->busy) + return handle->ptr; + return NULL; +} + +static void nbio_linux_cancel(void *data) +{ + struct nbio_linux_t* handle = (struct nbio_linux_t*)data; + if (!handle) + return; + + if (handle->busy) + { + struct io_event ev; + io_cancel(handle->ctx, &handle->cb, &ev); + handle->busy = false; + } +} + +static void nbio_linux_free(void *data) +{ + struct nbio_linux_t* handle = (struct nbio_linux_t*)data; + if (!handle) + return; + + io_destroy(handle->ctx); + close(handle->fd); + 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", +}; +#else +nbio_intf_t nbio_linux = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "nbio_linux", +}; + +#endif diff --git a/libretro-common/file/nbio/nbio_stdio.c b/libretro-common/file/nbio/nbio_stdio.c index f7c46a48e5..3e6f4094f1 100644 --- a/libretro-common/file/nbio/nbio_stdio.c +++ b/libretro-common/file/nbio/nbio_stdio.c @@ -1,227 +1,268 @@ -#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 - -struct nbio_t* nbio_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 (!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) -{ - 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) -{ - 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) -{ - 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) -{ - 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; -} - -void* nbio_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; -} - -void nbio_cancel(struct nbio_t* handle) -{ - if (!handle) - return; - - handle->op = -1; - handle->progress = handle->len; -} - -void nbio_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); -} +/* 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_stdio_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 void *nbio_stdio_open(const char * filename, unsigned mode) +{ + 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]); +#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_stdio_t*)malloc(sizeof(struct nbio_stdio_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(void *data) +{ + struct nbio_stdio_t *handle = (struct nbio_stdio_t*)data; + 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(void *data) +{ + struct nbio_stdio_t *handle = (struct nbio_stdio_t*)data; + 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(void *data) +{ + size_t amount = 65536; + struct nbio_stdio_t *handle = (struct nbio_stdio_t*)data; + + 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(void *data, size_t len) +{ + struct nbio_stdio_t *handle = (struct nbio_stdio_t*)data; + 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(void *data, size_t* len) +{ + struct nbio_stdio_t *handle = (struct nbio_stdio_t*)data; + if (!handle) + return NULL; + if (len) + *len = handle->len; + if (handle->op == -1) + return handle->data; + return NULL; +} + +static void nbio_stdio_cancel(void *data) +{ + struct nbio_stdio_t *handle = (struct nbio_stdio_t*)data; + if (!handle) + return; + + handle->op = -1; + handle->progress = handle->len; +} + +static void nbio_stdio_free(void *data) +{ + struct nbio_stdio_t *handle = (struct nbio_stdio_t*)data; + 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 new file mode 100644 index 0000000000..25ec106cd8 --- /dev/null +++ b/libretro-common/file/nbio/nbio_unixmmap.c @@ -0,0 +1,173 @@ +/* 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. + */ + +#include + +#if defined(HAVE_MMAP) && defined(BSD) + +#include +#include + +#ifdef _WIN32 +#include +#else +#include +#endif +#include +#include + +struct nbio_mmap_unix_t +{ + int fd; + int map_flags; + size_t len; + void* ptr; +}; + +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_mmap_unix_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); + + if (ptr == MAP_FAILED) + { + close(fd); + return NULL; + } + + handle = malloc(sizeof(struct nbio_mmap_unix_t)); + handle->fd = fd; + handle->map_flags = map_flags[mode]; + handle->len = len; + handle->ptr = ptr; + return handle; +} + +static void nbio_mmap_unix_begin_read(void *data) +{ + /* not needed */ +} + +static void nbio_mmap_unix_begin_write(void *data) +{ + /* not needed */ +} + +static bool nbio_mmap_unix_iterate(void *data) +{ + return true; /* not needed */ +} + +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 + * 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 */ + } + + 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(); + } +} + +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) + *len = handle->len; + return handle->ptr; +} + +static void nbio_mmap_unix_cancel(void *data) +{ + /* not needed */ +} + +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); + 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", +}; +#else +nbio_intf_t nbio_mmap_unix = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "nbio_mmap_unix", +}; + +#endif diff --git a/libretro-common/file/nbio/nbio_windowsmmap.c b/libretro-common/file/nbio/nbio_windowsmmap.c new file mode 100644 index 0000000000..42a22a16d6 --- /dev/null +++ b/libretro-common/file/nbio/nbio_windowsmmap.c @@ -0,0 +1,199 @@ +/* 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. + */ + +#include + +#if defined(_WIN32) && !defined(_XBOX) + +#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 + +#ifndef FILE_SHARE_ALL +#define FILE_SHARE_ALL (FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE) +#endif + +struct nbio_mmap_win32_t +{ + HANDLE file; + bool is_write; + size_t len; + void* ptr; +}; + +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_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); +#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; + + 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 = (struct nbio_mmap_win32_t*)malloc(sizeof(struct nbio_mmap_win32_t)); + + handle->file = file; + handle->is_write = is_write; + handle->len = len.QuadPart; + handle->ptr = ptr; + + return handle; +} + +static void nbio_mmap_win32_begin_read(void *data) +{ + /* not needed */ +} + +static void nbio_mmap_win32_begin_write(void *data) +{ + /* not needed */ +} + +static bool nbio_mmap_win32_iterate(void *data) +{ + /* not needed */ + return true; +} + +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; + + 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(); + } +} + +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) + *len = handle->len; + return handle->ptr; +} + +static void nbio_mmap_win32_cancel(void *data) +{ + /* not needed */ +} + +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); + UnmapViewOfFile(handle->ptr); + 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", +}; +#else +nbio_intf_t nbio_mmap_win32 = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "nbio_mmap_win32", +}; + +#endif 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++) { 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 diff --git a/libretro-common/include/file/nbio.h b/libretro-common/include/file/nbio.h index 011eef55e6..2aec848994 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 @@ -50,52 +51,73 @@ RETRO_BEGIN_DECLS #define BIO_WRITE 4 #endif -struct nbio_t; +typedef struct nbio_intf +{ + void *(*open)(const char * filename, unsigned mode); + + void (*begin_read)(void *data); + + void (*begin_write)(void *data); + + bool (*iterate)(void *data); + + void (*resize)(void *data, size_t len); + + void *(*get_ptr)(void *data, size_t* len); + + void (*cancel)(void *data); + + 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 nbio_write. + * 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 nbio_read. + * 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 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); +void nbio_resize(void *data, 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); +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 diff --git a/libretro-common/include/libretro.h b/libretro-common/include/libretro.h index 27b61b70b7..b900ac93e6 100644 --- a/libretro-common/include/libretro.h +++ b/libretro-common/include/libretro.h @@ -126,8 +126,14 @@ extern "C" { */ #define RETRO_DEVICE_KEYBOARD 3 -/* Lightgun X/Y coordinates are reported relatively to last poll, - * similar to mouse. */ +/* LIGHTGUN device is similar to Guncon-2 for PlayStation 2. + * It reports X/Y coordinates in screen space (similar to the pointer) + * in the range [-0x8000, 0x7fff] in both axes, with zero being center. + * As well as reporting on/off screen state. It features a trigger, + * start/select buttons, auxiliary action buttons and a + * directional pad. A forced off-screen shot can be requested for + * auto-reloading function in some games. + */ #define RETRO_DEVICE_LIGHTGUN 4 /* The ANALOG device is an extension to JOYPAD (RetroPad). @@ -214,14 +220,27 @@ extern "C" { #define RETRO_DEVICE_ID_MOUSE_BUTTON_4 9 #define RETRO_DEVICE_ID_MOUSE_BUTTON_5 10 -/* Id values for LIGHTGUN types. */ -#define RETRO_DEVICE_ID_LIGHTGUN_X 0 -#define RETRO_DEVICE_ID_LIGHTGUN_Y 1 -#define RETRO_DEVICE_ID_LIGHTGUN_TRIGGER 2 -#define RETRO_DEVICE_ID_LIGHTGUN_CURSOR 3 -#define RETRO_DEVICE_ID_LIGHTGUN_TURBO 4 -#define RETRO_DEVICE_ID_LIGHTGUN_PAUSE 5 -#define RETRO_DEVICE_ID_LIGHTGUN_START 6 +/* Id values for LIGHTGUN. */ +#define RETRO_DEVICE_ID_LIGHTGUN_SCREEN_X 13 /*Absolute Position*/ +#define RETRO_DEVICE_ID_LIGHTGUN_SCREEN_Y 14 /*Absolute*/ +#define RETRO_DEVICE_ID_LIGHTGUN_IS_OFFSCREEN 15 /*Status Check*/ +#define RETRO_DEVICE_ID_LIGHTGUN_TRIGGER 2 +#define RETRO_DEVICE_ID_LIGHTGUN_RELOAD 16 /*Forced off-screen shot*/ +#define RETRO_DEVICE_ID_LIGHTGUN_AUX_A 3 +#define RETRO_DEVICE_ID_LIGHTGUN_AUX_B 4 +#define RETRO_DEVICE_ID_LIGHTGUN_START 6 +#define RETRO_DEVICE_ID_LIGHTGUN_SELECT 7 +#define RETRO_DEVICE_ID_LIGHTGUN_AUX_C 8 +#define RETRO_DEVICE_ID_LIGHTGUN_DPAD_UP 9 +#define RETRO_DEVICE_ID_LIGHTGUN_DPAD_DOWN 10 +#define RETRO_DEVICE_ID_LIGHTGUN_DPAD_LEFT 11 +#define RETRO_DEVICE_ID_LIGHTGUN_DPAD_RIGHT 12 +/* deprecated */ +#define RETRO_DEVICE_ID_LIGHTGUN_X 0 /*Relative Position*/ +#define RETRO_DEVICE_ID_LIGHTGUN_Y 1 /*Relative*/ +#define RETRO_DEVICE_ID_LIGHTGUN_CURSOR 3 /*Use Aux:A*/ +#define RETRO_DEVICE_ID_LIGHTGUN_TURBO 4 /*Use Aux:B*/ +#define RETRO_DEVICE_ID_LIGHTGUN_PAUSE 5 /*Use Start*/ /* Id values for POINTER. */ #define RETRO_DEVICE_ID_POINTER_X 0 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; } 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)"); 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) 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 diff --git a/libretro-db/libretrodb_tool.c b/libretro-db/libretrodb_tool.c index 7e3a09c8af..e137e248e2 100644 --- a/libretro-db/libretrodb_tool.c +++ b/libretro-db/libretrodb_tool.c @@ -118,7 +118,7 @@ int main(int argc, char ** argv) { if (argc != 4) { - printf("Usage: %s find-name \n", argv[0]); + printf("Usage: %s get-names \n", argv[0]); goto error; } 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_ok.c b/menu/cbs/menu_cbs_ok.c index 145bcf013c..1b8172c6e5 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -1189,6 +1189,13 @@ static int set_path_generic(const char *label, const char *action_path) return 0; } +static int generic_action_ok_command(enum event_command cmd) +{ + if (!command_event(cmd, NULL)) + return menu_cbs_exit(); + return 0; +} + static int generic_action_ok(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx, unsigned id, enum msg_hash_enums flush_id) @@ -1319,7 +1326,7 @@ static int generic_action_ok(const char *path, case ACTION_OK_APPEND_DISK_IMAGE: flush_type = MENU_SETTINGS; command_event(CMD_EVENT_DISK_APPEND_IMAGE, action_path); - command_event(CMD_EVENT_RESUME, NULL); + generic_action_ok_command(CMD_EVENT_RESUME); break; case ACTION_OK_SET_DIRECTORY: flush_char = msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_DIRECTORY_SETTINGS_LIST); @@ -1354,6 +1361,34 @@ error: return menu_cbs_exit(); } +static int default_action_ok_load_content_with_core_from_menu(const char *_path, unsigned _type) +{ + content_ctx_info_t content_info; + content_info.argc = 0; + content_info.argv = NULL; + content_info.args = NULL; + content_info.environ_get = NULL; + if (!task_push_load_content_with_core_from_menu(_path, &content_info, (enum rarch_core_type)_type, NULL, NULL)) + return -1; + return 0; +} + +static int default_action_ok_load_content_from_playlist_from_menu(const char *_path, const char *path, const char *entry_label) +{ + content_ctx_info_t content_info; + content_info.argc = 0; + content_info.argv = NULL; + content_info.args = NULL; + content_info.environ_get = NULL; + if (!task_push_load_content_from_playlist_from_menu( + _path, path, entry_label, + &content_info, + NULL, NULL)) + return -1; + return 0; +} + + #define default_action_ok_set(funcname, _id, _flush) \ static int (funcname)(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) \ { \ @@ -1378,17 +1413,11 @@ static int action_ok_file_load(const char *path, { char menu_path_new[PATH_MAX_LENGTH]; char full_path_new[PATH_MAX_LENGTH]; - content_ctx_info_t content_info; const char *menu_label = NULL; const char *menu_path = NULL; rarch_setting_t *setting = NULL; file_list_t *menu_stack = menu_entries_get_menu_stack_ptr(0); - content_info.argc = 0; - content_info.argv = NULL; - content_info.args = NULL; - content_info.environ_get = NULL; - menu_path_new[0] = full_path_new[0] = '\0'; file_list_get_last(menu_stack, &menu_path, &menu_label, NULL, NULL); @@ -1433,22 +1462,16 @@ static int action_ok_file_load(const char *path, break; } - if (!task_push_load_content_with_core_from_menu( - full_path_new, - &content_info, - CORE_TYPE_PLAIN, - NULL, NULL)) - return -1; - - return 0; + return default_action_ok_load_content_with_core_from_menu(full_path_new, + CORE_TYPE_PLAIN); } + static int action_ok_playlist_entry_collection(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { menu_content_ctx_playlist_info_t playlist_info; char new_core_path[PATH_MAX_LENGTH]; - content_ctx_info_t content_info; size_t selection_ptr = 0; bool playlist_initialized = false; playlist_t *playlist = NULL; @@ -1461,11 +1484,6 @@ static int action_ok_playlist_entry_collection(const char *path, rarch_system_info_t *info = runloop_get_system_info(); struct retro_system_info *system = &info->info; - content_info.argc = 0; - content_info.argv = NULL; - content_info.args = NULL; - content_info.environ_get = NULL; - if (!menu_driver_ctl(RARCH_MENU_CTL_DRIVER_DATA_GET, &menu)) return menu_cbs_exit(); @@ -1489,24 +1507,11 @@ static int action_ok_playlist_entry_collection(const char *path, playlist_get_index(playlist, selection_ptr, &entry_path, &entry_label, &core_path, &core_name, NULL, NULL); - /* If the currently loaded core's name is equal - * to the core name from the playlist entry, - * then we directly load this game with the current core. - */ - if (system && - string_is_equal(system->library_name, core_name)) - { - if (playlist_initialized) - playlist_free(tmp_playlist); - return action_ok_file_load(menu->deferred_path, label, type, idx, entry_idx); - } - /* Is the core path / name of the playlist entry not yet filled in? */ if ( string_is_equal(core_path, file_path_str(FILE_PATH_DETECT)) && string_is_equal(core_name, file_path_str(FILE_PATH_DETECT))) { 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); @@ -1514,8 +1519,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; @@ -1535,62 +1538,46 @@ static int action_ok_playlist_entry_collection(const char *path, menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &tmp_playlist); - strlcpy(new_display_name, - core_info.inf->display_name, sizeof(new_display_name)); - playlist_update(tmp_playlist, + command_playlist_update_write(tmp_playlist, selection_ptr, + core_info.inf->display_name, NULL, - NULL, - new_core_path, - new_display_name, - NULL, - NULL); - playlist_write_file(tmp_playlist); + 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(); } playlist_get_index(playlist, playlist_info.idx, &path, NULL, NULL, NULL, NULL, NULL); - - if (!task_push_load_content_from_playlist_from_menu( - new_core_path, path, - &content_info, - NULL, NULL)) - return -1; - - return 0; + return default_action_ok_load_content_from_playlist_from_menu(new_core_path, path, entry_label); } static int action_ok_playlist_entry(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { menu_content_ctx_playlist_info_t playlist_info; - content_ctx_info_t content_info; + char new_core_path[PATH_MAX_LENGTH]; size_t selection_ptr = 0; playlist_t *playlist = g_defaults.content_history; 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; menu_handle_t *menu = NULL; - content_info.argc = 0; - content_info.argv = NULL; - content_info.args = NULL; - content_info.environ_get = NULL; + new_core_path[0] = '\0'; if (!menu_driver_ctl(RARCH_MENU_CTL_DRIVER_DATA_GET, &menu)) return menu_cbs_exit(); @@ -1598,22 +1585,16 @@ 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))) { 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); - bool found_associated_core = false; - - new_core_path[0] = '\0'; - - found_associated_core = + bool found_associated_core = menu_content_playlist_find_associated_core( path_base, new_core_path, sizeof(new_core_path)); @@ -1629,22 +1610,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, + command_playlist_update_write(NULL, selection_ptr, + core_info.inf->display_name, NULL, - NULL, - new_core_path, - new_display_name, - NULL, - NULL); - - free(new_display_name); - playlist_write_file(tmp_playlist); + new_core_path); } + else + strlcpy(new_core_path, core_path, sizeof(new_core_path)); playlist_info.data = playlist; playlist_info.idx = (unsigned)selection_ptr; @@ -1661,34 +1634,23 @@ static int action_ok_playlist_entry(const char *path, playlist_info.idx, &path, NULL, NULL, NULL, NULL, NULL); - if (!task_push_load_content_from_playlist_from_menu( - core_path, path, - &content_info, - NULL, NULL)) - return -1; - - return 0; + return default_action_ok_load_content_from_playlist_from_menu(new_core_path, path, entry_label); } static int action_ok_playlist_entry_start_content(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { menu_content_ctx_playlist_info_t playlist_info; - content_ctx_info_t content_info; size_t selection_ptr = 0; bool playlist_initialized = false; playlist_t *playlist = NULL; 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; menu_handle_t *menu = NULL; - content_info.argc = 0; - content_info.argv = NULL; - content_info.args = NULL; - content_info.environ_get = NULL; - if (!menu_driver_ctl(RARCH_MENU_CTL_DRIVER_DATA_GET, &menu)) return menu_cbs_exit(); @@ -1708,20 +1670,19 @@ 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))) { 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( @@ -1746,17 +1707,12 @@ static int action_ok_playlist_entry_start_content(const char *path, menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &tmp_playlist); - strlcpy(new_display_name, - core_info.inf->display_name, sizeof(new_display_name)); - playlist_update(tmp_playlist, + command_playlist_update_write( + tmp_playlist, selection_ptr, + core_info.inf->display_name, NULL, - NULL, - new_core_path, - new_display_name, - NULL, - NULL); - playlist_write_file(tmp_playlist); + new_core_path); } playlist_info.data = playlist; @@ -1771,21 +1727,7 @@ static int action_ok_playlist_entry_start_content(const char *path, playlist_get_index(playlist, playlist_info.idx, &path, NULL, NULL, NULL, NULL, NULL); - if (!task_push_load_content_from_playlist_from_menu( - core_path, path, - &content_info, - NULL, NULL)) - return -1; - - return 0; -} - -static int action_ok_cheat_apply_changes(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - command_event(CMD_EVENT_CHEATS_APPLY, NULL); - - return 0; + return default_action_ok_load_content_from_playlist_from_menu(core_path, path, entry_label); } static int action_ok_lookup_setting(const char *path, @@ -1828,15 +1770,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(g_defaults.music_history, + 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, @@ -1905,21 +1844,6 @@ static void menu_input_wifi_cb(void *userdata, const char *passphrase) menu_input_dialog_end(); } -static int action_ok_cheat(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - menu_input_ctx_line_t line; - - line.label = msg_hash_to_str(MSG_INPUT_CHEAT); - line.label_setting = label; - line.type = type; - line.idx = (unsigned)idx; - line.cb = menu_input_st_cheat_cb; - - if (!menu_input_dialog_start(&line)) - return -1; - return 0; -} static void menu_input_st_string_cb_rename_entry(void *userdata, const char *str) @@ -1929,25 +1853,11 @@ 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); - } - } + command_playlist_update_write(NULL, + menu_input_dialog_get_kb_idx(), + NULL, + label, + NULL); } menu_input_dialog_end(); @@ -2040,22 +1950,73 @@ static void menu_input_st_string_cb_save_preset(void *userdata, menu_input_dialog_end(); } -static int action_ok_shader_preset_save_as(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) +static void menu_input_st_string_cb_cheat_file_save_as( + void *userdata, const char *str) { - menu_input_ctx_line_t line; + if (str && *str) + { + rarch_setting_t *setting = NULL; + settings_t *settings = config_get_ptr(); + const char *label = menu_input_dialog_get_label_buffer(); - line.label = msg_hash_to_str(MSG_INPUT_PRESET_FILENAME); - line.label_setting = label; - line.type = type; - line.idx = (unsigned)idx; - line.cb = menu_input_st_string_cb_save_preset; + if (!string_is_empty(label)) + setting = menu_setting_find(label); - if (!menu_input_dialog_start(&line)) - return -1; - return 0; + if (setting) + { + setting_set_with_string_representation(setting, str); + menu_setting_generic(setting, false); + } + else if (!string_is_empty(label)) + cheat_manager_save(str, settings->paths.path_cheat_database); + } + + menu_input_dialog_end(); } +#define default_action_dialog_start(funcname, _label_setting, _idx, _cb) \ +static int (funcname)(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) \ +{ \ + menu_input_ctx_line_t line; \ + line.label = label; \ + line.label_setting = _label_setting; \ + line.type = type; \ + line.idx = (_idx); \ + line.cb = _cb; \ + if (!menu_input_dialog_start(&line)) \ + return -1; \ + return 0; \ +} + +default_action_dialog_start(action_ok_shader_preset_save_as, + msg_hash_to_str(MSG_INPUT_PRESET_FILENAME), + (unsigned)idx, + menu_input_st_string_cb_save_preset) +default_action_dialog_start(action_ok_enable_settings, + msg_hash_to_str(MSG_INPUT_ENABLE_SETTINGS_PASSWORD), + (unsigned)entry_idx, + menu_input_st_string_cb_enable_settings) +default_action_dialog_start(action_ok_wifi, + "Passphrase", + (unsigned)idx, + menu_input_wifi_cb) +default_action_dialog_start(action_ok_cheat_file_save_as, + msg_hash_to_str(MSG_INPUT_CHEAT_FILENAME), + (unsigned)idx, + menu_input_st_string_cb_cheat_file_save_as) +default_action_dialog_start(action_ok_cheat, + msg_hash_to_str(MSG_INPUT_CHEAT), + (unsigned)idx, + menu_input_st_cheat_cb) +default_action_dialog_start(action_ok_disable_kiosk_mode, + msg_hash_to_str(MSG_INPUT_KIOSK_MODE_PASSWORD), + (unsigned)entry_idx, + menu_input_st_string_cb_disable_kiosk_mode) +default_action_dialog_start(action_ok_rename_entry, + msg_hash_to_str(MSG_INPUT_RENAME_ENTRY), + (unsigned)entry_idx, + menu_input_st_string_cb_rename_entry) + enum { ACTION_OK_SHADER_PRESET_SAVE_CORE = 0, @@ -2134,45 +2095,7 @@ static int action_ok_shader_preset_save_game(const char *path, idx, entry_idx, ACTION_OK_SHADER_PRESET_SAVE_GAME); } -static void menu_input_st_string_cb_cheat_file_save_as( - void *userdata, const char *str) -{ - if (str && *str) - { - rarch_setting_t *setting = NULL; - settings_t *settings = config_get_ptr(); - const char *label = menu_input_dialog_get_label_buffer(); - if (!string_is_empty(label)) - setting = menu_setting_find(label); - - if (setting) - { - setting_set_with_string_representation(setting, str); - menu_setting_generic(setting, false); - } - else if (!string_is_empty(label)) - cheat_manager_save(str, settings->paths.path_cheat_database); - } - - menu_input_dialog_end(); -} - -static int action_ok_cheat_file_save_as(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - menu_input_ctx_line_t line; - - line.label = msg_hash_to_str(MSG_INPUT_CHEAT_FILENAME); - line.label_setting = label; - line.type = type; - line.idx = (unsigned)idx; - line.cb = menu_input_st_string_cb_cheat_file_save_as; - - if (!menu_input_dialog_start(&line)) - return -1; - return 0; -} static int generic_action_ok_remap_file_operation(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx, @@ -2316,26 +2239,14 @@ 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); + command_playlist_update_write(NULL, + rdb_entry_start_game_selection_ptr, + core_display_name, NULL, path); menu_entries_pop_stack(&selection, 0, 1); menu_navigation_set_selection(selection); @@ -2343,37 +2254,6 @@ static int action_ok_core_deferred_set(const char *path, return menu_cbs_exit(); } -static int action_ok_core_deferred_set_current_core(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - char core_display_name[PATH_MAX_LENGTH]; - 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); - - menu_entries_pop_stack(&selection, 0, 1); - menu_navigation_set_selection(selection); - - return 0; -} - static int action_ok_deferred_list_stub(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { @@ -2404,74 +2284,39 @@ static int action_ok_load_core_deferred(const char *path, return 0; } -static int action_ok_start_net_retropad_core(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - content_ctx_info_t content_info; - - content_info.argc = 0; - content_info.argv = NULL; - content_info.args = NULL; - content_info.environ_get = NULL; - - if (!task_push_start_builtin_core( - &content_info, - CORE_TYPE_NETRETROPAD, - NULL, NULL)) - return -1; - - return 0; +#define default_action_ok_start_builtin_core(funcname, _id) \ +static int (funcname)(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) \ +{ \ + content_ctx_info_t content_info; \ + content_info.argc = 0; \ + content_info.argv = NULL; \ + content_info.args = NULL; \ + content_info.environ_get = NULL; \ + if (!task_push_start_builtin_core(&content_info, _id, NULL, NULL)) \ + return -1; \ + return 0; \ } -static int action_ok_start_video_processor_core(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - content_ctx_info_t content_info; - - content_info.argc = 0; - content_info.argv = NULL; - content_info.args = NULL; - content_info.environ_get = NULL; - - if (!task_push_start_builtin_core( - &content_info, - CORE_TYPE_VIDEO_PROCESSOR, - NULL, NULL)) - return -1; - - return 0; -} +default_action_ok_start_builtin_core(action_ok_start_net_retropad_core, CORE_TYPE_NETRETROPAD) +default_action_ok_start_builtin_core(action_ok_start_video_processor_core, CORE_TYPE_VIDEO_PROCESSOR) #ifdef HAVE_FFMPEG static int action_ok_file_load_ffmpeg(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { char new_path[PATH_MAX_LENGTH]; - content_ctx_info_t content_info; - const char *menu_path = NULL; file_list_t *menu_stack = menu_entries_get_menu_stack_ptr(0); + file_list_get_last(menu_stack, &menu_path, NULL, NULL, NULL); new_path[0] = '\0'; - content_info.argc = 0; - content_info.argv = NULL; - content_info.args = NULL; - content_info.environ_get = NULL; - if (!string_is_empty(menu_path)) fill_pathname_join(new_path, menu_path, path, sizeof(new_path)); - if (!task_push_load_content_with_core_from_menu( - new_path, - &content_info, - CORE_TYPE_FFMPEG, - NULL, NULL)) - return -1; - - return 0; + return default_action_ok_load_content_with_core_from_menu(new_path, CORE_TYPE_FFMPEG); } #endif @@ -2479,7 +2324,6 @@ static int action_ok_audio_run(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { char combined_path[PATH_MAX_LENGTH]; - content_ctx_info_t content_info; menu_handle_t *menu = NULL; combined_path[0] = '\0'; @@ -2490,26 +2334,13 @@ static int action_ok_audio_run(const char *path, fill_pathname_join(combined_path, menu->scratch2_buf, menu->scratch_buf, sizeof(combined_path)); - content_info.argc = 0; - content_info.argv = NULL; - content_info.args = NULL; - content_info.environ_get = NULL; - - if (!task_push_load_content_with_core_from_menu( - combined_path, - &content_info, - CORE_TYPE_FFMPEG, - NULL, NULL)) - return -1; - - return 0; + return default_action_ok_load_content_with_core_from_menu(combined_path, CORE_TYPE_FFMPEG); } static int action_ok_file_load_imageviewer(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { char fullpath[PATH_MAX_LENGTH]; - content_ctx_info_t content_info; const char *menu_path = NULL; file_list_t *menu_stack = menu_entries_get_menu_stack_ptr(0); @@ -2517,43 +2348,17 @@ static int action_ok_file_load_imageviewer(const char *path, fullpath[0] = '\0'; - content_info.argc = 0; - content_info.argv = NULL; - content_info.args = NULL; - content_info.environ_get = NULL; - if (!string_is_empty(menu_path)) fill_pathname_join(fullpath, menu_path, path, sizeof(fullpath)); - if (!task_push_load_content_with_core_from_menu( - fullpath, - &content_info, - CORE_TYPE_IMAGEVIEWER, - NULL, NULL)) - return -1; - - return 0; + return default_action_ok_load_content_with_core_from_menu(fullpath, CORE_TYPE_IMAGEVIEWER); } static int action_ok_file_load_current_core(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { - content_ctx_info_t content_info; - - content_info.argc = 0; - content_info.argv = NULL; - content_info.args = NULL; - content_info.environ_get = NULL; - - if (!task_push_load_content_with_core_from_menu( - detect_content_path, - &content_info, - CORE_TYPE_PLAIN, - NULL, NULL)) - return -1; - - return 0; + return default_action_ok_load_content_with_core_from_menu(detect_content_path, CORE_TYPE_PLAIN); } static int action_ok_file_load_detect_core(const char *path, @@ -2576,12 +2381,6 @@ static int action_ok_file_load_detect_core(const char *path, return 0; } -static int generic_action_ok_command(enum event_command cmd) -{ - if (!command_event(cmd, NULL)) - return menu_cbs_exit(); - return 0; -} static int action_ok_load_state(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) @@ -2629,10 +2428,10 @@ static void cb_decompressed(void *task_data, void *user_data, const char *err) switch (type_hash) { case CB_CORE_UPDATER_DOWNLOAD: - command_event(CMD_EVENT_CORE_INFO_INIT, NULL); + generic_action_ok_command(CMD_EVENT_CORE_INFO_INIT); break; case CB_UPDATE_ASSETS: - command_event(CMD_EVENT_REINIT, NULL); + generic_action_ok_command(CMD_EVENT_REINIT); break; } } @@ -2728,7 +2527,7 @@ static int generic_action_ok_network(const char *path, menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh); - command_event(CMD_EVENT_NETWORK_INIT, NULL); + generic_action_ok_command(CMD_EVENT_NETWORK_INIT); transf = (menu_file_transfer_t*)calloc(1, sizeof(*transf)); strlcpy(transf->path, url_path, sizeof(transf->path)); @@ -2739,40 +2538,17 @@ static int generic_action_ok_network(const char *path, label, type, idx, entry_idx, type_id2); } -static int action_ok_core_content_list(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return generic_action_ok_network(path, label, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_CORE_CONTENT_LIST); +#define default_action_ok_list(funcname, _id) \ +static int (funcname)(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) \ +{ \ + return generic_action_ok_network(path, label, type, idx, entry_idx, _id); \ } -static int action_ok_core_content_dirs_list(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return generic_action_ok_network(path, label, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_CORE_CONTENT_DIRS_LIST); -} - -static int action_ok_core_updater_list(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return generic_action_ok_network(path, label, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_CORE_UPDATER_LIST); -} - -static int action_ok_thumbnails_updater_list(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return generic_action_ok_network(path, label, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_THUMBNAILS_UPDATER_LIST); -} - -static int action_ok_lakka_list(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return generic_action_ok_network(path, label, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_LAKKA_LIST); -} +default_action_ok_list(action_ok_core_content_list, MENU_ENUM_LABEL_CB_CORE_CONTENT_LIST) +default_action_ok_list(action_ok_core_content_dirs_list, MENU_ENUM_LABEL_CB_CORE_CONTENT_DIRS_LIST) +default_action_ok_list(action_ok_core_updater_list, MENU_ENUM_LABEL_CB_CORE_UPDATER_LIST) +default_action_ok_list(action_ok_thumbnails_updater_list, MENU_ENUM_LABEL_CB_THUMBNAILS_UPDATER_LIST) +default_action_ok_list(action_ok_lakka_list, MENU_ENUM_LABEL_CB_LAKKA_LIST) static void cb_generic_dir_download(void *task_data, void *user_data, const char *err) @@ -2924,7 +2700,7 @@ static void cb_generic_download(void *task_data, switch (transf->enum_idx) { case MENU_ENUM_LABEL_CB_CORE_UPDATER_DOWNLOAD: - command_event(CMD_EVENT_CORE_INFO_INIT, NULL); + generic_action_ok_command(CMD_EVENT_CORE_INFO_INIT); break; default: break; @@ -3053,103 +2829,26 @@ static int action_ok_core_content_download(const char *path, MENU_ENUM_LABEL_CB_CORE_CONTENT_DOWNLOAD); } -static int action_ok_core_content_thumbnails(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_CORE_THUMBNAILS_DOWNLOAD); +#define default_action_ok_download(funcname, _id) \ +static int (funcname)(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) \ +{ \ + return action_ok_download_generic(path, label, NULL, type, idx, entry_idx,_id); \ } -static int action_ok_thumbnails_updater_download(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_THUMBNAILS_UPDATER_DOWNLOAD); -} - -static int action_ok_download_url(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_DOWNLOAD_URL); -} - -static int action_ok_core_updater_download(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_CORE_UPDATER_DOWNLOAD); -} - -static int action_ok_lakka_download(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_LAKKA_DOWNLOAD); -} - -static int action_ok_update_assets(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_UPDATE_ASSETS); -} - -static int action_ok_update_core_info_files(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_UPDATE_CORE_INFO_FILES); -} - -static int action_ok_update_overlays(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_UPDATE_OVERLAYS); -} - -static int action_ok_update_shaders_cg(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_UPDATE_SHADERS_CG); -} - -static int action_ok_update_shaders_glsl(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_UPDATE_SHADERS_GLSL); -} - -static int action_ok_update_shaders_slang(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_UPDATE_SHADERS_SLANG); -} - -static int action_ok_update_databases(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_UPDATE_DATABASES); -} - -static int action_ok_update_cheats(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_UPDATE_CHEATS); -} - -static int action_ok_update_autoconfig_profiles(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_UPDATE_AUTOCONFIG_PROFILES); -} +default_action_ok_download(action_ok_core_content_thumbnails, MENU_ENUM_LABEL_CB_CORE_THUMBNAILS_DOWNLOAD) +default_action_ok_download(action_ok_thumbnails_updater_download, MENU_ENUM_LABEL_CB_THUMBNAILS_UPDATER_DOWNLOAD) +default_action_ok_download(action_ok_download_url, MENU_ENUM_LABEL_CB_DOWNLOAD_URL) +default_action_ok_download(action_ok_core_updater_download, MENU_ENUM_LABEL_CB_CORE_UPDATER_DOWNLOAD) +default_action_ok_download(action_ok_lakka_download, MENU_ENUM_LABEL_CB_LAKKA_DOWNLOAD) +default_action_ok_download(action_ok_update_assets, MENU_ENUM_LABEL_CB_UPDATE_ASSETS) +default_action_ok_download(action_ok_update_core_info_files, MENU_ENUM_LABEL_CB_UPDATE_CORE_INFO_FILES) +default_action_ok_download(action_ok_update_overlays, MENU_ENUM_LABEL_CB_UPDATE_OVERLAYS) +default_action_ok_download(action_ok_update_shaders_cg, MENU_ENUM_LABEL_CB_UPDATE_SHADERS_CG) +default_action_ok_download(action_ok_update_shaders_glsl, MENU_ENUM_LABEL_CB_UPDATE_SHADERS_GLSL) +default_action_ok_download(action_ok_update_shaders_slang, MENU_ENUM_LABEL_CB_UPDATE_SHADERS_SLANG) +default_action_ok_download(action_ok_update_databases, MENU_ENUM_LABEL_CB_UPDATE_DATABASES) +default_action_ok_download(action_ok_update_cheats, MENU_ENUM_LABEL_CB_UPDATE_CHEATS) +default_action_ok_download(action_ok_update_autoconfig_profiles, MENU_ENUM_LABEL_CB_UPDATE_AUTOCONFIG_PROFILES) /* creates folder and core options stub file for subsequent runs */ static int action_ok_option_create(const char *path, @@ -3202,6 +2901,7 @@ int (func_name)(const char *path, const char *label, unsigned type, size_t idx, return generic_action_ok_command(cmd); \ } +default_action_ok_cmd_func(action_ok_cheat_apply_changes,CMD_EVENT_CHEATS_APPLY) default_action_ok_cmd_func(action_ok_quit, CMD_EVENT_QUIT) default_action_ok_cmd_func(action_ok_save_new_config, CMD_EVENT_MENU_SAVE_CONFIG) default_action_ok_cmd_func(action_ok_resume_content, CMD_EVENT_RESUME) @@ -3238,21 +2938,6 @@ static int action_ok_add_to_favorites_playlist(const char *path, return 0; } -static int action_ok_rename_entry(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - menu_input_ctx_line_t line; - - line.label = msg_hash_to_str(MSG_INPUT_RENAME_ENTRY); - line.label_setting = label; - line.type = type; - line.idx = (unsigned)entry_idx; - line.cb = menu_input_st_string_cb_rename_entry; - - if (!menu_input_dialog_start(&line)) - return -1; - return 0; -} static int action_ok_delete_entry(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) @@ -3294,7 +2979,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); @@ -3303,37 +2992,6 @@ static int action_ok_delete_entry(const char *path, return 0; } -static int action_ok_disable_kiosk_mode(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - menu_input_ctx_line_t line; - - line.label = msg_hash_to_str(MSG_INPUT_KIOSK_MODE_PASSWORD); - line.label_setting = label; - line.type = type; - line.idx = (unsigned)entry_idx; - line.cb = menu_input_st_string_cb_disable_kiosk_mode; - - if (!menu_input_dialog_start(&line)) - return -1; - return 0; -} - -static int action_ok_enable_settings(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - menu_input_ctx_line_t line; - - line.label = msg_hash_to_str(MSG_INPUT_ENABLE_SETTINGS_PASSWORD); - line.label_setting = label; - line.type = type; - line.idx = (unsigned)entry_idx; - line.cb = menu_input_st_string_cb_enable_settings; - - if (!menu_input_dialog_start(&line)) - return -1; - return 0; -} static int action_ok_rdb_entry_submenu(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) @@ -3491,7 +3149,7 @@ static int action_ok_netplay_connect_room(const char *path, tmp_hostname[0] = '\0'; if (netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_DATA_INITED, NULL)) - command_event(CMD_EVENT_NETPLAY_DEINIT, NULL); + generic_action_ok_command(CMD_EVENT_NETPLAY_DEINIT); netplay_driver_ctl(RARCH_NETPLAY_CTL_ENABLE_CLIENT, NULL); if (netplay_room_list[idx - 3].host_method == NETPLAY_HOST_METHOD_MITM) @@ -3529,22 +3187,6 @@ static int action_ok_netplay_connect_room(const char *path, return 0; } -static int action_ok_wifi(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - - menu_input_ctx_line_t line; - - line.label = "Passphrase"; - line.label_setting = label; - line.type = type; - line.idx = (unsigned)idx; - line.cb = menu_input_wifi_cb; - - if (!menu_input_dialog_start(&line)) - return -1; - return 0; -} static int action_ok_netplay_lan_scan(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) @@ -3562,7 +3204,7 @@ static int action_ok_netplay_lan_scan(const char *path, /* Enable Netplay client mode */ if (netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_DATA_INITED, NULL)) - command_event(CMD_EVENT_NETPLAY_DEINIT, NULL); + generic_action_ok_command(CMD_EVENT_NETPLAY_DEINIT); netplay_driver_ctl(RARCH_NETPLAY_CTL_ENABLE_CLIENT, NULL); /* Enable Netplay */ @@ -3572,33 +3214,18 @@ static int action_ok_netplay_lan_scan(const char *path, return -1; } -static int action_ok_content_collection_list(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - filebrowser_set_type(FILEBROWSER_SELECT_COLLECTION); - return generic_action_ok_displaylist_push(path, NULL, label, type, idx, - entry_idx, ACTION_OK_DL_CONTENT_COLLECTION_LIST); +#define default_action_ok_dl_push(funcname, _fbid, _id, _path) \ +static int (funcname)(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) \ +{ \ + settings_t *settings = config_get_ptr(); \ + (void)settings; \ + filebrowser_set_type(_fbid); \ + return generic_action_ok_displaylist_push(path, _path, label, type, idx, entry_idx, _id); \ } -static int action_ok_push_content_list(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - settings_t *settings = config_get_ptr(); - filebrowser_set_type(FILEBROWSER_SELECT_FILE); - return generic_action_ok_displaylist_push(path, - settings->paths.directory_menu_content, label, type, idx, - entry_idx, ACTION_OK_DL_CONTENT_LIST); -} - -static int action_ok_push_scan_file(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - settings_t *settings = config_get_ptr(); - filebrowser_set_type(FILEBROWSER_SCAN_FILE); - return generic_action_ok_displaylist_push(path, - settings->paths.directory_menu_content, label, type, idx, - entry_idx, ACTION_OK_DL_CONTENT_LIST); -} +default_action_ok_dl_push(action_ok_content_collection_list, FILEBROWSER_SELECT_COLLECTION, ACTION_OK_DL_CONTENT_COLLECTION_LIST, NULL) +default_action_ok_dl_push(action_ok_push_content_list, FILEBROWSER_SELECT_FILE, ACTION_OK_DL_CONTENT_LIST, settings->paths.directory_menu_content) +default_action_ok_dl_push(action_ok_push_scan_file, FILEBROWSER_SCAN_FILE, ACTION_OK_DL_CONTENT_LIST, settings->paths.directory_menu_content) #ifdef HAVE_NETWORKING struct netplay_host_list *lan_hosts; @@ -3737,11 +3364,15 @@ 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 *file_list = menu_entries_get_selection_buf_ptr(0); + file_list_t *list = menu_entries_get_selection_buf_ptr(0); + lan_room_count = 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); @@ -3757,18 +3388,14 @@ static void netplay_refresh_rooms_cb(void *task_data, void *user_data, const cha calloc(netplay_room_count + lan_room_count, sizeof(struct netplay_room)); - for (i = 0; i < netplay_room_count; i++) + for (i = 0; i < (unsigned)netplay_room_count; i++) memcpy(&netplay_room_list[i], netplay_room_get(i), sizeof(netplay_room_list[i])); if (lan_room_count != 0) { - struct netplay_host *host = NULL; - - for (i = netplay_room_count; i < netplay_room_count + lan_room_count; i++) + for (i = netplay_room_count; i < (unsigned)(netplay_room_count + lan_room_count); i++) { - struct netplay_host *host = NULL; - host = &lan_hosts->hosts[j++]; - + struct netplay_host *host = &lan_hosts->hosts[j++]; strlcpy(netplay_room_list[i].nickname, host->nick, @@ -3800,7 +3427,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); } } @@ -3866,7 +3493,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; } @@ -3899,7 +3528,8 @@ static int action_ok_push_downloads_dir(const char *path, settings_t *settings = config_get_ptr(); filebrowser_set_type(FILEBROWSER_SELECT_FILE); - return generic_action_ok_displaylist_push(path, settings->paths.directory_core_assets, + return generic_action_ok_displaylist_push(path, + settings->paths.directory_core_assets, msg_hash_to_str(MENU_ENUM_LABEL_FAVORITES), type, idx, entry_idx, ACTION_OK_DL_CONTENT_LIST); @@ -3950,17 +3580,10 @@ static int action_ok_start_core(const char *path, static int action_ok_load_archive(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { - content_ctx_info_t content_info; - menu_handle_t *menu = NULL; const char *menu_path = NULL; const char *content_path = NULL; - content_info.argc = 0; - content_info.argv = NULL; - content_info.args = NULL; - content_info.environ_get = NULL; - if (!menu_driver_ctl(RARCH_MENU_CTL_DRIVER_DATA_GET, &menu)) return menu_cbs_exit(); @@ -3970,16 +3593,11 @@ static int action_ok_load_archive(const char *path, fill_pathname_join(detect_content_path, menu_path, content_path, sizeof(detect_content_path)); - command_event(CMD_EVENT_LOAD_CORE, NULL); + generic_action_ok_command(CMD_EVENT_LOAD_CORE); - if (!task_push_load_content_with_core_from_menu( + return default_action_ok_load_content_with_core_from_menu( detect_content_path, - &content_info, - CORE_TYPE_PLAIN, - NULL, NULL)) - return -1; - - return 0; + CORE_TYPE_PLAIN); } static int action_ok_load_archive_detect_core(const char *path, @@ -4059,56 +3677,19 @@ static int action_ok_load_archive_detect_core(const char *path, return ret; } -static int action_ok_help_audio_video_troubleshooting(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return generic_action_ok_help(path, label, type, idx, entry_idx, - MENU_ENUM_LABEL_HELP_AUDIO_VIDEO_TROUBLESHOOTING, - MENU_DIALOG_HELP_AUDIO_VIDEO_TROUBLESHOOTING); +#define default_action_ok_help(funcname, _id, _id2) \ +static int (funcname)(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) \ +{ \ + return generic_action_ok_help(path, label, type, idx, entry_idx, _id, _id2); \ } -static int action_ok_help(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return generic_action_ok_help(path, label, type, idx, entry_idx, - MENU_ENUM_LABEL_HELP, MENU_DIALOG_WELCOME); -} - -static int action_ok_help_controls(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return generic_action_ok_help(path, label, type, idx, entry_idx, - MENU_ENUM_LABEL_HELP_CONTROLS, MENU_DIALOG_HELP_CONTROLS); -} - -static int action_ok_help_what_is_a_core(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return generic_action_ok_help(path, label, type, idx, entry_idx, - MENU_ENUM_LABEL_HELP_WHAT_IS_A_CORE, MENU_DIALOG_HELP_WHAT_IS_A_CORE); -} - -static int action_ok_help_scanning_content(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return generic_action_ok_help(path, label, type, idx, entry_idx, - MENU_ENUM_LABEL_HELP_SCANNING_CONTENT, MENU_DIALOG_HELP_SCANNING_CONTENT); -} - -static int action_ok_help_change_virtual_gamepad(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return generic_action_ok_help(path, label, type, idx, entry_idx, - MENU_ENUM_LABEL_HELP_CHANGE_VIRTUAL_GAMEPAD, - MENU_DIALOG_HELP_CHANGE_VIRTUAL_GAMEPAD); -} - -static int action_ok_help_load_content(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return generic_action_ok_help(path, label, type, idx, entry_idx, - MENU_ENUM_LABEL_HELP_LOADING_CONTENT, MENU_DIALOG_HELP_LOADING_CONTENT); -} +default_action_ok_help(action_ok_help_audio_video_troubleshooting, MENU_ENUM_LABEL_HELP_AUDIO_VIDEO_TROUBLESHOOTING, MENU_DIALOG_HELP_AUDIO_VIDEO_TROUBLESHOOTING) +default_action_ok_help(action_ok_help, MENU_ENUM_LABEL_HELP, MENU_DIALOG_WELCOME) +default_action_ok_help(action_ok_help_controls, MENU_ENUM_LABEL_HELP_CONTROLS, MENU_DIALOG_HELP_CONTROLS) +default_action_ok_help(action_ok_help_what_is_a_core, MENU_ENUM_LABEL_HELP_WHAT_IS_A_CORE, MENU_DIALOG_HELP_WHAT_IS_A_CORE) +default_action_ok_help(action_ok_help_scanning_content, MENU_ENUM_LABEL_HELP_SCANNING_CONTENT, MENU_DIALOG_HELP_SCANNING_CONTENT) +default_action_ok_help(action_ok_help_change_virtual_gamepad, MENU_ENUM_LABEL_HELP_CHANGE_VIRTUAL_GAMEPAD, MENU_DIALOG_HELP_CHANGE_VIRTUAL_GAMEPAD) +default_action_ok_help(action_ok_help_load_content, MENU_ENUM_LABEL_HELP_LOADING_CONTENT, MENU_DIALOG_HELP_LOADING_CONTENT) static int action_ok_video_resolution(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) @@ -4123,7 +3704,7 @@ static int action_ok_video_resolution(const char *path, msg[0] = '\0'; #if defined(__CELLOS_LV2__) || defined(_WIN32) - command_event(CMD_EVENT_REINIT, NULL); + generic_action_ok_command(CMD_EVENT_REINIT); #endif video_driver_set_video_mode(width, height, true); #ifdef GEKKO @@ -4150,7 +3731,7 @@ static int action_ok_netplay_enable_host(const char *path, content_get_status(&contentless, &is_inited); if (netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_DATA_INITED, NULL)) - command_event(CMD_EVENT_NETPLAY_DEINIT, NULL); + generic_action_ok_command(CMD_EVENT_NETPLAY_DEINIT); netplay_driver_ctl(RARCH_NETPLAY_CTL_ENABLE_SERVER, NULL); /* If we haven't yet started, this will load on its own */ @@ -4216,15 +3797,15 @@ static int action_ok_netplay_enable_client(const char *path, #ifdef HAVE_NETWORKING menu_input_ctx_line_t line; if (netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_DATA_INITED, NULL)) - command_event(CMD_EVENT_NETPLAY_DEINIT, NULL); + generic_action_ok_command(CMD_EVENT_NETPLAY_DEINIT); netplay_driver_ctl(RARCH_NETPLAY_CTL_ENABLE_CLIENT, NULL); - /* If no host was specified in the config, ask for one */ - memset(&line, 0, sizeof(line)); - - line.label = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_IP_ADDRESS); + line.label = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_IP_ADDRESS); line.label_setting = "no_setting"; - line.cb = action_ok_netplay_enable_client_hostname_cb; + line.type = 0; + line.idx = 0; + line.cb = action_ok_netplay_enable_client_hostname_cb; + if (menu_input_dialog_start(&line)) return 0; #endif @@ -4243,9 +3824,9 @@ static int action_ok_netplay_disconnect(const char *path, /* Re-enable rewind if it was enabled TODO: Add a setting for these tweaks */ if (settings->bools.rewind_enable) - command_event(CMD_EVENT_REWIND_INIT, NULL); + generic_action_ok_command(CMD_EVENT_REWIND_INIT); if (settings->uints.autosave_interval != 0) - command_event(CMD_EVENT_AUTOSAVE_INIT, NULL); + generic_action_ok_command(CMD_EVENT_AUTOSAVE_INIT); return generic_action_ok_command(CMD_EVENT_RESUME); #else @@ -4257,7 +3838,12 @@ static int action_ok_netplay_disconnect(const char *path, static int action_ok_core_delete(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { - char* core_path = strdup(path_get(RARCH_PATH_CORE)); + const char *path_core = path_get(RARCH_PATH_CORE); + char *core_path = !string_is_empty(path_core) + ? strdup(path_core) : NULL; + + if (!core_path) + return 0; generic_action_ok_command(CMD_EVENT_UNLOAD_CORE); menu_entries_flush_stack(0, 0); @@ -4371,10 +3957,8 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs, BIND_ACTION_OK(cbs, action_ok_load_core); break; case MENU_ENUM_LABEL_FILE_BROWSER_CORE_SELECT_FROM_COLLECTION: - BIND_ACTION_OK(cbs, action_ok_core_deferred_set); - break; case MENU_ENUM_LABEL_FILE_BROWSER_CORE_SELECT_FROM_COLLECTION_CURRENT_CORE: - BIND_ACTION_OK(cbs, action_ok_core_deferred_set_current_core); + BIND_ACTION_OK(cbs, action_ok_core_deferred_set); break; case MENU_ENUM_LABEL_START_CORE: BIND_ACTION_OK(cbs, action_ok_start_core); diff --git a/menu/cbs/menu_cbs_scan.c b/menu/cbs/menu_cbs_scan.c index 965e99207e..213b6b8ad1 100644 --- a/menu/cbs/menu_cbs_scan.c +++ b/menu/cbs/menu_cbs_scan.c @@ -144,6 +144,7 @@ static int action_scan_input_desc(const char *path, target->key = RETROK_UNKNOWN; target->joykey = NO_BTN; target->joyaxis = AXIS_NONE; + target->mbutton = NO_BTN; } return 0; diff --git a/menu/cbs/menu_cbs_select.c b/menu/cbs/menu_cbs_select.c index 84132b7a01..bdca580865 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) { @@ -182,6 +235,7 @@ static int menu_cbs_init_bind_select_compare_type( #endif else { + switch (type) { case FILE_TYPE_USE_DIRECTORY: @@ -209,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; diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 9b1013905a..06170be390 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) @@ -1246,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; @@ -1266,6 +1268,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/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/drivers/xmb.c b/menu/drivers/xmb.c index c1d5dac42e..6301b86cd1 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 @@ -2102,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]; @@ -2239,6 +2242,18 @@ 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)) + { + int new_id = type - MENU_SETTINGS_CHEEVOS_START; + 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 + return xmb->textures.list[XMB_TEXTURE_SUBSETTING]; } diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index e4dd8450d1..61d3ccc919 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); } @@ -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 } @@ -3495,7 +3490,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 +3509,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 +3855,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 +4175,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); @@ -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 @@ -5615,6 +5602,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_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/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 }; diff --git a/menu/menu_event.c b/menu/menu_event.c index 8c5b321bd5..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(uint64_t input, uint64_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(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_PTR(p_input, menu_ok_btn ); unsigned ok_trigger = ok_current & ~ok_old; ok_old = ok_current; - if (input) + if (RARCH_INPUT_STATE_ANY_SET_PTR(p_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; + 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(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_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 (trigger_input & (UINT64_C(1) << 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 (trigger_input & (UINT64_C(1) << 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 (trigger_input & (UINT64_C(1) << 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 (trigger_input & (UINT64_C(1) << 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(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_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(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_PTR(p_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_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 (trigger_input & (UINT64_C(1) << 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); - trigger_input = 0; + RARCH_INPUT_STATE_CLEAR_PTR(p_trigger_input); } else { - if (trigger_input & (UINT64_C(1) << 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 (trigger_input & (UINT64_C(1) << 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 (trigger_input & (UINT64_C(1) << 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 (trigger_input & (UINT64_C(1) << 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 (trigger_input & (UINT64_C(1) << 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 (trigger_input & (UINT64_C(1) << 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 (trigger_input & (UINT64_C(1) << menu_cancel_btn)) + else if (RARCH_INPUT_STATE_BIT_GET_PTR(p_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_PTR(p_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_PTR(p_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_PTR(p_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_PTR(p_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_PTR(p_trigger_input, RARCH_MENU_TOGGLE)) ret = MENU_ACTION_TOGGLE; } @@ -314,7 +314,7 @@ unsigned menu_event(uint64_t input, uint64_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 61e9f4b0e3..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(uint64_t input, uint64_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/menu/menu_setting.c b/menu/menu_setting.c index 168dd8bc5f..17e388340b 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) @@ -1441,12 +1441,13 @@ static int setting_action_ok_bind_defaults(void *data, bool wraparound) target->key = def_binds[i - MENU_SETTINGS_BIND_BEGIN].key; target->joykey = NO_BTN; target->joyaxis = AXIS_NONE; + target->mbutton = NO_BTN; } return 0; } -static void +static void setting_get_string_representation_st_float_video_refresh_rate_auto( void *data, char *s, size_t len) { @@ -6461,6 +6462,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/menu/widgets/menu_dialog.c b/menu/widgets/menu_dialog.c index 4e4ecb065b..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; @@ -263,8 +264,11 @@ 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. */ + label = msg_hash_to_str(MENU_ENUM_LABEL_HELP); + if (label) + info.label = strdup(label); menu_displaylist_ctl(DISPLAYLIST_HELP, &info); } 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/menu/widgets/menu_input_bind_dialog.c b/menu/widgets/menu_input_bind_dialog.c index 960110fcb8..456ae54b46 100644 --- a/menu/widgets/menu_input_bind_dialog.c +++ b/menu/widgets/menu_input_bind_dialog.c @@ -30,9 +30,11 @@ #define MENU_MAX_BUTTONS 219 #define MENU_MAX_AXES 32 #define MENU_MAX_HATS 4 +#define MENU_MAX_MBUTTONS 32 /*enough to cover largest libretro constant*/ struct menu_bind_state_port { + bool mbuttons[MENU_MAX_MBUTTONS]; bool buttons[MENU_MAX_BUTTONS]; int16_t axes[MENU_MAX_AXES]; uint16_t hats[MENU_MAX_HATS]; @@ -206,6 +208,7 @@ static void menu_input_key_bind_poll_bind_state( unsigned port, bool timed_out) { + unsigned b; rarch_joypad_info_t joypad_info; const input_device_driver_t *joypad = input_driver_get_joypad_driver(); @@ -217,6 +220,11 @@ static void menu_input_key_bind_poll_bind_state( memset(state->state, 0, sizeof(state->state)); + /* poll mouse (on the relevant port) */ + for (b = 0; b < MENU_MAX_MBUTTONS; b++) + state->state[port].mbuttons[b] = + input_mouse_button_raw(port, b); + joypad_info.joy_idx = 0; joypad_info.auto_binds = NULL; joypad_info.axis_threshold = 0.0f; @@ -277,6 +285,30 @@ static bool menu_input_key_bind_poll_find_trigger_pad( const struct menu_bind_state_port *o = (const struct menu_bind_state_port*) &state->state[p]; + for (b = 0; b < MENU_MAX_MBUTTONS; b++) + { + bool iterate = n->mbuttons[b] && !o->mbuttons[b]; + + if (!iterate) + continue; + + switch ( b ) + { + + case RETRO_DEVICE_ID_MOUSE_LEFT: + case RETRO_DEVICE_ID_MOUSE_RIGHT: + case RETRO_DEVICE_ID_MOUSE_MIDDLE: + case RETRO_DEVICE_ID_MOUSE_BUTTON_4: + case RETRO_DEVICE_ID_MOUSE_BUTTON_5: + case RETRO_DEVICE_ID_MOUSE_WHEELUP: + case RETRO_DEVICE_ID_MOUSE_WHEELDOWN: + case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP: + case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN: + state->target->mbutton = b; + return true; + } + } + for (b = 0; b < MENU_MAX_BUTTONS; b++) { bool iterate = n->buttons[b] && !o->buttons[b]; @@ -398,7 +430,7 @@ bool menu_input_key_bind_iterate(menu_input_ctx_bind_t *bind) } snprintf(bind->s, bind->len, - "[%s]\npress keyboard or joypad\n(timeout %d %s)", + "[%s]\npress keyboard, mouse or joypad\n(timeout %d %s)", input_config_bind_map_get_desc( menu_input_binds.begin - MENU_SETTINGS_BIND_BEGIN), rarch_timer_get_timeout(&menu_input_binds.timer), diff --git a/msg_hash.h b/msg_hash.h index 25f83229b8..0cce4dfd36 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, @@ -546,6 +547,15 @@ enum msg_hash_enums MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R3, MENU_ENUM_LABEL_VALUE_INPUT_KEY, + MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X, @@ -558,6 +568,17 @@ enum msg_hash_enums MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_KEY, @@ -853,6 +874,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), @@ -1855,7 +1877,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 diff --git a/network/netplay/netplay_discovery.c b/network/netplay/netplay_discovery.c index 8f9104251b..82e63ada7a 100644 --- a/network/netplay/netplay_discovery.c +++ b/network/netplay/netplay_discovery.c @@ -123,11 +123,13 @@ 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; + unsigned k = 0; if (lan_ad_client_fd < 0) return false; @@ -136,10 +138,9 @@ bool netplay_discovery_driver_ctl(enum rarch_netplay_discovery_ctl_state state, { case RARCH_NETPLAY_DISCOVERY_CTL_LAN_SEND_QUERY: { - struct addrinfo hints = {0}, *addr; - int canBroadcast = 1; - net_ifinfo_t interfaces; + struct addrinfo hints = {0}, *addr; + int canBroadcast = 1; if (!net_ifinfo_new(&interfaces)) return false; @@ -160,7 +161,7 @@ bool netplay_discovery_driver_ctl(enum rarch_netplay_discovery_ctl_state state, memcpy((void *) &ad_packet_buffer, "RANQ", 4); ad_packet_buffer.protocol_version = htonl(NETPLAY_PROTOCOL_VERSION); - for (k=0; k < interfaces.size; k++) + for (k = 0; k < (unsigned)interfaces.size; k++) { strlcpy(ad_packet_buffer.address, interfaces.entries[k].host, NETPLAY_HOST_STR_LEN); @@ -169,7 +170,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); @@ -191,7 +192,7 @@ bool netplay_discovery_driver_ctl(enum rarch_netplay_discovery_ctl_state state, default: return false; } - +#endif return true; } @@ -228,15 +229,23 @@ error: */ bool netplay_lan_ad_server(netplay_t *netplay) { +/* Todo: implement net_ifinfo and ntohs for consoles */ +#ifndef RARCH_CONSOLE fd_set fds; + int ret; struct timeval tmp_tv = {0}; struct sockaddr their_addr; socklen_t addr_size; rarch_system_info_t *info = NULL; - int ret, k = 0; + unsigned k = 0; char reply_addr[NETPLAY_HOST_STR_LEN], port_str[6]; struct addrinfo *our_addr, hints = {0}; + 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 +286,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; @@ -334,11 +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; + 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); + sizeof(struct ad_packet), 0, our_addr->ai_addr, our_addr->ai_addrlen); + freeaddrinfo_retro(our_addr); } else continue; @@ -347,9 +353,9 @@ bool netplay_lan_ad_server(netplay_t *netplay) continue; } } - } - + net_ifinfo_free(&interfaces); +#endif return true; } diff --git a/network/netplay/netplay_frontend.c b/network/netplay/netplay_frontend.c index 49026cb10f..b393865a7a 100644 --- a/network/netplay/netplay_frontend.c +++ b/network/netplay/netplay_frontend.c @@ -613,9 +613,12 @@ static void netplay_announce(void) char *corename = NULL; char *gamename = NULL; char *coreversion = NULL; + char *frontend_ident = NULL; settings_t *settings = config_get_ptr(); rarch_system_info_t *system = runloop_get_system_info(); uint32_t content_crc = content_get_crc(); + const frontend_ctx_driver_t + *frontend = frontend_get_ptr(); net_http_urlencode_full(&username, settings->paths.username); net_http_urlencode_full(&corename, system->info.library_name); @@ -623,18 +626,19 @@ static void netplay_announce(void) !string_is_empty(path_basename(path_get(RARCH_PATH_BASENAME))) ? path_basename(path_get(RARCH_PATH_BASENAME)) : "N/A"); net_http_urlencode_full(&coreversion, system->info.library_version); + net_http_urlencode_full(&frontend_ident, frontend->ident); buf[0] = '\0'; snprintf(buf, sizeof(buf), "username=%s&core_name=%s&core_version=%s&" "game_name=%s&game_crc=%08X&port=%d" - "&has_password=%d&has_spectate_password=%d&force_mitm=%d&retroarch_version=%s", + "&has_password=%d&has_spectate_password=%d&force_mitm=%d&retroarch_version=%s&frontend=%s", username, corename, coreversion, gamename, content_crc, settings->uints.netplay_port, *settings->paths.netplay_password ? 1 : 0, *settings->paths.netplay_spectate_password ? 1 : 0, settings->bools.netplay_use_mitm_server, - PACKAGE_VERSION); + PACKAGE_VERSION, frontend_ident); #if 0 RARCH_LOG("[netplay] announcement URL: %s\n", buf); #endif diff --git a/pkg/android/phoenix/AndroidManifest.xml b/pkg/android/phoenix/AndroidManifest.xml index a892856fc3..b2896d6872 100644 --- a/pkg/android/phoenix/AndroidManifest.xml +++ b/pkg/android/phoenix/AndroidManifest.xml @@ -1,8 +1,8 @@ diff --git a/ctr/Makefile.cores b/pkg/ctr/Makefile.cores similarity index 52% rename from ctr/Makefile.cores rename to pkg/ctr/Makefile.cores index de64f12c4f..ebf5cf7a5c 100644 --- a/ctr/Makefile.cores +++ b/pkg/ctr/Makefile.cores @@ -3,79 +3,79 @@ ifeq ($(LIBRETRO), gambatte) APP_TITLE = Gambatte Libretro APP_PRODUCT_CODE = RARCH-GAMBATTE APP_UNIQUE_ID = 0xBAC01 - APP_ICON = ctr/assets/gambatte.png - APP_BANNER = ctr/assets/gambatte_banner.png + APP_ICON = pkg/ctr/assets/gambatte.png + APP_BANNER = pkg/ctr/assets/gambatte_banner.png else ifeq ($(LIBRETRO), gpsp) APP_TITLE = gpSP Libretro APP_PRODUCT_CODE = RARCH-GPSP APP_UNIQUE_ID = 0xBAC02 - APP_ICON = ctr/assets/gpsp.png - APP_BANNER = ctr/assets/gpsp_banner.png + APP_ICON = pkg/ctr/assets/gpsp.png + APP_BANNER = pkg/ctr/assets/gpsp_banner.png APP_USE_SVCHAX = 1 else ifeq ($(LIBRETRO), fceumm) APP_TITLE = FCeumm Libretro APP_PRODUCT_CODE = RARCH-FCEUMM APP_UNIQUE_ID = 0xBAC03 - APP_ICON = ctr/assets/fceumm.png - APP_BANNER = ctr/assets/fceumm_banner.png + APP_ICON = pkg/ctr/assets/fceumm.png + APP_BANNER = pkg/ctr/assets/fceumm_banner.png else ifeq ($(LIBRETRO), nestopia) APP_TITLE = Nestopia Libretro APP_PRODUCT_CODE = RARCH-NESTOPIA APP_UNIQUE_ID = 0xBAC04 - APP_ICON = ctr/assets/nestopia.png - APP_BANNER = ctr/assets/nestopia_banner.png + APP_ICON = pkg/ctr/assets/nestopia.png + APP_BANNER = pkg/ctr/assets/nestopia_banner.png else ifeq ($(LIBRETRO), nxengine) APP_TITLE = NXengine Libretro APP_PRODUCT_CODE = RARCH-NXENGINE APP_UNIQUE_ID = 0xBAC05 - APP_ICON = ctr/assets/nxengine.png - APP_BANNER = ctr/assets/nxengine_banner.png + APP_ICON = pkg/ctr/assets/nxengine.png + APP_BANNER = pkg/ctr/assets/nxengine_banner.png else ifeq ($(LIBRETRO), genesis_plus_gx) APP_TITLE = Genesis Plus GX Libretro APP_PRODUCT_CODE = RARCH-GENPLUSGX APP_UNIQUE_ID = 0xBAC06 - APP_ICON = ctr/assets/genesis_plus_gx.png - APP_BANNER = ctr/assets/genesis_plus_gx_banner.png + APP_ICON = pkg/ctr/assets/genesis_plus_gx.png + APP_BANNER = pkg/ctr/assets/genesis_plus_gx_banner.png else ifeq ($(LIBRETRO), mednafen_wswan) APP_TITLE = Mednafen wswan Libretro APP_PRODUCT_CODE = RARCH-M-WSWAN APP_UNIQUE_ID = 0xBAC08 - APP_ICON = ctr/assets/mednafen_wswan.png - APP_BANNER = ctr/assets/mednafen_wswan_banner.png + APP_ICON = pkg/ctr/assets/mednafen_wswan.png + APP_BANNER = pkg/ctr/assets/mednafen_wswan_banner.png else ifeq ($(LIBRETRO), mednafen_vb) APP_TITLE = Mednafen VB Libretro APP_PRODUCT_CODE = RARCH-M-VB APP_UNIQUE_ID = 0xBAC09 - APP_ICON = ctr/assets/mednafen_vb.png - APP_BANNER = ctr/assets/mednafen_vb_banner.png + APP_ICON = pkg/ctr/assets/mednafen_vb.png + APP_BANNER = pkg/ctr/assets/mednafen_vb_banner.png else ifeq ($(LIBRETRO), mednafen_ngp) APP_TITLE = Mednafen NGP Libretro APP_PRODUCT_CODE = RARCH-M-NGP APP_UNIQUE_ID = 0xBAC0A - APP_ICON = ctr/assets/mednafen_ngp.png - APP_BANNER = ctr/assets/mednafen_ngp_banner.png + APP_ICON = pkg/ctr/assets/mednafen_ngp.png + APP_BANNER = pkg/ctr/assets/mednafen_ngp_banner.png else ifeq ($(LIBRETRO), 2048) APP_TITLE = 2048 Libretro APP_PRODUCT_CODE = RARCH-2048 APP_UNIQUE_ID = 0xBAC0B - APP_ICON = ctr/assets/2048.png - APP_BANNER = ctr/assets/2048_banner.png + APP_ICON = pkg/ctr/assets/2048.png + APP_BANNER = pkg/ctr/assets/2048_banner.png else ifeq ($(LIBRETRO), picodrive) APP_TITLE = Picodrive Libretro APP_PRODUCT_CODE = RARCH-PICODRIVE APP_UNIQUE_ID = 0xBAC0C - APP_ICON = ctr/assets/picodrive.png - APP_BANNER = ctr/assets/picodrive_banner.png + APP_ICON = pkg/ctr/assets/picodrive.png + APP_BANNER = pkg/ctr/assets/picodrive_banner.png APP_USE_SVCHAX = 1 @@ -84,16 +84,16 @@ else ifeq ($(LIBRETRO), mgba) APP_AUTHOR = Jeffrey Pfau APP_PRODUCT_CODE = RARCH-MGBA APP_UNIQUE_ID = 0xBAC0E - APP_ICON = ctr/assets/mgba.png - APP_BANNER = ctr/assets/mgba_banner.png + APP_ICON = pkg/ctr/assets/mgba.png + APP_BANNER = pkg/ctr/assets/mgba_banner.png else ifeq ($(LIBRETRO), quicknes) APP_TITLE = QuickNES Libretro APP_AUTHOR = blargg, kode54 APP_PRODUCT_CODE = RARCH-QUICKNES APP_UNIQUE_ID = 0xBAC0F - APP_ICON = ctr/assets/quicknes.png - APP_BANNER = ctr/assets/quicknes_banner.png + APP_ICON = pkg/ctr/assets/quicknes.png + APP_BANNER = pkg/ctr/assets/quicknes_banner.png else ifeq ($(LIBRETRO), fbalpha2012) APP_TITLE = Final Burn Alpha 2012 @@ -101,16 +101,16 @@ else ifeq ($(LIBRETRO), fbalpha2012) APP_PRODUCT_CODE = RARCH-FBA APP_UNIQUE_ID = 0xBAC17 APP_BIG_TEXT_SECTION = 1 - APP_ICON = ctr/assets/fbalpha2012.png - APP_BANNER = ctr/assets/fbalpha2012_banner.png + APP_ICON = pkg/ctr/assets/fbalpha2012.png + APP_BANNER = pkg/ctr/assets/fbalpha2012_banner.png else ifeq ($(LIBRETRO), fbalpha2012_neogeo) APP_TITLE = Final Burn Alpha 2012 - NeoGeo APP_AUTHOR = Team FB Alpha APP_PRODUCT_CODE = RARCH-FBANEOGEO APP_UNIQUE_ID = 0xBAC10 - APP_ICON = ctr/assets/fbalpha2012_neogeo.png - APP_BANNER = ctr/assets/fbalpha2012_neogeo_banner.png + APP_ICON = pkg/ctr/assets/fbalpha2012_neogeo.png + APP_BANNER = pkg/ctr/assets/fbalpha2012_neogeo_banner.png APP_SYSTEM_MODE = 80MB else ifeq ($(LIBRETRO), fbalpha2012_cps1) @@ -118,16 +118,16 @@ else ifeq ($(LIBRETRO), fbalpha2012_cps1) APP_AUTHOR = Team FB Alpha APP_PRODUCT_CODE = RARCH-FBACPS1 APP_UNIQUE_ID = 0xBAC11 - APP_ICON = ctr/assets/fbalpha2012_cps1.png - APP_BANNER = ctr/assets/fbalpha2012_cps1_banner.png + APP_ICON = pkg/ctr/assets/fbalpha2012_cps1.png + APP_BANNER = pkg/ctr/assets/fbalpha2012_cps1_banner.png else ifeq ($(LIBRETRO), fbalpha2012_cps2) APP_TITLE = Final Burn Alpha 2012 - CPS-2 APP_AUTHOR = Team FB Alpha APP_PRODUCT_CODE = RARCH-FBACPS2 APP_UNIQUE_ID = 0xBAC12 - APP_ICON = ctr/assets/fbalpha2012_cps2.png - APP_BANNER = ctr/assets/fbalpha2012_cps2_banner.png + APP_ICON = pkg/ctr/assets/fbalpha2012_cps2.png + APP_BANNER = pkg/ctr/assets/fbalpha2012_cps2_banner.png APP_SYSTEM_MODE = 80MB @@ -136,16 +136,16 @@ else ifeq ($(LIBRETRO), mednafen_pce_fast) APP_AUTHOR = Ryphecha APP_PRODUCT_CODE = RARCH-M-PCE-FAST APP_UNIQUE_ID = 0xBAC14 - APP_ICON = ctr/assets/mednafen_pce_fast.png - APP_BANNER = ctr/assets/mednafen_pce_fast_banner.png + APP_ICON = pkg/ctr/assets/mednafen_pce_fast.png + APP_BANNER = pkg/ctr/assets/mednafen_pce_fast_banner.png else ifeq ($(LIBRETRO), pcsx_rearmed) APP_TITLE = PCSX ReARMed APP_AUTHOR = PCSX Team, notaz, Exophase APP_PRODUCT_CODE = RARCH-PCSXRARMD APP_UNIQUE_ID = 0xBAC15 - APP_ICON = ctr/assets/pcsx_rearmed.png - APP_BANNER = ctr/assets/pcsx_rearmed_banner.png + APP_ICON = pkg/ctr/assets/pcsx_rearmed.png + APP_BANNER = pkg/ctr/assets/pcsx_rearmed_banner.png APP_USE_SVCHAX = 1 else ifeq ($(LIBRETRO), fmsx) @@ -153,23 +153,23 @@ else ifeq ($(LIBRETRO), fmsx) APP_AUTHOR = Marat Fayzullin APP_PRODUCT_CODE = RARCH-FMSX APP_UNIQUE_ID = 0xBAC16 - APP_ICON = ctr/assets/fmsx.png - APP_BANNER = ctr/assets/fmsx_banner.png + APP_ICON = pkg/ctr/assets/fmsx.png + APP_BANNER = pkg/ctr/assets/fmsx_banner.png else ifeq ($(LIBRETRO), mame2000) APP_TITLE = MAME-2000 APP_PRODUCT_CODE = RARCH-MAME2000 APP_UNIQUE_ID = 0xBAC19 - APP_ICON = ctr/assets/mame2000.png - APP_BANNER = ctr/assets/mame2000_banner.png + APP_ICON = pkg/ctr/assets/mame2000.png + APP_BANNER = pkg/ctr/assets/mame2000_banner.png APP_BIG_TEXT_SECTION = 1 else ifeq ($(LIBRETRO), mame2003) APP_TITLE = MAME-2003 APP_PRODUCT_CODE = RARCH-MAME2003 APP_UNIQUE_ID = 0xBAC18 - APP_ICON = ctr/assets/mame2003.png - APP_BANNER = ctr/assets/mame2003_banner.png + APP_ICON = pkg/ctr/assets/mame2003.png + APP_BANNER = pkg/ctr/assets/mame2003_banner.png APP_BIG_TEXT_SECTION = 1 @@ -178,36 +178,68 @@ else ifeq ($(LIBRETRO), snes9x2002) APP_AUTHOR = various APP_PRODUCT_CODE = RARCH-POCKETSNES APP_UNIQUE_ID = 0xBAC1A - APP_ICON = ctr/assets/snes9x2002.png - APP_BANNER = ctr/assets/snes9x2002_banner.png + APP_ICON = pkg/ctr/assets/snes9x2002.png + APP_BANNER = pkg/ctr/assets/snes9x2002_banner.png else ifeq ($(LIBRETRO), snes9x2005) APP_TITLE = Snes9x 2005 APP_PRODUCT_CODE = RARCH-CATSFC APP_UNIQUE_ID = 0xBAC07 - APP_ICON = ctr/assets/snes9x2005.png - APP_BANNER = ctr/assets/snes9x2005_banner.png + APP_ICON = pkg/ctr/assets/snes9x2005.png + APP_BANNER = pkg/ctr/assets/snes9x2005_banner.png else ifeq ($(LIBRETRO), snes9x2005_plus) APP_TITLE = Snes9x 2005 Plus APP_PRODUCT_CODE = RARCH-CATSFCPLUS APP_UNIQUE_ID = 0xBAC13 - APP_ICON = ctr/assets/snes9x2005_plus.png - APP_BANNER = ctr/assets/snes9x2005_plus_banner.png + APP_ICON = pkg/ctr/assets/snes9x2005_plus.png + APP_BANNER = pkg/ctr/assets/snes9x2005_plus_banner.png else ifeq ($(LIBRETRO), snes9x2010) APP_TITLE = Snes9x 2010 APP_PRODUCT_CODE = RARCH-SNES9XNEXT APP_UNIQUE_ID = 0xBAC0D - APP_ICON = ctr/assets/snes9x2010.png - APP_BANNER = ctr/assets/snes9x2010_banner.png + APP_ICON = pkg/ctr/assets/snes9x2010.png + APP_BANNER = pkg/ctr/assets/snes9x2010_banner.png else ifeq ($(LIBRETRO), dosbox) APP_TITLE = DosBox APP_AUTHOR = various APP_PRODUCT_CODE = RARCH-DOSBOX APP_UNIQUE_ID = 0xBAC1B - APP_ICON = ctr/assets/dosbox.png - APP_BANNER = ctr/assets/dosbox_banner.png + APP_ICON = pkg/ctr/assets/dosbox.png + APP_BANNER = pkg/ctr/assets/dosbox_banner.png + +else ifeq ($(LIBRETRO), nekop2) + APP_TITLE = Neko Project 2 + APP_AUTHOR = various + APP_PRODUCT_CODE = RARCH-NP2 + APP_UNIQUE_ID = 0xBAC1C + APP_ICON = pkg/ctr/assets/nekop2.png + APP_BANNER = pkg/ctr/assets/nekop2_banner.png + +else ifeq ($(LIBRETRO), np2kai) + APP_TITLE = Neko Project 2 Kai + APP_AUTHOR = various + APP_PRODUCT_CODE = RARCH-NP2KAI + APP_UNIQUE_ID = 0xBAC1D + APP_ICON = pkg/ctr/assets/np2kai.png + APP_BANNER = pkg/ctr/assets/np2kai_banner.png + +else ifeq ($(LIBRETRO), 81) + APP_TITLE = lr-81 + APP_AUTHOR = various + APP_PRODUCT_CODE = RARCH-81 + APP_UNIQUE_ID = 0xBAC1E + APP_ICON = pkg/ctr/assets/81.png + APP_BANNER = pkg/ctr/assets/81_banner.png + +else ifeq ($(LIBRETRO), fuse) + APP_TITLE = Fuse + APP_AUTHOR = various + APP_PRODUCT_CODE = RARCH-FUSE + APP_UNIQUE_ID = 0xBAC1F + APP_ICON = pkg/ctr/assets/fuse.png + APP_BANNER = pkg/ctr/assets/fuse_banner.png endif diff --git a/ctr/assets/2048.png b/pkg/ctr/assets/2048.png similarity index 100% rename from ctr/assets/2048.png rename to pkg/ctr/assets/2048.png diff --git a/ctr/assets/2048_banner.png b/pkg/ctr/assets/2048_banner.png similarity index 100% rename from ctr/assets/2048_banner.png rename to pkg/ctr/assets/2048_banner.png diff --git a/ctr/assets/4do.png b/pkg/ctr/assets/4do.png similarity index 100% rename from ctr/assets/4do.png rename to pkg/ctr/assets/4do.png diff --git a/ctr/assets/4do_banner.png b/pkg/ctr/assets/4do_banner.png similarity index 100% rename from ctr/assets/4do_banner.png rename to pkg/ctr/assets/4do_banner.png diff --git a/pkg/ctr/assets/81.png b/pkg/ctr/assets/81.png new file mode 100644 index 0000000000..b0404d6731 Binary files /dev/null and b/pkg/ctr/assets/81.png differ diff --git a/pkg/ctr/assets/81_banner.png b/pkg/ctr/assets/81_banner.png new file mode 100644 index 0000000000..76697a38e1 Binary files /dev/null and b/pkg/ctr/assets/81_banner.png differ diff --git a/ctr/assets/assets.7z b/pkg/ctr/assets/assets.7z similarity index 100% rename from ctr/assets/assets.7z rename to pkg/ctr/assets/assets.7z diff --git a/ctr/assets/atari800.png b/pkg/ctr/assets/atari800.png similarity index 100% rename from ctr/assets/atari800.png rename to pkg/ctr/assets/atari800.png diff --git a/ctr/assets/atari800_banner.png b/pkg/ctr/assets/atari800_banner.png similarity index 100% rename from ctr/assets/atari800_banner.png rename to pkg/ctr/assets/atari800_banner.png diff --git a/ctr/assets/default.png b/pkg/ctr/assets/default.png similarity index 100% rename from ctr/assets/default.png rename to pkg/ctr/assets/default.png diff --git a/ctr/assets/dosbox.png b/pkg/ctr/assets/dosbox.png similarity index 100% rename from ctr/assets/dosbox.png rename to pkg/ctr/assets/dosbox.png diff --git a/ctr/assets/dosbox_banner.png b/pkg/ctr/assets/dosbox_banner.png similarity index 100% rename from ctr/assets/dosbox_banner.png rename to pkg/ctr/assets/dosbox_banner.png diff --git a/ctr/assets/fbalpha2012.png b/pkg/ctr/assets/fbalpha2012.png similarity index 100% rename from ctr/assets/fbalpha2012.png rename to pkg/ctr/assets/fbalpha2012.png diff --git a/ctr/assets/fbalpha2012_banner.png b/pkg/ctr/assets/fbalpha2012_banner.png similarity index 100% rename from ctr/assets/fbalpha2012_banner.png rename to pkg/ctr/assets/fbalpha2012_banner.png diff --git a/ctr/assets/fbalpha2012_cps1.png b/pkg/ctr/assets/fbalpha2012_cps1.png similarity index 100% rename from ctr/assets/fbalpha2012_cps1.png rename to pkg/ctr/assets/fbalpha2012_cps1.png diff --git a/ctr/assets/fbalpha2012_cps1_banner.png b/pkg/ctr/assets/fbalpha2012_cps1_banner.png similarity index 100% rename from ctr/assets/fbalpha2012_cps1_banner.png rename to pkg/ctr/assets/fbalpha2012_cps1_banner.png diff --git a/ctr/assets/fbalpha2012_cps2.png b/pkg/ctr/assets/fbalpha2012_cps2.png similarity index 100% rename from ctr/assets/fbalpha2012_cps2.png rename to pkg/ctr/assets/fbalpha2012_cps2.png diff --git a/ctr/assets/fbalpha2012_cps2_banner.png b/pkg/ctr/assets/fbalpha2012_cps2_banner.png similarity index 100% rename from ctr/assets/fbalpha2012_cps2_banner.png rename to pkg/ctr/assets/fbalpha2012_cps2_banner.png diff --git a/ctr/assets/fbalpha2012_cps3.png b/pkg/ctr/assets/fbalpha2012_cps3.png similarity index 100% rename from ctr/assets/fbalpha2012_cps3.png rename to pkg/ctr/assets/fbalpha2012_cps3.png diff --git a/ctr/assets/fbalpha2012_cps3_banner.png b/pkg/ctr/assets/fbalpha2012_cps3_banner.png similarity index 100% rename from ctr/assets/fbalpha2012_cps3_banner.png rename to pkg/ctr/assets/fbalpha2012_cps3_banner.png diff --git a/ctr/assets/fbalpha2012_neogeo.png b/pkg/ctr/assets/fbalpha2012_neogeo.png similarity index 100% rename from ctr/assets/fbalpha2012_neogeo.png rename to pkg/ctr/assets/fbalpha2012_neogeo.png diff --git a/ctr/assets/fbalpha2012_neogeo_banner.png b/pkg/ctr/assets/fbalpha2012_neogeo_banner.png similarity index 100% rename from ctr/assets/fbalpha2012_neogeo_banner.png rename to pkg/ctr/assets/fbalpha2012_neogeo_banner.png diff --git a/ctr/assets/fceumm.png b/pkg/ctr/assets/fceumm.png similarity index 100% rename from ctr/assets/fceumm.png rename to pkg/ctr/assets/fceumm.png diff --git a/ctr/assets/fceumm_banner.png b/pkg/ctr/assets/fceumm_banner.png similarity index 100% rename from ctr/assets/fceumm_banner.png rename to pkg/ctr/assets/fceumm_banner.png diff --git a/ctr/assets/fmsx.png b/pkg/ctr/assets/fmsx.png similarity index 100% rename from ctr/assets/fmsx.png rename to pkg/ctr/assets/fmsx.png diff --git a/ctr/assets/fmsx_banner.png b/pkg/ctr/assets/fmsx_banner.png similarity index 100% rename from ctr/assets/fmsx_banner.png rename to pkg/ctr/assets/fmsx_banner.png diff --git a/ctr/assets/fuse.png b/pkg/ctr/assets/fuse.png similarity index 100% rename from ctr/assets/fuse.png rename to pkg/ctr/assets/fuse.png diff --git a/ctr/assets/fuse_banner.png b/pkg/ctr/assets/fuse_banner.png similarity index 100% rename from ctr/assets/fuse_banner.png rename to pkg/ctr/assets/fuse_banner.png diff --git a/ctr/assets/gambatte.png b/pkg/ctr/assets/gambatte.png similarity index 100% rename from ctr/assets/gambatte.png rename to pkg/ctr/assets/gambatte.png diff --git a/ctr/assets/gambatte_banner.png b/pkg/ctr/assets/gambatte_banner.png similarity index 100% rename from ctr/assets/gambatte_banner.png rename to pkg/ctr/assets/gambatte_banner.png diff --git a/ctr/assets/genesis_plus_gx.png b/pkg/ctr/assets/genesis_plus_gx.png similarity index 100% rename from ctr/assets/genesis_plus_gx.png rename to pkg/ctr/assets/genesis_plus_gx.png diff --git a/ctr/assets/genesis_plus_gx_banner.png b/pkg/ctr/assets/genesis_plus_gx_banner.png similarity index 100% rename from ctr/assets/genesis_plus_gx_banner.png rename to pkg/ctr/assets/genesis_plus_gx_banner.png diff --git a/ctr/assets/gpsp.png b/pkg/ctr/assets/gpsp.png similarity index 100% rename from ctr/assets/gpsp.png rename to pkg/ctr/assets/gpsp.png diff --git a/ctr/assets/gpsp_banner.png b/pkg/ctr/assets/gpsp_banner.png similarity index 100% rename from ctr/assets/gpsp_banner.png rename to pkg/ctr/assets/gpsp_banner.png diff --git a/ctr/assets/gw.png b/pkg/ctr/assets/gw.png similarity index 100% rename from ctr/assets/gw.png rename to pkg/ctr/assets/gw.png diff --git a/ctr/assets/gw_banner.png b/pkg/ctr/assets/gw_banner.png similarity index 100% rename from ctr/assets/gw_banner.png rename to pkg/ctr/assets/gw_banner.png diff --git a/ctr/assets/handy.png b/pkg/ctr/assets/handy.png similarity index 100% rename from ctr/assets/handy.png rename to pkg/ctr/assets/handy.png diff --git a/ctr/assets/handy_banner.png b/pkg/ctr/assets/handy_banner.png similarity index 100% rename from ctr/assets/handy_banner.png rename to pkg/ctr/assets/handy_banner.png diff --git a/ctr/assets/libretro_banner.png b/pkg/ctr/assets/libretro_banner.png similarity index 100% rename from ctr/assets/libretro_banner.png rename to pkg/ctr/assets/libretro_banner.png diff --git a/pkg/ctr/assets/libretro_neutral_shaded_banner.png b/pkg/ctr/assets/libretro_neutral_shaded_banner.png new file mode 100644 index 0000000000..dbfa96dd4a Binary files /dev/null and b/pkg/ctr/assets/libretro_neutral_shaded_banner.png differ diff --git a/ctr/assets/mame2000.png b/pkg/ctr/assets/mame2000.png similarity index 100% rename from ctr/assets/mame2000.png rename to pkg/ctr/assets/mame2000.png diff --git a/ctr/assets/mame2000_banner.png b/pkg/ctr/assets/mame2000_banner.png similarity index 100% rename from ctr/assets/mame2000_banner.png rename to pkg/ctr/assets/mame2000_banner.png diff --git a/ctr/assets/mame2003.png b/pkg/ctr/assets/mame2003.png similarity index 100% rename from ctr/assets/mame2003.png rename to pkg/ctr/assets/mame2003.png diff --git a/ctr/assets/mame2003_banner.png b/pkg/ctr/assets/mame2003_banner.png similarity index 100% rename from ctr/assets/mame2003_banner.png rename to pkg/ctr/assets/mame2003_banner.png diff --git a/ctr/assets/mednafen_ngp.png b/pkg/ctr/assets/mednafen_ngp.png similarity index 100% rename from ctr/assets/mednafen_ngp.png rename to pkg/ctr/assets/mednafen_ngp.png diff --git a/ctr/assets/mednafen_ngp_banner.png b/pkg/ctr/assets/mednafen_ngp_banner.png similarity index 100% rename from ctr/assets/mednafen_ngp_banner.png rename to pkg/ctr/assets/mednafen_ngp_banner.png diff --git a/ctr/assets/mednafen_pce_fast.png b/pkg/ctr/assets/mednafen_pce_fast.png similarity index 100% rename from ctr/assets/mednafen_pce_fast.png rename to pkg/ctr/assets/mednafen_pce_fast.png diff --git a/ctr/assets/mednafen_pce_fast_banner.png b/pkg/ctr/assets/mednafen_pce_fast_banner.png similarity index 100% rename from ctr/assets/mednafen_pce_fast_banner.png rename to pkg/ctr/assets/mednafen_pce_fast_banner.png diff --git a/ctr/assets/mednafen_vb.png b/pkg/ctr/assets/mednafen_vb.png similarity index 100% rename from ctr/assets/mednafen_vb.png rename to pkg/ctr/assets/mednafen_vb.png diff --git a/ctr/assets/mednafen_vb_banner.png b/pkg/ctr/assets/mednafen_vb_banner.png similarity index 100% rename from ctr/assets/mednafen_vb_banner.png rename to pkg/ctr/assets/mednafen_vb_banner.png diff --git a/ctr/assets/mednafen_wswan.png b/pkg/ctr/assets/mednafen_wswan.png similarity index 100% rename from ctr/assets/mednafen_wswan.png rename to pkg/ctr/assets/mednafen_wswan.png diff --git a/ctr/assets/mednafen_wswan_banner.png b/pkg/ctr/assets/mednafen_wswan_banner.png similarity index 100% rename from ctr/assets/mednafen_wswan_banner.png rename to pkg/ctr/assets/mednafen_wswan_banner.png diff --git a/ctr/assets/mgba.png b/pkg/ctr/assets/mgba.png similarity index 100% rename from ctr/assets/mgba.png rename to pkg/ctr/assets/mgba.png diff --git a/ctr/assets/mgba_banner.png b/pkg/ctr/assets/mgba_banner.png similarity index 100% rename from ctr/assets/mgba_banner.png rename to pkg/ctr/assets/mgba_banner.png diff --git a/pkg/ctr/assets/nekop2.png b/pkg/ctr/assets/nekop2.png new file mode 100644 index 0000000000..d7695ba10e Binary files /dev/null and b/pkg/ctr/assets/nekop2.png differ diff --git a/pkg/ctr/assets/nekop2_banner.png b/pkg/ctr/assets/nekop2_banner.png new file mode 100644 index 0000000000..c97662eb6e Binary files /dev/null and b/pkg/ctr/assets/nekop2_banner.png differ diff --git a/ctr/assets/nestopia.png b/pkg/ctr/assets/nestopia.png similarity index 100% rename from ctr/assets/nestopia.png rename to pkg/ctr/assets/nestopia.png diff --git a/ctr/assets/nestopia_banner.png b/pkg/ctr/assets/nestopia_banner.png similarity index 100% rename from ctr/assets/nestopia_banner.png rename to pkg/ctr/assets/nestopia_banner.png diff --git a/pkg/ctr/assets/np2kai.png b/pkg/ctr/assets/np2kai.png new file mode 100644 index 0000000000..d7695ba10e Binary files /dev/null and b/pkg/ctr/assets/np2kai.png differ diff --git a/pkg/ctr/assets/np2kai_banner.png b/pkg/ctr/assets/np2kai_banner.png new file mode 100644 index 0000000000..83a82db0f6 Binary files /dev/null and b/pkg/ctr/assets/np2kai_banner.png differ diff --git a/ctr/assets/nxengine.png b/pkg/ctr/assets/nxengine.png similarity index 100% rename from ctr/assets/nxengine.png rename to pkg/ctr/assets/nxengine.png diff --git a/ctr/assets/nxengine_banner.png b/pkg/ctr/assets/nxengine_banner.png similarity index 100% rename from ctr/assets/nxengine_banner.png rename to pkg/ctr/assets/nxengine_banner.png diff --git a/ctr/assets/o2em.png b/pkg/ctr/assets/o2em.png similarity index 100% rename from ctr/assets/o2em.png rename to pkg/ctr/assets/o2em.png diff --git a/ctr/assets/o2em_banner.png b/pkg/ctr/assets/o2em_banner.png similarity index 100% rename from ctr/assets/o2em_banner.png rename to pkg/ctr/assets/o2em_banner.png diff --git a/ctr/assets/pcsx_rearmed.png b/pkg/ctr/assets/pcsx_rearmed.png similarity index 100% rename from ctr/assets/pcsx_rearmed.png rename to pkg/ctr/assets/pcsx_rearmed.png diff --git a/ctr/assets/pcsx_rearmed_banner.png b/pkg/ctr/assets/pcsx_rearmed_banner.png similarity index 100% rename from ctr/assets/pcsx_rearmed_banner.png rename to pkg/ctr/assets/pcsx_rearmed_banner.png diff --git a/ctr/assets/picodrive.png b/pkg/ctr/assets/picodrive.png similarity index 100% rename from ctr/assets/picodrive.png rename to pkg/ctr/assets/picodrive.png diff --git a/ctr/assets/picodrive_banner.png b/pkg/ctr/assets/picodrive_banner.png similarity index 100% rename from ctr/assets/picodrive_banner.png rename to pkg/ctr/assets/picodrive_banner.png diff --git a/ctr/assets/prosystem.png b/pkg/ctr/assets/prosystem.png similarity index 100% rename from ctr/assets/prosystem.png rename to pkg/ctr/assets/prosystem.png diff --git a/ctr/assets/prosystem_banner.png b/pkg/ctr/assets/prosystem_banner.png similarity index 100% rename from ctr/assets/prosystem_banner.png rename to pkg/ctr/assets/prosystem_banner.png diff --git a/ctr/assets/quicknes.png b/pkg/ctr/assets/quicknes.png similarity index 100% rename from ctr/assets/quicknes.png rename to pkg/ctr/assets/quicknes.png diff --git a/ctr/assets/quicknes_banner.png b/pkg/ctr/assets/quicknes_banner.png similarity index 100% rename from ctr/assets/quicknes_banner.png rename to pkg/ctr/assets/quicknes_banner.png diff --git a/ctr/assets/silent.wav b/pkg/ctr/assets/silent.wav similarity index 100% rename from ctr/assets/silent.wav rename to pkg/ctr/assets/silent.wav diff --git a/ctr/assets/snes9x2002.png b/pkg/ctr/assets/snes9x2002.png similarity index 100% rename from ctr/assets/snes9x2002.png rename to pkg/ctr/assets/snes9x2002.png diff --git a/ctr/assets/snes9x2002_banner.png b/pkg/ctr/assets/snes9x2002_banner.png similarity index 100% rename from ctr/assets/snes9x2002_banner.png rename to pkg/ctr/assets/snes9x2002_banner.png diff --git a/ctr/assets/snes9x2005.png b/pkg/ctr/assets/snes9x2005.png similarity index 100% rename from ctr/assets/snes9x2005.png rename to pkg/ctr/assets/snes9x2005.png diff --git a/ctr/assets/snes9x2005_banner.png b/pkg/ctr/assets/snes9x2005_banner.png similarity index 100% rename from ctr/assets/snes9x2005_banner.png rename to pkg/ctr/assets/snes9x2005_banner.png diff --git a/ctr/assets/snes9x2005_plus.png b/pkg/ctr/assets/snes9x2005_plus.png similarity index 100% rename from ctr/assets/snes9x2005_plus.png rename to pkg/ctr/assets/snes9x2005_plus.png diff --git a/ctr/assets/snes9x2005_plus_banner.png b/pkg/ctr/assets/snes9x2005_plus_banner.png similarity index 100% rename from ctr/assets/snes9x2005_plus_banner.png rename to pkg/ctr/assets/snes9x2005_plus_banner.png diff --git a/ctr/assets/snes9x2010.png b/pkg/ctr/assets/snes9x2010.png similarity index 100% rename from ctr/assets/snes9x2010.png rename to pkg/ctr/assets/snes9x2010.png diff --git a/ctr/assets/snes9x2010_banner.png b/pkg/ctr/assets/snes9x2010_banner.png similarity index 100% rename from ctr/assets/snes9x2010_banner.png rename to pkg/ctr/assets/snes9x2010_banner.png diff --git a/ctr/assets/stella.png b/pkg/ctr/assets/stella.png similarity index 100% rename from ctr/assets/stella.png rename to pkg/ctr/assets/stella.png diff --git a/ctr/assets/stella_banner.png b/pkg/ctr/assets/stella_banner.png similarity index 100% rename from ctr/assets/stella_banner.png rename to pkg/ctr/assets/stella_banner.png diff --git a/ctr/assets/vecx.png b/pkg/ctr/assets/vecx.png similarity index 100% rename from ctr/assets/vecx.png rename to pkg/ctr/assets/vecx.png diff --git a/ctr/assets/vecx_banner.png b/pkg/ctr/assets/vecx_banner.png similarity index 100% rename from ctr/assets/vecx_banner.png rename to pkg/ctr/assets/vecx_banner.png diff --git a/ctr/assets/virtualjaguar.png b/pkg/ctr/assets/virtualjaguar.png similarity index 100% rename from ctr/assets/virtualjaguar.png rename to pkg/ctr/assets/virtualjaguar.png diff --git a/ctr/assets/virtualjaguar_banner.png b/pkg/ctr/assets/virtualjaguar_banner.png similarity index 100% rename from ctr/assets/virtualjaguar_banner.png rename to pkg/ctr/assets/virtualjaguar_banner.png diff --git a/ctr/assets/yabause.png b/pkg/ctr/assets/yabause.png similarity index 100% rename from ctr/assets/yabause.png rename to pkg/ctr/assets/yabause.png diff --git a/ctr/assets/yabause_banner.png b/pkg/ctr/assets/yabause_banner.png similarity index 100% rename from ctr/assets/yabause_banner.png rename to pkg/ctr/assets/yabause_banner.png diff --git a/ctr/big_text_section.xml b/pkg/ctr/big_text_section.xml similarity index 100% rename from ctr/big_text_section.xml rename to pkg/ctr/big_text_section.xml diff --git a/ctr/tools/bannertool-linux b/pkg/ctr/tools/bannertool-linux similarity index 100% rename from ctr/tools/bannertool-linux rename to pkg/ctr/tools/bannertool-linux diff --git a/ctr/tools/bannertool-mac b/pkg/ctr/tools/bannertool-mac similarity index 100% rename from ctr/tools/bannertool-mac rename to pkg/ctr/tools/bannertool-mac diff --git a/ctr/tools/bannertool.exe b/pkg/ctr/tools/bannertool.exe similarity index 100% rename from ctr/tools/bannertool.exe rename to pkg/ctr/tools/bannertool.exe diff --git a/ctr/tools/makerom-linux b/pkg/ctr/tools/makerom-linux similarity index 100% rename from ctr/tools/makerom-linux rename to pkg/ctr/tools/makerom-linux diff --git a/ctr/tools/makerom-mac b/pkg/ctr/tools/makerom-mac similarity index 100% rename from ctr/tools/makerom-mac rename to pkg/ctr/tools/makerom-mac diff --git a/ctr/tools/makerom.exe b/pkg/ctr/tools/makerom.exe similarity index 100% rename from ctr/tools/makerom.exe rename to pkg/ctr/tools/makerom.exe diff --git a/ctr/tools/template.rsf b/pkg/ctr/tools/template.rsf similarity index 100% rename from ctr/tools/template.rsf rename to pkg/ctr/tools/template.rsf diff --git a/playlist.c b/playlist.c index c410fbb5f2..2c22d9243d 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; @@ -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); } diff --git a/qb/config.comp.sh b/qb/config.comp.sh index f0fcc84844..1ce76eeb14 100644 --- a/qb/config.comp.sh +++ b/qb/config.comp.sh @@ -4,4 +4,3 @@ USE_LANG_C="yes" if [ "$OS" = 'Win32' ]; then USE_LANG_CXX="yes" fi - diff --git a/qb/config.libs.sh b/qb/config.libs.sh index ffe90a5d66..d93a6f2732 100644 --- a/qb/config.libs.sh +++ b/qb/config.libs.sh @@ -1,14 +1,13 @@ -check_switch_c C99 -std=gnu99 "Cannot find C99 compatible compiler." - -check_switch_c NOUNUSED -Wno-unused-result -add_define_make NOUNUSED "$HAVE_NOUNUSED" -check_switch_c NOUNUSED_VARIABLE -Wno-unused-variable -add_define_make NOUNUSED_VARIABLE "$HAVE_NOUNUSED_VARIABLE" +check_switch '' C99 -std=gnu99 "Cannot find C99 compatible compiler." +check_switch '' NOUNUSED -Wno-unused-result +add_define MAKEFILE NOUNUSED "$HAVE_NOUNUSED" +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 @@ -38,7 +37,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 @@ -47,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" @@ -60,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 @@ -74,12 +73,12 @@ 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 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 @@ -120,10 +119,8 @@ fi if [ "$HAVE_EGL" != "no" ] && [ "$OS" != 'Win32' ]; then check_pkgconf EGL "$VC_PREFIX"egl # some systems have EGL libs, but no pkgconfig - if [ "$HAVE_EGL" = "no" ]; then - HAVE_EGL=auto; check_lib '' EGL "-l${VC_PREFIX}EGL $EXTRA_GL_LIBS" - [ "$HAVE_EGL" = "yes" ] && EGL_LIBS=-l"$VC_PREFIX"EGL - else + check_val '' EGL "-l${VC_PREFIX}EGL $EXTRA_GL_LIBS" + if [ "$HAVE_EGL" = "yes" ]; then EGL_LIBS="$EGL_LIBS $EXTRA_GL_LIBS" fi fi @@ -150,17 +147,12 @@ 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" - -[ -z "$BIN_DIR" ] && BIN_DIR="${PREFIX}/bin" -add_define_make BIN_DIR "$BIN_DIR" - -[ -z "$MAN_DIR" ] && MAN_DIR="${PREFIX}/share/man" -add_define_make MAN_DIR "$MAN_DIR" +add_define MAKEFILE ASSETS_DIR "${ASSETS_DIR:-${PREFIX}/share}" +add_define MAKEFILE BIN_DIR "${BIN_DIR:-${PREFIX}/bin}" +add_define MAKEFILE MAN_DIR "${MAN_DIR:-${PREFIX}/share/man}" if [ "$OS" = 'DOS' ]; then HAVE_SHADERPIPELINE=no @@ -238,7 +230,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 @@ -303,20 +295,14 @@ 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 - # fix undefined variables - PKG_CONF_USED="$PKG_CONF_USED CG" - check_pkgconf OSMESA osmesa else die : 'Notice: Ignoring Cg. Desktop OpenGL is not enabled.' @@ -326,11 +312,7 @@ fi if [ "$HAVE_ZLIB" != 'no' ]; then check_pkgconf ZLIB zlib - - if [ "$HAVE_ZLIB" = 'no' ]; then - HAVE_ZLIB='auto' - check_lib '' ZLIB '-lz' - fi + check_val '' ZLIB '-lz' fi if [ "$HAVE_THREADS" != 'no' ]; then @@ -377,22 +359,19 @@ 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 if [ "$HAVE_VG" != "no" ]; then check_pkgconf VG "$VC_PREFIX"vg - if [ "$HAVE_VG" = "no" ]; then - HAVE_VG=auto; check_lib '' VG "-l${VC_PREFIX}OpenVG $EXTRA_GL_LIBS" - [ "$HAVE_VG" = "yes" ] && VG_LIBS=-l"$VC_PREFIX"OpenVG - fi + check_val '' VG "-l${VC_PREFIX}OpenVG $EXTRA_GL_LIBS" fi else HAVE_VG=no @@ -403,7 +382,10 @@ 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 [ "$OS" != 'Darwin' ]; then + check_val '' X11 -lX11 +fi check_pkgconf WAYLAND wayland-egl check_pkgconf WAYLAND_CURSOR wayland-cursor @@ -412,6 +394,14 @@ 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 + check_val '' XEXT -lXext + check_val '' XF86VM -lXxf86vm +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 @@ -423,10 +413,7 @@ fi 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 - fi + check_val '' UDEV "-ludev" fi check_header XSHM X11/Xlib.h X11/extensions/XShm.h @@ -467,7 +454,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 @@ -484,7 +471,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.comp.sh b/qb/qb.comp.sh index 01b3e8ffa6..147715443d 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 $(printf %s "$(which ${CROSS_COMPILE}gcc ${CROSS_COMPILE}cc ${CROSS_COMPILE}clang 2>/dev/null)") ''; 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 $(printf %s "$(which ${CROSS_COMPILE}g++ ${CROSS_COMPILE}c++ ${CROSS_COMPILE}clang++ 2>/dev/null)") ''; 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=$(which ${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 $(which "${CROSS_COMPILE}pkg-config" 2>/dev/null) ''; do - [ -n "$p" ] && { - PKG_CONF_PATH=$p; - break; + for pkgconf in pkgconf 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" diff --git a/qb/qb.libs.sh b/qb/qb.libs.sh index 79270c04e6..00411c9109 100644 --- a/qb/qb.libs.sh +++ b/qb/qb.libs.sh @@ -1,50 +1,48 @@ -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}" +MAKEFILE_DEFINES='' +CONFIG_DEFINES='' [ "$PREFIX" ] || PREFIX="/usr/local" -add_define_header() -{ echo "$1=$2" >> "$CONFIG_DEFINES";} +add_define() # $1 = MAKEFILE or CONFIG $2 = define $3 = value +{ eval "${1}_DEFINES=\"\${${1}_DEFINES} $2=$3\""; } -add_define_make() -{ echo "$1=$2" >> "$MAKEFILE_DEFINES";} - -add_include_dirs() -{ while [ "$1" ]; do INCLUDE_DIRS="$INCLUDE_DIRS -I$1"; shift; done - INCLUDE_DIRS="${INCLUDE_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# }\"" } -add_library_dirs() -{ while [ "$1" ]; do LIBRARY_DIRS="$LIBRARY_DIRS -L$1"; shift; done - LIBRARY_DIRS="${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" = 'no' ] && return 0 - - if [ "$1" = cxx ]; then +check_compiler() # $1 = language $2 = function in lib +{ if [ "$1" = cxx ]; then COMPILER="$CXX" TEMP_CODE="$TEMP_CXX" - TEST_C="extern \"C\" { void $4(void); } int main() { $4(); }" + TEST_C="extern \"C\" { void $2(void); } int main() { $2(); }" else COMPILER="$CC" TEMP_CODE="$TEMP_C" - TEST_C="void $4(void); int main(void) { $4(); return 0; }" + 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 + + check_compiler "$1" "$4" if [ "$4" ]; then ECHOBUF="Checking function $4 in ${3% }" 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 \ @@ -56,43 +54,24 @@ 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' ] && { + if [ "$answer" = 'no' ]; then [ "$7" ] && die 1 "$7" [ "$tmpval" = 'yes' ] && { 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 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] +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 @@ -116,12 +95,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 @@ -159,104 +139,108 @@ 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 +check_switch() # $1 = language $2 = HAVE_$2 $3 = switch $4 = critical error message [checked only if non-empty] +{ check_compiler "$1" '' + + ECHOBUF="Checking for availability of switch $3 in $COMPILER" + printf %s\\n 'int main(void) { return 0; }' > "$TEMP_CODE" 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" + "$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" } } -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 - 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" - [ "$answer" = 'no' ] && { - [ "$3" ] && die 1 "$3" - } +check_val() # $1 = language $2 = HAVE_$2 $3 = lib +{ tmpval="$(eval "printf %s \"\$HAVE_$2\"")" + if [ "$tmpval" = 'no' ]; then + eval "HAVE_$2=auto" + check_lib "$1" "$2" "$3" + fi } create_config_header() { outfile="$1"; shift - 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" + eval "set -- $CONFIG_DEFINES" + for VAR do + printf %s\\n "#define ${VAR%%=*} ${VAR#*=}" + done - echo "#endif" + printf %s\\n '#endif' } > "$outfile" } 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 "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\"")" + [ "${FLAGS}" ] && printf %s\\n "$1_CFLAGS = ${FLAGS%"${FLAGS##*[! ]}"}" + [ "${LIBS}" ] && printf %s\\n "$1_LIBS = ${LIBS%"${LIBS##*[! ]}"}" ;; esac shift done - while IFS='=' read VAR VAL; do echo "$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" diff --git a/qb/qb.params.sh b/qb/qb.params.sh index 4d79d9e177..d574c60057 100644 --- a/qb/qb.params.sh +++ b/qb/qb.params.sh @@ -34,7 +34,8 @@ 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 "--build=BUILD" "The build system (no-op)" + print_help_option "--host=HOST" "Cross-compile with HOST-gcc instead of gcc" print_help_option "--help" "Show this help" echo "" @@ -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" diff --git a/qb/qb.system.sh b/qb/qb.system.sh index 45541ea1e4..597ba350c0 100644 --- a/qb/qb.system.sh +++ b/qb/qb.system.sh @@ -1,7 +1,24 @@ -IFS=' -' -\unalias -a 2>/dev/null -PATH="$(command -p getconf PATH):$PATH" +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 diff --git a/record/drivers/record_ffmpeg.c b/record/drivers/record_ffmpeg.c index b74875f293..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 @@ -348,7 +359,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 +369,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 +389,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 +501,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) diff --git a/retroarch.c b/retroarch.c index 74fdac1479..88173a0266 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, retro_bits_t* p_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_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_DOWN)) return false; - if (!BIT64_GET(input, RETRO_DEVICE_ID_JOYPAD_Y)) + if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_Y)) return false; - if (!BIT64_GET(input, RETRO_DEVICE_ID_JOYPAD_L)) + if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_L)) return false; - if (!BIT64_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 (!BIT64_GET(input, RETRO_DEVICE_ID_JOYPAD_L3)) + if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_L3)) return false; - if (!BIT64_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 (!BIT64_GET(input, RETRO_DEVICE_ID_JOYPAD_START)) + if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_START)) return false; - if (!BIT64_GET(input, RETRO_DEVICE_ID_JOYPAD_SELECT)) + if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_SELECT)) return false; - if (!BIT64_GET(input, RETRO_DEVICE_ID_JOYPAD_L)) + if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_L)) return false; - if (!BIT64_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 (!BIT64_GET(input, RETRO_DEVICE_ID_JOYPAD_START)) + if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_START)) return false; - if (!BIT64_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 uint64_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(); - uint64_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,20 +2390,20 @@ 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))) { - 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 +2412,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 +2533,21 @@ static enum runloop_state runloop_check_state( #ifdef HAVE_MENU if (menu_is_alive) { - static uint64_t old_input = 0; + static retro_bits_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; + 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(¤t_input, &trigger_input); + focused = pause_nonactive ? is_focused : true; focused = focused && !ui_companion_is_on_foreground(); @@ -2789,11 +2799,10 @@ static enum runloop_state runloop_check_state( driver_set_nonblock_state(); } - // Display the fast forward state to the user, if needed. - if (runloop_fastmotion) { + /* Display the fast forward state to the user, if needed. */ + if (runloop_fastmotion) runloop_msg_queue_push( msg_hash_to_str(MSG_FAST_FORWARD), 1, 1, false); - } old_button_state = new_button_state; old_hold_button_state = new_hold_button_state; 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 diff --git a/retroarch.h b/retroarch.h index a8600f665b..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 @@ -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/setting_list.c b/setting_list.c index ebb84273fd..1b69342c31 100644 --- a/setting_list.c +++ b/setting_list.c @@ -131,6 +131,8 @@ static int setting_bind_action_start(void *data) bind_type = setting_get_bind_type(setting); keybind->key = def_binds[bind_type - MENU_SETTINGS_BIND_BEGIN].key; + keybind->mbutton = NO_BTN; + return 0; } #endif diff --git a/tasks/task_content.c b/tasks/task_content.c index 65a4ab6974..0c8f0b4129 100644 --- a/tasks/task_content.c +++ b/tasks/task_content.c @@ -173,27 +173,21 @@ static void content_load_init_wrap( *argc = 0; argv[(*argc)++] = strdup("retroarch"); -#ifdef HAVE_DYNAMIC - if (!args->no_content) + if (args->content_path) { -#endif - if (args->content_path) - { - RARCH_LOG("Using content: %s.\n", args->content_path); - argv[(*argc)++] = strdup(args->content_path); - } + RARCH_LOG("Using content: %s.\n", args->content_path); + argv[(*argc)++] = strdup(args->content_path); + } #ifdef HAVE_MENU - else - { - RARCH_LOG("%s\n", - msg_hash_to_str(MSG_NO_CONTENT_STARTING_DUMMY_CORE)); - argv[(*argc)++] = strdup("--menu"); - } -#endif -#ifdef HAVE_DYNAMIC + else + { + RARCH_LOG("%s\n", + msg_hash_to_str(MSG_NO_CONTENT_STARTING_DUMMY_CORE)); + argv[(*argc)++] = strdup("--menu"); } #endif + if (args->sram_path) { argv[(*argc)++] = strdup("-s"); @@ -920,7 +914,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,19 +951,18 @@ 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( + content_ctx->history_list_enable + && playlist_tmp) + command_playlist_push_write( playlist_tmp, tmp, - NULL, + label, core_path, - core_name, - NULL, - NULL) - ) - playlist_write_file(playlist_tmp); + core_name); } free(tmp); @@ -1127,7 +1122,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); } @@ -1150,6 +1145,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 +1187,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)) @@ -1213,7 +1213,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); } @@ -1315,7 +1315,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); } @@ -1443,7 +1443,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); } @@ -1548,7 +1548,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); } diff --git a/tasks/task_database.c b/tasks/task_database.c index 6e49a4125a..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)); @@ -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"); @@ -862,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; } @@ -900,7 +917,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); diff --git a/tasks/task_file_transfer.c b/tasks/task_file_transfer.c index de00534f4d..9d8ed3976a 100644 --- a/tasks/task_file_transfer.c +++ b/tasks/task_file_transfer.c @@ -67,7 +67,7 @@ void task_file_load_handler(retro_task_t *task) case NBIO_STATUS_INIT: if (nbio && !string_is_empty(nbio->path)) { - struct nbio_t *handle = nbio_open(nbio->path, NBIO_READ); + struct nbio_t *handle = (struct nbio_t*)nbio_open(nbio->path, NBIO_READ); if (handle) { diff --git a/tasks/task_screenshot.c b/tasks/task_screenshot.c index e9f071c5b2..dee2926136 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" @@ -158,23 +159,16 @@ static void task_screenshot_handler(retro_task_t *task) #endif #ifdef HAVE_IMAGEVIEWER - if (ret && !state->silence) - { - if ( - state->history_list_enable - && g_defaults.image_history - && playlist_push( - g_defaults.image_history, - state->filename, - NULL, - "builtin", - "imageviewer", - NULL, - NULL - ) + if ( ret && + !state->silence && + state->history_list_enable ) - 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); 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); 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