diff --git a/CHANGES.md b/CHANGES.md index dce2282d35..4fff1f1297 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,6 +4,7 @@ - HID: Merge new HID subsystem. - HID: Fix WaveBird support for the Wii U GCA. - LOCALIZATION: Update Italian translation. +- LOCALIZATION: Update Japanese translation. - MENU: Audio mixer now works in the menu without any cores loaded. You have to enable the setting 'Enable menu audio' for this to work. - SCANNER: Add Wii Backup File WBFS support. - X11: CRT SwitchRes support for X11/Linux. diff --git a/Makefile b/Makefile index e93d97ea95..ba73a32b8a 100644 --- a/Makefile +++ b/Makefile @@ -150,8 +150,29 @@ ifneq ($(findstring $(GPERFTOOLS),tcmalloc),) LIBS += -ltcmalloc endif +# Qt MOC generation, required for QObject-derived classes +ifneq ($(MOC_HEADERS),) + # prefix moc_ to base filename of paths and change extension from h to cpp, so a/b/foo.h becomes a/b/moc_foo.cpp + MOC_SRC := $(join $(addsuffix moc_,$(addprefix $(OBJDIR)/,$(dir $(MOC_HEADERS)))), $(notdir $(MOC_HEADERS:.h=.cpp))) + MOC_OBJ := $(patsubst %.cpp,%.o,$(MOC_SRC)) + RARCH_OBJ += $(MOC_OBJ) +endif + all: $(TARGET) config.mk +$(MOC_SRC): + @$(if $(Q), $(shell echo echo MOC $<),) + $(eval MOC_TMP := $(patsubst %.h,%_moc.cpp,$@)) + $(Q)$(MOC) -o $(MOC_TMP) $< + +$(foreach x,$(join $(addsuffix :,$(MOC_SRC)),$(MOC_HEADERS)),$(eval $x)) + +$(MOC_OBJ): + @$(if $(Q), $(shell echo echo CXX $<),) + $(Q)$(CXX) $(CPPFLAGS) $(CXXFLAGS) $(DEFINES) -MMD -c -o $@ $< + +$(foreach x,$(join $(addsuffix :,$(MOC_OBJ)),$(MOC_SRC)),$(eval $x)) + ifeq ($(MAKECMDGOALS),clean) config.mk: else @@ -250,3 +271,6 @@ clean: rm -f *.d .PHONY: all install uninstall clean + +print-%: + @echo '$*=$($*)' diff --git a/Makefile.common b/Makefile.common index d17d8a3562..c3ac7be651 100644 --- a/Makefile.common +++ b/Makefile.common @@ -324,23 +324,27 @@ DEFINES += -DHAVE_IMAGEVIEWER OBJ += cores/libretro-imageviewer/image_core.o endif -# Qt - -ifeq ($(HAVE_QT_WRAPPER), 1) -OBJ += ui/drivers/ui_qt.o -LIBS += -lQt5Quick -lQt5Widgets -lQt5Gui -lQt5Qml -lQt5Network -lQt5Core -L./ui/drivers/qt/build/release/ -LIBS += -lwrapper -endif +# Qt WIMP GUI ifeq ($(HAVE_QT), 1) OBJ += ui/drivers/ui_qt.o \ ui/drivers/qt/ui_qt_application.o \ ui/drivers/qt/ui_qt_window.o \ ui/drivers/qt/ui_qt_browser_window.o \ + ui/drivers/qt/ui_qt_load_core_window.o \ ui/drivers/qt/ui_qt_msg_window.o +MOC_HEADERS += ui/drivers/ui_qt.h \ + ui/drivers/qt/ui_qt_load_core_window.h + +DEFINES += $(QT5CORE_CFLAGS) $(QT5GUI_CFLAGS) $(QT5WIDGETS_CFLAGS) -DHAVE_MAIN +#DEFINES += $(QT5WEBENGINE_CFLAGS) +LIBS += $(QT5CORE_LIBS) $(QT5GUI_LIBS) $(QT5WIDGETS_LIBS) +#LIBS += $(QT5WEBENGINE_LIBS) +NEED_CXX_LINKER = 1 + ifneq ($(findstring Linux,$(OS)),) -DEFINES += -I/usr/include/qt -fPIC +DEFINES += -fPIC endif endif @@ -1185,7 +1189,7 @@ ifeq ($(HAVE_VULKAN), 1) ifeq ($(HAVE_MENU_COMMON), 1) OBJ += menu/drivers_display/menu_display_vulkan.o endif - LIBS += -lstdc++ + #LIBS += -lstdc++ DEFINES += -DHAVE_VULKAN INCLUDE_DIRS += -Igfx/include diff --git a/audio/audio_driver.c b/audio/audio_driver.c index 1daab6cf50..dfa853cfa1 100644 --- a/audio/audio_driver.c +++ b/audio/audio_driver.c @@ -45,6 +45,16 @@ #define AUDIO_BUFFER_FREE_SAMPLES_COUNT (8 * 1024) +/** + * db_to_gain: + * @db : Decibels. + * + * Converts decibels to voltage gain. + * + * Returns: voltage gain value. + **/ +#define db_to_gain(db) (powf(10.0f, (db) / 20.0f)) + static const audio_driver_t *audio_drivers[] = { #ifdef HAVE_ALSA &audio_alsa, @@ -361,6 +371,12 @@ static bool audio_driver_deinit_internal(void) return true; } +static void audio_driver_mixer_init(unsigned out_rate) +{ + audio_mixer_init(out_rate); +} + + static bool audio_driver_init_internal(bool audio_cb_inited) { unsigned new_rate = 0; @@ -527,7 +543,7 @@ static bool audio_driver_init_internal(bool audio_cb_inited) audio_driver_free_samples_count = 0; - audio_mixer_init(settings->uints.audio_out_rate); + audio_driver_mixer_init(settings->uints.audio_out_rate); /* Threaded driver is initially stopped. */ if ( @@ -665,7 +681,7 @@ static void audio_driver_flush(const int16_t *data, size_t samples) if (audio_mixer_active) { bool override = audio_driver_mixer_mute_enable ? true : - (audio_driver_mixer_volume_gain != 0.0f) ? true : false; + (audio_driver_mixer_volume_gain != 1.0f) ? true : false; float mixer_gain = !audio_driver_mixer_mute_enable ? audio_driver_mixer_volume_gain : 0.0f; audio_mixer_mix(audio_driver_output_samples_buf, @@ -1071,7 +1087,7 @@ bool audio_driver_mixer_add_stream(audio_mixer_stream_params_t *params) audio_mixer_stop_cb_t stop_cb = audio_mixer_play_stop_cb; bool looped = false; void *buf = NULL; - + if (!audio_driver_mixer_get_free_stream_slot(&free_slot)) return false; @@ -1157,7 +1173,7 @@ static void audio_driver_mixer_play_stream_internal(unsigned i, bool looped) switch (audio_mixer_streams[i].state) { case AUDIO_STREAM_STATE_STOPPED: - audio_mixer_streams[i].voice = audio_mixer_play(audio_mixer_streams[i].handle, looped, audio_mixer_streams[i].volume, audio_mixer_streams[i].stop_cb); + audio_mixer_streams[i].voice = audio_mixer_play(audio_mixer_streams[i].handle, looped, 1.0f, audio_mixer_streams[i].stop_cb); set_state = true; break; case AUDIO_STREAM_STATE_PLAYING: @@ -1180,6 +1196,29 @@ void audio_driver_mixer_play_stream_looped(unsigned i) audio_driver_mixer_play_stream_internal(i, true); } +float audio_driver_mixer_get_stream_volume(unsigned i) +{ + if (i >= AUDIO_MIXER_MAX_STREAMS) + return 0.0f; + + return audio_mixer_streams[i].volume; +} + +void audio_driver_mixer_set_stream_volume(unsigned i, float vol) +{ + audio_mixer_voice_t *voice = NULL; + + if (i >= AUDIO_MIXER_MAX_STREAMS) + return; + + audio_mixer_streams[i].volume = vol; + + voice = audio_mixer_streams[i].voice; + + if (voice) + audio_mixer_voice_set_volume(voice, db_to_gain(vol)); +} + void audio_driver_mixer_stop_stream(unsigned i) { bool set_state = false; @@ -1205,6 +1244,7 @@ void audio_driver_mixer_stop_stream(unsigned i) if (voice) audio_mixer_stop(voice); audio_mixer_streams[i].state = AUDIO_STREAM_STATE_STOPPED; + audio_mixer_streams[i].volume = 1.0f; } } @@ -1235,8 +1275,8 @@ void audio_driver_mixer_remove_stream(unsigned i) if (handle) audio_mixer_destroy(handle); audio_mixer_streams[i].state = AUDIO_STREAM_STATE_NONE; - audio_mixer_streams[i].volume = 0.0f; audio_mixer_streams[i].stop_cb = NULL; + audio_mixer_streams[i].volume = 0.0f; audio_mixer_streams[i].handle = NULL; audio_mixer_streams[i].voice = NULL; } @@ -1452,15 +1492,6 @@ void audio_set_bool(enum audio_action action, bool val) } } -/** - * db_to_gain: - * @db : Decibels. - * - * Converts decibels to voltage gain. - * - * Returns: voltage gain value. - **/ -#define db_to_gain(db) (powf(10.0f, (db) / 20.0f)) void audio_set_float(enum audio_action action, float val) { diff --git a/audio/audio_driver.h b/audio/audio_driver.h index 0b3f991e4c..440e563ba1 100644 --- a/audio/audio_driver.h +++ b/audio/audio_driver.h @@ -296,6 +296,10 @@ void audio_driver_mixer_play_stream_looped(unsigned i); void audio_driver_mixer_stop_stream(unsigned i); +float audio_driver_mixer_get_stream_volume(unsigned i); + +void audio_driver_mixer_set_stream_volume(unsigned i, float vol); + void audio_driver_mixer_remove_stream(unsigned i); enum resampler_quality audio_driver_get_resampler_quality(void); diff --git a/command.c b/command.c index 1a279788d8..02223414ef 100644 --- a/command.c +++ b/command.c @@ -169,6 +169,7 @@ static const struct cmd_map map[] = { { "DISK_NEXT", RARCH_DISK_NEXT }, { "DISK_PREV", RARCH_DISK_PREV }, { "GRAB_MOUSE_TOGGLE", RARCH_GRAB_MOUSE_TOGGLE }, + { "UI_COMPANION_TOGGLE", RARCH_UI_COMPANION_TOGGLE }, { "GAME_FOCUS_TOGGLE", RARCH_GAME_FOCUS_TOGGLE }, { "MENU_TOGGLE", RARCH_MENU_TOGGLE }, { "MENU_UP", RETRO_DEVICE_ID_JOYPAD_UP }, @@ -1705,7 +1706,7 @@ void command_playlist_update_write( const char *core_path, const char *core_display_name, const char *crc32, - const char *db_name) + const char *db_name) { playlist_t *plist = (playlist_t*)data; playlist_t *playlist = plist ? plist : playlist_get_cached(); @@ -1787,10 +1788,11 @@ bool command_event(enum event_command cmd, void *data) return false; #endif - libretro_get_system_info( + if (!libretro_get_system_info( core_path, system, - &system_info->load_no_content); + &system_info->load_no_content)) + return false; info_find.path = core_path; if (!core_info_load(&info_find)) @@ -1803,11 +1805,17 @@ bool command_event(enum event_command cmd, void *data) } break; case CMD_EVENT_LOAD_CORE: - command_event(CMD_EVENT_LOAD_CORE_PERSIST, NULL); + { + bool success = command_event(CMD_EVENT_LOAD_CORE_PERSIST, NULL); + #ifndef HAVE_DYNAMIC command_event(CMD_EVENT_QUIT, NULL); +#else + if (!success) + return false; #endif break; + } case CMD_EVENT_LOAD_STATE: /* Immutable - disallow savestate load when * we absolutely cannot change game state. */ @@ -1925,7 +1933,7 @@ bool command_event(enum event_command cmd, void *data) cheevos_toggle_hardcore_mode(); #endif break; - /* this fallthrough is on purpose, it should do + /* this fallthrough is on purpose, it should do a CMD_EVENT_REINIT too */ case CMD_EVENT_REINIT_FROM_TOGGLE: retroarch_unset_forced_fullscreen(); @@ -2010,7 +2018,7 @@ TODO: Add a setting for these tweaks */ case CMD_EVENT_AUTOSAVE_INIT: command_event(CMD_EVENT_AUTOSAVE_DEINIT, NULL); #ifdef HAVE_THREADS - { + { #ifdef HAVE_NETWORKING /* Only enable state manager if netplay is not underway TODO: Add a setting for these tweaks */ @@ -2024,7 +2032,7 @@ TODO: Add a setting for these tweaks */ else runloop_unset(RUNLOOP_ACTION_AUTOSAVE); } - } + } #endif break; case CMD_EVENT_AUTOSAVE_STATE: @@ -2306,7 +2314,7 @@ TODO: Add a setting for these tweaks */ case CMD_EVENT_RESUME: rarch_menu_running_finished(); if (ui_companion_is_on_foreground()) - ui_companion_driver_toggle(); + ui_companion_driver_toggle(false); break; case CMD_EVENT_ADD_TO_FAVORITES: { @@ -2355,7 +2363,7 @@ TODO: Add a setting for these tweaks */ runloop_msg_queue_push(msg_hash_to_str(MSG_RESET_CORE_ASSOCIATION), 1, 180, true); break; - } + } case CMD_EVENT_RESTART_RETROARCH: if (!frontend_driver_set_fork(FRONTEND_FORK_RESTART)) return false; @@ -2577,7 +2585,7 @@ TODO: Add a setting for these tweaks */ case CMD_EVENT_FULLSCREEN_TOGGLE: { settings_t *settings = config_get_ptr(); - bool new_fullscreen_state = !settings->bools.video_fullscreen + bool new_fullscreen_state = !settings->bools.video_fullscreen && !retroarch_is_forced_fullscreen(); if (!video_driver_has_windowed()) return false; @@ -2736,6 +2744,11 @@ TODO: Add a setting for these tweaks */ video_driver_show_mouse(); } break; + case CMD_EVENT_UI_COMPANION_TOGGLE: + { + ui_companion_driver_toggle(true); + break; + } case CMD_EVENT_GAME_FOCUS_TOGGLE: { static bool game_focus_state = false; diff --git a/command.h b/command.h index 9cc3e3ce17..139db92890 100644 --- a/command.h +++ b/command.h @@ -139,7 +139,7 @@ enum event_command /* Add a playlist entry to favorites. */ CMD_EVENT_ADD_TO_FAVORITES, /* Reset playlist entry associated core to DETECT */ - CMD_EVENT_RESET_CORE_ASSOCIATION, + CMD_EVENT_RESET_CORE_ASSOCIATION, /* Toggles pause. */ CMD_EVENT_PAUSE_TOGGLE, /* Pauses RetroArch. */ @@ -218,6 +218,8 @@ enum event_command CMD_EVENT_GRAB_MOUSE_TOGGLE, /* Toggles game focus. */ CMD_EVENT_GAME_FOCUS_TOGGLE, + /* Toggles desktop menu. */ + CMD_EVENT_UI_COMPANION_TOGGLE, /* Toggles fullscreen mode. */ CMD_EVENT_FULLSCREEN_TOGGLE, CMD_EVENT_PERFCNT_REPORT_FRONTEND_LOG, @@ -271,7 +273,7 @@ void command_playlist_push_write( void command_playlist_update_write( void *data, size_t idx, - const char *path, + const char *path, const char *label, const char *core_path, const char *core_display_name, diff --git a/config.def.h b/config.def.h index 55653b7dc8..155fa181b6 100644 --- a/config.def.h +++ b/config.def.h @@ -670,6 +670,12 @@ static const bool ui_companion_start_on_boot = true; static const bool ui_companion_enable = false; +/* Currently only used to show the WIMP UI on startup */ +static const bool ui_companion_toggle = false; + +/* Only init the WIMP UI for this session if this is enabled */ +static const bool desktop_menu_enable = true; + #if defined(__QNX__) || defined(_XBOX1) || defined(_XBOX360) || defined(__CELLOS_LV2__) || (defined(__MACH__) && defined(IOS)) || defined(ANDROID) || defined(WIIU) || defined(HAVE_NEON) || defined(GEKKO) || defined(__ARM_NEON__) static enum resampler_quality audio_resampler_quality_level = RESAMPLER_QUALITY_LOWER; #elif defined(PSP) || defined(_3DS) || defined(VITA) diff --git a/config.def.keybinds.h b/config.def.keybinds.h index 298f9971a6..d941a210cf 100644 --- a/config.def.keybinds.h +++ b/config.def.keybinds.h @@ -97,6 +97,7 @@ static const struct retro_keybind retro_keybinds_1[] = { { 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_UI_COMPANION_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_UI_COMPANION_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, NO_BTN, 0, AXIS_NONE }, @@ -172,6 +173,7 @@ static const struct retro_keybind retro_keybinds_1[] = { { 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_UI_COMPANION_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_UI_COMPANION_TOGGLE, RETROK_F5, 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 }; diff --git a/configuration.c b/configuration.c index 4e5da257f0..4433f53ad6 100644 --- a/configuration.c +++ b/configuration.c @@ -1180,6 +1180,8 @@ static struct config_bool_setting *populate_settings_bool(settings_t *settings, SETTING_BOOL("automatically_add_content_to_playlist", &settings->bools.automatically_add_content_to_playlist, true, automatically_add_content_to_playlist, false); SETTING_BOOL("ui_companion_start_on_boot", &settings->bools.ui_companion_start_on_boot, true, ui_companion_start_on_boot, false); SETTING_BOOL("ui_companion_enable", &settings->bools.ui_companion_enable, true, ui_companion_enable, false); + SETTING_BOOL("ui_companion_toggle", &settings->bools.ui_companion_toggle, false, ui_companion_toggle, false); + SETTING_BOOL("desktop_menu_enable", &settings->bools.desktop_menu_enable, true, desktop_menu_enable, false); SETTING_BOOL("video_gpu_record", &settings->bools.video_gpu_record, true, gpu_record, false); SETTING_BOOL("input_remap_binds_enable", &settings->bools.input_remap_binds_enable, true, true, false); SETTING_BOOL("all_users_control_menu", &settings->bools.input_all_users_control_menu, true, all_users_control_menu, false); @@ -3526,14 +3528,14 @@ static void save_keybind_mbutton(config_file_t *conf, const char *base, const struct retro_keybind *bind, bool save_empty) { - char key[64]; + char key[64]; - key[0] = '\0'; + key[0] = '\0'; - fill_pathname_join_delim_concat(key, prefix, - base, '_', "_mbtn", sizeof(key)); + fill_pathname_join_delim_concat(key, prefix, + base, '_', "_mbtn", sizeof(key)); - switch ( bind->mbutton ) + switch ( bind->mbutton ) { case RETRO_DEVICE_ID_MOUSE_LEFT: config_set_uint64(conf, key, 1); diff --git a/configuration.h b/configuration.h index affea22fa7..64cf46e2d6 100644 --- a/configuration.h +++ b/configuration.h @@ -198,6 +198,8 @@ typedef struct settings bool ui_suspend_screensaver_enable; bool ui_companion_start_on_boot; bool ui_companion_enable; + bool ui_companion_toggle; + bool desktop_menu_enable; /* Cheevos */ bool cheevos_enable; diff --git a/core_info.c b/core_info.c index d7ed2041d6..18bcfeffec 100644 --- a/core_info.c +++ b/core_info.c @@ -151,6 +151,7 @@ static void core_info_list_free(core_info_list_t *core_info_list) free(info->systemname); free(info->system_manufacturer); free(info->display_name); + free(info->display_version); free(info->supported_extensions); free(info->authors); free(info->permissions); @@ -278,6 +279,13 @@ static core_info_list_t *core_info_list_new(const char *path, free(tmp); tmp = NULL; } + if (config_get_string(conf, "display_version", &tmp) + && !string_is_empty(tmp)) + { + core_info[i].display_version = strdup(tmp); + free(tmp); + tmp = NULL; + } if (config_get_string(conf, "corename", &tmp) && !string_is_empty(tmp)) { diff --git a/core_info.h b/core_info.h index b63fa8df98..f87805e605 100644 --- a/core_info.h +++ b/core_info.h @@ -43,6 +43,7 @@ typedef struct char *path; void *config_data; char *display_name; + char *display_version; char *core_name; char *system_manufacturer; char *systemname; diff --git a/frontend/frontend.c b/frontend/frontend.c index bd2fecde6e..8dd0b71693 100644 --- a/frontend/frontend.c +++ b/frontend/frontend.c @@ -37,6 +37,13 @@ #include "../paths.h" #include "../retroarch.h" +/* griffin hack */ +#ifdef HAVE_QT +#ifndef HAVE_MAIN +#define HAVE_MAIN +#endif +#endif + #ifndef HAVE_MAIN #include "../retroarch.h" #endif @@ -98,6 +105,9 @@ void main_exit(void *args) int rarch_main(int argc, char *argv[], void *data) { void *args = (void*)data; +#ifdef HAVE_MAIN + const ui_application_t *ui_application = NULL; +#endif rarch_ctl(RARCH_CTL_PREINIT, NULL); frontend_driver_init_first(args); @@ -140,6 +150,11 @@ int rarch_main(int argc, char *argv[], void *data) }while(1); main_exit(args); +#elif HAVE_QT + ui_application = ui_companion_driver_get_qt_application_ptr(); + + if (ui_application && ui_application->run) + ui_application->run(args); #endif return 0; diff --git a/gfx/common/win32_common.c b/gfx/common/win32_common.c index b29359a8ce..23951682e4 100644 --- a/gfx/common/win32_common.c +++ b/gfx/common/win32_common.c @@ -434,7 +434,7 @@ static int win32_drag_query_file(HWND hwnd, WPARAM wparam) #ifndef _XBOX static LRESULT win32_handle_keyboard_event(HWND hwnd, UINT message, - WPARAM wparam, LPARAM lparam) + WPARAM wparam, LPARAM lparam) { uint16_t mod = 0; @@ -818,7 +818,7 @@ bool win32_window_create(void *data, unsigned style, notification_filter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; notification_filter.dbcc_classguid = GUID_DEVINTERFACE_HID; notification_handler = RegisterDeviceNotification( - main_window.hwnd, ¬ification_filter, DEVICE_NOTIFY_WINDOW_HANDLE); + main_window.hwnd, ¬ification_filter, DEVICE_NOTIFY_WINDOW_HANDLE); if (!notification_handler) RARCH_ERR("Error registering for notifications\n"); @@ -1029,7 +1029,7 @@ void win32_set_style(MONITORINFOEX *current_mon, HMONITOR *hm_to_use, float refresh_mod = settings->bools.video_black_frame_insertion ? 2.0f : 1.0f; unsigned refresh = roundf(settings->floats.video_refresh_rate * refresh_mod * settings->uints.video_swap_interval); - + if (windowed_full) { *style = WS_EX_TOPMOST | WS_POPUP; diff --git a/gfx/drivers_context/x_ctx.c b/gfx/drivers_context/x_ctx.c index bc906021bb..aa097bb6cc 100644 --- a/gfx/drivers_context/x_ctx.c +++ b/gfx/drivers_context/x_ctx.c @@ -124,7 +124,7 @@ typedef struct Hints } Hints; /* We use long because X11 wants 32-bit pixels for 32-bit systems and 64 for 64... */ -const unsigned long retroarch_icon_data[] = { +static const unsigned long retroarch_icon_data[] = { 16, 16, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, diff --git a/gfx/video_driver.c b/gfx/video_driver.c index acd5eb8152..1776954fef 100644 --- a/gfx/video_driver.c +++ b/gfx/video_driver.c @@ -229,6 +229,8 @@ static void *video_context_data = NULL; static bool deferred_video_context_driver_set_flags = false; static gfx_ctx_flags_t deferred_flag_data = {0}; +static bool video_started_fullscreen = false; + static shader_backend_t *current_shader = NULL; static void *current_shader_data = NULL; @@ -422,6 +424,11 @@ static const shader_backend_t *shader_ctx_drivers[] = { NULL }; +bool video_driver_started_fullscreen(void) +{ + return video_started_fullscreen; +} + /* Stub functions */ static void update_window_title_null(void *data, void *data2) @@ -1021,6 +1028,8 @@ static bool video_driver_init_internal(bool *video_is_threaded) (video_driver_pix_fmt == RETRO_PIXEL_FORMAT_XRGB8888); video.parent = 0; + video_started_fullscreen = video.fullscreen; + /* Reset video frame count */ video_driver_frame_count = 0; @@ -1631,7 +1640,7 @@ bool video_driver_supports_viewport_read(void) bool video_driver_supports_read_frame_raw(void) { if (current_video->read_frame_raw) - return true; + return true; return false; } @@ -2562,11 +2571,11 @@ void video_driver_frame(const void *data, unsigned width, compute_audio_buffer_statistics(&audio_stats); snprintf(video_info.stat_text, - sizeof(video_info.stat_text), + sizeof(video_info.stat_text), "Video Statistics:\n -Frame rate: %6.2f fps\n -Frame time: %6.2f ms\n -Frame time deviation: %.3f %%\n" " -Frame count: %" PRIu64"\n -Viewport: %d x %d x %3.2f\n" "Audio Statistics:\n -Average buffer saturation: %.2f %%\n -Standard deviation: %.2f %%\n -Time spent close to underrun: %.2f %%\n -Time spent close to blocking: %.2f %%\n -Sample count: %d\n" - "Core Geometry:\n -Size: %u x %u\n -Max Size: %u x %u\n -Aspect: %3.2f\nCore Timing:\n -FPS: %3.2f\n -Sample Rate: %6.2f\n", + "Core Geometry:\n -Size: %u x %u\n -Max Size: %u x %u\n -Aspect: %3.2f\nCore Timing:\n -FPS: %3.2f\n -Sample Rate: %6.2f\n", video_info.frame_rate, video_info.frame_time, 100.0 * stddev, @@ -3336,7 +3345,7 @@ bool video_context_driver_set_flags(gfx_ctx_flags_t *flags) enum gfx_ctx_api video_context_driver_get_api(void) { - enum gfx_ctx_api ctx_api = video_context_data ? + enum gfx_ctx_api ctx_api = video_context_data ? current_video_context.get_api(video_context_data) : GFX_CTX_NONE; if (ctx_api == GFX_CTX_NONE) @@ -3436,7 +3445,7 @@ void video_shader_driver_use(void *data) { if (current_shader && current_shader->use) { - video_shader_ctx_info_t *shader_info = + video_shader_ctx_info_t *shader_info = (video_shader_ctx_info_t*)data; current_shader->use(shader_info->data, current_shader_data, shader_info->idx, shader_info->set_active); diff --git a/gfx/video_driver.h b/gfx/video_driver.h index 4563e9a3b7..5cb44cf763 100644 --- a/gfx/video_driver.h +++ b/gfx/video_driver.h @@ -1347,6 +1347,8 @@ float video_driver_get_refresh_rate(void); extern bool (*video_driver_cb_has_focus)(void); +bool video_driver_started_fullscreen(void); + extern video_driver_t video_gl; extern video_driver_t video_vulkan; extern video_driver_t video_psp1; diff --git a/griffin/griffin_cpp.cpp b/griffin/griffin_cpp.cpp index ac200c1f80..562d395a00 100644 --- a/griffin/griffin_cpp.cpp +++ b/griffin/griffin_cpp.cpp @@ -33,6 +33,7 @@ MENU UI ============================================================ */ #if defined(HAVE_QT) +#define HAVE_MAIN /* also requires defining in frontend.c */ #include "../ui/drivers/ui_qt.cpp" #include "../ui/drivers/qt/ui_qt_window.cpp" @@ -41,10 +42,6 @@ UI #include "../ui/drivers/qt/ui_qt_application.cpp" #endif -#if defined(HAVE_QT_WRAPPER) -#include "../ui/drivers/ui_qt.cpp" -#endif - /*============================================================ VIDEO DRIVER ============================================================ */ diff --git a/input/input_defines.h b/input/input_defines.h index 12e2be7e97..5e4103bcc9 100644 --- a/input/input_defines.h +++ b/input/input_defines.h @@ -53,19 +53,19 @@ enum 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, + /* 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_FIRST_MISC_CUSTOM_BIND, @@ -107,6 +107,7 @@ enum RARCH_DISK_PREV, RARCH_GRAB_MOUSE_TOGGLE, RARCH_GAME_FOCUS_TOGGLE, + RARCH_UI_COMPANION_TOGGLE, RARCH_MENU_TOGGLE, diff --git a/input/input_driver.c b/input/input_driver.c index 742b34b1b9..f51faf1c51 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -296,17 +296,17 @@ 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( 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), @@ -343,6 +343,7 @@ const struct input_bind_map input_config_bind_map[RARCH_BIND_LIST_END_NULL] = { DECLARE_META_BIND(2, disk_prev, RARCH_DISK_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_PREV), DECLARE_META_BIND(2, grab_mouse_toggle, RARCH_GRAB_MOUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GRAB_MOUSE_TOGGLE), DECLARE_META_BIND(2, game_focus_toggle, RARCH_GAME_FOCUS_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GAME_FOCUS_TOGGLE), + DECLARE_META_BIND(2, desktop_menu_toggle, RARCH_UI_COMPANION_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_UI_COMPANION_TOGGLE), #ifdef HAVE_MENU DECLARE_META_BIND(1, menu_toggle, RARCH_MENU_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE), #endif @@ -1001,9 +1002,10 @@ void input_menu_keys_pressed(void *data, input_bits_t *p_new_state) if (!menu_input_dialog_get_display_kb()) { - unsigned ids[14][2]; + unsigned ids[15][2]; const struct retro_keybind *quitkey = &input_config_binds[0][RARCH_QUIT_KEY]; const struct retro_keybind *fskey = &input_config_binds[0][RARCH_FULLSCREEN_TOGGLE_KEY]; + const struct retro_keybind *companionkey = &input_config_binds[0][RARCH_UI_COMPANION_TOGGLE]; ids[0][0] = RETROK_SPACE; ids[0][1] = RETRO_DEVICE_ID_JOYPAD_START; @@ -1033,6 +1035,8 @@ void input_menu_keys_pressed(void *data, input_bits_t *p_new_state) ids[12][1] = RETRO_DEVICE_ID_JOYPAD_A; ids[13][0] = RETROK_DELETE; ids[13][1] = RETRO_DEVICE_ID_JOYPAD_Y; + ids[14][0] = companionkey->key; + ids[14][1] = RARCH_UI_COMPANION_TOGGLE; if (settings->bools.input_menu_swap_ok_cancel_buttons) { @@ -1040,7 +1044,7 @@ void input_menu_keys_pressed(void *data, input_bits_t *p_new_state) ids[12][1] = RETRO_DEVICE_ID_JOYPAD_B; } - for (i = 0; i < 14; i++) + for (i = 0; i < 15; i++) { if (current_input->input_state(current_input_data, joypad_info, binds, 0, @@ -1092,7 +1096,7 @@ void input_keys_pressed(void *data, input_bits_t *p_new_state) if (check_input_driver_block_hotkey(binds_norm, binds_auto)) { - const struct retro_keybind *enable_hotkey = + const struct retro_keybind *enable_hotkey = &input_config_binds[0][RARCH_ENABLE_HOTKEY]; if ( enable_hotkey && enable_hotkey->valid @@ -1106,9 +1110,9 @@ void input_keys_pressed(void *data, input_bits_t *p_new_state) if (binds[RARCH_GAME_FOCUS_TOGGLE].valid) { - const struct retro_keybind *focus_binds_auto = + const struct retro_keybind *focus_binds_auto = &input_autoconf_binds[0][RARCH_GAME_FOCUS_TOGGLE]; - const struct retro_keybind *focus_normal = + const struct retro_keybind *focus_normal = &binds[RARCH_GAME_FOCUS_TOGGLE]; /* Allows rarch_focus_toggle hotkey to still work @@ -1172,7 +1176,7 @@ void input_get_state_for_port(void *data, unsigned port, input_bits_t *p_new_sta for (j = 0; j < 2; j++) { unsigned offset = 0 + (i * 4) + (j * 2); - int16_t val = input_joypad_analog(joypad_driver, + int16_t val = input_joypad_analog(joypad_driver, joypad_info, port, i, j, libretro_input_binds[port]); if (val >= 0) @@ -2761,9 +2765,9 @@ unsigned input_config_get_device_count() unsigned num_devices; for ( num_devices = 0; num_devices < MAX_INPUT_DEVICES; ++num_devices ) { - const char *device_name = input_config_get_device_name(num_devices); - if ( string_is_empty(device_name) ) - break; + const char *device_name = input_config_get_device_name(num_devices); + if ( string_is_empty(device_name) ) + break; } return num_devices; } @@ -2797,7 +2801,7 @@ void input_config_set_device_name(unsigned port, const char *name) name, sizeof(input_device_names[port])); - input_autoconfigure_joypad_reindex_devices(); + input_autoconfigure_joypad_reindex_devices(); } } diff --git a/intl/msg_hash_ja.h b/intl/msg_hash_ja.h index e5eb01c715..a53af8fe5a 100644 --- a/intl/msg_hash_ja.h +++ b/intl/msg_hash_ja.h @@ -498,6 +498,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_VERBOSE_ENABLE, "実績の詳細モード" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_AUTO_SCREENSHOT, + "自動スクリーンショット" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ACHIEVEMENTS, "解除可能の実績:" @@ -885,6 +889,10 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_GRAB_MOUSE_TOGGLE, "マウスグラブを切り替え") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_GAME_FOCUS_TOGGLE, "ゲームのフォーカスを切り替え") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_UI_COMPANION_TOGGLE, + "デスクトップメニューを切り替え") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DESKTOP_MENU_ENABLE, + "デスクトップメニューを有効(再起動が必要)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, "保存状態をロード") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, @@ -917,6 +925,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_PREV, "前のシェーダー") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION_HOLD_KEY, "ホルドでスローモーション") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION_KEY, + "スローモーションに切り替え") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS, "前の状態スロット") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS, @@ -961,8 +971,10 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_TURBO_PERIOD, "ターボの期間") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_USER_BINDS, "入力ユーザー%uのバインド") +MSG_HASH(MENU_ENUM_LABEL_VALUE_LATENCY_SETTINGS, + "遅延") MSG_HASH(MENU_ENUM_LABEL_VALUE_INTERNAL_STORAGE_STATUS, - "Internal storage status") + "内蔵ストレージ状態") MSG_HASH(MENU_ENUM_LABEL_VALUE_JOYPAD_AUTOCONFIG_DIR, "入力デバイスの自動設定") MSG_HASH(MENU_ENUM_LABEL_VALUE_JOYPAD_DRIVER, @@ -1431,6 +1443,12 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SHUTDOWN, "シャットダウン") MSG_HASH(MENU_ENUM_LABEL_VALUE_SLOWMOTION_RATIO, "スローモーション比") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RUN_AHEAD_ENABLED, + "先読みして遅延を減らす") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RUN_AHEAD_FRAMES, + "先読みするフレーム数") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RUN_AHEAD_SECONDARY_INSTANCE, + "2つ目のコアで先読みする") MSG_HASH(MENU_ENUM_LABEL_VALUE_SORT_SAVEFILES_ENABLE, "フォルダでセーブファイルを並び替え") MSG_HASH(MENU_ENUM_LABEL_VALUE_SORT_SAVESTATES_ENABLE, @@ -1611,6 +1629,10 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_THREADED_DATA_RUNLOOP_ENABLE, "スレッド化タスク") MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAILS, "サムネイル") +MSG_HASH(MENU_ENUM_LABEL_VALUE_LEFT_THUMBNAILS, + "左のサムネイル") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_VERTICAL_THUMBNAILS, + "サムネイル両方を右側に設置") MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAILS_DIRECTORY, "サムネイル") MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAILS_UPDATER_LIST, @@ -1631,6 +1653,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_UI_COMPANION_ENABLE, "UI Companion Enable") MSG_HASH(MENU_ENUM_LABEL_VALUE_UI_COMPANION_START_ON_BOOT, "UI Companion Start On Boot") +MSG_HASH(MENU_ENUM_LABEL_VALUE_UI_COMPANION_TOGGLE, + "起動時にデスクトップメニューを表示") MSG_HASH(MENU_ENUM_LABEL_VALUE_UI_MENUBAR_ENABLE, "メニューバー") MSG_HASH(MENU_ENUM_LABEL_VALUE_UNABLE_TO_READ_COMPRESSED_FILE, @@ -1688,7 +1712,7 @@ 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, @@ -1865,6 +1889,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_HISTORY, "履歴タブを表示") MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD, "コンテンツをインポートするタブを表示") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_PLAYLISTS, + "プレイリストタブを表示") MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES, "お気に入りタブを表示") MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_IMAGES, @@ -1878,7 +1904,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_VIDEO, MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_NETPLAY, "ネットプレイタブを表示") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_LAYOUT, - "Menu Layout") + "メニュー配置") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_THEME, "メニューのアイコンテーマ") MSG_HASH(MENU_ENUM_LABEL_VALUE_YES, @@ -2124,7 +2150,7 @@ MSG_HASH(MSG_FAILED_TO_LOAD_OVERLAY, MSG_HASH(MSG_FAILED_TO_LOAD_STATE, "Failed to load state from") MSG_HASH(MSG_FAILED_TO_OPEN_LIBRETRO_CORE, - "Failed to open libretro core") + "コアをロードするに失敗しました") MSG_HASH(MSG_FAILED_TO_PATCH, "パッチに失敗しました") MSG_HASH(MSG_FAILED_TO_RECEIVE_HEADER_FROM_CLIENT, @@ -2210,7 +2236,7 @@ MSG_HASH(MSG_INPUT_RENAME_ENTRY, MSG_HASH(MSG_INTERFACE, "インタフェース") MSG_HASH(MSG_INTERNAL_STORAGE, - "内部ストレージ") + "内蔵ストレージ") MSG_HASH(MSG_REMOVABLE_STORAGE, "リムーバブルストレージ") MSG_HASH(MSG_INVALID_NICKNAME_SIZE, @@ -3273,6 +3299,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES, "お気に入りに追加") MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES_PLAYLIST, "お気に入りに追加") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RESET_CORE_ASSOCIATION, + "コア関連をリセット") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_DISABLE_KIOSK_MODE, "キオスクモードを無効") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_DISABLE_KIOSK_MODE, @@ -3322,7 +3350,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_WATCH_FOR_CHANGES, MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_WINDOW_SHOW_DECORATIONS, "ウィンドウ枠を表示") MSG_HASH(MENU_ENUM_LABEL_VALUE_STATISTICS_SHOW, - "Display Statistics") + "統計を表示") MSG_HASH(MENU_ENUM_SUBLABEL_STATISTICS_SHOW, "Show onscreen technical statistics.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_RGUI_BORDER_FILLER_ENABLE, @@ -3332,9 +3360,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_RGUI_BORDER_FILLER_THICKNESS_ENABLE, MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_RGUI_BACKGROUND_FILLER_THICKNESS_ENABLE, "Enable background filler thickness") MSG_HASH(MENU_ENUM_SUBLABEL_CRT_SWITCH_RESOLUTION, "For 15 kHz CRT displays only. Attempts to use exact core/game resolution and refresh rate.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CRT_SWITCH_RESOLUTION, "CRT SwitchRes") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CRT_SWITCH_RESOLUTION, "CRT SwitchRes") MSG_HASH(MENU_ENUM_SUBLABEL_CRT_SWITCH_RESOLUTION_SUPER, "When CRT SwitchRes is enabled, force ultrawide horizontal resolution to minimize mode switching.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CRT_SWITCH_RESOLUTION_SUPER, "CRT Super Resolution") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CRT_SWITCH_RESOLUTION_SUPER, "CRT Super Resolution") MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_REWIND, "Show Rewind Settings") MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SHOW_REWIND, @@ -3348,10 +3376,120 @@ MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SHOW_OVERLAYS, MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_OVERLAYS, "Show Overlay Settings") MSG_HASH(MENU_ENUM_LABEL_VALUE_AUDIO_ENABLE_MENU, - "Enable menu audio") + "メニューのオーディオを有効") MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_ENABLE_MENU, "Enable or disable menu sound.") MSG_HASH(MENU_ENUM_LABEL_VALUE_AUDIO_MIXER_SETTINGS, - "Mixer Settings") + "ミキサー設定") MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_MIXER_SETTINGS, "View and/or modify audio mixer settings.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_INFO, + "詳細") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_FILE, + "ファイル(&F)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_FILE_LOAD_CORE, + "コアをロード(&L)...") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_FILE_UNLOAD_CORE, + "コアをアンロード(&U)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_FILE_EXIT, + "終了(&X)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_EDIT, + "編集(&E)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_EDIT_SEARCH, + "検索(&S)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW, + "表示(&V)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_CLOSED_DOCKS, + "閉じたドック") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS, + "設定(&O)...") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_SAVE_DOCK_POSITIONS, + "ドック配置を記憶:") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_SAVE_GEOMETRY, + "ウィンドウ位置とサイズを記憶:") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_SAVE_LAST_TAB, + "最後のコンテンツブラウザーのタブを記憶:") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_THEME, + "テーマ") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_THEME_SYSTEM_DEFAULT, + "<システムデフォルト>") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_THEME_DARK, + "ダーク") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_THEME_CUSTOM, + "カスタム...") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_TITLE, + "設定") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_NAME, + "名前") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_LOAD_CUSTOM_CORE, + "カスタムなコアをロード...") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_LOAD_CORE, + "コアをロード") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_LOADING_CORE, + "コアをロード中...") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_CORE_VERSION, + "バージョン") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_TAB_PLAYLISTS, + "プレイリスト") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_TAB_FILE_BROWSER, + "ファイルブラウザー") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_TAB_FILE_BROWSER_TOP, + "先頭") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_TAB_FILE_BROWSER_UP, + "上へ") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_DOCK_CONTENT_BROWSER, + "コンテンツブラウザー") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_THUMBNAIL_BOXART, + "ボックスアート") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_THUMBNAIL_SCREENSHOT, + "スクリーンショット") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_THUMBNAIL_TITLE_SCREEN, + "タイトルスクリーン") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_ALL_PLAYLISTS, + "すべてのプレイリスト") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_CORE, + "コア") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_CORE_INFO, + "コア情報") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_CORE_SELECTION_ASK, + "<問い合わせる>") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_INFORMATION, + "情報") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_WARNING, + "警告") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_ERROR, + "エラー") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_RESTART_TO_TAKE_EFFECT, + "変更はRetroArchを再起動した後に反映されます。") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_LOG, + "ログ") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_DONT_SHOW_AGAIN, + "今後表示しない") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_STOP, + "停止") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_ASSOCIATE_CORE, + "コアに関連付ける") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_HIDDEN_PLAYLISTS, + "隠したプレイリスト") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_HIDE, + "隠す") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_HIGHLIGHT_COLOR, + "ハイライトカラー") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_CHOOSE, + "選択(&C)...") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_SELECT_COLOR, + "色の選択") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_SELECT_THEME, + "テーマの選択") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_CUSTOM_THEME, + "カスタムなテーマ") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_FILE_PATH_IS_BLANK, + "ファイルのパスは空きです。") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_FILE_IS_EMPTY, + "ファイルは空きです。") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_FILE_READ_OPEN_FAILED, + "ファイルを読み込みのために開けません。") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_FILE_DOES_NOT_EXIST, + "ファイルは存在しません。") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_SUGGEST_LOADED_CORE_FIRST, + "ロードしたコアを最初に優先する") diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index 2223b11108..8f82a2bdd4 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -1057,6 +1057,10 @@ MSG_HASH(MENU_ENUM_LABEL_UI_COMPANION_ENABLE, "ui_companion_enable") MSG_HASH(MENU_ENUM_LABEL_UI_COMPANION_START_ON_BOOT, "ui_companion_start_on_boot") +MSG_HASH(MENU_ENUM_LABEL_UI_COMPANION_TOGGLE, + "ui_companion_toggle") +MSG_HASH(MENU_ENUM_LABEL_DESKTOP_MENU_ENABLE, + "desktop_menu_enable") MSG_HASH(MENU_ENUM_LABEL_UI_MENUBAR_ENABLE, "ui_menubar_enable") MSG_HASH(MENU_ENUM_LABEL_UNDO_LOAD_STATE, diff --git a/intl/msg_hash_pt_br.h b/intl/msg_hash_pt_br.h index 740d49b2ee..ae74cee172 100644 --- a/intl/msg_hash_pt_br.h +++ b/intl/msg_hash_pt_br.h @@ -1,42 +1,55 @@ -MSG_HASH(MSG_COMPILER, - "Compilador" - ) -MSG_HASH(MSG_UNKNOWN_COMPILER, - "Compilador desconhecido" - ) -MSG_HASH(MSG_DEVICE_DISCONNECTED_FROM_PORT, - "Dispositivo desconectado da porta" - ) -MSG_HASH(MSG_UNKNOWN_NETPLAY_COMMAND_RECEIVED, - "Comando Netplay desconhecido recebido" - ) -MSG_HASH(MSG_FILE_ALREADY_EXISTS_SAVING_TO_BACKUP_BUFFER, - "Este arquivo já existe. Salvando no buffer de backup" - ) -MSG_HASH(MSG_GOT_CONNECTION_FROM, - "Conexão recebida de: \"%s\"" - ) -MSG_HASH(MSG_GOT_CONNECTION_FROM_NAME, - "Conexão recebida de: \"%s (%s)\"" - ) -MSG_HASH(MSG_PUBLIC_ADDRESS, - "Endereço público" - ) -MSG_HASH(MSG_NO_ARGUMENTS_SUPPLIED_AND_NO_MENU_BUILTIN, - "Nenhum argumento fornecido e nenhum menu interno, exibindo ajuda..." - ) -MSG_HASH(MSG_SETTING_DISK_IN_TRAY, - "Definindo disco na bandeja" - ) -MSG_HASH(MSG_WAITING_FOR_CLIENT, - "Aguardando pelo cliente..." - ) -MSG_HASH(MSG_NETPLAY_YOU_HAVE_LEFT_THE_GAME, - "Você deixou o jogo" - ) -MSG_HASH(MSG_NETPLAY_YOU_HAVE_JOINED_AS_PLAYER_N, - "Você se juntou como jogador %u" - ) +MSG_HASH( + MSG_COMPILER, + "Compilador" + ) +MSG_HASH( + MSG_UNKNOWN_COMPILER, + "Compilador desconhecido" + ) +MSG_HASH( + MSG_DEVICE_DISCONNECTED_FROM_PORT, + "Dispositivo desconectado da porta" + ) +MSG_HASH( + MSG_UNKNOWN_NETPLAY_COMMAND_RECEIVED, + "Comando Netplay desconhecido recebido" + ) +MSG_HASH( + MSG_FILE_ALREADY_EXISTS_SAVING_TO_BACKUP_BUFFER, + "Este arquivo já existe. Salvando no buffer de backup" + ) +MSG_HASH( + MSG_GOT_CONNECTION_FROM, + "Conexão recebida de: \"%s\"" + ) +MSG_HASH( + MSG_GOT_CONNECTION_FROM_NAME, + "Conexão recebida de: \"%s (%s)\"" + ) +MSG_HASH( + MSG_PUBLIC_ADDRESS, + "Endereço público" + ) +MSG_HASH( + MSG_NO_ARGUMENTS_SUPPLIED_AND_NO_MENU_BUILTIN, + "Nenhum argumento fornecido e nenhum menu interno, exibindo ajuda..." + ) +MSG_HASH( + MSG_SETTING_DISK_IN_TRAY, + "Definindo disco na bandeja" + ) +MSG_HASH( + MSG_WAITING_FOR_CLIENT, + "Aguardando pelo cliente..." + ) +MSG_HASH( + MSG_NETPLAY_YOU_HAVE_LEFT_THE_GAME, + "Você deixou o jogo" + ) +MSG_HASH( + MSG_NETPLAY_YOU_HAVE_JOINED_AS_PLAYER_N, + "Você se juntou como jogador %u" + ) MSG_HASH( MSG_NETPLAY_YOU_HAVE_JOINED_WITH_INPUT_DEVICES_S, "Você se juntou aos dispositivos de entrada %.*s" @@ -73,285 +86,382 @@ MSG_HASH( MSG_NETPLAY_DIFFERENT_CORE_VERSIONS, "ATENÇÃO: Um par de Netplay está executando uma versão diferente do núcleo. Se ocorrerem problemas, use a mesma versão." ) -MSG_HASH(MSG_NETPLAY_ENDIAN_DEPENDENT, - "Este núcleo não suporta Netplay inter-arquitetura entre estes sistemas" - ) -MSG_HASH(MSG_NETPLAY_PLATFORM_DEPENDENT, - "Este núcleo não suporta Netplay inter-arquitetura" - ) -MSG_HASH(MSG_NETPLAY_ENTER_PASSWORD, - "Digite a senha do servidor de Netplay:" - ) -MSG_HASH(MSG_NETPLAY_INCORRECT_PASSWORD, - "Senha incorreta" - ) -MSG_HASH(MSG_NETPLAY_SERVER_NAMED_HANGUP, - "\"%s\" desconectou" - ) -MSG_HASH(MSG_NETPLAY_SERVER_HANGUP, - "Um cliente do Netplay desconectou" - ) -MSG_HASH(MSG_NETPLAY_CLIENT_HANGUP, - "Desconectado do Netplay" - ) -MSG_HASH(MSG_NETPLAY_CANNOT_PLAY_UNPRIVILEGED, - "Você não tem permissão para jogar" - ) -MSG_HASH(MSG_NETPLAY_CANNOT_PLAY_NO_SLOTS, - "Não há vagas livres para jogadores" - ) -MSG_HASH(MSG_NETPLAY_CANNOT_PLAY, - "Impossível alterar para modo jogador" - ) -MSG_HASH(MSG_NETPLAY_PEER_PAUSED, - "Par do Netplay \"%s\" pausou" - ) -MSG_HASH(MSG_NETPLAY_CHANGED_NICK, - "Seu apelido mudou para \"%s\"" - ) -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHARED_CONTEXT, - "Dar aos núcleos renderizados por hardware seu próprio contexto privado. Evita ter que assumir mudanças de estado de hardware entre quadros." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SETTINGS, - "Ajusta as configurações de aparência da tela de menu." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_HARD_SYNC, - "Sincronia rígida entre CPU e GPU. Reduz a latência ao custo de desempenho." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_THREADED, - "Melhora o desempenho ao custo de latência e mais engasgamento de vídeo. Use somente se você não puder obter velocidade total de outra forma." - ) -MSG_HASH(MSG_AUDIO_VOLUME, - "Volume de áudio" - ) -MSG_HASH(MSG_AUTODETECT, - "Autodetectar" - ) -MSG_HASH(MSG_AUTOLOADING_SAVESTATE_FROM, - "Autocarregando Estado de Jogo de" - ) -MSG_HASH(MSG_CAPABILITIES, - "Capacidades" - ) -MSG_HASH(MSG_CONNECTING_TO_NETPLAY_HOST, - "Conectando ao hospedeiro de Netplay" - ) -MSG_HASH(MSG_CONNECTING_TO_PORT, - "Conectando a porta" - ) -MSG_HASH(MSG_CONNECTION_SLOT, - "Vaga de conexão" - ) -MSG_HASH(MSG_SORRY_UNIMPLEMENTED_CORES_DONT_DEMAND_CONTENT_NETPLAY, - "Desculpe, não implementado: núcleos que não exigem conteúdo não podem participar do Netplay." - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_ACCOUNTS_CHEEVOS_PASSWORD, - "Senha" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_ACCOUNTS_CHEEVOS_SETTINGS, - "Contas Cheevos" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_ACCOUNTS_CHEEVOS_USERNAME, - "Nome de usuário" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_ACCOUNTS_LIST, - "Contas" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_ACCOUNTS_LIST_END, - "Ponto Final da Lista de Contas" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_ACCOUNTS_RETRO_ACHIEVEMENTS, - "Retro Achievements" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_LIST, - "Lista de Conquistas" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_LIST_HARDCORE, - "Lista de Conquistas (Hardcore)" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_CONTENT_LIST, - "Analisar Conteúdo" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_CONFIGURATIONS_LIST, - "Configurações" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TAB, - "Importar conteúdo" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_TAB, - "Salas de Netplay" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_ASK_ARCHIVE, - "Perguntar" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_ASSETS_DIRECTORY, - "Recursos" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_AUDIO_BLOCK_FRAMES, - "Bloquear Quadros" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_AUDIO_DEVICE, - "Dispositivo de Áudio" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_AUDIO_DRIVER, - "Driver de Áudio" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_AUDIO_DSP_PLUGIN, - "Plugin DSP de Áudio" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_AUDIO_ENABLE, - "Habilitar Áudio" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_AUDIO_FILTER_DIR, - "Filtro de Áudio" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_TURBO_DEADZONE_LIST, - "Turbo/Zona-Morta" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_AUDIO_LATENCY, - "Latência de Áudio (ms)" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_AUDIO_MAX_TIMING_SKEW, - "Desvio Máximo de Tempo do Áudio" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_AUDIO_MUTE, - "Áudio Mudo" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_AUDIO_OUTPUT_RATE, - "Taxa da Saída de Áudio (Hz)" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_AUDIO_RATE_CONTROL_DELTA, - "Controle Dinâmico da Taxa de Áudio" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_AUDIO_RESAMPLER_DRIVER, - "Driver de Reamostragem de Áudio" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_AUDIO_SETTINGS, - "Áudio" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_AUDIO_SYNC, - "Sincronizar Áudio" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_AUDIO_VOLUME, - "Nível de Volume de Áudio (dB)" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_AUDIO_WASAPI_EXCLUSIVE_MODE, - "WASAPI Modo Exclusivo" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_AUDIO_WASAPI_FLOAT_FORMAT, - "WASAPI Formato de Ponto Flutuante" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_AUDIO_WASAPI_SH_BUFFER_LENGTH, - "WASAPI Tamanho do Buffer Compartilhado" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_AUTOSAVE_INTERVAL, - "Intervalo do Autossalvamento da SRAM" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_AUTO_OVERRIDES_ENABLE, - "Autocarregar Arquivos de Redefinição" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_AUTO_REMAPS_ENABLE, - "Autocarregar Arquivos de Remapeamento" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_AUTO_SHADERS_ENABLE, - "Autocarregar Predefinições de Shader" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_BACK, - "Voltar" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_CONFIRM, - "Confirmar" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_INFO, - "Informações" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_QUIT, - "Sair" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_SCROLL_DOWN, - "Rolar para Baixo" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_SCROLL_UP, - "Rolar para Cima" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_START, - "Iniciar" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_TOGGLE_KEYBOARD, - "Alternar Teclado" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_TOGGLE_MENU, - "Alternar Menu" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS, - "Controles Básicos de Menu" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_CONFIRM, - "Confirmar/OK" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_INFO, - "Informação" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_QUIT, - "Sair" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_SCROLL_UP, - "Rolar para Cima" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_START, - "Padrões" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_TOGGLE_KEYBOARD, - "Alternar Teclado" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_TOGGLE_MENU, - "Alternar Menu" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_BLOCK_SRAM_OVERWRITE, - "Não sobregravar a SRAM ao carregar Estado de Jogo" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_BLUETOOTH_ENABLE, - "Habilitar Bluetooth" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_BUILDBOT_ASSETS_URL, - "URL de Recursos do Buildbot" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_CACHE_DIRECTORY, - "Cache" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_CAMERA_ALLOW, - "Permitir Câmera" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_CAMERA_DRIVER, - "Driver de Câmera" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_CHEAT, - "Trapaça" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_CHEAT_APPLY_CHANGES, - "Aplicar Alterações" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_CHEAT_DATABASE_PATH, - "Arquivo de Trapaça" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_CHEAT_FILE, - "Arquivo de Trapaça" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_CHEAT_FILE_LOAD, - "Carregar Arquivo de Trapaça" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_CHEAT_FILE_SAVE_AS, - "Salvar Arquivo de Trapaça Como" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_CHEAT_NUM_PASSES, - "Estágios de Trapaça" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_CHEEVOS_DESCRIPTION, - "Descrição" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_CHEEVOS_HARDCORE_MODE_ENABLE, - "Conquistas no Modo Hardcore" - ) +MSG_HASH( + MSG_NETPLAY_ENDIAN_DEPENDENT, + "Este núcleo não suporta Netplay inter-arquitetura entre estes sistemas" + ) +MSG_HASH( + MSG_NETPLAY_PLATFORM_DEPENDENT, + "Este núcleo não suporta Netplay inter-arquitetura" + ) +MSG_HASH( + MSG_NETPLAY_ENTER_PASSWORD, + "Digite a senha do servidor de Netplay:" + ) +MSG_HASH( + MSG_NETPLAY_INCORRECT_PASSWORD, + "Senha incorreta" + ) +MSG_HASH( + MSG_NETPLAY_SERVER_NAMED_HANGUP, + "\"%s\" desconectou" + ) +MSG_HASH( + MSG_NETPLAY_SERVER_HANGUP, + "Um cliente do Netplay desconectou" + ) +MSG_HASH( + MSG_NETPLAY_CLIENT_HANGUP, + "Desconectado do Netplay" + ) +MSG_HASH( + MSG_NETPLAY_CANNOT_PLAY_UNPRIVILEGED, + "Você não tem permissão para jogar" + ) +MSG_HASH( + MSG_NETPLAY_CANNOT_PLAY_NO_SLOTS, + "Não há vagas livres para jogadores" + ) +MSG_HASH( + MSG_NETPLAY_CANNOT_PLAY_NOT_AVAILABLE, + "Os dispositivos de entrada solicitados não estão disponíveis" + ) +MSG_HASH( + MSG_NETPLAY_CANNOT_PLAY, + "Impossível alterar para modo jogador" + ) +MSG_HASH( + MSG_NETPLAY_PEER_PAUSED, + "Par do Netplay \"%s\" pausou" + ) +MSG_HASH( + MSG_NETPLAY_CHANGED_NICK, + "Seu apelido mudou para \"%s\"" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SHARED_CONTEXT, + "Dar aos núcleos renderizados por hardware seu próprio contexto privado. Evita ter que assumir mudanças de estado de hardware entre quadros." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_SETTINGS, + "Ajusta as configurações de aparência da tela de menu." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_HARD_SYNC, + "Sincronia rígida entre CPU e GPU. Reduz a latência ao custo de desempenho." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_THREADED, + "Melhora o desempenho ao custo de latência e mais engasgamento de vídeo. Use somente se você não puder obter velocidade total de outra forma." + ) +MSG_HASH( + MSG_AUDIO_VOLUME, + "Volume de áudio" + ) +MSG_HASH( + MSG_AUTODETECT, + "Detectar automaticamente" + ) +MSG_HASH( + MSG_AUTOLOADING_SAVESTATE_FROM, + "Autocarregando Estado de Jogo de" + ) +MSG_HASH( + MSG_CAPABILITIES, + "Capacidades" + ) +MSG_HASH( + MSG_CONNECTING_TO_NETPLAY_HOST, + "Conectando ao hospedeiro de Netplay" + ) +MSG_HASH( + MSG_CONNECTING_TO_PORT, + "Conectando a porta" + ) +MSG_HASH( + MSG_CONNECTION_SLOT, + "Vaga de conexão" + ) +MSG_HASH( + MSG_SORRY_UNIMPLEMENTED_CORES_DONT_DEMAND_CONTENT_NETPLAY, + "Desculpe, não implementado: núcleos que não exigem conteúdo não podem participar do Netplay." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ACCOUNTS_CHEEVOS_PASSWORD, + "Senha" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ACCOUNTS_CHEEVOS_SETTINGS, + "Contas Cheevos" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ACCOUNTS_CHEEVOS_USERNAME, + "Nome de usuário" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ACCOUNTS_LIST, + "Contas" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ACCOUNTS_LIST_END, + "Ponto Final da Lista de Contas" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ACCOUNTS_RETRO_ACHIEVEMENTS, + "Retro Achievements" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_LIST, + "Lista de Conquistas" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_LIST_HARDCORE, + "Lista de Conquistas (Hardcore)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ADD_CONTENT_LIST, + "Analisar Conteúdo" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONFIGURATIONS_LIST, + "Configurações" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ADD_TAB, + "Importar conteúdo" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_TAB, + "Salas de Netplay" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ASK_ARCHIVE, + "Perguntar" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ASSETS_DIRECTORY, + "Recursos" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_BLOCK_FRAMES, + "Bloquear Quadros" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_DEVICE, + "Dispositivo de Áudio" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_DRIVER, + "Driver de Áudio" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_DSP_PLUGIN, + "Plugin DSP de Áudio" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_ENABLE, + "Habilitar Áudio" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_FILTER_DIR, + "Filtro de Áudio" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_TURBO_DEADZONE_LIST, + "Turbo/Zona-Morta" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_LATENCY, + "Latência de Áudio (ms)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_MAX_TIMING_SKEW, + "Desvio Máximo de Tempo do Áudio" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_MUTE, + "Áudio Mudo" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_OUTPUT_RATE, + "Taxa da Saída de Áudio (Hz)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_RATE_CONTROL_DELTA, + "Controle Dinâmico da Taxa de Áudio" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_RESAMPLER_DRIVER, + "Driver de Reamostragem de Áudio" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_SETTINGS, + "Áudio" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_SYNC, + "Sincronizar Áudio" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_VOLUME, + "Nível de Volume de Áudio (dB)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_WASAPI_EXCLUSIVE_MODE, + "WASAPI Modo Exclusivo" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_WASAPI_FLOAT_FORMAT, + "WASAPI Formato de Ponto Flutuante" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_WASAPI_SH_BUFFER_LENGTH, + "WASAPI Tamanho do Buffer Compartilhado" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUTOSAVE_INTERVAL, + "Intervalo do Salvamento Automático da SRAM" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUTO_OVERRIDES_ENABLE, + "Carraga Automaticamente Arquivos de Redefinição" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUTO_REMAPS_ENABLE, + "Carraga Automaticamente Arquivos de Remapeamento" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUTO_SHADERS_ENABLE, + "Carraga Automaticamente Predefinições de Shader" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_BACK, + "Voltar" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_CONFIRM, + "Confirmar" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_INFO, + "Informações" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_QUIT, + "Sair" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_SCROLL_DOWN, + "Rolar para Baixo" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_SCROLL_UP, + "Rolar para Cima" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_START, + "Iniciar" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_TOGGLE_KEYBOARD, + "Alternar Teclado" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_TOGGLE_MENU, + "Alternar Menu" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS, + "Controles Básicos de Menu" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_CONFIRM, + "Confirmar/OK" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_INFO, + "Informação" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_QUIT, + "Sair" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_SCROLL_UP, + "Rolar para Cima" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_START, + "Padrões" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_TOGGLE_KEYBOARD, + "Alternar Teclado" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_TOGGLE_MENU, + "Alternar Menu" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BLOCK_SRAM_OVERWRITE, + "Não sobregravar a SRAM ao carregar Estado de Jogo" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BLUETOOTH_ENABLE, + "Habilitar Bluetooth" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BUILDBOT_ASSETS_URL, + "URL de Recursos do Buildbot" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CACHE_DIRECTORY, + "Cache" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CAMERA_ALLOW, + "Permitir Câmera" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CAMERA_DRIVER, + "Driver de Câmera" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT, + "Trapaça" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_APPLY_CHANGES, + "Aplicar Alterações" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_DATABASE_PATH, + "Arquivo de Trapaça" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_FILE, + "Arquivo de Trapaça" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_FILE_LOAD, + "Carregar Arquivo de Trapaça" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_FILE_SAVE_AS, + "Salvar Arquivo de Trapaça Como" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_NUM_PASSES, + "Estágios de Trapaça" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_DESCRIPTION, + "Descrição" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_HARDCORE_MODE_ENABLE, + "Conquistas no Modo Hardcore" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_LEADERBOARDS_ENABLE, "Tabelas de Classificação" @@ -360,31 +470,37 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_BADGES_ENABLE, "Insígnias de Conquistas" ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_CHEEVOS_LOCKED_ACHIEVEMENTS, - "Conquistas Bloqueadas:" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_CHEEVOS_LOCKED_ENTRY, - "Bloqueada" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_CHEEVOS_SETTINGS, - "Retro Achievements" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_CHEEVOS_TEST_UNOFFICIAL, - "Testar Conquistas Não Oficiais" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ACHIEVEMENTS, - "Conquistas Desbloqueadas:" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ENTRY, - "Desbloqueada" - ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_LOCKED_ACHIEVEMENTS, + "Conquistas Bloqueadas:" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_LOCKED_ENTRY, + "Bloqueada" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_SETTINGS, + "Retro Achievements" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_TEST_UNOFFICIAL, + "Testar Conquistas Não Oficiais" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ACHIEVEMENTS, + "Conquistas Desbloqueadas:" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ENTRY, + "Desbloqueada" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ENTRY_HARDCORE, "Hardcore" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_VERBOSE_ENABLE, - "Conquistas Modo Verboso" + "Modo Detalhado das Conquistas" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_AUTO_SCREENSHOT, @@ -393,322 +509,232 @@ MSG_HASH( MSG_HASH( MENU_ENUM_LABEL_VALUE_CLOSE_CONTENT, "Fechar Conteúdo" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_CONFIG, - "Configuração" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_CONFIGURATIONS, - "Carregar Configuração" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_CONFIGURATION_SETTINGS, - "Configuração" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_CONFIG_SAVE_ON_EXIT, - "Salvar Configuração ao Sair" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_COLLECTION_LIST, - "Coleções" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_DATABASE_DIRECTORY, - "Base de Dados" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_DIR, - "Conteúdo" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_HISTORY_SIZE, - "Tamanho da Lista de Histórico" - ) + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONFIG, + "Configuração" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONFIGURATIONS, + "Carregar Configuração" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONFIGURATION_SETTINGS, + "Configuração" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONFIG_SAVE_ON_EXIT, + "Salvar Configuração ao Sair" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_COLLECTION_LIST, + "Coleções" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_DATABASE_DIRECTORY, + "Base de Dados" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_DIR, + "Conteúdo" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_HISTORY_SIZE, + "Tamanho da Lista de Histórico") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_REMOVE, - "Permitir a remoção de itens" - ) + "Permitir a remoção de itens") MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_SETTINGS, - "Menu Rápido" - ) + "Menu Rápido") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_ASSETS_DIR, - "Recursos de Núcleo" - ) + "Recursos de Núcleo") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_ASSETS_DIRECTORY, - "Downloads" - ) + "Downloads") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_CHEAT_OPTIONS, - "Trapaças" - ) + "Trapaças") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_COUNTERS, - "Contadores do Núcleo" - ) + "Contadores do Núcleo") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_ENABLE, - "Exibir nome do núcleo" - ) + "Exibir nome do núcleo") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFORMATION, - "Informação do Núcleo" - ) + "Informação do Núcleo") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_AUTHORS, - "Autores" - ) + "Autores") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_CATEGORIES, - "Categorias" - ) + "Categorias") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_CORE_LABEL, - "Rótulo do núcleo" - ) + "Rótulo do núcleo") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_CORE_NAME, - "Nome do núcleo" - ) + "Nome do núcleo") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_FIRMWARE, - "Firmware(s)" - ) + "Firmware(s)") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_LICENSES, - "Licença(s)" - ) + "Licença(s)") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_PERMISSIONS, - "Permissões" - ) + "Permissões") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_SUPPORTED_EXTENSIONS, - "Extensões suportadas" - ) + "Extensões suportadas") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_SYSTEM_MANUFACTURER, - "Fabricante do sistema" - ) + "Fabricante do sistema") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_SYSTEM_NAME, - "Nome do sistema" - ) + "Nome do sistema") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INPUT_REMAPPING_OPTIONS, - "Controles" - ) + "Controles") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_LIST, - "Carregar Núcleo" - ) + "Carregar Núcleo") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_OPTIONS, - "Opções" - ) + "Opções") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_SETTINGS, - "Núcleo" - ) + "Núcleo") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_SET_SUPPORTS_NO_CONTENT_ENABLE, - "Iniciar um Núcleo Automaticamente" - ) + "Iniciar um Núcleo Automaticamente") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_UPDATER_AUTO_EXTRACT_ARCHIVE, - "Extrair automaticamente o arquivo baixado" - ) + "Extrair automaticamente o arquivo baixado") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_UPDATER_BUILDBOT_URL, - "URL de Núcleos do Buildbot" - ) + "URL de Núcleos do Buildbot") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_UPDATER_LIST, - "Atualizador de Núcleo" - ) + "Atualizador de Núcleo") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_UPDATER_SETTINGS, - "Atualizador" - ) + "Atualizador") MSG_HASH(MENU_ENUM_LABEL_VALUE_CPU_ARCHITECTURE, - "Arquitetura da CPU:" - ) + "Arquitetura da CPU:") MSG_HASH(MENU_ENUM_LABEL_VALUE_CPU_CORES, - "Cores da CPU:" - ) + "Cores da CPU:") MSG_HASH(MENU_ENUM_LABEL_VALUE_CURSOR_DIRECTORY, - "Cursor" - ) + "Cursor") MSG_HASH(MENU_ENUM_LABEL_VALUE_CURSOR_MANAGER, - "Gerenciar Cursor" - ) + "Gerenciar Cursor") MSG_HASH(MENU_ENUM_LABEL_VALUE_CUSTOM_RATIO, - "Proporção Personalizada" - ) + "Proporção Personalizada") MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_MANAGER, - "Gerenciar Base de Dados" - ) + "Gerenciar Base de Dados") MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_SELECTION, - "Seleção de Base de Dados" - ) + "Seleção de Base de Dados") MSG_HASH(MENU_ENUM_LABEL_VALUE_DELETE_ENTRY, - "Remover" - ) + "Remover") MSG_HASH(MENU_ENUM_LABEL_VALUE_FAVORITES, - "Diretório Inicial" - ) + "Diretório Inicial") MSG_HASH(MENU_ENUM_LABEL_VALUE_DIRECTORY_CONTENT, - "" - ) + "") MSG_HASH(MENU_ENUM_LABEL_VALUE_DIRECTORY_DEFAULT, - "" - ) + "") MSG_HASH(MENU_ENUM_LABEL_VALUE_DIRECTORY_NONE, - "" - ) + "") MSG_HASH(MENU_ENUM_LABEL_VALUE_DIRECTORY_NOT_FOUND, - "Diretório não encontrado." - ) + "Diretório não encontrado.") MSG_HASH(MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, - "Diretório" - ) + "Diretório") MSG_HASH(MENU_ENUM_LABEL_VALUE_DISK_CYCLE_TRAY_STATUS, - "Condição da Bandeja do Ciclo de Disco" - ) + "Condição da Bandeja do Ciclo de Disco") MSG_HASH(MENU_ENUM_LABEL_VALUE_DISK_IMAGE_APPEND, - "Anexar Imagem de Disco" - ) + "Anexar Imagem de Disco") MSG_HASH(MENU_ENUM_LABEL_VALUE_DISK_INDEX, - "Índice de Disco" - ) + "Índice de Disco") MSG_HASH(MENU_ENUM_LABEL_VALUE_DISK_OPTIONS, - "Controle de Disco" - ) + "Controle de Disco") MSG_HASH(MENU_ENUM_LABEL_VALUE_DONT_CARE, - "Não importa" - ) + "Não importa") MSG_HASH(MENU_ENUM_LABEL_VALUE_DOWNLOADED_FILE_DETECT_CORE_LIST, - "Downloads" - ) + "Downloads") MSG_HASH(MENU_ENUM_LABEL_VALUE_DOWNLOAD_CORE, - "Baixar Núcleo..." - ) + "Baixar Núcleo...") MSG_HASH(MENU_ENUM_LABEL_VALUE_DOWNLOAD_CORE_CONTENT, - "Download de Conteúdo" - ) + "Download de Conteúdo") MSG_HASH(MENU_ENUM_LABEL_VALUE_DPI_OVERRIDE_ENABLE, - "Habilitar Redefinição de DPI" - ) + "Habilitar Redefinição de DPI") MSG_HASH(MENU_ENUM_LABEL_VALUE_DPI_OVERRIDE_VALUE, - "Redefinição de DPI" - ) + "Redefinição de DPI") MSG_HASH(MENU_ENUM_LABEL_VALUE_DRIVER_SETTINGS, - "Driver" - ) + "Driver") MSG_HASH(MENU_ENUM_LABEL_VALUE_DUMMY_ON_CORE_SHUTDOWN, - "Carregar Modelo no Desligamento do Núcleo" - ) + "Carregar Modelo no Desligamento do Núcleo") MSG_HASH(MENU_ENUM_LABEL_VALUE_CHECK_FOR_MISSING_FIRMWARE, - "Verificar por Firmware que Falta Antes de Carregar" - ) + "Verificar por Firmware que Falta Antes de Carregar") MSG_HASH(MENU_ENUM_LABEL_VALUE_DYNAMIC_WALLPAPER, - "Plano de Fundo Dinâmico" - ) + "Plano de Fundo Dinâmico") MSG_HASH(MENU_ENUM_LABEL_VALUE_DYNAMIC_WALLPAPERS_DIRECTORY, - "Planos de Fundo Dinâmicos" - ) + "Planos de Fundo Dinâmicos") MSG_HASH(MENU_ENUM_LABEL_VALUE_CHEEVOS_ENABLE, - "Habilitar Conquistas" - ) + "Habilitar Conquistas") MSG_HASH(MENU_ENUM_LABEL_VALUE_ENTRY_HOVER_COLOR, - "Cor do item de menu ao passar o cursor" - ) + "Cor do item de menu ao passar o cursor") MSG_HASH(MENU_ENUM_LABEL_VALUE_ENTRY_NORMAL_COLOR, - "Cor normal do item de menu" - ) + "Cor normal do item de menu") MSG_HASH(MENU_ENUM_LABEL_VALUE_FALSE, - "Falso" - ) + "Falso") MSG_HASH(MENU_ENUM_LABEL_VALUE_FASTFORWARD_RATIO, - "Velocidade Máxima de Execução" - ) + "Velocidade Máxima de Execução") MSG_HASH(MENU_ENUM_LABEL_VALUE_FAVORITES_TAB, - "Favoritos" - ) + "Favoritos") MSG_HASH(MENU_ENUM_LABEL_VALUE_FPS_SHOW, - "Mostrar Taxa de Quadros" - ) + "Mostrar Taxa de Quadros") MSG_HASH(MENU_ENUM_LABEL_VALUE_FRAME_THROTTLE_ENABLE, - "Controlar Velocidade Máxima de Execução" - ) + "Controlar Velocidade Máxima de Execução") MSG_HASH(MENU_ENUM_LABEL_VALUE_FRAME_THROTTLE_SETTINGS, - "Controle de Quadros" - ) + "Controle de Quadros") MSG_HASH(MENU_ENUM_LABEL_VALUE_FRONTEND_COUNTERS, - "Contadores do Frontend" - ) + "Contadores do Frontend") MSG_HASH(MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_OPTIONS, - "Autocarregar Opções de Núcleo Específicas do Conteúdo" - ) + "Carraga Automaticamente Opções de Núcleo Específicas do Conteúdo") MSG_HASH(MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_OPTIONS_CREATE, - "Criar arquivo de opções do jogo" - ) + "Criar arquivo de opções do jogo") MSG_HASH(MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_OPTIONS_IN_USE, - "Arquivo de opções do jogo" - ) + "Arquivo de opções do jogo") MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP, - "Ajuda" - ) + "Ajuda") MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_AUDIO_VIDEO_TROUBLESHOOTING, - "Solução de Problemas de Áudio/Vídeo" - ) + "Solução de Problemas de Áudio/Vídeo") MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_CHANGE_VIRTUAL_GAMEPAD, - "Alterando a Transparência de Gamepad Virtual" - ) + "Alterando a Transparência de Gamepad Virtual") MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_CONTROLS, - "Controles Básicos de Menu" - ) + "Controles Básicos de Menu") MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_LIST, - "Ajuda" - ) + "Ajuda") MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_LOADING_CONTENT, - "Carregando Conteúdo" - ) + "Carregando Conteúdo") MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_SCANNING_CONTENT, - "Procurando em Busca de Conteúdo" - ) + "Procurando em Busca de Conteúdo") MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_WHAT_IS_A_CORE, - "O Que É Um Núcleo?" - ) + "O Que É Um Núcleo?") MSG_HASH(MENU_ENUM_LABEL_VALUE_HISTORY_LIST_ENABLE, - "Habilitar Lista de Histórico" - ) + "Habilitar Lista de Histórico") MSG_HASH(MENU_ENUM_LABEL_VALUE_HISTORY_TAB, - "Histórico" - ) + "Histórico") MSG_HASH(MENU_ENUM_LABEL_VALUE_HORIZONTAL_MENU, - "Menu Horizontal" - ) + "Menu Horizontal") MSG_HASH(MENU_ENUM_LABEL_VALUE_IMAGES_TAB, - "Imagem" - ) + "Imagem") MSG_HASH(MENU_ENUM_LABEL_VALUE_INFORMATION, - "Informação" - ) + "Informação") MSG_HASH(MENU_ENUM_LABEL_VALUE_INFORMATION_LIST, - "Informação" - ) + "Informação") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ADC_TYPE, - "Tipo de Analógico Para Digital" - ) + "Tipo de Analógico Para Digital") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ALL_USERS_CONTROL_MENU, - "Todos os Usuários Controlam o Menu" - ) + "Todos os Usuários Controlam o Menu") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X, - "Analógico Esquerdo X" - ) + "Analógico Esquerdo X") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS, - "Analógico Esquerdo X- (esquerda)" - ) + "Analógico Esquerdo X- (esquerda)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS, - "Analógico Esquerdo X+ (direita)" - ) + "Analógico Esquerdo X+ (direita)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y, - "Analógico Esquerdo Y" - ) + "Analógico Esquerdo Y") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_MINUS, - "Analógico Esquerdo Y- (cima)" - ) + "Analógico Esquerdo Y- (cima)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS, - "Analógico Esquerdo Y+ (baixo)" - ) + "Analógico Esquerdo Y+ (baixo)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X, - "Analógico Direito X" - ) + "Analógico Direito X") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS, - "Analógico Direito X- (esquerda)" - ) + "Analógico Direito X- (esquerda)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_PLUS, - "Analógico Direito X+ (direita)" - ) + "Analógico Direito X+ (direita)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y, - "Analógico Direito Y" - ) + "Analógico Direito Y") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, - "Analógico Direito Y- (cima)" - ) + "Analógico Direito Y- (cima)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, - "Analógico Direito Y+ (baixo)" - ) + "Analógico Direito Y+ (baixo)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, "Gatinho da Pistola") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, @@ -732,101 +758,69 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, "D-pad Direito da Pistola") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, - "Habilitar Autoconfiguração" - ) + "Habilitar Autoconfiguração") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, - "Zona Morta do Controle Analógico" - ) + "Zona Morta do Controle Analógico") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, - "Inverter Botões OK e Cancelar do Menu" - ) + "Inverter Botões OK e Cancelar do Menu") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_BIND_ALL, - "Vincular Todos" - ) + "Vincular Todos") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_BIND_DEFAULT_ALL, - "Vincular Todos pelo Padrão" - ) + "Vincular Todos pelo Padrão") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_BIND_TIMEOUT, - "Tempo Limite para Vincular" - ) + "Tempo Limite para Vincular") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_DESCRIPTOR_HIDE_UNBOUND, - "Ocultar Descritores de Entrada do Núcleo Não Vinculados" - ) + "Ocultar Descritores de Entrada do Núcleo Não Vinculados") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_DESCRIPTOR_LABEL_SHOW, - "Exibir Rótulos do Descritor de Entrada" - ) + "Exibir Rótulos do Descritor de Entrada") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_DEVICE_INDEX, - "Índice de Dispositivo" - ) + "Índice de Dispositivo") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_DEVICE_TYPE, - "Tipo de Dispositivo" - ) + "Tipo de Dispositivo") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_INDEX, - "Índice de Mouse" - ) + "Índice de Mouse") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_DRIVER, - "Driver de Entrada" - ) + "Driver de Entrada") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_DUTY_CYCLE, - "Ciclo de Trabalho" - ) + "Ciclo de Trabalho") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_HOTKEY_BINDS, - "Vínculos das Teclas de Atalho da Entrada" - ) + "Vínculos das Teclas de Atalho da Entrada") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ICADE_ENABLE, - "Habilitar Mapeamento de Gamepad no Teclado" - ) + "Habilitar Mapeamento de Gamepad no Teclado") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_A, - "Botão A (direita)" - ) + "Botão A (direita)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, - "Botão B (baixo)" - ) + "Botão B (baixo)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_DOWN, - "Direcional para baixo" - ) + "Direcional para baixo") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L2, - "Botão L2 (gatilho)" - ) + "Botão L2 (gatilho)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L3, - "Botão L3 (polegar)" - ) + "Botão L3 (polegar)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L, - "Botão L (ombro)" - ) + "Botão L (ombro)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_LEFT, - "Direcional Esquerdo" - ) + "Direcional Esquerdo") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R2, - "Botão R2 (gatilho)" - ) + "Botão R2 (gatilho)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R3, - "Botão R3 (polegar)" - ) + "Botão R3 (polegar)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R, - "Botão R (ombro)" - ) + "Botão R (ombro)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_RIGHT, - "Direcional Direito" - ) + "Direcional Direito") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_SELECT, - "Botão Select" - ) + "Botão Select") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_START, - "Botão Start" - ) + "Botão Start") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_UP, - "Direcional para Cima" - ) + "Direcional para Cima") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_X, - "Botão X (topo)" - ) + "Botão X (topo)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, - "Botão Y (esquerda)" - ) + "Botão Y (esquerda)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, - "(Tecla: %s)" - ) + "(Tecla: %s)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, "Mouse 1") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, @@ -846,411 +840,282 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, "Roda do Mouse para Diretira") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, - "Tipo de Mapeamento para Gamepad no Teclado" - ) + "Tipo de Mapeamento para Gamepad no Teclado") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, - "Usuários Máximos" - ) + "Usuários Máximos") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MENU_ENUM_TOGGLE_GAMEPAD_COMBO, - "Combinação do Gamepad para Alternar Menu" - ) + "Combinação do Gamepad para Alternar Menu") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_MINUS, - "Índice de Trapaça -" - ) + "Índice de Trapaça -") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_PLUS, - "Índice de Trapaça +" - ) + "Índice de Trapaça +") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_TOGGLE, - "Alternar Trapaça" - ) + "Alternar Trapaça") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_EJECT_TOGGLE, - "Alternar ejeção de disco" - ) + "Alternar ejeção de disco") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_NEXT, - "Próximo disco" - ) + "Próximo disco") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_PREV, - "Disco anterior" - ) + "Disco anterior") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_ENABLE_HOTKEY, - "Habilitar teclas de atalho" - ) + "Habilitar teclas de atalho") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_HOLD_KEY, - "Manter Avanço Rápido" - ) + "Manter Avanço Rápido") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_KEY, - "Alternar Avanço Rápido" - ) + "Alternar Avanço Rápido") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_FRAMEADVANCE, - "Avanço de Quadro" - ) + "Avanço de Quadro") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_FULLSCREEN_TOGGLE_KEY, - "Alternar tela cheia" - ) + "Alternar tela cheia") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_GRAB_MOUSE_TOGGLE, - "Alternar captura do Mouse" - ) + "Alternar captura do Mouse") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_GAME_FOCUS_TOGGLE, - "Alternar foco do jogo" - ) + "Alternar foco do jogo") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, - "Carregar Estado de Jogo" - ) + "Carregar Estado de Jogo") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, - "Alternar menu" - ) + "Alternar menu") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE, - "Alternar gravação de filme" - ) + "Alternar gravação de filme") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, - "Alternar áudio mudo" - ) + "Alternar áudio mudo") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_GAME_WATCH, - "Alternar modo jogador/espectador do Netplay" - ) + "Alternar modo jogador/espectador do Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_OSK, - "Alternar teclado virtual" - ) + "Alternar teclado virtual") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_OVERLAY_NEXT, - "Próxima Transparência" - ) + "Próxima Transparência") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE, - "Alternar pausa" - ) + "Alternar pausa") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, - "Sair do RetroArch" - ) + "Sair do RetroArch") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_RESET, - "Reinicializar jogo" - ) + "Reinicializar jogo") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND, - "Retroceder" - ) + "Rebobinar") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_SAVE_STATE_KEY, - "Salvar Estado de Jogo" - ) + "Salvar Estado de Jogo") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_SCREENSHOT, - "Capturar tela" - ) + "Capturar tela") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, - "Próximo Shader" - ) + "Próximo Shader") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_PREV, - "Shader Anterior" - ) + "Shader Anterior") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION_HOLD_KEY, - "Câmera Lenta" - ) + "Câmera Lenta") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION_KEY, + "Alternar câmera lenta") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS, - "Compartimento do Estado de Jogo -" - ) + "Compartimento do Estado de Jogo -") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS, - "Compartimento do Estado de Jogo +" - ) + "Compartimento do Estado de Jogo +") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_DOWN, - "Volume -" - ) + "Volume -") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_UP, - "Volume +" - ) + "Volume +") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_ENABLE, - "Mostrar Transparência" - ) + "Mostrar Transparência") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_HIDE_IN_MENU, - "Ocultar Transparência no Menu" - ) + "Ocultar Transparência no Menu") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_SHOW_PHYSICAL_INPUTS, - "Exibir Comandos Na Transparência" - ) + "Exibir Comandos Na Transparência") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_SHOW_PHYSICAL_INPUTS_PORT, - "Porta de Escuta do Exibir Comandos " - ) + "Porta de Escuta do Exibir Comandos ") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_POLL_TYPE_BEHAVIOR, - "Tipo de Comportamento da Chamada Seletiva" - ) + "Tipo de Comportamento da Chamada Seletiva") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_POLL_TYPE_BEHAVIOR_EARLY, - "Mais cedo" - ) + "Mais cedo") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_POLL_TYPE_BEHAVIOR_LATE, - "Mais tarde" - ) + "Mais tarde") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_POLL_TYPE_BEHAVIOR_NORMAL, - "Normal" - ) + "Normal") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_PREFER_FRONT_TOUCH, - "Preferir Toque Frontal" - ) + "Preferir Toque Frontal") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_REMAPPING_DIRECTORY, - "Remapeamento de Entrada" - ) + "Remapeamento de Entrada") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_REMAP_BINDS_ENABLE, - "Habilitar Remapeamento de Vínculos" - ) + "Habilitar Remapeamento de Vínculos") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_SAVE_AUTOCONFIG, - "Salvar Autoconfiguração" - ) + "Salvar Autoconfiguração") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_SETTINGS, - "Entrada" - ) + "Entrada") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_SMALL_KEYBOARD_ENABLE, - "Habilitar Teclado Pequeno" - ) + "Habilitar Teclado Pequeno") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_TOUCH_ENABLE, - "Habilitar Toque" - ) + "Habilitar Toque") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, - "Habilitar Turbo" - ) + "Habilitar Turbo") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_TURBO_PERIOD, - "Período do Turbo" - ) + "Período do Turbo") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_USER_BINDS, - "Vínculos de Entrada do Usuário %u" - ) + "Vínculos de Entrada do Usuário %u") +MSG_HASH(MENU_ENUM_LABEL_VALUE_LATENCY_SETTINGS, + "Latência") MSG_HASH(MENU_ENUM_LABEL_VALUE_INTERNAL_STORAGE_STATUS, - "Condição do armazenamento interno" - ) + "Condição do armazenamento interno") MSG_HASH(MENU_ENUM_LABEL_VALUE_JOYPAD_AUTOCONFIG_DIR, - "Autoconfiguração de Entrada" - ) + "Autoconfiguração de Entrada") MSG_HASH(MENU_ENUM_LABEL_VALUE_JOYPAD_DRIVER, - "Driver de Joypad" - ) + "Driver de Joypad") MSG_HASH(MENU_ENUM_LABEL_VALUE_LAKKA_SERVICES, - "Serviços" - ) + "Serviços") MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_CHINESE_SIMPLIFIED, - "Chinês (Simplificado)" - ) + "Chinês (Simplificado)") MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_CHINESE_TRADITIONAL, - "Chinês (Tradicional)" - ) + "Chinês (Tradicional)") MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_DUTCH, - "Holandês" - ) + "Holandês") MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_ENGLISH, - "Inglês" - ) + "Inglês") MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_ESPERANTO, - "Esperanto" - ) + "Esperanto") MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_FRENCH, - "Francês" - ) + "Francês") MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_GERMAN, - "Alemão" - ) + "Alemão") MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_ITALIAN, - "Italiano" - ) + "Italiano") MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_JAPANESE, - "Japonês" - ) + "Japonês") MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_KOREAN, - "Coreano" - ) + "Coreano") MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_POLISH, - "Polonês" - ) + "Polonês") MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_PORTUGUESE_BRAZIL, - "Português (Brasil)" - ) + "Português (Brasil)") MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_PORTUGUESE_PORTUGAL, - "Português (Portugal)" - ) + "Português (Portugal)") MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_RUSSIAN, - "Russo" - ) + "Russo") MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_SPANISH, - "Espanhol" - ) + "Espanhol") MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_VIETNAMESE, - "Vietnamita" - ) + "Vietnamita") MSG_HASH( - MENU_ENUM_LABEL_VALUE_LANG_ARABIC, - "Arabic" - ) + MENU_ENUM_LABEL_VALUE_LANG_ARABIC, + "Árabe") MSG_HASH(MENU_ENUM_LABEL_VALUE_LEFT_ANALOG, - "Analógico Esquerdo" - ) + "Analógico Esquerdo") MSG_HASH(MENU_ENUM_LABEL_VALUE_LIBRETRO_DIR_PATH, - "Núcleo" - ) + "Núcleo") MSG_HASH(MENU_ENUM_LABEL_VALUE_LIBRETRO_INFO_PATH, - "Informação do Núcleo" - ) + "Informação do Núcleo") MSG_HASH(MENU_ENUM_LABEL_VALUE_LIBRETRO_LOG_LEVEL, - "Nível de Registro de Eventos do Núcleo" - ) + "Nível de Registro de Eventos do Núcleo") MSG_HASH(MENU_ENUM_LABEL_VALUE_LINEAR, - "Linear" - ) + "Linear") MSG_HASH(MENU_ENUM_LABEL_VALUE_LOAD_ARCHIVE, - "Carregar Arquivo" - ) + "Carregar Arquivo") MSG_HASH(MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_HISTORY, - "Carregar Recente" - ) + "Carregar Recente") MSG_HASH(MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_LIST, - "Carregar Conteúdo" - ) + "Carregar Conteúdo") MSG_HASH(MENU_ENUM_LABEL_VALUE_LOAD_STATE, - "Carregar Estado de Jogo" - ) + "Carregar Estado de Jogo") MSG_HASH(MENU_ENUM_LABEL_VALUE_LOCATION_ALLOW, - "Permitir Localização" - ) + "Permitir Localização") MSG_HASH(MENU_ENUM_LABEL_VALUE_LOCATION_DRIVER, - "Driver de Localização" - ) + "Driver de Localização") MSG_HASH(MENU_ENUM_LABEL_VALUE_LOGGING_SETTINGS, - "Registro de Eventos" - ) + "Registro de Eventos") MSG_HASH(MENU_ENUM_LABEL_VALUE_LOG_VERBOSITY, - "Verbosidade do Registro de Eventos" - ) + "Verbosidade do Registro de Eventos") MSG_HASH(MENU_ENUM_LABEL_VALUE_MAIN_MENU, - "Menu Principal" - ) + "Menu Principal") MSG_HASH(MENU_ENUM_LABEL_VALUE_MANAGEMENT, - "Configurações da Base de Dados" - ) + "Configurações da Base de Dados") MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME, - "Tema de Cor do Menu" - ) + "Tema de Cor do Menu") MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_BLUE, - "Azul" - ) + "Azul") MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_BLUE_GREY, - "Cinza Azulado" - ) + "Cinza Azulado") MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_DARK_BLUE, - "Azul Escuro" - ) + "Azul Escuro") MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_GREEN, - "Verde" - ) + "Verde") MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_NVIDIA_SHIELD, - "Shield" - ) + "Shield") MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_RED, - "Vermelho" - ) + "Vermelho") MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_YELLOW, - "Amarelo" - ) + "Amarelo") MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_FOOTER_OPACITY, - "Opacidade do Rodapé" - ) + "Opacidade do Rodapé") MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_HEADER_OPACITY, - "Opacidade do Cabeçalho" - ) + "Opacidade do Cabeçalho") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_DRIVER, - "Driver de Menu" - ) + "Driver de Menu") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_ENUM_THROTTLE_FRAMERATE, - "Controlar Taxa de Quadros do Menu" - ) + "Controlar Taxa de Quadros do Menu") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_FILE_BROWSER_SETTINGS, - "Configurações" - ) + "Configurações") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_LINEAR_FILTER, - "Filtro Linear de Menu" - ) + "Filtro Linear de Menu") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_HORIZONTAL_ANIMATION, - "Animação Horizontal" - ) + "Animação Horizontal") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SETTINGS, - "Aparência" - ) + "Aparência") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_WALLPAPER, - "Plano de Fundo" - ) + "Plano de Fundo") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_WALLPAPER_OPACITY, - "Opacidade do plano de fundo" - ) + "Opacidade do plano de fundo") MSG_HASH(MENU_ENUM_LABEL_VALUE_MISSING, - "Faltando" - ) + "Faltando") MSG_HASH(MENU_ENUM_LABEL_VALUE_MORE, - "..." - ) + "...") MSG_HASH(MENU_ENUM_LABEL_VALUE_MOUSE_ENABLE, - "Suporte para Mouse" - ) + "Suporte para Mouse") MSG_HASH(MENU_ENUM_LABEL_VALUE_MULTIMEDIA_SETTINGS, - "Multimídia" - ) + "Multimídia") MSG_HASH(MENU_ENUM_LABEL_VALUE_MUSIC_TAB, - "Música" - ) + "Música") MSG_HASH(MENU_ENUM_LABEL_VALUE_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE, - "Filtrar Extensões Desconhecidas" - ) + "Filtrar Extensões Desconhecidas") MSG_HASH(MENU_ENUM_LABEL_VALUE_NAVIGATION_WRAPAROUND, - "Navegação Retorna ao Início" - ) + "Navegação Retorna ao Início") MSG_HASH(MENU_ENUM_LABEL_VALUE_NEAREST, - "Mais Próximo" - ) + "Mais Próximo") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY, - "Netplay" - ) + "Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_ALLOW_SLAVES, - "Permitir Clientes em Modo Escravo" - ) + "Permitir Clientes em Modo Escravo") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_CHECK_FRAMES, - "Verificar Quadros do Netplay" - ) + "Verificar Quadros do Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_INPUT_LATENCY_FRAMES_MIN, - "Quadros de Latência de Entrada" - ) + "Quadros de Latência de Entrada") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_INPUT_LATENCY_FRAMES_RANGE, - "Faixa de Quadros de Latência de Entrada" - ) + "Faixa de Quadros de Latência de Entrada") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_DELAY_FRAMES, - "Atraso de Quadros do Netplay" - ) + "Atraso de Quadros do Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_DISCONNECT, - "Desconectar do hospedeiro de Netplay" - ) + "Desconectar do hospedeiro de Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_ENABLE, - "Habilitar Netplay" - ) + "Habilitar Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_ENABLE_CLIENT, - "Conectar ao hospedeiro de Netplay" - ) + "Conectar ao hospedeiro de Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_ENABLE_HOST, - "Iniciar hospedeiro de Netplay" - ) + "Iniciar hospedeiro de Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_DISABLE_HOST, - "Parar hospedeiro de Netplay" - ) + "Parar hospedeiro de Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_IP_ADDRESS, - "Endereço do Servidor" - ) + "Endereço do Servidor") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_LAN_SCAN_SETTINGS, - "Analisar a rede local" - ) + "Analisar a rede local") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_MODE, - "Habilitar Cliente Netplay" - ) + "Habilitar Cliente Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_NICKNAME, - "Usuário" - ) + "Usuário") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_PASSWORD, - "Senha do Servidor" - ) + "Senha do Servidor") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_PUBLIC_ANNOUNCE, - "Anunciar Netplay Publicamente") + "Anunciar Netplay Publicamente") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_REQUEST_DEVICE_I, "Solicitar Dispositivo %u") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_REQUIRE_SLAVES, - "Não Permitir Clientes em Modo Não Escravo" - ) + "Não Permitir Clientes em Modo Não Escravo") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_SETTINGS, - "Configurações do Netplay") + "Configurações do Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_SHARE_ANALOG, "Compartilhamento de Entrada Analógica") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_SHARE_ANALOG_MAX, @@ -1270,1150 +1135,797 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_SHARE_NONE, MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_SHARE_NO_PREFERENCE, "Sem preferência") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_START_AS_SPECTATOR, - "Modo Espectador do Netplay" - ) + "Modo Espectador do Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_STATELESS_MODE, - "Modo sem Estados de Jogo do Netplay" - ) + "Modo sem Estados de Jogo do Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_SPECTATE_PASSWORD, - "Senha Apenas Espectador do Servidor" - ) + "Senha Apenas Espectador do Servidor") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_SPECTATOR_MODE_ENABLE, - "Habilitar Espectador do Netplay" - ) + "Habilitar Espectador do Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_TCP_UDP_PORT, - "Porta TCP do Netplay" - ) + "Porta TCP do Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_NAT_TRAVERSAL, - "Travessia de NAT do Netplay" - ) + "Travessia de NAT do Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_CMD_ENABLE, - "Comandos de Rede" - ) + "Comandos de Rede") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_CMD_PORT, - "Porta de Comando de Rede" - ) + "Porta de Comando de Rede") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_INFORMATION, - "Informação de Rede" - ) + "Informação de Rede") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_REMOTE_ENABLE, - "Gamepad de Rede" - ) + "Gamepad de Rede") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_REMOTE_PORT, - "Porta Base Remota de Rede" - ) + "Porta Base Remota de Rede") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_SETTINGS, - "Rede" - ) + "Rede") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO, - "Não" - ) + "Não") MSG_HASH(MENU_ENUM_LABEL_VALUE_NONE, - "Nenhum" - ) + "Nenhum") MSG_HASH(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE, - "N/D" - ) + "N/D") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_ACHIEVEMENTS_TO_DISPLAY, - "Não há Conquistas para mostrar." - ) + "Não há Conquistas para mostrar.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_CORE, - "Nenhum Núcleo" - ) + "Nenhum Núcleo") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_CORES_AVAILABLE, - "Nenhum núcleo disponível" - ) + "Nenhum núcleo disponível") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_CORE_INFORMATION_AVAILABLE, - "Não há informação de núcleo disponível." - ) + "Não há informação de núcleo disponível.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_CORE_OPTIONS_AVAILABLE, - "Não há opções de núcleo disponíveis." - ) + "Não há opções de núcleo disponíveis.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_ENTRIES_TO_DISPLAY, - "Não há itens para mostrar." - ) + "Não há itens para mostrar.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_HISTORY_AVAILABLE, - "Não há histórico disponível." - ) + "Não há histórico disponível.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_INFORMATION_AVAILABLE, - "Não há informação disponível." - ) + "Não há informação disponível.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_ITEMS, - "Sem itens." - ) + "Sem itens.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_NETPLAY_HOSTS_FOUND, - "Nenhum hospedeiro de Netplay encontrado." - ) + "Nenhum hospedeiro de Netplay encontrado.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_NETWORKS_FOUND, - "Nenhuma rede encontrada." - ) + "Nenhuma rede encontrada.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_PERFORMANCE_COUNTERS, - "Não há contadores de desempenho." - ) + "Não há contadores de desempenho.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_PLAYLISTS, - "Não há listas de reprodução." - ) + "Não há listas de reprodução.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_PLAYLIST_ENTRIES_AVAILABLE, - "Não há itens de lista de reprodução disponíveis." - ) + "Não há itens de lista de reprodução disponíveis.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_SETTINGS_FOUND, - "Nenhuma configuração encontrada." - ) + "Nenhuma configuração encontrada.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_SHADER_PARAMETERS, - "Não há parâmetros de Shader." - ) + "Não há parâmetros de Shader.") MSG_HASH(MENU_ENUM_LABEL_VALUE_OFF, - "DESLIGADO" - ) + "DESLIGADO") MSG_HASH(MENU_ENUM_LABEL_VALUE_ON, - "LIGADO" - ) + "LIGADO") MSG_HASH(MENU_ENUM_LABEL_VALUE_ONLINE, - "Online" - ) + "Online") MSG_HASH(MENU_ENUM_LABEL_VALUE_ONLINE_UPDATER, - "Atualizador Online" - ) + "Atualizador Online") MSG_HASH(MENU_ENUM_LABEL_VALUE_ONSCREEN_DISPLAY_SETTINGS, - "Exibição na Tela" - ) + "Exibição na Tela") MSG_HASH(MENU_ENUM_LABEL_VALUE_ONSCREEN_OVERLAY_SETTINGS, - "Transparência na Tela" - ) + "Transparência na Tela") MSG_HASH(MENU_ENUM_LABEL_VALUE_ONSCREEN_NOTIFICATIONS_SETTINGS, - "Notificações na Tela" - ) + "Notificações na Tela") MSG_HASH(MENU_ENUM_LABEL_VALUE_OPEN_ARCHIVE, - "Navegar no Arquivo" - ) + "Navegar no Arquivo") MSG_HASH(MENU_ENUM_LABEL_VALUE_OPTIONAL, - "Opcional" - ) + "Opcional") MSG_HASH(MENU_ENUM_LABEL_VALUE_OVERLAY, - "Transparência" - ) + "Transparência") MSG_HASH(MENU_ENUM_LABEL_VALUE_OVERLAY_AUTOLOAD_PREFERRED, - "Autocarregar Transparência Favorita" - ) + "Carraga Automaticamente Transparência Favorita") MSG_HASH(MENU_ENUM_LABEL_VALUE_OVERLAY_DIRECTORY, - "Transparência" - ) + "Transparência") MSG_HASH(MENU_ENUM_LABEL_VALUE_OVERLAY_OPACITY, - "Opacidade da Transparência" - ) + "Opacidade da Transparência") MSG_HASH(MENU_ENUM_LABEL_VALUE_OVERLAY_PRESET, - "Predefinição de Transparência" - ) + "Predefinição de Transparência") MSG_HASH(MENU_ENUM_LABEL_VALUE_OVERLAY_SCALE, - "Escala da Transparência" - ) + "Escala da Transparência") MSG_HASH(MENU_ENUM_LABEL_VALUE_OVERLAY_SETTINGS, - "Transparência na Tela" - ) + "Transparência na Tela") MSG_HASH(MENU_ENUM_LABEL_VALUE_PAL60_ENABLE, - "Utilizar Modo PAL60" - ) + "Utilizar Modo PAL60") MSG_HASH(MENU_ENUM_LABEL_VALUE_PARENT_DIRECTORY, - "Diretório superior" - ) + "Diretório superior") MSG_HASH(MENU_ENUM_LABEL_VALUE_PAUSE_LIBRETRO, - "Pausar quando o menu for ativado" - ) + "Pausar quando o menu for ativado") MSG_HASH(MENU_ENUM_LABEL_VALUE_PAUSE_NONACTIVE, - "Não rodar em segundo plano" - ) + "Não rodar em segundo plano") MSG_HASH(MENU_ENUM_LABEL_VALUE_PERFCNT_ENABLE, - "Contadores de Desempenho" - ) + "Contadores de Desempenho") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLISTS_TAB, - "Listas de Reprodução" - ) + "Listas de Reprodução") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_DIRECTORY, - "Lista de Reprodução" - ) + "Lista de Reprodução") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_SETTINGS, - "Listas de Reprodução" - ) + "Listas de Reprodução") MSG_HASH(MENU_ENUM_LABEL_VALUE_POINTER_ENABLE, - "Suporte para Toque" - ) + "Suporte para Toque") MSG_HASH(MENU_ENUM_LABEL_VALUE_PORT, - "Porta" - ) + "Porta") MSG_HASH(MENU_ENUM_LABEL_VALUE_PRESENT, - "Presente" - ) + "Presente") MSG_HASH(MENU_ENUM_LABEL_VALUE_PRIVACY_SETTINGS, - "Privacidade" - ) + "Privacidade") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUIT_RETROARCH, - "Sair do RetroArch" - ) + "Sair do RetroArch") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ANALOG, - "Analógico suportado" - ) + "Analógico suportado") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_BBFC_RATING, - "Classificação BBFC" - ) + "Classificação BBFC") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_CERO_RATING, - "Classificação CERO" - ) + "Classificação CERO") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_COOP, - "Cooperativo suportado" - ) + "Cooperativo suportado") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_CRC32, - "CRC32" - ) + "CRC32") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_DESCRIPTION, - "Descrição" - ) + "Descrição") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_DEVELOPER, - "Desenvolvedor" - ) + "Desenvolvedor") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_EDGE_MAGAZINE_ISSUE, - "Edição da Revista Edge" - ) + "Edição da Revista Edge") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_EDGE_MAGAZINE_RATING, - "Classificação da Revista Edge" - ) + "Classificação da Revista Edge") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_EDGE_MAGAZINE_REVIEW, - "Análise da Revista Edge" - ) + "Análise da Revista Edge") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ELSPA_RATING, - "Classificação ELSPA" - ) + "Classificação ELSPA") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ENHANCEMENT_HW, - "Hardware de Aprimoramento" - ) + "Hardware de Aprimoramento") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ESRB_RATING, - "Classificação ESRB" - ) + "Classificação ESRB") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_FAMITSU_MAGAZINE_RATING, - "Classificação da Revista Famitsu" - ) + "Classificação da Revista Famitsu") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_FRANCHISE, - "Franquia" - ) + "Franquia") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_GENRE, - "Gênero" - ) + "Gênero") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_MD5, - "MD5" - ) + "MD5") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_NAME, - "Nome" - ) + "Nome") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ORIGIN, - "Origem" - ) + "Origem") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_PEGI_RATING, - "Classificação PEGI" - ) + "Classificação PEGI") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_PUBLISHER, - "Editor" - ) + "Editor") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_RELEASE_MONTH, - "Mês de Lançamento" - ) + "Mês de Lançamento") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_RELEASE_YEAR, - "Ano de Lançamento" - ) + "Ano de Lançamento") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_RUMBLE, - "Suporte para Vibração" - ) + "Suporte para Vibração") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_SERIAL, - "Número de Série" - ) + "Número de Série") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_SHA1, - "SHA1" - ) + "SHA1") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_START_CONTENT, - "Iniciar Conteúdo" - ) + "Iniciar Conteúdo") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_TGDB_RATING, - "Classificação TGDB" - ) + "Classificação TGDB") MSG_HASH(MENU_ENUM_LABEL_VALUE_REBOOT, - "Reiniciar" - ) + "Reiniciar") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_CONFIG_DIRECTORY, - "Configuração de Gravação" - ) + "Configuração de Gravação") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_OUTPUT_DIRECTORY, - "Saída de Gravação" - ) + "Saída de Gravação") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_SETTINGS, - "Gravação" - ) + "Gravação") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORD_CONFIG, - "Carregar Configuração de Gravação..." - ) + "Carregar Configuração de Gravação...") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORD_DRIVER, - "Driver de Gravação" - ) + "Driver de Gravação") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORD_ENABLE, - "Habilitar Gravação" - ) + "Habilitar Gravação") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORD_PATH, - "Salvar Saída de Gravação Como..." - ) + "Salvar Saída de Gravação Como...") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORD_USE_OUTPUT_DIRECTORY, - "Salvar Gravações no Diretório de Saída" - ) + "Salvar Gravações no Diretório de Saída") MSG_HASH(MENU_ENUM_LABEL_VALUE_REMAP_FILE, - "Arquivo de Remapeamento" - ) + "Arquivo de Remapeamento") MSG_HASH(MENU_ENUM_LABEL_VALUE_REMAP_FILE_LOAD, - "Carregar Arquivo de Remapeamento" - ) + "Carregar Arquivo de Remapeamento") MSG_HASH(MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_CORE, - "Salvar Arquivo de Remapeamento de Núcleo" - ) + "Salvar Arquivo de Remapeamento de Núcleo") MSG_HASH(MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_GAME, - "Salvar Arquivo de Remapeamento de Jogo" - ) + "Salvar Arquivo de Remapeamento de Jogo") MSG_HASH(MENU_ENUM_LABEL_VALUE_REMAP_FILE_REMOVE_CORE, - "Remover Arquivo de Remapeamento de Núcleo" - ) + "Remover Arquivo de Remapeamento de Núcleo") MSG_HASH(MENU_ENUM_LABEL_VALUE_REMAP_FILE_REMOVE_GAME, - "Remover Arquivo de Remapeamento de Jogo" - ) + "Remover Arquivo de Remapeamento de Jogo") MSG_HASH(MENU_ENUM_LABEL_VALUE_REQUIRED, - "Obrigatório" - ) + "Obrigatório") MSG_HASH(MENU_ENUM_LABEL_VALUE_RESTART_CONTENT, - "Reiniciar" - ) + "Reiniciar") MSG_HASH(MENU_ENUM_LABEL_VALUE_RESTART_RETROARCH, - "Reiniciar RetroArch" - ) + "Reiniciar RetroArch") MSG_HASH(MENU_ENUM_LABEL_VALUE_RESUME, - "Retomar" - ) + "Retomar") MSG_HASH(MENU_ENUM_LABEL_VALUE_RESUME_CONTENT, - "Retomar" - ) + "Retomar") MSG_HASH(MENU_ENUM_LABEL_VALUE_RETROKEYBOARD, - "RetroKeyboard" - ) + "RetroKeyboard") MSG_HASH(MENU_ENUM_LABEL_VALUE_RETROPAD, - "RetroPad" - ) + "RetroPad") MSG_HASH(MENU_ENUM_LABEL_VALUE_RETROPAD_WITH_ANALOG, - "RetroPad com Analógico" - ) + "RetroPad com Analógico") MSG_HASH(MENU_ENUM_LABEL_VALUE_RETRO_ACHIEVEMENTS_SETTINGS, - "Conquistas" - ) + "Conquistas") MSG_HASH(MENU_ENUM_LABEL_VALUE_REWIND_ENABLE, - "Habilitar Voltar Atrás" - ) + "Habilitar Rebobinagem") MSG_HASH(MENU_ENUM_LABEL_VALUE_REWIND_GRANULARITY, - "Granularidade do Voltar Atrás" - ) + "Granularidade do Voltar Atrás") MSG_HASH(MENU_ENUM_LABEL_VALUE_REWIND_SETTINGS, - "Voltar Atrás" - ) + "Rebobinagem") MSG_HASH(MENU_ENUM_LABEL_VALUE_RGUI_BROWSER_DIRECTORY, - "Navegador de Arquivos" - ) + "Navegador de Arquivos") MSG_HASH(MENU_ENUM_LABEL_VALUE_RGUI_CONFIG_DIRECTORY, - "Configuração" - ) + "Configuração") MSG_HASH(MENU_ENUM_LABEL_VALUE_RGUI_SHOW_START_SCREEN, - "Mostrar Tela Inicial" - ) + "Mostrar Tela Inicial") MSG_HASH(MENU_ENUM_LABEL_VALUE_RIGHT_ANALOG, - "Analógico Direito" - ) + "Analógico Direito") MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES, - "Adicionar aos Favoritos" - ) + "Adicionar aos Favoritos") MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES_PLAYLIST, - "Adicionar aos Favoritos" - ) + "Adicionar aos Favoritos") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RESET_CORE_ASSOCIATION, + "Redefinir Associação do Núcleo") MSG_HASH(MENU_ENUM_LABEL_VALUE_RUN, - "Executar" - ) + "Executar") MSG_HASH(MENU_ENUM_LABEL_VALUE_RUN_MUSIC, - "Executar" - ) + "Executar") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAMBA_ENABLE, - "Habilitar SAMBA" - ) + "Habilitar SAMBA") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVEFILE_DIRECTORY, - "Arquivo de Jogo-Salvo" - ) + "Arquivo de Jogo-Salvo") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVESTATE_AUTO_INDEX, - "Índice Automático de Estado de Jogo" - ) + "Índice Automático de Estado de Jogo") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVESTATE_AUTO_LOAD, - "Autocarregar Estado de Jogo" - ) + "Carraga Automaticamente Estado de Jogo") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVESTATE_AUTO_SAVE, - "Autosalvar Estado de Jogo" - ) + "Salvar Automaticamente Estado de Jogo") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVESTATE_DIRECTORY, - "Arquivo de Estado de Jogo" - ) + "Arquivo de Estado de Jogo") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVESTATE_THUMBNAIL_ENABLE, - "Miniaturas do Estado de Jogo" - ) + "Miniaturas do Estado de Jogo") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG, - "Salvar Configuração Atual" - ) + "Salvar Configuração Atual") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_CORE, - "Salvar Redefinição de Núcleo" - ) + "Salvar Redefinição de Núcleo") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_GAME, - "Salvar Redefinição de Jogo" - ) + "Salvar Redefinição de Jogo") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVE_NEW_CONFIG, - "Salvar Nova Configuração" - ) + "Salvar Nova Configuração") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVE_STATE, - "Salvar Estado de Jogo" - ) + "Salvar Estado de Jogo") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVING_SETTINGS, - "Salvando" - ) + "Salvando") MSG_HASH(MENU_ENUM_LABEL_VALUE_SCAN_DIRECTORY, - "Analisar Diretório" - ) + "Analisar Diretório") MSG_HASH(MENU_ENUM_LABEL_VALUE_SCAN_FILE, - "Analisar Arquivo" - ) + "Analisar Arquivo") MSG_HASH(MENU_ENUM_LABEL_VALUE_SCAN_THIS_DIRECTORY, - "" - ) + "") MSG_HASH(MENU_ENUM_LABEL_VALUE_SCREENSHOT_DIRECTORY, - "Captura de Tela" - ) + "Captura de Tela") MSG_HASH(MENU_ENUM_LABEL_VALUE_SCREEN_RESOLUTION, - "Resolução da Tela" - ) + "Resolução da Tela") MSG_HASH(MENU_ENUM_LABEL_VALUE_SEARCH, - "Procurar" - ) + "Procurar") MSG_HASH(MENU_ENUM_LABEL_VALUE_SECONDS, - "segundos" - ) + "segundos") MSG_HASH(MENU_ENUM_LABEL_VALUE_SETTINGS, - "Configurações" - ) + "Configurações") MSG_HASH(MENU_ENUM_LABEL_VALUE_SETTINGS_TAB, - "Configurações" - ) + "Configurações") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER, - "Shader" - ) + "Shader") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_APPLY_CHANGES, - "Aplicar Alterações" - ) + "Aplicar Alterações") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_OPTIONS, - "Shaders" - ) + "Shaders") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_RIBBON, - "Faixa" - ) + "Faixa") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_RIBBON_SIMPLIFIED, - "Faixa (simplificada)" - ) + "Faixa (simplificada)") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_SIMPLE_SNOW, - "Neve Simples" - ) + "Neve Simples") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_SNOW, - "Neve" - ) + "Neve") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHOW_ADVANCED_SETTINGS, - "Exibir Configurações Avançadas" - ) + "Exibir Configurações Avançadas") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHOW_HIDDEN_FILES, - "Exibir Arquivos e Pastas Ocultos" - ) + "Exibir Arquivos e Pastas Ocultos") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHUTDOWN, - "Desligar" - ) + "Desligar") MSG_HASH(MENU_ENUM_LABEL_VALUE_SLOWMOTION_RATIO, - "Taxa de Câmera Lenta" - ) + "Taxa de Câmera Lenta") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RUN_AHEAD_ENABLED, + "Adiantar para Reduzir a Latência") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RUN_AHEAD_FRAMES, + "Número de Quadros para Adiantar") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RUN_AHEAD_SECONDARY_INSTANCE, + "Adiantar Usa uma Segunda Instância") MSG_HASH(MENU_ENUM_LABEL_VALUE_SORT_SAVEFILES_ENABLE, - "Classificar Arquivos de Jogo-Salvo em Pastas" - ) + "Classificar Arquivos de Jogo-Salvo em Pastas") MSG_HASH(MENU_ENUM_LABEL_VALUE_SORT_SAVESTATES_ENABLE, - "Classificar Arquivos de Estado de Jogo em Pastas" - ) + "Classificar Arquivos de Estado de Jogo em Pastas") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVESTATES_IN_CONTENT_DIR_ENABLE, - "Gravar Estados de Jogo no Diretório de Conteúdo" - ) + "Gravar Estados de Jogo no Diretório de Conteúdo") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVEFILES_IN_CONTENT_DIR_ENABLE, - "Gravar Jogos-Salvos no Diretório de Conteúdo" - ) + "Gravar Jogos-Salvos no Diretório de Conteúdo") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEMFILES_IN_CONTENT_DIR_ENABLE, - "Arquivos de Sistema estão no Diretório de Conteúdo" - ) + "Arquivos de Sistema estão no Diretório de Conteúdo") MSG_HASH(MENU_ENUM_LABEL_VALUE_SCREENSHOTS_IN_CONTENT_DIR_ENABLE, - "Salvar Capturas de Tela no Diretório de Conteúdo" - ) + "Salvar Capturas de Tela no Diretório de Conteúdo") MSG_HASH(MENU_ENUM_LABEL_VALUE_SSH_ENABLE, - "Habilitar SSH" - ) + "Habilitar SSH") MSG_HASH(MENU_ENUM_LABEL_VALUE_START_CORE, - "Iniciar Núcleo" - ) + "Iniciar Núcleo") MSG_HASH(MENU_ENUM_LABEL_VALUE_START_NET_RETROPAD, - "Iniciar RetroPad Remoto" - ) + "Iniciar RetroPad Remoto") MSG_HASH(MENU_ENUM_LABEL_VALUE_START_VIDEO_PROCESSOR, - "Iniciar Processador de Vídeo" - ) + "Iniciar Processador de Vídeo") MSG_HASH(MENU_ENUM_LABEL_VALUE_STATE_SLOT, - "Compartimento do Estado de Jogo" - ) + "Compartimento do Estado de Jogo") MSG_HASH(MENU_ENUM_LABEL_VALUE_STATUS, - "Condição" - ) + "Condição") MSG_HASH(MENU_ENUM_LABEL_VALUE_STDIN_CMD_ENABLE, - "Comandos stdin" - ) + "Comandos stdin") MSG_HASH(MENU_ENUM_LABEL_VALUE_SUPPORTED_CORES, - "Núcleos Sugeridos" - ) + "Núcleos Sugeridos") MSG_HASH(MENU_ENUM_LABEL_VALUE_SUSPEND_SCREENSAVER_ENABLE, - "Desativar Protetor de Tela" - ) + "Desativar Protetor de Tela") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_BGM_ENABLE, - "Habilitar Música em Segundo Plano do Sistema" - ) + "Habilitar Música em Segundo Plano do Sistema") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_DIRECTORY, - "Sistema/BIOS" - ) + "Sistema/BIOS") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFORMATION, - "Informação do Sistema" - ) + "Informação do Sistema") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_7ZIP_SUPPORT, - "Suporte a 7zip" - ) + "Suporte a 7zip") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_ALSA_SUPPORT, - "Suporte a ALSA" - ) + "Suporte a ALSA") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_BUILD_DATE, - "Data de Compilação" - ) + "Data de Compilação") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_CG_SUPPORT, - "Suporte a Cg" - ) + "Suporte a Cg") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_COCOA_SUPPORT, - "Suporte a Cocoa" - ) + "Suporte a Cocoa") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_COMMAND_IFACE_SUPPORT, - "Suporte à Interface de Comando" - ) + "Suporte à Interface de Comando") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_CORETEXT_SUPPORT, - "Suporte a CoreText" - ) + "Suporte a CoreText") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_CPU_FEATURES, - "Características de CPU" - ) + "Características de CPU") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DISPLAY_METRIC_DPI, - "Métrica DPI da Tela" - ) + "Métrica DPI da Tela") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DISPLAY_METRIC_MM_HEIGHT, - "Métrica de Altura da Tela (mm)" - ) + "Métrica de Altura da Tela (mm)") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DISPLAY_METRIC_MM_WIDTH, - "Métrica de Largura da Tela (mm)" - ) + "Métrica de Largura da Tela (mm)") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DSOUND_SUPPORT, - "Suporte a DirectSound" - ) + "Suporte a DirectSound") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_WASAPI_SUPPORT, - "Suporte a WASAPI" - ) + "Suporte a WASAPI") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DYLIB_SUPPORT, - "Suporte à biblioteca dinâmica" - ) + "Suporte à biblioteca dinâmica") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DYNAMIC_SUPPORT, - "Carregamento dinâmico em tempo de execução da biblioteca libretro" - ) + "Carregamento dinâmico em tempo de execução da biblioteca libretro") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_EGL_SUPPORT, - "Suporte a EGL" - ) + "Suporte a EGL") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FBO_SUPPORT, - "Suporte a OpenGL/Direct3D render-to-texture (multi-pass shaders)" - ) + "Suporte a OpenGL/Direct3D render-to-texture (multi-pass shaders)") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FFMPEG_SUPPORT, - "Suporte a FFmpeg" - ) + "Suporte a FFmpeg") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FREETYPE_SUPPORT, - "Suporte a FreeType" - ) + "Suporte a FreeType") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FRONTEND_IDENTIFIER, - "Identificador do Frontend" - ) + "Identificador do Frontend") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FRONTEND_NAME, - "Nome do Frontend" - ) + "Nome do Frontend") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FRONTEND_OS, - "SO do Frontend" - ) + "SO do Frontend") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_GIT_VERSION, - "Versão Git" - ) + "Versão Git") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_GLSL_SUPPORT, - "Suporte a GLSL" - ) + "Suporte a GLSL") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_HLSL_SUPPORT, - "Suporte a HLSL" - ) + "Suporte a HLSL") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_JACK_SUPPORT, - "Suporte a JACK" - ) + "Suporte a JACK") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_KMS_SUPPORT, - "Suporte a KMS/EGL" - ) + "Suporte a KMS/EGL") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LAKKA_VERSION, - "Versão Lakka" - ) + "Versão Lakka") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBRETRODB_SUPPORT, - "Suporte a LibretroDB" - ) + "Suporte a LibretroDB") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBUSB_SUPPORT, - "Suporte a Libusb" - ) + "Suporte a Libusb") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBXML2_SUPPORT, - "Suporte a libxml2 XML parsing" - ) + "Suporte a libxml2 XML parsing") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETPLAY_SUPPORT, - "Suporte Netplay (ponto-a-ponto)" - ) + "Suporte Netplay (ponto-a-ponto)") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETWORK_COMMAND_IFACE_SUPPORT, - "Suporte à Interface de comando de rede" - ) + "Suporte à Interface de comando de rede") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETWORK_REMOTE_SUPPORT, - "Suporte a Gamepad de Rede" - ) + "Suporte a Gamepad de Rede") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OPENAL_SUPPORT, - "Suporte a OpenAL" - ) + "Suporte a OpenAL") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OPENGLES_SUPPORT, - "Suporte a OpenGL ES" - ) + "Suporte a OpenGL ES") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OPENGL_SUPPORT, - "Suporte a OpenGL" - ) + "Suporte a OpenGL") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OPENSL_SUPPORT, - "Suporte a OpenSL" - ) + "Suporte a OpenSL") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OPENVG_SUPPORT, - "Suporte a OpenVG" - ) + "Suporte a OpenVG") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OSS_SUPPORT, - "Suporte a OSS" - ) + "Suporte a OSS") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OVERLAY_SUPPORT, - "Suporte à Transparência" - ) + "Suporte à Transparência") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE, - "Fonte de Energia" - ) + "Fonte de Energia") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_CHARGED, - "Carregado" - ) + "Carregado") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_CHARGING, - "Carregando" - ) + "Carregando") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_DISCHARGING, - "Descarregando" - ) + "Descarregando") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_NO_SOURCE, - "Não há fonte" - ) + "Não há fonte") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_PULSEAUDIO_SUPPORT, - "Suporte a PulseAudio" - ) + "Suporte a PulseAudio") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_PYTHON_SUPPORT, - "Suporte a Python (suporte de script em Shaders)" - ) + "Suporte a Python (suporte de script em Shaders)") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RBMP_SUPPORT, - "Suporte a BMP (RBMP)" - ) + "Suporte a BMP (RBMP)") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RETRORATING_LEVEL, - "Nível RetroRating" - ) + "Nível RetroRating") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RJPEG_SUPPORT, - "Suporte a JPEG (RJPEG)" - ) + "Suporte a JPEG (RJPEG)") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_ROARAUDIO_SUPPORT, - "Suporte a RoarAudio" - ) + "Suporte a RoarAudio") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RPNG_SUPPORT, - "Suporte a PNG (RPNG)" - ) + "Suporte a PNG (RPNG)") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RSOUND_SUPPORT, - "Suporte a RSound" - ) + "Suporte a RSound") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RTGA_SUPPORT, - "Suporte a TGA (RTGA)" - ) + "Suporte a TGA (RTGA)") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_SDL2_SUPPORT, - "Suporte a SDL2" - ) + "Suporte a SDL2") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_SDL_IMAGE_SUPPORT, - "Suporte a imagem SDL" - ) + "Suporte a imagem SDL") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_SDL_SUPPORT, - "Suporte a SDL1.2" - ) + "Suporte a SDL1.2") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_SLANG_SUPPORT, - "Suporte a Slang" - ) + "Suporte a Slang") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_THREADING_SUPPORT, - "Suporte a Paralelismo" - ) + "Suporte a Paralelismo") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_UDEV_SUPPORT, - "Suporte a Udev" - ) + "Suporte a Udev") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_V4L2_SUPPORT, - "Suporte a Video4Linux2" - ) + "Suporte a Video4Linux2") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_VIDEO_CONTEXT_DRIVER, - "Driver de contexto de vídeo" - ) + "Driver de contexto de vídeo") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_VULKAN_SUPPORT, - "Suporte a Vulkan" - ) + "Suporte a Vulkan") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_WAYLAND_SUPPORT, - "Suporte a Wayland" - ) + "Suporte a Wayland") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_X11_SUPPORT, - "Suporte a X11" - ) + "Suporte a X11") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_XAUDIO2_SUPPORT, - "Suporte a XAudio2" - ) + "Suporte a XAudio2") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_XVIDEO_SUPPORT, - "Suporte a XVideo" - ) + "Suporte a XVideo") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_ZLIB_SUPPORT, - "Suporte a Zlib" - ) + "Suporte a Zlib") MSG_HASH(MENU_ENUM_LABEL_VALUE_TAKE_SCREENSHOT, - "Capturar tela" - ) + "Capturar tela") MSG_HASH(MENU_ENUM_LABEL_VALUE_THREADED_DATA_RUNLOOP_ENABLE, - "Paralelismo de tarefas" - ) + "Paralelismo de tarefas") MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAILS, "Miniaturas") MSG_HASH(MENU_ENUM_LABEL_VALUE_LEFT_THUMBNAILS, - "Miniaturas à esquerda") + "Miniaturas à Esquerda") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_VERTICAL_THUMBNAILS, + "Disposição Vertical de Miniaturas") MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAILS_DIRECTORY, - "Miniaturas" - ) + "Miniaturas") MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAILS_UPDATER_LIST, - "Atualizador de Miniaturas" - ) + "Atualizador de Miniaturas") MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAIL_MODE_BOXARTS, - "Arte da Embalagem" - ) + "Arte da Embalagem") MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAIL_MODE_SCREENSHOTS, - "Captura de Tela" - ) + "Captura de Tela") MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAIL_MODE_TITLE_SCREENS, - "Tela do Título" - ) + "Tela do Título") MSG_HASH(MENU_ENUM_LABEL_VALUE_TIMEDATE_ENABLE, - "Exibir data / hora" - ) + "Exibir data e hora") MSG_HASH(MENU_ENUM_LABEL_VALUE_TITLE_COLOR, - "Cor do título do menu" - ) + "Cor do título do menu") MSG_HASH(MENU_ENUM_LABEL_VALUE_TRUE, - "Verdadeiro" - ) + "Verdadeiro") MSG_HASH(MENU_ENUM_LABEL_VALUE_UI_COMPANION_ENABLE, - "Habilitar Companheiro da Interface de Usuário" - ) + "Habilitar Companheiro da Interface de Usuário") MSG_HASH(MENU_ENUM_LABEL_VALUE_UI_COMPANION_START_ON_BOOT, - "Companheiro da Interface de Usuário Roda na Inicialização" - ) + "Companheiro da Interface de Usuário Roda na Inicialização") MSG_HASH(MENU_ENUM_LABEL_VALUE_UI_MENUBAR_ENABLE, - "Barra de Menu" - ) + "Barra de Menu") MSG_HASH(MENU_ENUM_LABEL_VALUE_UNABLE_TO_READ_COMPRESSED_FILE, - "Incapaz de ler o arquivo comprimido." - ) + "Incapaz de ler o arquivo comprimido.") MSG_HASH(MENU_ENUM_LABEL_VALUE_UNDO_LOAD_STATE, - "Desfazer Carregamento de Estado de Jogo" - ) + "Desfazer Carregamento de Estado de Jogo") MSG_HASH(MENU_ENUM_LABEL_VALUE_UNDO_SAVE_STATE, - "Desfazer Salvamento de Estado de Jogo" - ) + "Desfazer Salvamento de Estado de Jogo") MSG_HASH(MENU_ENUM_LABEL_VALUE_UNKNOWN, - "Desconhecido" - ) + "Desconhecido") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATER_SETTINGS, - "Atualizador" - ) + "Atualizador") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_ASSETS, - "Atualizar Recursos" - ) + "Atualizar Recursos") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_AUTOCONFIG_PROFILES, - "Atualizar Perfis de Autoconfiguração" - ) + "Atualizar Perfis de Autoconfiguração") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_CG_SHADERS, - "Atualizar Shaders Cg" - ) + "Atualizar Shaders Cg") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_CHEATS, - "Atualizar Trapaças" - ) + "Atualizar Trapaças") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_CORE_INFO_FILES, - "Atualizar Arquivos de Informação de Núcleo" - ) + "Atualizar Arquivos de Informação de Núcleo") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_DATABASES, - "Atualizar Bases de Dados" - ) + "Atualizar Bases de Dados") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_GLSL_SHADERS, - "Atualizar Shaders GLSL" - ) + "Atualizar Shaders GLSL") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_LAKKA, - "Atualizar Lakka" - ) + "Atualizar Lakka") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_OVERLAYS, - "Atualizar Transparências" - ) + "Atualizar Transparências") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_SLANG_SHADERS, - "Atualizar Shaders Slang" - ) + "Atualizar Shaders Slang") MSG_HASH(MENU_ENUM_LABEL_VALUE_USER, - "Usuário" - ) + "Usuário") +MSG_HASH(MENU_ENUM_LABEL_VALUE_KEYBOARD, + "Kbd") MSG_HASH(MENU_ENUM_LABEL_VALUE_USER_INTERFACE_SETTINGS, - "Interface de Usuário" - ) + "Interface de Usuário") MSG_HASH(MENU_ENUM_LABEL_VALUE_USER_LANGUAGE, - "Idioma" - ) + "Idioma") MSG_HASH(MENU_ENUM_LABEL_VALUE_USER_SETTINGS, - "Usuário" - ) + "Usuário") MSG_HASH(MENU_ENUM_LABEL_VALUE_USE_BUILTIN_IMAGE_VIEWER, - "Utilizar o Visualizador de Imagem Integrado" - ) + "Utilizar o Visualizador de Imagem Integrado") MSG_HASH(MENU_ENUM_LABEL_VALUE_USE_BUILTIN_PLAYER, - "Utilizar o Reprodutor de Mídia Integrado" - ) + "Utilizar o Reprodutor de Mídia Integrado") MSG_HASH(MENU_ENUM_LABEL_VALUE_USE_THIS_DIRECTORY, - "" - ) + "") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ALLOW_ROTATE, - "Permitir rotação" - ) + "Permitir rotação") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO, - "Configurar Proporção de Tela" - ) + "Configurar Proporção de Tela") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_AUTO, - "Proporção de Tela Automática" - ) + "Proporção de Tela Automática") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_INDEX, - "Proporção de Tela" - ) + "Proporção de Tela") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION, - "Inserção de Quadro Opaco" - ) + "Inserção de Quadro Opaco") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_CROP_OVERSCAN, - "Cortar Overscan (Recarregar)" - ) + "Cortar Overscan (Recarregar)") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DISABLE_COMPOSITION, - "Desativar Composição da Área de Trabalho" - ) + "Desativar Composição da Área de Trabalho") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DRIVER, - "Driver de Vídeo" - ) + "Driver de Vídeo") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FILTER, - "Filtro de Vídeo" - ) + "Filtro de Vídeo") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FILTER_DIR, - "Filtro de Vídeo" - ) + "Filtro de Vídeo") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FILTER_FLICKER, - "Filtro de tremulação de vídeo" - ) + "Filtro de tremulação de vídeo") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FONT_ENABLE, - "Habilitar Notificações na Tela" - ) + "Habilitar Notificações na Tela") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FONT_PATH, - "Fonte das Notificações na Tela" - ) + "Fonte das Notificações na Tela") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FONT_SIZE, - "Tamanho da Notificação na Tela" - ) + "Tamanho da Notificação na Tela") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_ASPECT, - "Forçar Proporção de Tela" - ) + "Forçar Proporção de Tela") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_SRGB_DISABLE, - "Forçar Desativação de sRGB FBO" - ) + "Forçar Desativação de sRGB FBO") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FRAME_DELAY, - "Atraso de Quadro" - ) + "Atraso de Quadro") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FULLSCREEN, - "Utilizar Modo de Tela Cheia" - ) + "Utilizar Modo de Tela Cheia") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_GAMMA, - "Gama de Vídeo" - ) + "Gama de Vídeo") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_GPU_RECORD, - "Usar Gravação da GPU" - ) + "Usar Gravação da GPU") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT, - "Habilitar Captura de Tela da GPU" - ) + "Habilitar Captura de Tela da GPU") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_HARD_SYNC, - "Sincronia Rígida de GPU" - ) + "Sincronia Rígida de GPU") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_HARD_SYNC_FRAMES, - "Quadros de Sincronia Rígida de GPU" - ) + "Quadros de Sincronia Rígida de GPU") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MAX_SWAPCHAIN_IMAGES, - "Máximo de imagens na cadeia de troca" - ) + "Máximo de imagens na cadeia de troca") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_POS_X, - "Posição X da Notificação na Tela" - ) + "Posição X da Notificação na Tela") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_POS_Y, - "Posição Y da Notificação na Tela" - ) + "Posição Y da Notificação na Tela") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MONITOR_INDEX, - "Índice de Monitor" - ) + "Índice de Monitor") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_POST_FILTER_RECORD, - "Usar Gravação Pós-Filtro" - ) + "Usar Gravação Pós-Filtro") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_REFRESH_RATE, - "Taxa de Atualização Vertical" - ) + "Taxa de Atualização Vertical") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_REFRESH_RATE_AUTO, - "Taxa de Quadros Estimada da Tela" - ) + "Taxa de Quadros Estimada da Tela") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_REFRESH_RATE_POLLED, - "Set Display-Reported Refresh Rate" - ) + "Definir Taxa de Atualização Reportada") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ROTATION, - "Rotação" - ) + "Rotação") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SCALE, - "Escala em Janela" - ) + "Escala em Janela") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SCALE_INTEGER, - "Escala em Inteiros" - ) + "Escala em Inteiros") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SETTINGS, - "Vídeo" - ) + "Vídeo") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_DIR, - "Shader de Vídeo" - ) + "Shader de Vídeo") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_NUM_PASSES, - "Estágios de Shader" - ) + "Estágios de Shader") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PARAMETERS, - "Pré-visualizar Parâmetros de Shader" - ) + "Pré-visualizar Parâmetros de Shader") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET, - "Carregar Predefinição de Shader" - ) + "Carregar Predefinição de Shader") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_AS, - "Salvar Predefinição de Shader Como" - ) + "Salvar Predefinição de Shader Como") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_CORE, - "Salvar Predefinição de Núcleo" - ) + "Salvar Predefinição de Núcleo") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_PARENT, + "Salvar Predefinição de Diretório de Conteúdo") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_GAME, - "Salvar Predefinição de Jogo" - ) + "Salvar Predefinição de Jogo") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHARED_CONTEXT, - "Habilitar Contexto Compartilhado de Hardware" - ) + "Habilitar Contexto Compartilhado de Hardware") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SMOOTH, - "Filtragem Bilinear" - ) + "Filtragem Bilinear") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SOFT_FILTER, - "Habilitar Filtro por Software" - ) + "Habilitar Filtro por Software") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SWAP_INTERVAL, - "Intervalo de Troca da Sincronização Vertical (V-Sync)" - ) + "Intervalo de Troca da Sincronização Vertical (V-Sync)") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_TAB, - "Vídeo" - ) + "Vídeo") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_THREADED, - "Vídeo Paralelizado" - ) + "Vídeo Paralelizado") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VFILTER, - "Reduzir Tremulação de Vídeo" - ) + "Reduzir Tremulação de Vídeo") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_HEIGHT, - "Altura Personalizada da Proporção de Tela" - ) + "Altura Personalizada da Proporção de Tela") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH, - "Largura Personalizada da Proporção de Tela" - ) + "Largura Personalizada da Proporção de Tela") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_X, - "Posição X Personalizada da Proporção de Tela" - ) + "Posição X Personalizada da Proporção de Tela") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y, - "Posição Y Personalizada da Proporção de Tela" - ) + "Posição Y Personalizada da Proporção de Tela") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VI_WIDTH, - "Definir Largura de Tela do VI" - ) + "Definir Largura de Tela do VI") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VSYNC, - "Sincronização Vertical (V-Sync)" - ) + "Sincronização Vertical (V-Sync)") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_WINDOWED_FULLSCREEN, - "Modo Janela em Tela Cheia" - ) + "Modo Janela em Tela Cheia") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_WINDOW_WIDTH, - "Largura da Janela" - ) + "Largura da Janela") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_WINDOW_HEIGHT, - "Altura da Janela" - ) + "Altura da Janela") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FULLSCREEN_X, - "Largura em Tela Cheia" - ) + "Largura em Tela Cheia") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FULLSCREEN_Y, - "Altura em Tela Cheia" - ) + "Altura em Tela Cheia") MSG_HASH(MENU_ENUM_LABEL_VALUE_WIFI_DRIVER, - "Driver de Wi-Fi" - ) + "Driver de Wi-Fi") MSG_HASH(MENU_ENUM_LABEL_VALUE_WIFI_SETTINGS, - "Wi-Fi" - ) + "Wi-Fi") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ALPHA_FACTOR, - "Fator Alfa do Menu" - ) + "Fator Alfa do Menu") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_FONT_COLOR_RED, + "Cor Vermelha da Fonte do Menu") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_FONT_COLOR_GREEN, + "Cor Verde da Fonte do Menu") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_FONT_COLOR_BLUE, + "Cor Azul da Fonte do Menu") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_FONT, - "Fonte do Menu" - ) + "Fonte do Menu") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_CUSTOM, - "Personalizado" - ) + "Personalizado") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_FLATUI, - "FlatUI" - ) + "FlatUI") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_MONOCHROME, - "Monocromático" - ) + "Monocromático") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_MONOCHROME_INVERTED, - "Monocromático Inverted" - ) + "Monocromático Inverted") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_SYSTEMATIC, - "Sistemático" - ) + "Sistemático") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_NEOACTIVE, - "NeoActive" - ) + "NeoActive") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, - "Pixel" - ) + "Pixel") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, - "RetroActive" - ) + "RetroActive") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, - "Retrosystem" - ) + "Retrosystem") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, - "Dot-Art" - ) + "Dot-Art") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, - "Tema de Cor do Menu" - ) + "Tema de Cor do Menu") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_APPLE_GREEN, - "Verde Maçã" - ) + "Verde Maçã") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_DARK, - "Escuro" - ) + "Escuro") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_LIGHT, + "Claro") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_MORNING_BLUE, + "Azul da manhã") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_DARK_PURPLE, - "Roxo Escuro" - ) + "Roxo Escuro") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_ELECTRIC_BLUE, - "Azul Elétrico" - ) + "Azul Elétrico") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_GOLDEN, - "Dourado" - ) + "Dourado") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_LEGACY_RED, - "Vermelho Legado" - ) + "Vermelho Legado") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_MIDNIGHT_BLUE, - "Azul Meia-noite" - ) + "Azul Meia-noite") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_PLAIN, - "Natural" - ) + "Natural") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_UNDERSEA, - "Submarino" - ) + "Submarino") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_VOLCANIC_RED, - "Vermelho Vulcânico" - ) + "Vermelho Vulcânico") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_RIBBON_ENABLE, - "Pipeline do Shader de Menu" - ) + "Pipeline do Shader de Menu") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_SCALE_FACTOR, - "Fator de Escala do Menu" - ) + "Fator de Escala do Menu") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_SHADOWS_ENABLE, - "Habilitar Sombras dos Ícones" - ) + "Habilitar Sombras dos Ícones") MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_HISTORY, - "Exibir Aba de Histórico" - ) + "Exibir Aba de Histórico") MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD, - "Exibir Aba de Importação de Conteúdo" - ) + "Exibir Aba de Importação de Conteúdo") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_PLAYLISTS, + "Exibir Guias da Lista de Reprodução") MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES, - "Exibir Aba de Favoritos" - ) + "Exibir Aba de Favoritos") MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_IMAGES, - "Exibir Aba de Imagem" - ) + "Exibir Aba de Imagem") MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_MUSIC, - "Exibir Aba de Música" - ) + "Exibir Aba de Música") MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS, - "Exibir Aba de Configurações" - ) + "Exibir Aba de Configurações") MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_VIDEO, - "Exibir Aba de Vídeo" - ) + "Exibir Aba de Vídeo") MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_NETPLAY, - "Exibir Aba de Netplay" - ) -MSG_HASH(MENU_ENUM_SUBLABEL_XMB_LAYOUT, - "Select a different layout for the XMB interface.") + "Exibir Aba de Netplay") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_LAYOUT, + "Layout do Menu") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_THEME, - "Tema de Ícones do Menu" - ) + "Tema de Ícones do Menu") MSG_HASH(MENU_ENUM_LABEL_VALUE_YES, - "Sim" - ) + "Sim") MSG_HASH(MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_TWO, - "Predefinição de Shader" - ) + "Predefinição de Shader") MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_ENABLE, - "Habilitar ou desabilitar conquistas. Para mais informações, visite http://retroachievements.org" - ) + "Habilitar ou desabilitar conquistas. Para mais informações, visite http://retroachievements.org") MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_TEST_UNOFFICIAL, - "Habilitar ou desabilitar conquistas não oficiais e/ou recursos beta para fins de teste." - ) + "Habilitar ou desabilitar conquistas não oficiais e/ou recursos beta para fins de teste.") MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_HARDCORE_MODE_ENABLE, - "Habilitar ou desabilitar Estado de Jogo, Trapaças, Voltar Atrás, Pausa e Câmera Lenta para todos os jogos.") + "Habilitar ou desabilitar Estado de Jogo, Trapaças, Rebobinagem, Avanço Rápido, Pausa e Câmera Lenta para todos os jogos.") MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_LEADERBOARDS_ENABLE, "Ativar ou desativar tabelas de classificação no jogo. Não tem efeito se o modo Hardcore estiver desativado.") MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_BADGES_ENABLE, @@ -2423,416 +1935,850 @@ MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_VERBOSE_ENABLE, MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_AUTO_SCREENSHOT, "Obter automaticamente uma captura de tela quando uma conquista é acionada.") MSG_HASH(MENU_ENUM_SUBLABEL_DRIVER_SETTINGS, - "Alterar os drivers utilizados pelo sistema." - ) + "Alterar os drivers utilizados pelo sistema.") MSG_HASH(MENU_ENUM_SUBLABEL_RETRO_ACHIEVEMENTS_SETTINGS, - "Alterar as configurações de conquistas." - ) + "Alterar as configurações de conquistas.") MSG_HASH(MENU_ENUM_SUBLABEL_CORE_SETTINGS, - "Alterar as configurações de núcleo." - ) + "Alterar as configurações de núcleo.") MSG_HASH(MENU_ENUM_SUBLABEL_RECORDING_SETTINGS, - "Alterar as configurações de gravação." - ) + "Alterar as configurações de gravação.") MSG_HASH(MENU_ENUM_SUBLABEL_ONSCREEN_DISPLAY_SETTINGS, - "Alterar as configurações de Transparência e Transparência de teclado, e as configurações de notificação na tela." - ) + "Alterar as configurações de Transparência e Transparência de teclado, e as configurações de notificação na tela.") MSG_HASH(MENU_ENUM_SUBLABEL_FRAME_THROTTLE_SETTINGS, - "Alterar as configurações de Voltar Atrás, Avanço Rápido e Câmera Lenta." - ) + "Alterar as configurações de Rebobinagem, Avanço Rápido e Câmera Lenta.") MSG_HASH(MENU_ENUM_SUBLABEL_SAVING_SETTINGS, - "Alterar as configurações de salvamento." - ) + "Alterar as configurações de salvamento.") MSG_HASH(MENU_ENUM_SUBLABEL_LOGGING_SETTINGS, - "Alterar as configurações de registro de eventos." - ) + "Alterar as configurações de registro de eventos.") MSG_HASH(MENU_ENUM_SUBLABEL_USER_INTERFACE_SETTINGS, - "Alterar as configurações da interface de usuário." - ) + "Alterar as configurações da interface de usuário.") MSG_HASH(MENU_ENUM_SUBLABEL_USER_SETTINGS, - "Alterar as configurações de conta, nome de usuário e idioma." - ) + "Alterar as configurações de conta, nome de usuário e idioma.") MSG_HASH(MENU_ENUM_SUBLABEL_PRIVACY_SETTINGS, - "Alterar as configurações de privacidade." - ) + "Alterar as configurações de privacidade.") MSG_HASH(MENU_ENUM_SUBLABEL_DIRECTORY_SETTINGS, - "Alterar os diretórios padrão onde os arquivos estão localizados." - ) + "Alterar os diretórios padrão onde os arquivos estão localizados.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_SETTINGS, - "Alterar as configurações de lista de reprodução." - ) + "Alterar as configurações de lista de reprodução.") MSG_HASH(MENU_ENUM_SUBLABEL_NETWORK_SETTINGS, - "Configurar as configurações de servidor e rede." - ) + "Configurar as configurações de servidor e rede.") MSG_HASH(MENU_ENUM_SUBLABEL_ADD_CONTENT_LIST, - "Analisar conteúdo e adicionar na base de dados." - ) + "Analisar conteúdo e adicionar na base de dados.") MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_SETTINGS, - "Alterar as configurações de saída de áudio." - ) + "Alterar as configurações de saída de áudio.") MSG_HASH(MENU_ENUM_SUBLABEL_BLUETOOTH_ENABLE, - "Habilitar ou desabilitar o bluetooth." - ) + "Habilitar ou desabilitar o bluetooth.") MSG_HASH(MENU_ENUM_SUBLABEL_CONFIG_SAVE_ON_EXIT, - "Salvar as alterações nos arquivos de configuração ao sair." - ) + "Salvar as alterações nos arquivos de configuração ao sair.") MSG_HASH(MENU_ENUM_SUBLABEL_CONFIGURATION_SETTINGS, - "Alterar as definições padrão para os arquivos de configuração." - ) + "Alterar as definições padrão para os arquivos de configuração.") MSG_HASH(MENU_ENUM_SUBLABEL_CONFIGURATIONS_LIST, - "Gerenciar e criar arquivos de configuração." - ) + "Gerenciar e criar arquivos de configuração.") MSG_HASH(MENU_ENUM_SUBLABEL_CPU_CORES, - "Quantidade de Cores que a CPU possui." - ) + "Quantidade de Cores que a CPU possui.") MSG_HASH(MENU_ENUM_SUBLABEL_FPS_SHOW, - "Exibir a taxa atual de quadros por segundo na tela." - ) + "Exibir a taxa atual de quadros por segundo na tela.") MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_HOTKEY_BINDS, - "Ajustar configurações das teclas de atalho." - ) + "Ajustar configurações das teclas de atalho.") MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_MENU_ENUM_TOGGLE_GAMEPAD_COMBO, - "Combinação de botões do Gamepad para alternar o menu." - ) + "Combinação de botões do Gamepad para alternar o menu.") MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_SETTINGS, - "Alterar as configurações de Joypad, teclado e Mouse." - ) + "Alterar as configurações de Joypad, teclado e Mouse.") MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_USER_BINDS, - "Configurar os controles para este usuário." - ) + "Configurar os controles para este usuário.") +MSG_HASH(MENU_ENUM_SUBLABEL_LATENCY_SETTINGS, + "Altere as configurações relacionadas a vídeo, áudio e latência dos comandos.") MSG_HASH(MENU_ENUM_SUBLABEL_LOG_VERBOSITY, - "Habilitar ou desabilitar registro de eventos no terminal." - ) + "Habilitar ou desabilitar registro de eventos no terminal.") MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY, - "Juntar-se ou hospedar uma sessão de Netplay." - ) + "Juntar-se ou hospedar uma sessão de Netplay.") MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_LAN_SCAN_SETTINGS, - "Procurar por e conectar aos hospedeiros de Netplay na rede local." - ) + "Procurar por e conectar aos hospedeiros de Netplay na rede local.") MSG_HASH(MENU_ENUM_SUBLABEL_INFORMATION_LIST_LIST, - "Exibir informações de núcleo, rede e sistema." - ) + "Exibir informações de núcleo, rede e sistema.") MSG_HASH(MENU_ENUM_SUBLABEL_ONLINE_UPDATER, - "Baixar complementos, componentes e conteúdo para o RetroArch." - ) + "Baixar complementos, componentes e conteúdo para o RetroArch.") MSG_HASH(MENU_ENUM_SUBLABEL_SAMBA_ENABLE, - "Habilitar ou desabilitar compartilhamento de pastas na rede." - ) + "Habilitar ou desabilitar compartilhamento de pastas na rede.") MSG_HASH(MENU_ENUM_SUBLABEL_SERVICES_SETTINGS, - "Gerenciar serviços ao nível de sistema operacional." - ) + "Gerenciar serviços ao nível de sistema operacional.") MSG_HASH(MENU_ENUM_SUBLABEL_SHOW_HIDDEN_FILES, - "Exibir arquivos/diretórios ocultos no navegador de arquivos." - ) + "Exibir arquivos/diretórios ocultos no navegador de arquivos.") MSG_HASH(MENU_ENUM_SUBLABEL_SSH_ENABLE, - "Habilitar ou desabilitar acesso remoto à linha de comando." - ) + "Habilitar ou desabilitar acesso remoto à linha de comando.") MSG_HASH(MENU_ENUM_SUBLABEL_SUSPEND_SCREENSAVER_ENABLE, - "Prevenir que o protetor de tela do seu sistema seja ativado." - ) + "Prevenir que o protetor de tela do seu sistema seja ativado.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_WINDOW_SCALE, - "Definir o tamanho da janela em relação ao tamanho da janela de exibição do núcleo. Como alternativa, você pode definir uma largura e altura de janela abaixo para um tamanho de janela fixo." - ) + "Definir o tamanho da janela em relação ao tamanho da janela de exibição do núcleo. Como alternativa, você pode definir uma largura e altura de janela abaixo para um tamanho de janela fixo.") MSG_HASH(MENU_ENUM_SUBLABEL_USER_LANGUAGE, - "Definir o idioma da interface." - ) + "Definir o idioma da interface.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_BLACK_FRAME_INSERTION, - "Inserir um quadro opaco entre quadros. Útil para usuários com telas de 120Hz que desejam jogar conteúdos em 60Hz para eliminar efeito de fantasma." - ) + "Inserir um quadro opaco entre quadros. Útil para usuários com telas de 120Hz que desejam jogar conteúdos em 60Hz para eliminar efeito de fantasma.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FRAME_DELAY, - "Reduz a latência ao custo de maior risco de engasgamento de vídeo. Adiciona um atraso após o V-Sync (em ms)." - ) + "Reduz a latência ao custo de maior risco de engasgamento de vídeo. Adiciona um atraso após o V-Sync (em ms).") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_HARD_SYNC_FRAMES, - "Definir quantos quadros a CPU pode rodar à frente da GPU quando utilizado o recurso 'Sincronia Rígida de GPU'." - ) + "Definir quantos quadros a CPU pode rodar à frente da GPU quando utilizado o recurso 'Sincronia Rígida de GPU'.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_MAX_SWAPCHAIN_IMAGES, - "Informar ao driver de vídeo para utilizar explicitamente um modo de buffer específico." - ) + "Informar ao driver de vídeo para utilizar explicitamente um modo de buffer específico.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_MONITOR_INDEX, - "Seleciona qual tela de exibição a ser usada." - ) + "Seleciona qual tela de exibição a ser usada.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_REFRESH_RATE_AUTO, - "A taxa de atualização estimada da tela em Hz." - ) + "A taxa de atualização estimada da tela em Hz.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_REFRESH_RATE_POLLED, - "The refresh rate as reported by the display driver." - ) + "A taxa de atualização conforme relatada pelo driver de vídeo.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SETTINGS, - "Alterar as configurações de saída de vídeo." - ) + "Alterar as configurações de saída de vídeo.") MSG_HASH(MENU_ENUM_SUBLABEL_WIFI_SETTINGS, - "Analisar por redes sem fio e estabelecer uma conexão." - ) + "Analisar por redes sem fio e estabelecer uma conexão.") MSG_HASH(MENU_ENUM_SUBLABEL_HELP_LIST, - "Saiba mais sobre como o programa funciona." - ) + "Saiba mais sobre como o programa funciona.") MSG_HASH(MSG_ADDED_TO_FAVORITES, - "Adicionado aos favoritos" - ) + "Adicionado aos favoritos") +MSG_HASH(MSG_RESET_CORE_ASSOCIATION, + "A associação do núcleo de entrada da lista de reprodução foi redefinida.") MSG_HASH(MSG_APPENDED_DISK, - "Disco anexado" - ) + "Disco anexado") MSG_HASH(MSG_APPLICATION_DIR, - "Diretório do aplicativo" - ) + "Diretório do aplicativo") MSG_HASH(MSG_APPLYING_CHEAT, - "Aplicando as alterações de Trapaças." - ) + "Aplicando as alterações de Trapaças.") MSG_HASH(MSG_APPLYING_SHADER, - "Aplicando Shader" - ) + "Aplicando Shader") MSG_HASH(MSG_AUDIO_MUTED, - "Áudio mudo." - ) + "Áudio mudo.") MSG_HASH(MSG_AUDIO_UNMUTED, - "Áudio mudo desativado." - ) + "Áudio mudo desativado.") MSG_HASH(MSG_AUTOCONFIG_FILE_ERROR_SAVING, - "Erro em salvar o arquivo de autoconfiguração." - ) + "Erro em salvar o arquivo de autoconfiguração.") MSG_HASH(MSG_AUTOCONFIG_FILE_SAVED_SUCCESSFULLY, - "Arquivo de autoconfiguração salvo com sucesso." - ) + "Arquivo de autoconfiguração salvo com sucesso.") MSG_HASH(MSG_AUTOSAVE_FAILED, - "Não foi possível inicializar o autossalvamento." - ) + "Não foi possível inicializar o salvamento automático.") MSG_HASH(MSG_AUTO_SAVE_STATE_TO, - "Autosalvar Estado de Jogo em" - ) + "Salvar Automaticamente Estado de Jogo em") MSG_HASH(MSG_BLOCKING_SRAM_OVERWRITE, - "Bloqueando Sobrescrita da SRAM" - ) + "Bloqueando Sobrescrita da SRAM") MSG_HASH(MSG_BRINGING_UP_COMMAND_INTERFACE_ON_PORT, - "Trazendo a interface de comando na porta" - ) + "Trazendo a interface de comando na porta") MSG_HASH(MSG_BYTES, - "bytes" - ) + "bytes") MSG_HASH(MSG_CANNOT_INFER_NEW_CONFIG_PATH, - "Não é possível inferir o novo caminho de configuração. Use a hora atual." - ) + "Não é possível inferir o novo caminho de configuração. Use a hora atual.") MSG_HASH(MSG_CHEEVOS_HARDCORE_MODE_ENABLE, - "Modo Hardcore habilitado, Estados de Jogo e Voltar Atrás estão desabilitados." - ) + "Modo Hardcore Habilitado, Estados de Jogo e Rebobinagem estão desabilitados.") MSG_HASH(MSG_COMPARING_WITH_KNOWN_MAGIC_NUMBERS, - "Comparando com números mágicos conhecidos..." - ) + "Comparando com números mágicos conhecidos...") MSG_HASH(MSG_COMPILED_AGAINST_API, - "Compilado contra a API" - ) + "Compilado contra a API") MSG_HASH(MSG_CONFIG_DIRECTORY_NOT_SET, - "Diretório de configuração não definido. Não foi possível salvar a nova configuração." - ) + "Diretório de configuração não definido. Não foi possível salvar a nova configuração.") MSG_HASH(MSG_CONNECTED_TO, - "Conectado a" - ) + "Conectado a") MSG_HASH(MSG_CONTENT_CRC32S_DIFFER, - "O CRC32 dos conteúdos difere. Não é possível utilizar jogos diferentes." - ) + "O CRC32 dos conteúdos difere. Não é possível utilizar jogos diferentes.") MSG_HASH(MSG_CONTENT_LOADING_SKIPPED_IMPLEMENTATION_WILL_DO_IT, - "Carregamento de conteúdo ignorado. A implementação irá carregar por conta própria." - ) + "Carregamento de conteúdo ignorado. A implementação irá carregar por conta própria.") MSG_HASH(MSG_CORE_DOES_NOT_SUPPORT_SAVESTATES, - "O núcleo não suporta Estados de Jogo." - ) + "O núcleo não suporta Estados de Jogo.") MSG_HASH(MSG_CORE_OPTIONS_FILE_CREATED_SUCCESSFULLY, - "O arquivo de opções de núcleo foi criado com sucesso." - ) + "O arquivo de opções de núcleo foi criado com sucesso.") MSG_HASH(MSG_COULD_NOT_FIND_ANY_NEXT_DRIVER, - "Não foi possível encontrar nenhum driver seguinte" - ) + "Não foi possível encontrar nenhum driver seguinte") MSG_HASH(MSG_COULD_NOT_FIND_COMPATIBLE_SYSTEM, - "Não foi possível encontrar um sistema compatível." - ) + "Não foi possível encontrar um sistema compatível.") MSG_HASH(MSG_COULD_NOT_FIND_VALID_DATA_TRACK, - "Não foi possível encontrar uma faixa de dados válida" - ) + "Não foi possível encontrar uma faixa de dados válida") MSG_HASH(MSG_COULD_NOT_OPEN_DATA_TRACK, - "Não foi possível abrir a faixa de dados" - ) + "Não foi possível abrir a faixa de dados") MSG_HASH(MSG_COULD_NOT_READ_CONTENT_FILE, - "Não foi possível ler o arquivo de conteúdo" - ) + "Não foi possível ler o arquivo de conteúdo") MSG_HASH(MSG_COULD_NOT_READ_MOVIE_HEADER, - "Não foi possível ler o cabeçalho do filme." - ) + "Não foi possível ler o cabeçalho do filme.") MSG_HASH(MSG_COULD_NOT_READ_STATE_FROM_MOVIE, - "Não foi possível ler o Estado de Jogo do filme." - ) + "Não foi possível ler o Estado de Jogo do filme.") MSG_HASH(MSG_CRC32_CHECKSUM_MISMATCH, - "Soma de verificação CRC32 incompatível entre o arquivo de conteúdo e a soma de verificação de conteúdo salva no cabeçalho do arquivo de reprodução. Reprodução altamente susceptível de dessincronizar na reprodução." - ) + "Soma de verificação CRC32 incompatível entre o arquivo de conteúdo e a soma de verificação de conteúdo salva no cabeçalho do arquivo de reprodução. Reprodução altamente susceptível de dessincronizar na reprodução.") MSG_HASH(MSG_CUSTOM_TIMING_GIVEN, - "Tempo personalizado fornecido" - ) + "Tempo personalizado fornecido") MSG_HASH(MSG_DECOMPRESSION_ALREADY_IN_PROGRESS, - "Descompressão já está em andamento." - ) + "Descompressão já está em andamento.") MSG_HASH(MSG_DECOMPRESSION_FAILED, - "Descompressão falhou." - ) + "Descompressão falhou.") MSG_HASH(MSG_DETECTED_VIEWPORT_OF, - "Detectada janela de exibição de" - ) + "Detectada janela de exibição de") MSG_HASH(MSG_DID_NOT_FIND_A_VALID_CONTENT_PATCH, - "Não encontrou uma modificação de conteúdo válido." - ) + "Não encontrou uma modificação de conteúdo válido.") MSG_HASH(MSG_DISCONNECT_DEVICE_FROM_A_VALID_PORT, - "Desconectar dispositivo de uma porta válida." - ) + "Desconectar dispositivo de uma porta válida.") MSG_HASH(MSG_DISK_CLOSED, - "Fechado" - ) + "Fechado") MSG_HASH(MSG_DISK_EJECTED, - "Ejetado" - ) + "Ejetado") MSG_HASH(MSG_DOWNLOADING, - "Baixando" - ) + "Baixando") +MSG_HASH(MSG_INDEX_FILE, + "index") MSG_HASH(MSG_DOWNLOAD_FAILED, - "Download falhou" - ) + "Download falhou") MSG_HASH(MSG_ERROR, - "Erro" - ) + "Erro") MSG_HASH(MSG_ERROR_LIBRETRO_CORE_REQUIRES_CONTENT, - "O núcleo libretro requer conteúdo, mas nada foi fornecido." - ) + "O núcleo libretro requer conteúdo, mas nada foi fornecido.") MSG_HASH(MSG_ERROR_LIBRETRO_CORE_REQUIRES_SPECIAL_CONTENT, - "O núcleo libretro requer conteúdo especial, mas nenhum foi fornecido." - ) + "O núcleo libretro requer conteúdo especial, mas nenhum foi fornecido.") MSG_HASH(MSG_ERROR_PARSING_ARGUMENTS, - "Erro em analisar os argumentos." - ) + "Erro em analisar os argumentos.") MSG_HASH(MSG_ERROR_SAVING_CORE_OPTIONS_FILE, - "Erro em salvar o arquivo de opções de núcleo." - ) + "Erro em salvar o arquivo de opções de núcleo.") MSG_HASH(MSG_ERROR_SAVING_REMAP_FILE, - "Erro em salvar o arquivo de remapeamento." - ) + "Erro em salvar o arquivo de remapeamento.") MSG_HASH(MSG_ERROR_REMOVING_REMAP_FILE, - "Erro em remover o arquivo de remapeamento." - ) + "Erro em remover o arquivo de remapeamento.") MSG_HASH(MSG_ERROR_SAVING_SHADER_PRESET, - "Erro em salvar a predefinição de Shader." - ) + "Erro em salvar a predefinição de Shader.") MSG_HASH(MSG_EXTERNAL_APPLICATION_DIR, - "Diretório de Aplicativo Externo" - ) + "Diretório de Aplicativo Externo") MSG_HASH(MSG_EXTRACTING, - "Extraindo" - ) + "Extraindo") MSG_HASH(MSG_EXTRACTING_FILE, - "Extraindo arquivo" - ) + "Extraindo arquivo") MSG_HASH(MSG_FAILED_SAVING_CONFIG_TO, - "Falha em salvar a configuração em" - ) + "Falha em salvar a configuração em") MSG_HASH(MSG_FAILED_TO, - "Falha em" - ) + "Falha em") MSG_HASH(MSG_FAILED_TO_ACCEPT_INCOMING_SPECTATOR, - "Falha em aceitar o espectador ingresso." - ) + "Falha em aceitar o espectador ingresso.") MSG_HASH(MSG_FAILED_TO_ALLOCATE_MEMORY_FOR_PATCHED_CONTENT, - "Falha em alocar memória para o conteúdo modificado..." - ) + "Falha em alocar memória para o conteúdo modificado...") MSG_HASH(MSG_FAILED_TO_APPLY_SHADER, - "Falha em aplicar o Shader." - ) + "Falha em aplicar o Shader.") MSG_HASH(MSG_FAILED_TO_BIND_SOCKET, - "Falha em vincular o soquete." - ) + "Falha em vincular o soquete.") MSG_HASH(MSG_FAILED_TO_CREATE_THE_DIRECTORY, - "Falha em criar o diretório." - ) + "Falha em criar o diretório.") MSG_HASH(MSG_FAILED_TO_EXTRACT_CONTENT_FROM_COMPRESSED_FILE, - "Falha em extrair o conteúdo do arquivo comprimido" - ) + "Falha em extrair o conteúdo do arquivo comprimido") MSG_HASH(MSG_FAILED_TO_GET_NICKNAME_FROM_CLIENT, - "Falha em obter o apelido do cliente." - ) + "Falha em obter o apelido do cliente.") MSG_HASH(MSG_FAILED_TO_LOAD, - "Falha em carregar" - ) + "Falha em carregar") MSG_HASH(MSG_FAILED_TO_LOAD_CONTENT, - "Falha em carregar o conteúdo" - ) + "Falha em carregar o conteúdo") MSG_HASH(MSG_FAILED_TO_LOAD_MOVIE_FILE, - "Falha em carregar o arquivo de filme" - ) + "Falha em carregar o arquivo de filme") MSG_HASH(MSG_FAILED_TO_LOAD_OVERLAY, - "Falha em carregar a Transparência." - ) + "Falha em carregar a Transparência.") MSG_HASH(MSG_FAILED_TO_LOAD_STATE, - "Falha em carregar o Estado de Jogo de" - ) + "Falha em carregar o Estado de Jogo de") MSG_HASH(MSG_FAILED_TO_OPEN_LIBRETRO_CORE, - "Falha em abrir o núcleo Libretro" - ) + "Falha em abrir o núcleo Libretro") MSG_HASH(MSG_FAILED_TO_PATCH, - "Falha em executar a modificação" - ) + "Falha em executar a modificação") MSG_HASH(MSG_FAILED_TO_RECEIVE_HEADER_FROM_CLIENT, - "Falha em receber o cabeçalho do cliente." - ) + "Falha em receber o cabeçalho do cliente.") MSG_HASH(MSG_FAILED_TO_RECEIVE_NICKNAME, - "Falha em receber o apelido." - ) + "Falha em receber o apelido.") MSG_HASH(MSG_FAILED_TO_RECEIVE_NICKNAME_FROM_HOST, - "Falha em receber o apelido do hospedeiro." - ) + "Falha em receber o apelido do hospedeiro.") MSG_HASH(MSG_FAILED_TO_RECEIVE_NICKNAME_SIZE_FROM_HOST, - "Falha em receber o tamanho do apelido do hospedeiro." - ) + "Falha em receber o tamanho do apelido do hospedeiro.") MSG_HASH(MSG_FAILED_TO_RECEIVE_SRAM_DATA_FROM_HOST, - "Falha em receber os dados SRAM do hospedeiro." - ) + "Falha em receber os dados SRAM do hospedeiro.") MSG_HASH(MSG_FAILED_TO_REMOVE_DISK_FROM_TRAY, - "Falha em remover o disco da bandeja." - ) + "Falha em remover o disco da bandeja.") MSG_HASH(MSG_FAILED_TO_REMOVE_TEMPORARY_FILE, - "Falha em remover o arquivo temporário" - ) + "Falha em remover o arquivo temporário") MSG_HASH(MSG_FAILED_TO_SAVE_SRAM, - "Falha em salvar SRAM" - ) + "Falha em salvar SRAM") MSG_HASH(MSG_FAILED_TO_SAVE_STATE_TO, - "Falha em salvar o Estado de Jogo em" - ) + "Falha em salvar o Estado de Jogo em") MSG_HASH(MSG_FAILED_TO_SEND_NICKNAME, - "Falha em enviar o apelido." - ) + "Falha em enviar o apelido.") MSG_HASH(MSG_FAILED_TO_SEND_NICKNAME_SIZE, - "Falha em enviar o tamanho do apelido." - ) + "Falha em enviar o tamanho do apelido.") MSG_HASH(MSG_FAILED_TO_SEND_NICKNAME_TO_CLIENT, - "Falha em enviar o apelido para o cliente." - ) + "Falha em enviar o apelido para o cliente.") MSG_HASH(MSG_FAILED_TO_SEND_NICKNAME_TO_HOST, - "Falha em enviar o apelido para o hospedeiro." - ) + "Falha em enviar o apelido para o hospedeiro.") MSG_HASH(MSG_FAILED_TO_SEND_SRAM_DATA_TO_CLIENT, - "Falha em enviar os dados SRAM para o cliente." - ) + "Falha em enviar os dados SRAM para o cliente.") MSG_HASH(MSG_FAILED_TO_START_AUDIO_DRIVER, - "Falha em iniciar o driver de áudio. Prosseguindo sem áudio." - ) + "Falha em iniciar o driver de áudio. Prosseguindo sem áudio.") MSG_HASH(MSG_FAILED_TO_START_MOVIE_RECORD, - "Falha em iniciar a gravação do filme." - ) + "Falha em iniciar a gravação do filme.") MSG_HASH(MSG_FAILED_TO_START_RECORDING, - "Falha em iniciar a gravação." - ) + "Falha em iniciar a gravação.") MSG_HASH(MSG_FAILED_TO_TAKE_SCREENSHOT, - "Falha em obter uma captura de tela." - ) + "Falha em obter uma captura de tela.") MSG_HASH(MSG_FAILED_TO_UNDO_LOAD_STATE, - "Falha em desfazer o carregamento de Estado de Jogo." - ) + "Falha em desfazer o carregamento de Estado de Jogo.") MSG_HASH(MSG_FAILED_TO_UNDO_SAVE_STATE, - "Falha em desfazer o salvamento de Estado de Jogo." - ) + "Falha em desfazer o salvamento de Estado de Jogo.") +MSG_HASH(MSG_FAILED_TO_UNMUTE_AUDIO, + "Falha em desativar o áudio mudo.") +MSG_HASH(MSG_FATAL_ERROR_RECEIVED_IN, + "Erro fatal recebido em") +MSG_HASH(MSG_FILE_NOT_FOUND, + "Arquivo não encontrado") +MSG_HASH(MSG_FOUND_AUTO_SAVESTATE_IN, + "Estado de Jogo automático encontrado em") +MSG_HASH(MSG_FOUND_DISK_LABEL, + "Rótulo de disco encontrado") +MSG_HASH(MSG_FOUND_FIRST_DATA_TRACK_ON_FILE, + "Encontrada primeira faixa de dados no arquivo") +MSG_HASH(MSG_FOUND_LAST_STATE_SLOT, + "Encontrada último compartimento de Estado de Jogo") +MSG_HASH(MSG_FOUND_SHADER, + "Shader encontrado") +MSG_HASH(MSG_FRAMES, + "Quadros") +MSG_HASH(MSG_GAME_SPECIFIC_CORE_OPTIONS_FOUND_AT, + "Opções por Jogo: Opções de núcleo específicas do jogo encontradas em") +MSG_HASH(MSG_GOT_INVALID_DISK_INDEX, + "Índice de disco inválido obtido") +MSG_HASH(MSG_GRAB_MOUSE_STATE, + "Capturar estado do Mouse") +MSG_HASH(MSG_GAME_FOCUS_ON, + "Foco do jogo ligado") +MSG_HASH(MSG_GAME_FOCUS_OFF, + "Foco do jogo desligado") +MSG_HASH(MSG_HW_RENDERED_MUST_USE_POSTSHADED_RECORDING, + "O núcleo libretro é renderizado por hardware. Deve usar a gravação pós-Shader também.") +MSG_HASH(MSG_INFLATED_CHECKSUM_DID_NOT_MATCH_CRC32, + "A soma de verificação inflada não corresponde ao CRC32.") +MSG_HASH(MSG_INPUT_CHEAT, + "Entrada de Trapaça") +MSG_HASH(MSG_INPUT_CHEAT_FILENAME, + "Nome do Arquivo de Trapaça") +MSG_HASH(MSG_INPUT_PRESET_FILENAME, + "Nome de Arquivo de Predefinição") +MSG_HASH(MSG_INPUT_RENAME_ENTRY, + "Renomear Título") +MSG_HASH(MSG_INTERFACE, + "Interface") +MSG_HASH(MSG_INTERNAL_STORAGE, + "Armazenamento Interno") +MSG_HASH(MSG_REMOVABLE_STORAGE, + "Armazenamento Removível") +MSG_HASH(MSG_INVALID_NICKNAME_SIZE, + "Tamanho de apelido inválido.") +MSG_HASH(MSG_IN_BYTES, + "em bytes") +MSG_HASH(MSG_IN_GIGABYTES, + "em gigabytes") +MSG_HASH(MSG_IN_MEGABYTES, + "em megabytes") +MSG_HASH(MSG_LIBRETRO_ABI_BREAK, + "foi compilado contra uma versão diferente do libretro do que esta.") +MSG_HASH(MSG_LIBRETRO_FRONTEND, + "Frontend para Libretro") +MSG_HASH(MSG_LOADED_STATE_FROM_SLOT, + "Estado de Jogo carregado do compartimento #%d.") +MSG_HASH(MSG_LOADED_STATE_FROM_SLOT_AUTO, + "Estado de Jogo carregado do compartimento #-1 (automático).") +MSG_HASH(MSG_LOADING, + "Carregando") +MSG_HASH(MSG_FIRMWARE, + "Um ou mais arquivos de firmware estão faltando") +MSG_HASH(MSG_LOADING_CONTENT_FILE, + "Carregando arquivo de conteúdo") +MSG_HASH(MSG_LOADING_HISTORY_FILE, + "Carregando arquivo de histórico") +MSG_HASH(MSG_LOADING_STATE, + "Carregando Estado de Jogo") +MSG_HASH(MSG_MEMORY, + "Memória") +MSG_HASH(MSG_MOVIE_FILE_IS_NOT_A_VALID_BSV1_FILE, + "O arquivo de filme não é um arquivo BSV1 válido.") +MSG_HASH(MSG_MOVIE_FORMAT_DIFFERENT_SERIALIZER_VERSION, + "O formato de filme parece ter uma versão de serializador diferente. Provavelmente irá falhar.") +MSG_HASH(MSG_MOVIE_PLAYBACK_ENDED, + "Reprodução de filme terminou.") +MSG_HASH(MSG_MOVIE_RECORD_STOPPED, + "Parando a gravação de filme.") +MSG_HASH(MSG_NETPLAY_FAILED, + "Falha em inicializar o Netplay.") +MSG_HASH(MSG_NO_CONTENT_STARTING_DUMMY_CORE, + "Sem conteúdo, iniciando um núcleo modelo.") +MSG_HASH(MSG_NO_SAVE_STATE_HAS_BEEN_OVERWRITTEN_YET, + "Nenhum Estado de Jogo foi sobrescrito até o momento.") +MSG_HASH(MSG_NO_STATE_HAS_BEEN_LOADED_YET, + "Nenhum Estado de Jogo foi carregado até o momento.") +MSG_HASH(MSG_OVERRIDES_ERROR_SAVING, + "Erro em salvar as redefinições.") +MSG_HASH(MSG_OVERRIDES_SAVED_SUCCESSFULLY, + "Redefinições salvas com sucesso.") +MSG_HASH(MSG_PAUSED, + "Pausado.") +MSG_HASH(MSG_PROGRAM, + "RetroArch") +MSG_HASH(MSG_READING_FIRST_DATA_TRACK, + "Lendo a primeira faixa de dados...") +MSG_HASH(MSG_RECEIVED, + "recebido") +MSG_HASH(MSG_RECORDING_TERMINATED_DUE_TO_RESIZE, + "A gravação terminou devido ao redimensionamento.") +MSG_HASH(MSG_RECORDING_TO, + "Gravando em") +MSG_HASH(MSG_REDIRECTING_CHEATFILE_TO, + "Redirecionando o arquivo de Trapaça em") +MSG_HASH(MSG_REDIRECTING_SAVEFILE_TO, + "Redirecionando o Jogo-Salvo em") +MSG_HASH(MSG_REDIRECTING_SAVESTATE_TO, + "Redirecionando o Estado de Jogo em") +MSG_HASH(MSG_REMAP_FILE_SAVED_SUCCESSFULLY, + "Arquivo de remapeamento salvo com sucesso.") +MSG_HASH(MSG_REMAP_FILE_REMOVED_SUCCESSFULLY, + "Arquivo de remapeamento salvo com sucesso.") +MSG_HASH(MSG_REMOVED_DISK_FROM_TRAY, + "Disco removido da bandeja.") +MSG_HASH(MSG_REMOVING_TEMPORARY_CONTENT_FILE, + "Removendo arquivo de conteúdo temporário") +MSG_HASH(MSG_RESET, + "Reinicializar") +MSG_HASH(MSG_RESTARTING_RECORDING_DUE_TO_DRIVER_REINIT, + "Reiniciando a gravação devido ao reinício do driver.") +MSG_HASH(MSG_RESTORED_OLD_SAVE_STATE, + "Estado de Jogo antigo restaurado.") +MSG_HASH(MSG_RESTORING_DEFAULT_SHADER_PRESET_TO, + "Shaders: restaurando predefinição padrão de Shader em") +MSG_HASH(MSG_REVERTING_SAVEFILE_DIRECTORY_TO, + "Revertendo diretório de Jogo-Salvo em") +MSG_HASH(MSG_REVERTING_SAVESTATE_DIRECTORY_TO, + "Revertendo diretório de Estado de Jogo em") +MSG_HASH(MSG_REWINDING, + "Voltando atrás.") +MSG_HASH(MSG_REWIND_INIT, + "Inicializando o buffer de Rebobinagem com tamanho") +MSG_HASH(MSG_REWIND_INIT_FAILED, + "Falha em inicializar o buffer de Rebobinagem. Rebobinagem será desativado.") +MSG_HASH(MSG_REWIND_INIT_FAILED_THREADED_AUDIO, + "Esta implementação usa áudio paralelizado. Não é possível utilizar Rebobinagem.") +MSG_HASH(MSG_REWIND_REACHED_END, + "Final do buffer de Rebobinagem atingido.") +MSG_HASH(MSG_SAVED_NEW_CONFIG_TO, + "Nova configuração salva em") +MSG_HASH(MSG_SAVED_STATE_TO_SLOT, + "Estado de Jogo salvo no compartimento #%d.") +MSG_HASH(MSG_SAVED_STATE_TO_SLOT_AUTO, + "Estado de Jogo salvo no compartimento #-1 (automático).") +MSG_HASH(MSG_SAVED_SUCCESSFULLY_TO, + "Salvo com sucesso em") +MSG_HASH(MSG_SAVING_RAM_TYPE, + "Salvando Tipo de RAM") +MSG_HASH(MSG_SAVING_STATE, + "Salvando Estado de Jogo") +MSG_HASH(MSG_SCANNING, + "Analisando") +MSG_HASH(MSG_SCANNING_OF_DIRECTORY_FINISHED, + "Análise de diretório terminada") +MSG_HASH(MSG_SENDING_COMMAND, + "Enviando comando") +MSG_HASH(MSG_SEVERAL_PATCHES_ARE_EXPLICITLY_DEFINED, + "Várias modificações de conteúdo estão explicitamente definidas, ignorando todas...") +MSG_HASH(MSG_SHADER, + "Shader") +MSG_HASH(MSG_SHADER_PRESET_SAVED_SUCCESSFULLY, + "Predefinição de Shader salva com sucesso.") +MSG_HASH(MSG_SKIPPING_SRAM_LOAD, + "Ignorando carregamento da SRAM.") +MSG_HASH(MSG_SLOW_MOTION, + "Câmera Lenta.") +MSG_HASH(MSG_FAST_FORWARD, + "Avanço rápido.") +MSG_HASH(MSG_SLOW_MOTION_REWIND, + "Rebobinagem em Câmera Lenta.") +MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, + "SRAM não será salva.") +MSG_HASH(MSG_STARTING_MOVIE_PLAYBACK, + "Iniciando reprodução de filme.") +MSG_HASH(MSG_STARTING_MOVIE_RECORD_TO, + "Iniciando a gravação de filme em") +MSG_HASH(MSG_STATE_SIZE, + "Tamanho do Estado de Jogo") +MSG_HASH(MSG_STATE_SLOT, + "Compartimento do Estado de Jogo") +MSG_HASH(MSG_TAKING_SCREENSHOT, + "Fazendo captura de tela") +MSG_HASH(MSG_TO, + "em") +MSG_HASH(MSG_UNDID_LOAD_STATE, + "Desfez o carregamento de Estado de Jogo.") +MSG_HASH(MSG_UNDOING_SAVE_STATE, + "Desfazendo o salvamento de Estado de Jogo") +MSG_HASH(MSG_UNKNOWN, + "Desconhecido") +MSG_HASH(MSG_UNPAUSED, + "Retomando.") +MSG_HASH(MSG_UNRECOGNIZED_COMMAND, + "Comando não reconhecido") +MSG_HASH(MSG_USING_CORE_NAME_FOR_NEW_CONFIG, + "Usando o nome do núcleo para uma nova configuração.") +MSG_HASH(MSG_USING_LIBRETRO_DUMMY_CORE_RECORDING_SKIPPED, + "Usando o núcleo libretro modelo. Pulando a gravação.") +MSG_HASH(MSG_VALUE_CONNECT_DEVICE_FROM_A_VALID_PORT, + "Conecte o dispositivo a partir de uma porta válida.") +MSG_HASH(MSG_VALUE_DISCONNECTING_DEVICE_FROM_PORT, + "Desconectando o dispositivo da porta") +MSG_HASH(MSG_VALUE_REBOOTING, + "Reinicializando...") +MSG_HASH(MSG_VALUE_SHUTTING_DOWN, + "Desligando...") +MSG_HASH(MSG_VERSION_OF_LIBRETRO_API, + "Versão da API libretro") +MSG_HASH(MSG_VIEWPORT_SIZE_CALCULATION_FAILED, + "Falha no cálculo de tamanho da janela de exibição! Prosseguindo usando dados brutos. Isto provavelmente não funcionará corretamente...") +MSG_HASH(MSG_VIRTUAL_DISK_TRAY, + "bandeja de disco virtual.") +MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_LATENCY, + "Latência de áudio desejada em milissegundos. Pode não ser honrado se o driver de áudio não puder prover a latência desejada.") +MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_MUTE, + "Áudio mudo/não-mudo.") +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_RATE_CONTROL_DELTA, + "Ajuda a suavizar as imperfeições na regulagem ao sincronizar áudio e vídeo. Esteja ciente que se desativado, será quase impossível de se obter a sincronia adequada." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CAMERA_ALLOW, + "Permitir ou não o acesso à câmera pelos núcleos." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_LOCATION_ALLOW, + "Permitir ou não o acesso ao serviço de localização pelos núcleos." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_MAX_USERS, + "Número máximo de usuários suportados pelo RetroArch." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_POLL_TYPE_BEHAVIOR, + "Influencia como a chamada seletiva de entrada é feita dentro do RetroArch. Definindo com 'Cedo' ou 'Tarde' pode resultar em menos latência, dependendo da sua configuração." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_ALL_USERS_CONTROL_MENU, + "Permitir a qualquer usuário controlar o menu. Se desabilitado, apenas o Usuário 1 poderá controlar o menu." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_VOLUME, + "Volume do áudio (em dB). 0dB é o volume normal, e nenhum ganho é aplicado." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_WASAPI_EXCLUSIVE_MODE, + "Permitir ao driver WASAPI obter controle exclusivo do dispositivo de áudio. Se desativado, o modo compartilhado será utilizado." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_WASAPI_FLOAT_FORMAT, + "Utilizar formato de ponto flutuante para o driver WASAPI, se suportado pelo dispositivo de áudio." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_WASAPI_SH_BUFFER_LENGTH, + "O tamanho (em quadros) do buffer intermediário quando o driver WASAPI estiver em modo compartilhado." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_SYNC, + "Sincroniza o áudio. Recomendado." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_AXIS_THRESHOLD, + "Até que ponto um eixo deve ser movido para resultar em um botão pressionado." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_BIND_TIMEOUT, + "Quantidade de segundos para aguardar até proceder para o próximo vínculo." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_TURBO_PERIOD, + "Descreve o período quando os botões com turbo habilitado são alternados. Os números são descritos em quadros." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DUTY_CYCLE, + "Descreve quão longo deve ser o período de um botão com turbo habilitado. Os números são descritos como quadros." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_VSYNC, + "Sincroniza o vídeo de saída da placa gráfica com a taxa de atualização da tela. Recomendado." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_ALLOW_ROTATE, + "Permite que os núcleos definam a rotação. Quando desabilitado, as requisições de rotação são ignoradas. Útil para configurações onde se rotaciona manualmente a tela." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_DUMMY_ON_CORE_SHUTDOWN, + "Alguns núcleos podem ter um recurso de desligamento. Se habilitado, impedirá que o núcleo feche o RetroArch. Em vez disto, carrega um núcleo modelo." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHECK_FOR_MISSING_FIRMWARE, + "Verifica se todos os firmwares necessários estão presentes antes de tentar carregar conteúdo." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_REFRESH_RATE, + "Taxa de atualização vertical da sua tela. Utilizado para calcular uma taxa de saída de áudio adequada. OBS: Isto será ignorado se a função 'Vídeo Paralelizado' estiver habilitada." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_ENABLE, + "Habilita a saída de áudio." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_MAX_TIMING_SKEW, + "Mudança máxima na taxa de entrada de áudio. Se aumentado habilita grandes mudanças na regulagem ao custo de imprecisão no timbre do som (ex: rodando núcleos PAL em modo NTSC)." + ) +MSG_HASH( + MSG_FAILED, + "falhou" + ) +MSG_HASH( + MSG_SUCCEEDED, + "teve êxito" + ) +MSG_HASH( + MSG_DEVICE_NOT_CONFIGURED, + "não configurado" + ) +MSG_HASH( + MSG_DEVICE_NOT_CONFIGURED_FALLBACK, + "não configurado, usando reserva" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST, + "Lista de Cursores da Base de Dados" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_DEVELOPER, + "Base de Dados - Filtro : Desenvolvedor" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_PUBLISHER, + "Base de Dados - Filtro : Publicador" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DISABLED, + "Desabilitado" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ENABLED, + "Habilitado" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_HISTORY_PATH, + "Caminho do Histórico de Conteúdo" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_ORIGIN, + "Base de Dados - Filtro : Origem") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_FRANCHISE, + "Base de Dados - Filtro : Franquia") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_ESRB_RATING, + "Base de Dados - Filtro : Classificação ESRB") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_ELSPA_RATING, + "Base de Dados - Filtro : Classificação ELSPA") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_PEGI_RATING, + "Base de Dados - Filtro : Classificação PEGI") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_CERO_RATING, + "Base de Dados - Filtro : Classificação CERO") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_BBFC_RATING, + "Base de Dados - Filtro : Classificação BBFC") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_MAX_USERS, + "Base de Dados - Filtro : Usuários máximos") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_RELEASEDATE_BY_MONTH, + "Base de Dados - Filtro : Data de Lançamento Por Mês") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_RELEASEDATE_BY_YEAR, + "Base de Dados - Filtro : Data de Lançamento Por Ano") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_EDGE_MAGAZINE_ISSUE, + "Base de Dados - Filtro : Edição da Revista Edge") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_EDGE_MAGAZINE_RATING, + "Base de Dados - Filtro : Classificação da Revista Edge") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_DATABASE_INFO, + "Informações da Base de Dados") +MSG_HASH(MSG_WIFI_SCAN_COMPLETE, + "Análise de Wi-Fi completa.") +MSG_HASH(MSG_SCANNING_WIRELESS_NETWORKS, + "Analisando redes sem fio...") +MSG_HASH(MSG_NETPLAY_LAN_SCAN_COMPLETE, + "Análise de Netplay completa.") +MSG_HASH(MSG_NETPLAY_LAN_SCANNING, + "Analisando por hospedeiros de Netplay...") +MSG_HASH(MENU_ENUM_SUBLABEL_PAUSE_NONACTIVE, + "Pausar o jogo quando a janela do RetroArch não estiver ativa.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_DISABLE_COMPOSITION, + "Habilitar ou desabilitar composição (Somente no Windows).") +MSG_HASH(MENU_ENUM_SUBLABEL_HISTORY_LIST_ENABLE, + "Habilitar ou desabilitar a lista de reprodução recente para jogos, imagens, música e vídeos.") +MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_HISTORY_SIZE, + "Limita o número de itens da lista de reprodução recente para jogos, imagens, música e vídeos.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_UNIFIED_MENU_CONTROLS, + "Controles de Menu Unificados") +MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_UNIFIED_MENU_CONTROLS, + "Utilizar os mesmos controles para o menu e jogo. Aplica-se ao teclado.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FONT_ENABLE, + "Exibir mensagens na tela.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_USER_REMOTE_ENABLE, + "Habilitar Remoto do Usuário %d") +MSG_HASH(MENU_ENUM_LABEL_VALUE_BATTERY_LEVEL_ENABLE, + "Exibir nível de bateria") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FILE, + "Selecionar Arquivo") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FROM_COLLECTION, + "Selecionar de Coleção") +MSG_HASH(MENU_ENUM_LABEL_VALUE_FILTER, + "Filtro") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SCALE, + "Escala") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_START_WHEN_LOADED, + "O Netplay irá iniciar quando o conteúdo for carregado.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_LOAD_CONTENT_MANUALLY, + "Não foi possível encontrar um núcleo adequado ou arquivo de conteúdo, carregue manualmente.") +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BROWSE_URL_LIST, + "Navegar pela URL" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BROWSE_URL, + "Caminho da URL" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BROWSE_START, + "Iniciar" + ) +MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_BOKEH, + "Bokeh") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_SNOWFLAKE, + "Floco de neve") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_REFRESH_ROOMS, + "Atualizar Lista de Salas") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME, + "Apelido: %s") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME_LAN, + "Apelido (lan): %s") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_COMPAT_CONTENT_FOUND, + "Conteúdo compatível encontrado") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_CROP_OVERSCAN, + "Corta alguns pixels ao redor das bordas da imagem habitualmente deixada em branco por desenvolvedores, que por vezes também contêm pixels de lixo.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SMOOTH, + "Adiciona um leve embaciado à imagem para suavizar as arestas da borda dos pixels. Esta opção tem pouco impacto no desempenho.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FILTER, + "Aplica um filtro de vídeo processado pela CPU. OBS: Pode vir a um alto custo de desempenho. Alguns filtros de vídeo podem funcionar apenas para núcleos que usam cores de 32 bits ou 16 bits.") +MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_USERNAME, + "Insira o nome de usuário de sua conta Retro Achievements.") +MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_PASSWORD, + "Insira a senha de sua conta Retro Achievements.") +MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_NICKNAME, + "Insira seu nome de usuário aqui. Isto será utilizado para sessões do Netplay, entre outras coisas.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_POST_FILTER_RECORD, + "Capturar a imagem depois que os filtros (mas não os Shaders) forem aplicados. Seu vídeo ficará tão elegante quanto o que você vê na tela.") +MSG_HASH(MENU_ENUM_SUBLABEL_CORE_LIST, + "Selecionar qual núcleo utilizar.") +MSG_HASH(MENU_ENUM_SUBLABEL_LOAD_CONTENT_LIST, + "Selecionar qual conteúdo iniciar.") +MSG_HASH(MENU_ENUM_SUBLABEL_NETWORK_INFORMATION, + "Exibir interfaces de rede e endereços de IP associados.") +MSG_HASH(MENU_ENUM_SUBLABEL_SYSTEM_INFORMATION, + "Exibir informações específicas do dispositivo.") +MSG_HASH(MENU_ENUM_SUBLABEL_QUIT_RETROARCH, + "Sair do programa.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_WINDOW_WIDTH, + "Define a largura personalizada para a janela de exibição. Deixado em 0 a janela irá dimensionar o mais largo possível.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_WINDOW_HEIGHT, + "Define a altura personalizada para a janela de exibição. Deixado em 0 a janela irá dimensionar o mais alto possível.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FULLSCREEN_X, + "Define a largura personalizada para o modo de tela cheia em não-janela. Deixar em 0 irá usar a resolução da área de trabalho.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FULLSCREEN_Y, + "Define a altura personalizada para o modo de tela cheia em não-janela. Deixar em 0 irá usar a resolução da área de trabalho.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_MESSAGE_POS_X, + "Especifique a posição personalizada no eixo X para o texto na tela.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_MESSAGE_POS_Y, + "Especifique a posição personalizada no eixo Y para o texto na tela.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FONT_SIZE, + "Especifique o tamanho da fonte em pontos.") +MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_OVERLAY_HIDE_IN_MENU, + "Ocultar a Transparência enquanto estiver dentro do menu e exibir novamente ao sair.") +MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_OVERLAY_SHOW_PHYSICAL_INPUTS, + "Exibir comandos de teclado/controle na transparência.") +MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_OVERLAY_SHOW_PHYSICAL_INPUTS_PORT, + "Selecione a porta para a transparência escutar se Exibir Comandos na Transparência estiver habilitado.") +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_COLLECTION_LIST, + "O conteúdo analisado aparecerá aqui." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SCALE_INTEGER, + "Apenas dimensiona o vídeo em valores inteiros. O tamanho de base depende da geometria relatada pelo sistema e da proporção de tela. Se 'Forçar Proporção' não estiver definido, X / Y serão dimensionados independentemente em valores inteiros." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_GPU_SCREENSHOT, + "Captura a tela com Shader de GPU se disponível." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_ROTATION, + "Força uma certa rotação da tela. A rotação é adicionada a rotação que o núcleo definir." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_FORCE_SRGB_DISABLE, + "Desabilita de forma forçada o suporte sRGB FBO. Alguns drivers Intel OpenGL no Windows possuem problemas de vídeo com o suporte sRGB FBO se estiver habilitado. Habilitando isto pode contornar o problema." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_FULLSCREEN, + "Inicia em tela cheia. Pode ser mudado a qualquer momento." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_WINDOWED_FULLSCREEN, + "Se estiver em tela cheia, prefira utilizar uma janela de tela cheia." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_GPU_RECORD, + "Grava o material de saída do Shader de GPU se disponível." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SAVESTATE_AUTO_INDEX, + "Ao criar um Estado de Jogo, o índice do Estado de Jogo é aumentado automaticamente antes de ser salvo. Ao carregar um conteúdo, o índice será definido para o índice mais alto existente." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_BLOCK_SRAM_OVERWRITE, + "Bloqueia a SRAM de ser sobrescrita ao carregar um Estado de Jogo. Pode causar problemas no jogo." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_FASTFORWARD_RATIO, + "Taxa máxima em que o conteúdo será executado quando utilizado o Avanço Rápido (ex: 5.0x para conteúdos em 60fps = 300 fps máx). Se for definido como 0.0x, a taxa de Avanço Rápido é ilimitada (sem FPS máx)." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SLOWMOTION_RATIO, + "Quando está em Câmera Lenta, o conteúdo será diminuído pelo fator especificado/definido." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_RUN_AHEAD_ENABLED, + "Executar o núcleo lógico um ou mais quadros à frente e carreguar o estado de volta para reduzir o atraso dos controles percebido." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_RUN_AHEAD_FRAMES, + "O número de quadros para avançar. Causa problemas de jogabilidade, como instabilidade, se você exceder o número de quadros de atraso internos do jogo." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_RUN_AHEAD_SECONDARY_INSTANCE, + "Usa uma segunda instância do núcleo do RetroArch para avançar. Evita problemas de áudio devido ao estado de carregamento." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REWIND_ENABLE, + "Habilita Rebobinagem. Isso irá impactar o desempenho ao jogar." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REWIND_GRANULARITY, + "Ao definir um número de quadros para Rebobinagem, você pode retroceder vários quadros de uma só vez, aumentando a velocidade da função." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_LIBRETRO_LOG_LEVEL, + "Define o nível de registro de eventos para os núcleos. Se o nível do registro enviado por um núcleo for abaixo deste valor, o mesmo é ignorado." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PERFCNT_ENABLE, + "Habilitar os contadores de desempenho para o RetroArch (e núcleos)." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SAVESTATE_AUTO_SAVE, + "Cria automaticamente um Estado de Jogo no final da execução do RetroArch. O RetroArch irá carregar automaticamente este Estado de Jogo se a função 'Autocarregar Estado de Jogo' estiver habilitada." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SAVESTATE_AUTO_LOAD, + "Carrega automaticamente o último Estado de Jogo auto salvo na inicialização do RetroArch." + ) MSG_HASH( MENU_ENUM_SUBLABEL_SAVESTATE_THUMBNAIL_ENABLE, "Mostrar miniaturas de estados salvos dentro do menu." @@ -2873,1178 +2819,470 @@ MSG_HASH( MENU_ENUM_SUBLABEL_JOYPAD_DRIVER, "Driver do Joypad para usar." ) -MSG_HASH(MSG_FAILED_TO_UNMUTE_AUDIO, - "Falha em desativar o áudio mudo." - ) -MSG_HASH(MSG_FATAL_ERROR_RECEIVED_IN, - "Erro fatal recebido em" - ) -MSG_HASH(MSG_FILE_NOT_FOUND, - "Arquivo não encontrado" - ) -MSG_HASH(MSG_FOUND_AUTO_SAVESTATE_IN, - "Estado de Jogo automático encontrado em" - ) -MSG_HASH(MSG_FOUND_DISK_LABEL, - "Rótulo de disco encontrado" - ) -MSG_HASH(MSG_FOUND_FIRST_DATA_TRACK_ON_FILE, - "Encontrada primeira faixa de dados no arquivo" - ) -MSG_HASH(MSG_FOUND_LAST_STATE_SLOT, - "Encontrada último compartimento de Estado de Jogo" - ) -MSG_HASH(MSG_FOUND_SHADER, - "Shader encontrado" - ) -MSG_HASH(MSG_FRAMES, - "Quadros" - ) -MSG_HASH(MSG_GAME_SPECIFIC_CORE_OPTIONS_FOUND_AT, - "Opções por Jogo: Opções de núcleo específicas do jogo encontradas em" - ) -MSG_HASH(MSG_GOT_INVALID_DISK_INDEX, - "Índice de disco inválido obtido" - ) -MSG_HASH(MSG_GRAB_MOUSE_STATE, - "Capturar estado do Mouse" - ) -MSG_HASH(MSG_GAME_FOCUS_ON, - "Foco do jogo ligado" - ) -MSG_HASH(MSG_GAME_FOCUS_OFF, - "Foco do jogo desligado" - ) -MSG_HASH(MSG_HW_RENDERED_MUST_USE_POSTSHADED_RECORDING, - "O núcleo libretro é renderizado por hardware. Deve usar a gravação pós-Shader também." - ) -MSG_HASH(MSG_INFLATED_CHECKSUM_DID_NOT_MATCH_CRC32, - "A soma de verificação inflada não corresponde ao CRC32." - ) -MSG_HASH(MSG_INPUT_CHEAT, - "Entrada de Trapaça" - ) -MSG_HASH(MSG_INPUT_CHEAT_FILENAME, - "Nome do Arquivo de Trapaça" - ) -MSG_HASH(MSG_INPUT_PRESET_FILENAME, - "Nome de Arquivo de Predefinição" - ) -MSG_HASH(MSG_INPUT_RENAME_ENTRY, - "Renomear Título" - ) -MSG_HASH(MSG_INTERFACE, - "Interface" - ) -MSG_HASH(MSG_INTERNAL_STORAGE, - "Armazenamento Interno" - ) -MSG_HASH(MSG_REMOVABLE_STORAGE, - "Armazenamento Removível" - ) -MSG_HASH(MSG_INVALID_NICKNAME_SIZE, - "Tamanho de apelido inválido." - ) -MSG_HASH(MSG_IN_BYTES, - "em bytes" - ) -MSG_HASH(MSG_IN_GIGABYTES, - "em gigabytes" - ) -MSG_HASH(MSG_IN_MEGABYTES, - "em megabytes" - ) -MSG_HASH(MSG_LIBRETRO_ABI_BREAK, - "foi compilado contra uma versão diferente do libretro do que esta." - ) -MSG_HASH(MSG_LIBRETRO_FRONTEND, - "Frontend para Libretro" - ) -MSG_HASH(MSG_LOADED_STATE_FROM_SLOT, - "Estado de Jogo carregado do compartimento #%d." - ) -MSG_HASH(MSG_LOADED_STATE_FROM_SLOT_AUTO, - "Estado de Jogo carregado do compartimento #-1 (automático)." - ) -MSG_HASH(MSG_LOADING, - "Carregando" - ) -MSG_HASH(MSG_FIRMWARE, - "Um ou mais arquivos de firmware estão faltando" - ) -MSG_HASH(MSG_LOADING_CONTENT_FILE, - "Carregando arquivo de conteúdo" - ) -MSG_HASH(MSG_LOADING_HISTORY_FILE, - "Carregando arquivo de histórico" - ) -MSG_HASH(MSG_LOADING_STATE, - "Carregando Estado de Jogo" - ) -MSG_HASH(MSG_MEMORY, - "Memória" - ) -MSG_HASH(MSG_MOVIE_FILE_IS_NOT_A_VALID_BSV1_FILE, - "O arquivo de filme não é um arquivo BSV1 válido." - ) -MSG_HASH(MSG_MOVIE_FORMAT_DIFFERENT_SERIALIZER_VERSION, - "O formato de filme parece ter uma versão de serializador diferente. Provavelmente irá falhar." - ) -MSG_HASH(MSG_MOVIE_PLAYBACK_ENDED, - "Reprodução de filme terminou." - ) -MSG_HASH(MSG_MOVIE_RECORD_STOPPED, - "Parando a gravação de filme." - ) -MSG_HASH(MSG_NETPLAY_FAILED, - "Falha em inicializar o Netplay." - ) -MSG_HASH(MSG_NO_CONTENT_STARTING_DUMMY_CORE, - "Sem conteúdo, iniciando um núcleo modelo." - ) -MSG_HASH(MSG_NO_SAVE_STATE_HAS_BEEN_OVERWRITTEN_YET, - "Nenhum Estado de Jogo foi sobrescrito até o momento." - ) -MSG_HASH(MSG_NO_STATE_HAS_BEEN_LOADED_YET, - "Nenhum Estado de Jogo foi carregado até o momento." - ) -MSG_HASH(MSG_OVERRIDES_ERROR_SAVING, - "Erro em salvar as redefinições." - ) -MSG_HASH(MSG_OVERRIDES_SAVED_SUCCESSFULLY, - "Redefinições salvas com sucesso." - ) -MSG_HASH(MSG_PAUSED, - "Pausado." - ) -MSG_HASH(MSG_PROGRAM, - "RetroArch" - ) -MSG_HASH(MSG_READING_FIRST_DATA_TRACK, - "Lendo a primeira faixa de dados..." - ) -MSG_HASH(MSG_RECEIVED, - "recebido" - ) -MSG_HASH(MSG_RECORDING_TERMINATED_DUE_TO_RESIZE, - "A gravação terminou devido ao redimensionamento." - ) -MSG_HASH(MSG_RECORDING_TO, - "Gravando em" - ) -MSG_HASH(MSG_REDIRECTING_CHEATFILE_TO, - "Redirecionando o arquivo de Trapaça em" - ) -MSG_HASH(MSG_REDIRECTING_SAVEFILE_TO, - "Redirecionando o Jogo-Salvo em" - ) -MSG_HASH(MSG_REDIRECTING_SAVESTATE_TO, - "Redirecionando o Estado de Jogo em" - ) -MSG_HASH(MSG_REMAP_FILE_SAVED_SUCCESSFULLY, - "Arquivo de remapeamento salvo com sucesso." - ) -MSG_HASH(MSG_REMAP_FILE_REMOVED_SUCCESSFULLY, - "Arquivo de remapeamento salvo com sucesso." - ) -MSG_HASH(MSG_REMOVED_DISK_FROM_TRAY, - "Disco removido da bandeja." - ) -MSG_HASH(MSG_REMOVING_TEMPORARY_CONTENT_FILE, - "Removendo arquivo de conteúdo temporário" - ) -MSG_HASH(MSG_RESET, - "Reinicializar" - ) -MSG_HASH(MSG_RESTARTING_RECORDING_DUE_TO_DRIVER_REINIT, - "Reiniciando a gravação devido ao reinício do driver." - ) -MSG_HASH(MSG_RESTORED_OLD_SAVE_STATE, - "Estado de Jogo antigo restaurado." - ) -MSG_HASH(MSG_RESTORING_DEFAULT_SHADER_PRESET_TO, - "Shaders: restaurando predefinição padrão de Shader em" - ) -MSG_HASH(MSG_REVERTING_SAVEFILE_DIRECTORY_TO, - "Revertendo diretório de Jogo-Salvo em" - ) -MSG_HASH(MSG_REVERTING_SAVESTATE_DIRECTORY_TO, - "Revertendo diretório de Estado de Jogo em" - ) -MSG_HASH(MSG_REWINDING, - "Voltando atrás." - ) -MSG_HASH(MSG_REWIND_INIT, - "Inicializando o buffer de Voltar Atrás com tamanho" - ) -MSG_HASH(MSG_REWIND_INIT_FAILED, - "Falha em inicializar o buffer de Voltar Atrás. Voltar Atrás será desativado." - ) -MSG_HASH(MSG_REWIND_INIT_FAILED_THREADED_AUDIO, - "Esta implementação usa áudio paralelizado. Não é possível utilizar Voltar Atrás." - ) -MSG_HASH(MSG_REWIND_REACHED_END, - "Final do buffer de Voltar Atrás atingido." - ) -MSG_HASH(MSG_SAVED_NEW_CONFIG_TO, - "Nova configuração salva em" - ) -MSG_HASH(MSG_SAVED_STATE_TO_SLOT, - "Estado de Jogo salvo no compartimento #%d." - ) -MSG_HASH(MSG_SAVED_STATE_TO_SLOT_AUTO, - "Estado de Jogo salvo no compartimento #-1 (automático)." - ) -MSG_HASH(MSG_SAVED_SUCCESSFULLY_TO, - "Salvo com sucesso em" - ) -MSG_HASH(MSG_SAVING_RAM_TYPE, - "Salvando Tipo de RAM" - ) -MSG_HASH(MSG_SAVING_STATE, - "Salvando Estado de Jogo" - ) -MSG_HASH(MSG_SCANNING, - "Analisando" - ) -MSG_HASH(MSG_SCANNING_OF_DIRECTORY_FINISHED, - "Análise de diretório terminada" - ) -MSG_HASH(MSG_SENDING_COMMAND, - "Enviando comando" - ) -MSG_HASH(MSG_SEVERAL_PATCHES_ARE_EXPLICITLY_DEFINED, - "Várias modificações de conteúdo estão explicitamente definidas, ignorando todas..." - ) -MSG_HASH(MSG_SHADER, - "Shader" - ) -MSG_HASH(MSG_SHADER_PRESET_SAVED_SUCCESSFULLY, - "Predefinição de Shader salva com sucesso." - ) -MSG_HASH(MSG_SKIPPING_SRAM_LOAD, - "Ignorando carregamento da SRAM." - ) -MSG_HASH(MSG_SLOW_MOTION, - "Câmera Lenta." - ) -MSG_HASH(MSG_FAST_FORWARD, - "Avanço rápido." - ) -MSG_HASH(MSG_SLOW_MOTION_REWIND, - "Voltar Atrás em Câmera Lenta." - ) -MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, - "SRAM não será salva." - ) -MSG_HASH(MSG_STARTING_MOVIE_PLAYBACK, - "Iniciando reprodução de filme." - ) -MSG_HASH(MSG_STARTING_MOVIE_RECORD_TO, - "Iniciando a gravação de filme em" - ) -MSG_HASH(MSG_STATE_SIZE, - "Tamanho do Estado de Jogo" - ) -MSG_HASH(MSG_STATE_SLOT, - "Compartimento do Estado de Jogo" - ) -MSG_HASH(MSG_TAKING_SCREENSHOT, - "Fazendo captura de tela" - ) -MSG_HASH(MSG_TO, - "em" - ) -MSG_HASH(MSG_UNDID_LOAD_STATE, - "Desfez o carregamento de Estado de Jogo." - ) -MSG_HASH(MSG_UNDOING_SAVE_STATE, - "Desfazendo o salvamento de Estado de Jogo" - ) -MSG_HASH(MSG_UNKNOWN, - "Desconhecido" - ) -MSG_HASH(MSG_UNPAUSED, - "Retomando." - ) -MSG_HASH(MSG_UNRECOGNIZED_COMMAND, - "Comando não reconhecido" - ) -MSG_HASH(MSG_USING_CORE_NAME_FOR_NEW_CONFIG, - "Usando o nome do núcleo para uma nova configuração." - ) -MSG_HASH(MSG_USING_LIBRETRO_DUMMY_CORE_RECORDING_SKIPPED, - "Usando o núcleo libretro modelo. Pulando a gravação." - ) -MSG_HASH(MSG_VALUE_CONNECT_DEVICE_FROM_A_VALID_PORT, - "Conecte o dispositivo a partir de uma porta válida." - ) -MSG_HASH(MSG_VALUE_DISCONNECTING_DEVICE_FROM_PORT, - "Desconectando o dispositivo da porta" - ) -MSG_HASH(MSG_VALUE_REBOOTING, - "Reinicializando..." - ) -MSG_HASH(MSG_VALUE_SHUTTING_DOWN, - "Desligando..." - ) -MSG_HASH(MSG_VERSION_OF_LIBRETRO_API, - "Versão da API libretro" - ) -MSG_HASH(MSG_VIEWPORT_SIZE_CALCULATION_FAILED, - "Falha no cálculo de tamanho da janela de exibição! Prosseguindo usando dados brutos. Isto provavelmente não funcionará corretamente..." - ) -MSG_HASH(MSG_VIRTUAL_DISK_TRAY, - "bandeja de disco virtual." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_LATENCY, - "Latência de áudio desejada em milissegundos. Pode não ser honrado se o driver de áudio não puder prover a latência desejada." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_MUTE, - "Áudio mudo/não-mudo." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_RATE_CONTROL_DELTA, - "Ajuda a suavizar as imperfeições na regulagem ao sincronizar áudio e vídeo. Esteja ciente que se desativado, será quase impossível de se obter a sincronia adequada." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_CAMERA_ALLOW, - "Permitir ou não o acesso a câmera pelos núcleos." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_LOCATION_ALLOW, - "Permitir ou não o acesso ao serviço de localização pelos núcleos." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_MAX_USERS, - "Número máximo de usuários suportados pelo RetroArch." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_POLL_TYPE_BEHAVIOR, - "Influencia como a chamada seletiva de entrada é feita dentro do RetroArch. Definindo com 'Cedo' ou 'Tarde' pode resultar em menos latência, dependendo da sua configuração." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_ALL_USERS_CONTROL_MENU, - "Permitir a qualquer usuário controlar o menu. Se desabilitado, apenas o Usuário 1 poderá controlar o menu." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_VOLUME, - "Volume do áudio (em dB). 0dB é o volume normal, e nenhum ganho é aplicado." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_WASAPI_EXCLUSIVE_MODE, - "Permitir ao driver WASAPI obter controle exclusivo do dispositivo de áudio. Se desativado, o modo compartilhado será utilizado." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_WASAPI_FLOAT_FORMAT, - "Utilizar formato de ponto flutuante para o driver WASAPI, se suportado pelo dispositivo de áudio." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_WASAPI_SH_BUFFER_LENGTH, - "O tamanho (em quadros) do buffer intermediário quando o driver WASAPI estiver em modo compartilhado." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_SYNC, - "Sincroniza o áudio. Recomendado." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_AXIS_THRESHOLD, - "Até que ponto um eixo deve ser movido para resultar em um botão pressionado." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_BIND_TIMEOUT, - "Quantidade de segundos para aguardar até proceder para o próximo vínculo." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_TURBO_PERIOD, - "Descreve o período quando os botões com turbo habilitado são alternados. Os números são descritos em quadros." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_DUTY_CYCLE, - "Descreve quão longo deve ser o período de um botão com turbo habilitado. Os números são descritos como quadros." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_VSYNC, - "Sincroniza o vídeo de saída da placa gráfica com a taxa de atualização da tela. Recomendado." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_ALLOW_ROTATE, - "Permite que os núcleos definam a rotação. Quando desabilitado, as requisições de rotação são ignoradas. Útil para configurações onde se rotaciona manualmente a tela." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_DUMMY_ON_CORE_SHUTDOWN, - "Alguns núcleos podem ter um recurso de desligamento. Se habilitado, impedirá que o núcleo feche o RetroArch. Em vez disto, carrega um núcleo modelo." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_CHECK_FOR_MISSING_FIRMWARE, - "Verifica se todos os firmwares necessários estão presentes antes de tentar carregar conteúdo." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_REFRESH_RATE, - "Taxa de atualização vertical da sua tela. Utilizado para calcular uma taxa de saída de áudio adequada. OBS: Isto será ignorado se a função 'Vídeo Paralelizado' estiver habilitada." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_ENABLE, - "Habilita a saída de áudio." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_MAX_TIMING_SKEW, - "Mudança máxima na taxa de entrada de áudio. Se aumentado habilita grandes mudanças na regulagem ao custo de imprecisão no timbre do som (ex: rodando núcleos PAL em modo NTSC)." - ) -MSG_HASH(MSG_FAILED, - "falhou" - ) -MSG_HASH(MSG_SUCCEEDED, - "teve êxito" - ) -MSG_HASH(MSG_DEVICE_NOT_CONFIGURED, - "não configurado" - ) -MSG_HASH(MSG_DEVICE_NOT_CONFIGURED_FALLBACK, - "não configurado, usando reserva" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST, - "Lista de Cursores da Base de Dados" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_DEVELOPER, - "Base de Dados - Filtro : Desenvolvedor" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_PUBLISHER, - "Base de Dados - Filtro : Publicador" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_DISABLED, - "Desabilitado" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_ENABLED, - "Habilitado" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_HISTORY_PATH, - "Caminho do Histórico de Conteúdo" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_ORIGIN, - "Base de Dados - Filtro : Origem" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_FRANCHISE, - "Base de Dados - Filtro : Franquia" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_ESRB_RATING, - "Base de Dados - Filtro : Classificação ESRB" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_ELSPA_RATING, - "Base de Dados - Filtro : Classificação ELSPA" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_PEGI_RATING, - "Base de Dados - Filtro : Classificação PEGI" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_CERO_RATING, - "Base de Dados - Filtro : Classificação CERO" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_BBFC_RATING, - "Base de Dados - Filtro : Classificação BBFC" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_MAX_USERS, - "Base de Dados - Filtro : Usuários máximos" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_RELEASEDATE_BY_MONTH, - "Base de Dados - Filtro : Data de Lançamento Por Mês" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_RELEASEDATE_BY_YEAR, - "Base de Dados - Filtro : Data de Lançamento Por Ano" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_EDGE_MAGAZINE_ISSUE, - "Base de Dados - Filtro : Edição da Revista Edge" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_EDGE_MAGAZINE_RATING, - "Base de Dados - Filtro : Classificação da Revista Edge" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_DATABASE_INFO, - "Informações da Base de Dados" - ) -MSG_HASH(MSG_WIFI_SCAN_COMPLETE, - "Análise de Wi-Fi completa." - ) -MSG_HASH(MSG_SCANNING_WIRELESS_NETWORKS, - "Analisando redes sem fio..." - ) -MSG_HASH(MSG_NETPLAY_LAN_SCAN_COMPLETE, - "Análise de Netplay completa." - ) -MSG_HASH(MSG_NETPLAY_LAN_SCANNING, - "Analisando por hospedeiros de Netplay..." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_PAUSE_NONACTIVE, - "Pausar o jogo quando a janela do RetroArch não estiver ativa." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_DISABLE_COMPOSITION, - "Habilitar ou desabilitar composição (Somente no Windows)." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_HISTORY_LIST_ENABLE, - "Habilitar ou desabilitar a lista de reprodução recente para jogos, imagens, música e vídeos." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_HISTORY_SIZE, - "Limita o número de itens da lista de reprodução recente para jogos, imagens, música e vídeos." - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_UNIFIED_MENU_CONTROLS, - "Controles de Menu Unificados" - ) -MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_UNIFIED_MENU_CONTROLS, - "Utilizar os mesmos controles para o menu e jogo. Aplica-se ao teclado." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FONT_ENABLE, - "Exibir mensagens na tela." - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_USER_REMOTE_ENABLE, - "Habilitar Remoto do Usuário %d" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_BATTERY_LEVEL_ENABLE, - "Exibir nível de bateria" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FILE, - "Selecionar Arquivo" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FROM_COLLECTION, - "Selecionar de Coleção" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_FILTER, - "Filtro" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_SCALE, - "Escala" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_START_WHEN_LOADED, - "O Netplay irá iniciar quando o conteúdo for carregado." - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_LOAD_CONTENT_MANUALLY, - "Não foi possível encontrar um núcleo adequado ou arquivo de conteúdo, carregue manualmente." - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_BROWSE_URL_LIST, - "Navegar pela URL" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_BROWSE_URL, - "Caminho da URL" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_BROWSE_START, - "Iniciar" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_BOKEH, - "Bokeh" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_REFRESH_ROOMS, - "Atualizar Lista de Salas" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME, - "Apelido: %s" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME_LAN, - "Apelido (lan): %s" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_COMPAT_CONTENT_FOUND, - "Conteúdo compatível encontrado" - ) -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_CROP_OVERSCAN, - "Corta alguns pixels ao redor das bordas da imagem habitualmente deixada em branco por desenvolvedores, que por vezes também contêm pixels de lixo." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SMOOTH, - "Adiciona um leve embaciado à imagem para suavizar as arestas da borda dos pixels. Esta opção tem pouco impacto no desempenho." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FILTER, - "Aplica um filtro de vídeo processado pela CPU. OBS: Pode vir a um alto custo de desempenho. Alguns filtros de vídeo podem funcionar apenas para núcleos que usam cores de 32 bits ou 16 bits." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_USERNAME, - "Insira o nome de usuário de sua conta Retro Achievements." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_PASSWORD, - "Insira a senha de sua conta Retro Achievements." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_NICKNAME, - "Insira seu nome de usuário aqui. Isto será utilizado para sessões do Netplay, entre outras coisas." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_POST_FILTER_RECORD, - "Capturar a imagem depois que os filtros (mas não os Shaders) forem aplicados. Seu vídeo ficará tão elegante quanto o que você vê na tela." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_CORE_LIST, - "Selecionar qual núcleo utilizar." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_LOAD_CONTENT_LIST, - "Selecionar qual conteúdo iniciar." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_NETWORK_INFORMATION, - "Exibir interfaces de rede e endereços de IP associados." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_SYSTEM_INFORMATION, - "Exibir informações específicas do dispositivo." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_QUIT_RETROARCH, - "Sair do programa." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_WINDOW_WIDTH, - "Define a largura personalizada para a janela de exibição. Deixado em 0 a janela irá dimensionar o mais largo possível." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_WINDOW_HEIGHT, - "Define a altura personalizada para a janela de exibição. Deixado em 0 a janela irá dimensionar o mais alto possível." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FULLSCREEN_X, - "Define a largura personalizada para o modo de tela cheia em não-janela. Deixar em 0 irá usar a resolução da área de trabalho." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FULLSCREEN_Y, - "Define a altura personalizada para o modo de tela cheia em não-janela. Deixar em 0 irá usar a resolução da área de trabalho." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_MESSAGE_POS_X, - "Especifique a posição personalizada no eixo X para o texto na tela." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_MESSAGE_POS_Y, - "Especifique a posição personalizada no eixo Y para o texto na tela." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FONT_SIZE, - "Especifique o tamanho da fonte em pontos." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_OVERLAY_HIDE_IN_MENU, - "Ocultar a Transparência enquanto estiver dentro do menu e exibir novamente ao sair." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_OVERLAY_SHOW_PHYSICAL_INPUTS, - "Exibir comandos de teclado/controle na transparência." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_OVERLAY_SHOW_PHYSICAL_INPUTS_PORT, - "Selecione a porta para a transparência escutar se Exibir Comandos na Transparência estiver habilitado." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_COLLECTION_LIST, - "O conteúdo analisado aparecerá aqui." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SCALE_INTEGER, - "Apenas dimensiona o vídeo em valores inteiros. O tamanho de base depende da geometria relatada pelo sistema e da proporção de tela. Se 'Forçar Proporção' não estiver definido, X / Y serão dimensionados independentemente em valores inteiros." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_GPU_SCREENSHOT, - "Captura a tela com Shader de GPU se disponível." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_ROTATION, - "Força uma certa rotação da tela. A rotação é adicionada a rotação que o núcleo definir." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FORCE_SRGB_DISABLE, - "Desabilita de forma forçada o suporte sRGB FBO. Alguns drivers Intel OpenGL no Windows possuem problemas de vídeo com o suporte sRGB FBO se estiver habilitado. Habilitando isto pode contornar o problema." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FULLSCREEN, - "Inicia em tela cheia. Pode ser mudado a qualquer momento." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_WINDOWED_FULLSCREEN, - "Se estiver em tela cheia, prefira utilizar uma janela de tela cheia." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_GPU_RECORD, - "Grava o material de saída do Shader de GPU se disponível." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_SAVESTATE_AUTO_INDEX, - "Ao criar um Estado de Jogo, o índice do Estado de Jogo é aumentado automaticamente antes de ser salvo. Ao carregar um conteúdo, o índice será definido para o índice mais alto existente." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_BLOCK_SRAM_OVERWRITE, - "Bloqueia a SRAM de ser sobrescrita ao carregar um Estado de Jogo. Pode causar problemas no jogo." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_FASTFORWARD_RATIO, - "A taxa máxima na qual o conteúdo será executado quando utilizado o Avanço Rápido (ex: 5.0x para conteúdos em 60fps = 300 fps max). Se for definido como 0.0x, a taxa de Avanço Rápido é ilimitada (sem FPS max)." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_SLOWMOTION_RATIO, - "Quando está em Câmera Lenta, o conteúdo será diminuído pelo fator especificado/definido." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_REWIND_ENABLE, - "Habilita Voltar Atrás. Isso irá impactar o desempenho ao jogar." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_REWIND_GRANULARITY, - "Ao definir um número de quadros para Voltar Atrás, você pode retroceder vários quadros de uma só vez, aumentando a velocidade da função." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_LIBRETRO_LOG_LEVEL, - "Define o nível de registro de eventos para os núcleos. Se o nível do registro enviado por um núcleo for abaixo deste valor, o mesmo é ignorado." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_PERFCNT_ENABLE, - "Habilitar os contadores de desempenho para o RetroArch (e núcleos)." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_SAVESTATE_AUTO_SAVE, - "Cria automaticamente um Estado de Jogo no final da execução do RetroArch. O RetroArch irá carregar automaticamente este Estado de Jogo se a função 'Autocarregar Estado de Jogo' estiver habilitada." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_SAVESTATE_AUTO_LOAD, - "Autocarrega o último Estado de Jogo autosalvo na inicialização do RetroArch." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_RESAMPLER_DRIVER, - "Driver de reamostragem de áudio a ser utilizado." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_CAMERA_DRIVER, - "Driver de câmera a ser utilizado." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_LOCATION_DRIVER, - "Driver de localização a ser utilizado." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_MENU_DRIVER, - "Driver de menu a ser utilizado." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_RECORD_DRIVER, - "Driver de gravação a ser utilizado." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_WIFI_DRIVER, - "Driver de WiFi a ser utilizado." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE, - "Filtra os arquivos em exibição no explorador de arquivos por extensões suportadas." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_MENU_WALLPAPER, - "Seleciona uma imagem para definir como plano de fundo do menu." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_DYNAMIC_WALLPAPER, - "Carrega dinamicamente um novo plano de fundo dependendo do contexto." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_DEVICE, - "Substitui o dispositivo de áudio padrão utilizado pelo driver de áudio. Isto depende do driver." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_DSP_PLUGIN, - "Plugin DSP de Áudio que processa o áudio antes de ser enviado para o driver." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_OUTPUT_RATE, - "Taxa de amostragem da saída de áudio." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_OVERLAY_OPACITY, - "Opacidade de todos os elementos de interface da Transparência." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_OVERLAY_SCALE, - "Escala de todos os elementos de interface da Transparência." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_OVERLAY_ENABLE, - "Habilita a Transparência." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_OVERLAY_PRESET, - "Seleciona uma Transparência pelo navegador de arquivos." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_IP_ADDRESS, - "Endereço do hospedeiro a se conectar." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_TCP_UDP_PORT, - "Porta do endereço de IP do hospedeiro. Pode ser uma porta TCP ou uma porta UDP." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_PASSWORD, - "Senha para conectar ao hospedeiro de Netplay. Utilizado apenas no modo hospedeiro." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_PUBLIC_ANNOUNCE, - "Anunciar os jogos de Netplay publicamente. Se não for definido, os clientes deverão conectar manualmente em vez de usar o lobby público." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_SPECTATE_PASSWORD, - "Senha para conectar ao hospedeiro de Netplay apenas com privilégios de espectador. Utilizado apenas no modo hospedeiro." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_START_AS_SPECTATOR, - "Define se o Netplay deve iniciar em modo espectador." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_ALLOW_SLAVES, - "Define se conexões em modo escravo são permitidas. Clientes em modo escravo requerem muito pouco poder de processamento em ambos os lados, mas irão sofrer significamente da latência de rede." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_REQUIRE_SLAVES, - "Define se conexões que não estão em modo escravo são proibidas. Não recomendado, exceto para redes muito rápidas com máquinas muito lentas." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_STATELESS_MODE, - "Define se deve executar o Netplay em modo que não utilize Estados de Jogo. Se definido como verdadeiro, uma rede muito rápida é necessária, mas Voltar Atrás não é permitido, então não haverá oscilação no Netplay." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_CHECK_FRAMES, - "Frequência em quadros no qual o Netplay verificará se o hospedeiro e o cliente estão sincronizados." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_NAT_TRAVERSAL, - "Ao hospedar uma partida, tente receber conexões da Internet pública usando UPnP ou tecnologias similares para escapar das redes locais." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_STDIN_CMD_ENABLE, - "Habilitar interface de comando stdin." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_MOUSE_ENABLE, - "Habilitar controle por Mouse dentro do menu." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_POINTER_ENABLE, - "Habilitar controle por toque dentro do menu." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_THUMBNAILS, - "Tipo de miniatura a ser exibida." +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_RESAMPLER_DRIVER, + "Driver de reamostragem de áudio a ser utilizado." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CAMERA_DRIVER, + "Driver de câmera a ser utilizado." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_LOCATION_DRIVER, + "Driver de localização a ser utilizado." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_DRIVER, + "Driver de menu a ser utilizado." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_RECORD_DRIVER, + "Driver de gravação a ser utilizado." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_WIFI_DRIVER, + "Driver de WiFi a ser utilizado." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE, + "Filtra os arquivos em exibição no explorador de arquivos por extensões suportadas." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_WALLPAPER, + "Seleciona uma imagem para definir como plano de fundo do menu." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_DYNAMIC_WALLPAPER, + "Carrega dinamicamente um novo plano de fundo dependendo do contexto." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_DEVICE, + "Substitui o dispositivo de áudio padrão utilizado pelo driver de áudio. Isto depende do driver." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_DSP_PLUGIN, + "Plugin DSP de Áudio que processa o áudio antes de ser enviado para o driver." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_OUTPUT_RATE, + "Taxa de amostragem da saída de áudio." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OVERLAY_OPACITY, + "Opacidade de todos os elementos de interface da Transparência." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OVERLAY_SCALE, + "Escala de todos os elementos de interface da Transparência." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_OVERLAY_ENABLE, + "Habilita a Transparência." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OVERLAY_PRESET, + "Seleciona uma Transparência pelo navegador de arquivos." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_IP_ADDRESS, + "Endereço do hospedeiro a se conectar." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_TCP_UDP_PORT, + "Porta do endereço de IP do hospedeiro. Pode ser uma porta TCP ou uma porta UDP." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_PASSWORD, + "Senha para conectar ao hospedeiro de Netplay. Utilizado apenas no modo hospedeiro." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_PUBLIC_ANNOUNCE, + "Anunciar os jogos de Netplay publicamente. Se não for definido, os clientes deverão conectar manualmente em vez de usar o lobby público." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_SPECTATE_PASSWORD, + "Senha para conectar ao hospedeiro de Netplay apenas com privilégios de espectador. Utilizado apenas no modo hospedeiro." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_START_AS_SPECTATOR, + "Define se o Netplay deve iniciar em modo espectador." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_ALLOW_SLAVES, + "Define se conexões em modo escravo são permitidas. Clientes em modo escravo requerem muito pouco poder de processamento em ambos os lados, mas irão sofrer significamente da latência de rede." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_REQUIRE_SLAVES, + "Define se conexões que não estão em modo escravo são proibidas. Não recomendado, exceto para redes muito rápidas com máquinas muito lentas." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_STATELESS_MODE, + "Define se deve executar o Netplay em modo que não utilize Estados de Jogo. Se definido como verdadeiro, uma rede muito rápida é necessária, mas Rebobinagem não é permitido, então não haverá oscilação no Netplay." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_CHECK_FRAMES, + "Frequência em quadros no qual o Netplay verificará se o hospedeiro e o cliente estão sincronizados." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_NAT_TRAVERSAL, + "Ao hospedar uma partida, tente receber conexões da Internet pública usando UPnP ou tecnologias similares para escapar das redes locais." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_STDIN_CMD_ENABLE, + "Habilitar interface de comando stdin." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MOUSE_ENABLE, + "Habilitar controle por Mouse dentro do menu." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_POINTER_ENABLE, + "Habilitar controle por toque dentro do menu." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_THUMBNAILS, + "Tipo de miniatura a ser exibida." ) MSG_HASH( MENU_ENUM_SUBLABEL_LEFT_THUMBNAILS, "Tipo de miniatura para exibir à esquerda." ) -MSG_HASH(MENU_ENUM_SUBLABEL_TIMEDATE_ENABLE, - "Exibir data e/ou hora atuais dentro do menu." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_BATTERY_LEVEL_ENABLE, - "Exibir o nível de bateria atual dentro do menu." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_NAVIGATION_WRAPAROUND, - "Voltar ao início ou final se o limite da lista for alcançado horizontalmente ou verticalmente." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_ENABLE_HOST, - "Habilita o Netplay no modo hospedeiro (servidor)." - ) +MSG_HASH( + MENU_ENUM_SUBLABEL_XMB_VERTICAL_THUMBNAILS, + "Exibe a miniatura esquerda sob a direita, no lado direito da tela.") +MSG_HASH( + MENU_ENUM_SUBLABEL_TIMEDATE_ENABLE, + "Exibir data e/ou hora atuais dentro do menu." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_BATTERY_LEVEL_ENABLE, + "Exibir o nível de bateria atual dentro do menu." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NAVIGATION_WRAPAROUND, + "Voltar ao início ou final se o limite da lista for alcançado horizontalmente ou verticalmente." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_ENABLE_HOST, + "Habilita o Netplay no modo hospedeiro (servidor)." + ) MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_ENABLE_CLIENT, - "Habilita o Netplay no modo cliente." - ) + "Habilita o Netplay no modo cliente.") MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_DISCONNECT, - "Desconecta de uma conexão de Netplay ativa." - ) + "Desconecta de uma conexão de Netplay ativa.") MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_DIRECTORY, - "Analisa um diretório por arquivos compatíveis e os adiciona à coleção." - ) + "Analisa um diretório por arquivos compatíveis e os adiciona à coleção.") MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_FILE, - "Analisa um arquivo compatível e o adiciona à coleção." - ) + "Analisa um arquivo compatível e o adiciona à coleção.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SWAP_INTERVAL, - "Usa um intervalo de troca personalizado para V-Sync. Defina para reduzir efetivamente a taxa de atualização do monitor pela metade." - ) + "Usa um intervalo de troca personalizado para V-Sync. Defina para reduzir efetivamente a taxa de atualização do monitor pela metade." + ) MSG_HASH(MENU_ENUM_SUBLABEL_SORT_SAVEFILES_ENABLE, - "Ordenar os Jogos-Salvos em pastas com o nome do núcleo utilizado." - ) + "Ordenar os Jogos-Salvos em pastas com o nome do núcleo utilizado." + ) MSG_HASH(MENU_ENUM_SUBLABEL_SORT_SAVESTATES_ENABLE, - "Ordenar os Estados de Jogo em pastas com o nome do núcleo utilizado." - ) + "Ordenar os Estados de Jogo em pastas com o nome do núcleo utilizado." + ) MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_REQUEST_DEVICE_I, "Solicitar jogar com o dispositivo de entrada dado.") MSG_HASH(MENU_ENUM_SUBLABEL_CORE_UPDATER_BUILDBOT_URL, - "URL para o diretório de atualização de núcleos no buildbot do Libreto." - ) + "URL para o diretório de atualização de núcleos no buildbot do Libreto.") MSG_HASH(MENU_ENUM_SUBLABEL_BUILDBOT_ASSETS_URL, - "URL para o diretório de atualizações de recursos no buildbot do Libretro." - ) + "URL para o diretório de atualizações de recursos no buildbot do Libretro.") MSG_HASH(MENU_ENUM_SUBLABEL_CORE_UPDATER_AUTO_EXTRACT_ARCHIVE, - "Após o download, extrair automaticamente os arquivos contidos nos arquivos comprimidos baixados." - ) + "Após o download, extrair automaticamente os arquivos contidos nos arquivos comprimidos baixados." + ) MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_REFRESH_ROOMS, - "Analisar por novas salas." - ) + "Analisar por novas salas.") MSG_HASH(MENU_ENUM_SUBLABEL_DELETE_ENTRY, - "Remover esta entrada da coleção." - ) + "Remover esta entrada da coleção.") MSG_HASH(MENU_ENUM_SUBLABEL_INFORMATION, - "Visualizar mais informações sobre o conteúdo." - ) + "Visualizar mais informações sobre o conteúdo.") MSG_HASH(MENU_ENUM_SUBLABEL_ADD_TO_FAVORITES, - "Adicionar o item aos seus favoritos." - ) + "Adicionar o item aos seus favoritos.") MSG_HASH(MENU_ENUM_SUBLABEL_ADD_TO_FAVORITES_PLAYLIST, - "Adicionar o item aos seus favoritos." - ) + "Adicionar o item aos seus favoritos.") MSG_HASH(MENU_ENUM_SUBLABEL_RUN, - "Iniciar o conteúdo." - ) + "Iniciar o conteúdo.") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_FILE_BROWSER_SETTINGS, - "Ajustar as definições do navegador de arquivos." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_AUTO_REMAPS_ENABLE, - "Habilitar por padrão controles personalizados na inicialização." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_AUTO_OVERRIDES_ENABLE, - "Habilitar por padrão configuração personalizada na inicialização." - ) + "Ajustar as definições do navegador de arquivos.") +MSG_HASH( + MENU_ENUM_SUBLABEL_AUTO_REMAPS_ENABLE, + "Habilitar por padrão controles personalizados na inicialização." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUTO_OVERRIDES_ENABLE, + "Habilitar por padrão configuração personalizada na inicialização." + ) MSG_HASH(MENU_ENUM_SUBLABEL_GAME_SPECIFIC_OPTIONS, - "Habilitar por padrão opções de núcleo personalizadas na inicialização." - ) + "Habilitar por padrão opções de núcleo personalizadas na inicialização.") MSG_HASH(MENU_ENUM_SUBLABEL_CORE_ENABLE, - "Exibir o nome do núcleo atual dentro do menu." - ) + "Exibir o nome do núcleo atual dentro do menu.") MSG_HASH(MENU_ENUM_SUBLABEL_DATABASE_MANAGER, - "Visualizar bases de dados." - ) + "Visualizar bases de dados.") MSG_HASH(MENU_ENUM_SUBLABEL_CURSOR_MANAGER, - "Visualizar pesquisas anteriores." - ) + "Visualizar pesquisas anteriores.") MSG_HASH(MENU_ENUM_SUBLABEL_TAKE_SCREENSHOT, - "Capturar uma imagem da tela." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_CLOSE_CONTENT, - "Fecha o conteúdo atual. Alterações não salvas serão perdidas." - ) + "Capturar uma imagem da tela.") +MSG_HASH( + MENU_ENUM_SUBLABEL_CLOSE_CONTENT, + "Fecha o conteúdo atual. Alterações não salvas serão perdidas." + ) MSG_HASH(MENU_ENUM_SUBLABEL_LOAD_STATE, - "Carregar um Estado de Jogo do compartimento selecionado atualmente." - ) + "Carregar um Estado de Jogo do compartimento selecionado atualmente.") MSG_HASH(MENU_ENUM_SUBLABEL_SAVE_STATE, - "Salvar um Estado de Jogo no compartimento selecionado atualmente." - ) + "Salvar um Estado de Jogo no compartimento selecionado atualmente.") MSG_HASH(MENU_ENUM_SUBLABEL_RESUME, - "Retomar a execução do conteúdo atual e sair do Menu Rápido." - ) + "Retomar a execução do conteúdo atual e sair do Menu Rápido.") MSG_HASH(MENU_ENUM_SUBLABEL_RESUME_CONTENT, - "Retomar a execução do conteúdo atual e sair do Menu Rápido." - ) + "Retomar a execução do conteúdo atual e sair do Menu Rápido.") MSG_HASH(MENU_ENUM_SUBLABEL_STATE_SLOT, - "Altera o compartimento do Estado de Jogo selecionado atualmente." - ) + "Altera o compartimento do Estado de Jogo selecionado atualmente.") MSG_HASH(MENU_ENUM_SUBLABEL_UNDO_LOAD_STATE, - "Se um Estado de Jogo for carregado, o conteúdo voltará ao estado anterior ao carregamento." - ) + "Se um Estado de Jogo for carregado, o conteúdo voltará ao estado anterior ao carregamento.") MSG_HASH(MENU_ENUM_SUBLABEL_UNDO_SAVE_STATE, - "Se o Estado de Jogo foi sobrescrito, ele voltará ao Estado de Jogo salvo anteriormente." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_ACCOUNTS_RETRO_ACHIEVEMENTS, - "Serviço Retro Achievements. Para mais informações, visite http://retroachievements.org (em inglês)" - ) -MSG_HASH(MENU_ENUM_SUBLABEL_ACCOUNTS_LIST, - "Gerenciar contas configuradas atualmente." - ) + "Se o Estado de Jogo foi sobrescrito, ele voltará ao Estado de Jogo salvo anteriormente.") +MSG_HASH( + MENU_ENUM_SUBLABEL_ACCOUNTS_RETRO_ACHIEVEMENTS, + "Serviço Retro Achievements. Para mais informações, visite http://retroachievements.org (em inglês)" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_ACCOUNTS_LIST, + "Gerenciar contas configuradas atualmente." + ) MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_META_REWIND, - "Gerenciar as configurações de Voltar Atrás." - ) + "Gerenciar as configurações de Rebobinagem.") MSG_HASH(MENU_ENUM_SUBLABEL_RESTART_CONTENT, - "Reinicia o conteúdo do começo." - ) + "Reinicia o conteúdo do começo.") MSG_HASH(MENU_ENUM_SUBLABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CORE, - "Salva um arquivo de redefinição de configuração que será aplicado a todo o conteúdo carregado por este núcleo. Terá prioridade sobre a configuração principal." - ) + "Salva um arquivo de redefinição de configuração que será aplicado a todo o conteúdo carregado por este núcleo. Terá prioridade sobre a configuração principal.") MSG_HASH(MENU_ENUM_SUBLABEL_SAVE_CURRENT_CONFIG_OVERRIDE_GAME, - "Salva um arquivo de redefinição de configuração que será aplicado apenas ao conteúdo atual. Terá prioridade sobre a configuração principal." - ) + "Salva um arquivo de redefinição de configuração que será aplicado apenas ao conteúdo atual. Terá prioridade sobre a configuração principal.") MSG_HASH(MENU_ENUM_SUBLABEL_CORE_CHEAT_OPTIONS, - "Configurar códigos de Trapaça." - ) + "Configurar códigos de Trapaça.") MSG_HASH(MENU_ENUM_SUBLABEL_SHADER_OPTIONS, - "Configurar Shader para realçar a aparência da imagem." - ) + "Configurar Shader para realçar a aparência da imagem.") MSG_HASH(MENU_ENUM_SUBLABEL_CORE_INPUT_REMAPPING_OPTIONS, - "Alterar os controles para o conteúdo que está sendo executado." - ) + "Alterar os controles para o conteúdo que está sendo executado.") MSG_HASH(MENU_ENUM_SUBLABEL_CORE_OPTIONS, - "Alterar as opções para o conteúdo que está sendo executado." - ) + "Alterar as opções para o conteúdo que está sendo executado.") MSG_HASH(MENU_ENUM_SUBLABEL_SHOW_ADVANCED_SETTINGS, - "Exibir as configurações avançadas para usuários experientes (oculto por padrão)." - ) + "Exibir as configurações avançadas para usuários experientes (oculto por padrão).") MSG_HASH(MENU_ENUM_SUBLABEL_THREADED_DATA_RUNLOOP_ENABLE, - "Executar tarefas em linhas de processamento paralelas." - ) + "Executar tarefas em linhas de processamento paralelas.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_REMOVE, - "Permitir que o usuário possa remover itens das coleções." - ) + "Permitir que o usuário possa remover itens das coleções.") MSG_HASH(MENU_ENUM_SUBLABEL_SYSTEM_DIRECTORY, - "Define o diretório de sistema. Os núcleos podem consultar este diretório para carregar arquivos de BIOS, configurações específicas do sistema, etc." - ) + "Define o diretório de sistema. Os núcleos podem consultar este diretório para carregar arquivos de BIOS, configurações específicas do sistema, etc.") MSG_HASH(MENU_ENUM_SUBLABEL_RGUI_BROWSER_DIRECTORY, - "Define o diretório inicial do navegador de arquivos." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_DIR, - "Usualmente definido por desenvolvedores que agrupam aplicativos Libretro/RetroArch para apontar para os recursos." - ) + "Define o diretório inicial do navegador de arquivos.") +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_DIR, + "Usualmente definido por desenvolvedores que agrupam aplicativos Libretro/RetroArch para apontar para os recursos." + ) MSG_HASH(MENU_ENUM_SUBLABEL_DYNAMIC_WALLPAPERS_DIRECTORY, - "Diretório para armazenar planos de fundo dinamicamente carregados pelo menu dependendo do contexto." - ) + "Diretório para armazenar planos de fundo dinamicamente carregados pelo menu dependendo do contexto.") MSG_HASH(MENU_ENUM_SUBLABEL_THUMBNAILS_DIRECTORY, - "Miniaturas auxiliares (arte da embalagem/imagens diversas e etc.) são armazenadas aqui." - ) + "Miniaturas auxiliares (arte da embalagem/imagens diversas e etc.) são armazenadas aqui." + ) MSG_HASH(MENU_ENUM_SUBLABEL_RGUI_CONFIG_DIRECTORY, - "Define o diretório inicial para o navegador de configurações do menu." - ) + "Define o diretório inicial para o navegador de configurações do menu.") MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_INPUT_LATENCY_FRAMES_MIN, - "O número de quadros de latência de entrada para o Netplay utilizar para mascarar a latência da rede. Reduz a oscilação e torna o Netplay menos intensivo para a CPU, ao custo de atraso perceptível na entrada." - ) + "O número de quadros de latência de entrada para o Netplay utilizar para mascarar a latência da rede. Reduz a oscilação e torna o Netplay menos intensivo para a CPU, ao custo de atraso perceptível na entrada.") MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_INPUT_LATENCY_FRAMES_RANGE, - "O intervalo de quadros de latência de entrada que pode ser utilizado para mascarar a latência da rede. Reduz a oscilação e torna o Netplay menos intensivo para a CPU, ao custo de atraso imprevisível na entrada." - ) + "O intervalo de quadros de latência de entrada que pode ser utilizado para mascarar a latência da rede. Reduz a oscilação e torna o Netplay menos intensivo para a CPU, ao custo de atraso imprevisível na entrada.") MSG_HASH(MENU_ENUM_SUBLABEL_DISK_CYCLE_TRAY_STATUS, - "Alterna o disco atual. Se o disco estiver inserido, o mesmo será ejetado. Se o disco não estiver inserido, o mesmo será inserido." - ) + "Alterna o disco atual. Se o disco estiver inserido, o mesmo será ejetado. Se o disco não estiver inserido, o mesmo será inserido.") MSG_HASH(MENU_ENUM_SUBLABEL_DISK_INDEX, - "Mudar o índice do disco." - ) + "Mudar o índice do disco.") MSG_HASH(MENU_ENUM_SUBLABEL_DISK_OPTIONS, - "Gerenciamento de imagem de disco." - ) + "Gerenciamento de imagem de disco.") MSG_HASH(MENU_ENUM_SUBLABEL_DISK_IMAGE_APPEND, - "Selecione uma imagem de disco para inserir." - ) + "Selecione uma imagem de disco para inserir.") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_ENUM_THROTTLE_FRAMERATE, - "Certifica-se de que a taxa de quadros é controlada enquanto estiver dentro do menu." - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_LAYOUT, - "Menu Layout") + "Certifica-se de que a taxa de quadros é controlada enquanto estiver dentro do menu.") +MSG_HASH(MENU_ENUM_SUBLABEL_XMB_LAYOUT, + "Selecione um layout diferente para a interface XMB.") MSG_HASH(MENU_ENUM_SUBLABEL_XMB_THEME, - "Selecionar um tema diferente para os ícones. As alterações terão efeito após reiniciar o programa." - ) + "Selecionar um tema diferente para os ícones. As alterações terão efeito após reiniciar o programa.") MSG_HASH(MENU_ENUM_SUBLABEL_XMB_SHADOWS_ENABLE, - "Habilitar as sombras para todos os ícones. Isto terá um pequeno impacto no desempenho." - ) + "Habilitar as sombras para todos os ícones. Isto terá um pequeno impacto no desempenho.") MSG_HASH(MENU_ENUM_SUBLABEL_MATERIALUI_MENU_COLOR_THEME, - "Selecionar um tema de gradiente de cor de plano de fundo diferente." - ) + "Selecionar um tema de gradiente de cor de plano de fundo diferente.") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_WALLPAPER_OPACITY, - "Modificar a opacidade do plano de fundo." - ) + "Modificar a opacidade do plano de fundo.") MSG_HASH(MENU_ENUM_SUBLABEL_XMB_MENU_COLOR_THEME, - "Selecionar um tema de gradiente de cor de plano de fundo diferente." - ) + "Selecionar um tema de gradiente de cor de plano de fundo diferente.") MSG_HASH(MENU_ENUM_SUBLABEL_XMB_RIBBON_ENABLE, - "Selecionar um efeito de plano de fundo animado. Pode exigir mais processamento da GPU dependendo do efeito. Se o desempenho for insatisfatório, desligue este efeito ou reverta para um efeito mais simples." - ) + "Selecionar um efeito de plano de fundo animado. Pode exigir mais processamento da GPU dependendo do efeito. Se o desempenho for insatisfatório, desligue este efeito ou reverta para um efeito mais simples.") MSG_HASH(MENU_ENUM_SUBLABEL_XMB_FONT, - "Selecionar uma fonte principal diferente para ser usada pelo menu." - ) + "Selecionar uma fonte principal diferente para ser usada pelo menu.") MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES, - "Exibir a aba de favoritos dentro do menu principal." - ) + "Exibir a aba de favoritos dentro do menu principal.") MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SHOW_IMAGES, - "Exibir a aba de imagem dentro do menu principal." - ) + "Exibir a aba de imagem dentro do menu principal.") MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SHOW_MUSIC, - "Exibir a aba de música dentro do menu principal." - ) + "Exibir a aba de música dentro do menu principal.") MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SHOW_VIDEO, - "Exibir a aba de vídeo dentro do menu principal." - ) + "Exibir a aba de vídeo dentro do menu principal.") MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SHOW_NETPLAY, - "Exibir a aba de Netplay dentro do menu principal." - ) + "Exibir a aba de Netplay dentro do menu principal.") MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS, - "Mostrar a aba de configurações dentro do menu principal." - ) + "Mostrar a aba de configurações dentro do menu principal.") MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SHOW_HISTORY, - "Mostrar a aba de histórico recente dentro do menu principal." - ) + "Mostrar a aba de histórico recente dentro do menu principal.") MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD, - "Mostrar a aba de importação de conteúdo dentro do menu principal." - ) + "Mostrar a aba de importação de conteúdo dentro do menu principal.") +MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SHOW_PLAYLISTS, + "Exibir abas da lista de reprodução dentro do menu principal.") MSG_HASH(MENU_ENUM_SUBLABEL_RGUI_SHOW_START_SCREEN, - "Exibir a tela inicial no menu. É automaticamente definido como falso após o programa iniciar pela primeira vez." - ) + "Exibir a tela inicial no menu. É automaticamente definido como falso após o programa iniciar pela primeira vez.") MSG_HASH(MENU_ENUM_SUBLABEL_MATERIALUI_MENU_HEADER_OPACITY, - "Modificar a opacidade do gráfico do cabeçalho." - ) + "Modificar a opacidade do gráfico do cabeçalho.") MSG_HASH(MENU_ENUM_SUBLABEL_MATERIALUI_MENU_FOOTER_OPACITY, - "Modificar a opacidade do gráfico do rodapé." - ) + "Modificar a opacidade do gráfico do rodapé.") MSG_HASH(MENU_ENUM_SUBLABEL_DPI_OVERRIDE_ENABLE, - "O menu normalmente se dimensiona dinamicamente. Se você desejar definir uma escala de tamanho específica em vez disto, habilite esta função." - ) + "O menu normalmente se dimensiona dinamicamente. Se você desejar definir uma escala de tamanho específica em vez disto, habilite esta função.") MSG_HASH(MENU_ENUM_SUBLABEL_DPI_OVERRIDE_VALUE, - "Definir o tamanho do dimensionamento personalizado aqui. OBS: Você deve habilitar a função 'Redefinição de DPI' para que este dimensionamento tenha efeito." - ) + "Definir o tamanho do dimensionamento personalizado aqui. OBS: Você deve habilitar a função 'Redefinição de DPI' para que este dimensionamento tenha efeito.") MSG_HASH(MENU_ENUM_SUBLABEL_CORE_ASSETS_DIRECTORY, - "Salvar todos os arquivos baixados neste diretório." - ) + "Salvar todos os arquivos baixados neste diretório.") MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_REMAPPING_DIRECTORY, - "Salvar todos os controles remapeados neste diretório." - ) + "Salvar todos os controles remapeados neste diretório.") MSG_HASH(MENU_ENUM_SUBLABEL_LIBRETRO_DIR_PATH, - "Diretório onde o programa busca por conteúdo/núcleos." - ) + "Diretório onde o programa busca por conteúdo/núcleos.") MSG_HASH(MENU_ENUM_SUBLABEL_LIBRETRO_INFO_PATH, - "Os arquivos de informação do aplicativo/núcleo são armazenados aqui." - ) + "Os arquivos de informação do aplicativo/núcleo são armazenados aqui.") MSG_HASH(MENU_ENUM_SUBLABEL_JOYPAD_AUTOCONFIG_DIR, - "Se um Joypad estiver conectado, o mesmo será autoconfigurado se um arquivo de configuração correspondente estiver presente dento deste diretório." - ) + "Se um Joypad estiver conectado, o mesmo será autoconfigurado se um arquivo de configuração correspondente estiver presente dento deste diretório.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_DIRECTORY, - "Salvar todas as coleções neste diretório." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_CACHE_DIRECTORY, - "Se for definido um diretório, o conteúdo que é temporariamente extraído (ex: dos arquivos) sera extraído para este diretório." - ) + "Salvar todas as coleções neste diretório.") +MSG_HASH( + MENU_ENUM_SUBLABEL_CACHE_DIRECTORY, + "Se for definido um diretório, o conteúdo que é temporariamente extraído (ex: dos arquivos) sera extraído para este diretório." + ) MSG_HASH(MENU_ENUM_SUBLABEL_CURSOR_DIRECTORY, - "As consultas salvas são armazenadas neste diretório." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_DATABASE_DIRECTORY, - "As bases de dados são armazenadas neste diretório." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_ASSETS_DIRECTORY, - "Esta localização é consultada por padrão quando a interface do menu tenta procurar por recursos carregáveis, etc." - ) + "As consultas salvas são armazenadas neste diretório.") +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_DATABASE_DIRECTORY, + "As bases de dados são armazenadas neste diretório." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_ASSETS_DIRECTORY, + "Esta localização é consultada por padrão quando a interface do menu tenta procurar por recursos carregáveis, etc." + ) MSG_HASH(MENU_ENUM_SUBLABEL_SAVEFILE_DIRECTORY, - "Salvar todos os Jogos-Salvos neste diretório. Se não for definido, tentaremos salvar dentro do diretório de trabalho do arquivo." - ) + "Salvar todos os Jogos-Salvos neste diretório. Se não for definido, tentaremos salvar dentro do diretório de trabalho do arquivo.") MSG_HASH(MENU_ENUM_SUBLABEL_SAVESTATE_DIRECTORY, - "Salvar todos os Estados de Jogo neste diretório. Se não for definido, tentaremos salvar dentro do diretório de trabalho do arquivo." - ) + "Salvar todos os Estados de Jogo neste diretório. Se não for definido, tentaremos salvar dentro do diretório de trabalho do arquivo.") MSG_HASH(MENU_ENUM_SUBLABEL_SCREENSHOT_DIRECTORY, - "Diretório para armazenar as capturas de tela." - ) + "Diretório para armazenar as capturas de tela.") MSG_HASH(MENU_ENUM_SUBLABEL_OVERLAY_DIRECTORY, - "Define um diretório onde as Transparências são mantidas para fácil acesso." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_CHEAT_DATABASE_PATH, - "Os arquivos de Trapaça são mantidos aqui." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_FILTER_DIR, - "Diretório onde os arquivos de filtro DSP de áudio são mantidos." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FILTER_DIR, - "Diretório onde os arquivos de filtro de vídeo processado por CPU são mantidos." - ) + "Define um diretório onde as Transparências são mantidas para fácil acesso.") +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_DATABASE_PATH, + "Os arquivos de Trapaça são mantidos aqui." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_FILTER_DIR, + "Diretório onde os arquivos de filtro DSP de áudio são mantidos." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_FILTER_DIR, + "Diretório onde os arquivos de filtro de vídeo processado por CPU são mantidos." + ) MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHADER_DIR, - "Define um diretório onde os arquivos de Shader de vídeo processado por GPU são mantidos para fácil acesso." - ) + "Define um diretório onde os arquivos de Shader de vídeo processado por GPU são mantidos para fácil acesso.") MSG_HASH(MENU_ENUM_SUBLABEL_RECORDING_OUTPUT_DIRECTORY, - "As gravações serão armazenadas neste diretório." - ) + "As gravações serão armazenadas neste diretório.") MSG_HASH(MENU_ENUM_SUBLABEL_RECORDING_CONFIG_DIRECTORY, - "As configurações de gravação serão mantidas aqui." - ) + "As configurações de gravação serão mantidas aqui.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FONT_PATH, - "Selecionar uma fonte diferente para as notificações na tela." - ) + "Selecionar uma fonte diferente para as notificações na tela.") MSG_HASH(MENU_ENUM_SUBLABEL_SHADER_APPLY_CHANGES, - "As alterações das configurações de Shader terão efeito imediato. Use isto se você alterou a quantidade de estágios de Shader, filtros, escala FBO, etc." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHADER_NUM_PASSES, - "Aumentar ou diminuir a quantidade de estágios do pipeline de Shader. Você pode adicionar um Shader separado para cada estágio do pipeline e configurar sua escala e filtro." - ) + "As alterações das configurações de Shader terão efeito imediato. Use isto se você alterou a quantidade de estágios de Shader, filtros, escala FBO, etc.") +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SHADER_NUM_PASSES, + "Aumentar ou diminuir a quantidade de estágios do pipeline de Shader. Você pode adicionar um Shader separado para cada estágio do pipeline e configurar sua escala e filtro." + ) MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET, - "Carregar uma predefinição de Shader. O pipeline de Shader será definido automaticamente." - ) + "Carregar uma predefinição de Shader. O pipeline de Shader será definido automaticamente.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_SAVE_AS, - "Salvar as definições de Shader atuais como uma nova predefinição de Shader." - ) + "Salvar as definições de Shader atuais como uma nova predefinição de Shader.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_SAVE_CORE, - "Salvar as definições de Shader atuais como a definição padrão para esta aplicação/núcleo." - ) + "Salvar as definições de Shader atuais como a definição padrão para esta aplicação/núcleo.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_SAVE_PARENT, + "Salve as configurações atuais do shader como as configurações padrão para todos os arquivos no diretório de conteúdo atual.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_SAVE_GAME, - "Salvar as definições de Shader atuais como a definição padrão para o conteúdo." - ) + "Salvar as definições de Shader atuais como a definição padrão para o conteúdo.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHADER_PARAMETERS, - "Modifica diretamente o Shader atual. As alterações não serão salvas no arquivo de predefinição." - ) + "Modifica diretamente o Shader atual. As alterações não serão salvas no arquivo de predefinição.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_PARAMETERS, - "Modifica a predefinição de Shader atualmente utilizada no menu." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_CHEAT_NUM_PASSES, - "Aumentar ou diminuir a quantidade de Trapaças." - ) + "Modifica a predefinição de Shader atualmente utilizada no menu.") +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_NUM_PASSES, + "Aumentar ou diminuir a quantidade de Trapaças." + ) MSG_HASH(MENU_ENUM_SUBLABEL_CHEAT_APPLY_CHANGES, - "As alterações de Trapaça terão efeito imediato." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_CHEAT_FILE_LOAD, - "Carregar um arquivo de Trapaça." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_CHEAT_FILE_SAVE_AS, - "Salvar as Trapaças atuais como um arquivo de Jogo-Salvo." - ) + "As alterações de Trapaça terão efeito imediato.") +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_FILE_LOAD, + "Carregar um arquivo de Trapaça." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_FILE_SAVE_AS, + "Salvar as Trapaças atuais como um arquivo de Jogo-Salvo." + ) MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SETTINGS, - "Acessar rapidamente todas as configurações relevantes ao jogo." - ) + "Acessar rapidamente todas as configurações relevantes ao jogo.") MSG_HASH(MENU_ENUM_SUBLABEL_CORE_INFORMATION, - "Visualizar informações sobre a aplicação/núcleo." - ) + "Visualizar informações sobre a aplicação/núcleo.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_ASPECT_RATIO, - "Valor em ponto flutuante da proporção de tela (largura / altura), utilizado se Proporção de Tela estiver definido como 'Configuração'." - ) + "Valor em ponto flutuante da proporção de tela (largura / altura), utilizado se Proporção de Tela estiver definido como 'Configuração'.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_HEIGHT, - "Personalizar a altura da janela de exibição que é usada se a Proporção de Tela estiver definida como 'Personalizada'." - ) + "Personalizar a altura da janela de exibição que é usada se a Proporção de Tela estiver definida como 'Personalizada'.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_WIDTH, - "Personalizar a largura da janela de exibição que é usada se a Proporção de Tela estiver definida como 'Personalizada'." - ) + "Personalizar a largura da janela de exibição que é usada se a Proporção de Tela estiver definida como 'Personalizada'.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_X, - "Deslocamento personalizado no eixo-X da janela de exibição. Será ignorado se a 'Escala em Inteiros' estiver habilitada. Neste caso ela será centralizada automaticamente." - ) + "Deslocamento personalizado no eixo-X da janela de exibição. Será ignorado se a 'Escala em Inteiros' estiver habilitada. Neste caso ela será centralizada automaticamente.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y, - "Deslocamento personalizado no eixo-Y da janela de exibição. Será ignorado se a 'Escala em Inteiros' estiver habilitada. Neste caso ela será centralizada automaticamente." - ) + "Deslocamento personalizado no eixo-Y da janela de exibição. Será ignorado se a 'Escala em Inteiros' estiver habilitada. Neste caso ela será centralizada automaticamente.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_USE_MITM_SERVER, - "Utilizar Servidor MITM" - ) + "Utilizar Servidor MITM") MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_USE_MITM_SERVER, - "Encaminhar conexões do Netplay através de um servidor 'homem no meio' (MITM). Útil se o hospedeiro estiver atrás de um firewall ou tiver problemas de NAT/UPnP.") + "Encaminhar conexões do Netplay através de um servidor 'homem no meio' (MITM). Útil se o hospedeiro estiver atrás de um firewall ou tiver problemas de NAT/UPnP.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_MITM_SERVER, "Localização do Servidor de Retransmissão") MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_MITM_SERVER, "Escolha um servidor de retransmissão específico para usar. Locais geograficamente mais próximos tendem a ter menor latência.") MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_MIXER, - "Adicionar ao mixer" - ) + "Adicionar ao mixer") MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_MIXER_AND_COLLECTION, - "Adicionar ao mixer" - ) + "Adicionar ao mixer") MSG_HASH(MENU_ENUM_LABEL_VALUE_FILTER_BY_CURRENT_CORE, - "Filtrar por núcleo atual" - ) -MSG_HASH(MSG_AUDIO_MIXER_VOLUME, - "Volume global do mixer de áudio" - ) -MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_MIXER_VOLUME, - "Volume global do mixer de áudio (em dB). 0dB é o volume normal, e nenhum ganho será aplicado." - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_AUDIO_MIXER_VOLUME, - "Nível de Volume do Mixer de Áudio (dB)" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_AUDIO_MIXER_MUTE, - "Mixer de Áudio Mudo" - ) + "Filtrar por núcleo atual") +MSG_HASH( + MSG_AUDIO_MIXER_VOLUME, + "Volume global do mixer de áudio" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_MIXER_VOLUME, + "Volume global do mixer de áudio (em dB). 0dB é o volume normal, e nenhum ganho será aplicado." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_MIXER_VOLUME, + "Nível de Volume do Mixer de Áudio (dB)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_MIXER_MUTE, + "Mixer de Áudio Mudo" + ) MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_MIXER_MUTE, - "Mixer de áudio mudo/não-mudo." - ) + "Mixer de áudio mudo/não-mudo.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_ONLINE_UPDATER, - "Exibir Atualizador Online" - ) + "Exibir Atualizador Online") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_ONLINE_UPDATER, - "Exibir a opção 'Atualizador Online'." - ) + "Exibir a opção 'Atualizador Online'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_VIEWS_SETTINGS, "Visualizações") MSG_HASH( @@ -4052,196 +3290,135 @@ MSG_HASH( "Exibir elementos na tela de menu." ) MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_CORE_UPDATER, - "Exibir Atualizador de Núcleos" - ) + "Exibir Atualizador de Núcleos") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_CORE_UPDATER, - "Exibir a opção de atualizar núcleos (e arquivos de informação de núcleo)." - ) + "Exibir a opção de atualizar núcleos (e arquivos de informação de núcleo).") MSG_HASH(MSG_PREPARING_FOR_CONTENT_SCAN, - "Preparando a busca de conteúdo..." - ) + "Preparando a busca de conteúdo...") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_DELETE, - "Remover núcleo" - ) + "Remover núcleo") MSG_HASH(MENU_ENUM_SUBLABEL_CORE_DELETE, - "Remover este núcleo do disco.") + "Remover este núcleo do disco.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_FRAMEBUFFER_OPACITY, - "Opacidade do Framebuffer" - ) + "Opacidade do Framebuffer") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_FRAMEBUFFER_OPACITY, - "Modificar a opacidade do framebuffer." - ) + "Modificar a opacidade do framebuffer.") MSG_HASH(MENU_ENUM_LABEL_VALUE_GOTO_FAVORITES, - "Favoritos" - ) + "Favoritos") MSG_HASH(MENU_ENUM_SUBLABEL_GOTO_FAVORITES, - "Conteúdo adicionado aos 'Favoritos' vai aparecer aqui." - ) + "Conteúdo adicionado aos 'Favoritos' vai aparecer aqui.") MSG_HASH(MENU_ENUM_LABEL_VALUE_GOTO_MUSIC, - "Músicas" - ) + "Músicas") MSG_HASH(MENU_ENUM_SUBLABEL_GOTO_MUSIC, - "Músicas que foram reproduzidas aparecem aqui." - ) + "Músicas que foram reproduzidas aparecem aqui.") MSG_HASH(MENU_ENUM_LABEL_VALUE_GOTO_IMAGES, - "Imagens" - ) + "Imagens") MSG_HASH(MENU_ENUM_SUBLABEL_GOTO_IMAGES, - "Imagens que foram exibidas aparecem aqui." - ) + "Imagens que foram exibidas aparecem aqui.") MSG_HASH(MENU_ENUM_LABEL_VALUE_GOTO_VIDEO, - "Vídeos" - ) + "Vídeos") MSG_HASH(MENU_ENUM_SUBLABEL_GOTO_VIDEO, - "Vídeos que foram reproduzidos aparecem aqui." - ) + "Vídeos que foram reproduzidos aparecem aqui.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_ICONS_ENABLE, - "Ícones do Menu" - ) + "Ícones do Menu") MSG_HASH(MENU_ENUM_SUBLABEL_MATERIALUI_ICONS_ENABLE, - "Habilitar/desabilitar os ícones exibidos do lado esquerdo dos itens de menu." - ) + "Habilitar/desabilitar os ícones exibidos do lado esquerdo dos itens de menu.") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MAIN_MENU_ENABLE_SETTINGS, - "Habilitar guia de configurações" - ) + "Habilitar guia de configurações") MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS_PASSWORD, - "Definir senha para habilitar guia de configurações" - ) + "Definir senha para habilitar guia de configurações") MSG_HASH(MSG_INPUT_ENABLE_SETTINGS_PASSWORD, - "Digite a senha" - ) + "Digite a senha") MSG_HASH(MSG_INPUT_ENABLE_SETTINGS_PASSWORD_OK, - "Senha correta." - ) + "Senha correta.") MSG_HASH(MSG_INPUT_ENABLE_SETTINGS_PASSWORD_NOK, - "Senha incorreta." - ) + "Senha incorreta.") MSG_HASH(MENU_ENUM_SUBLABEL_XMB_MAIN_MENU_ENABLE_SETTINGS, - "Habilita a guia de configurações. É necessário reiniciar para que a guia apareça." - ) + "Habilita a guia de configurações. É necessário reiniciar para que a guia apareça.") MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS_PASSWORD, - "O fornecimento de uma senha ao ocultar a guia de configurações permite restaurar mais tarde a partir do menu, indo para a guia Menu Principal, selecionando Habilitar guia configurações e inserindo a senha." - ) + "O fornecimento de uma senha ao ocultar a guia de configurações permite restaurar mais tarde a partir do menu, indo para a guia Menu Principal, selecionando Habilitar guia configurações e inserindo a senha.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_RENAME, - "Permita que o usuário renomeie as entradas nas coleções." - ) + "Permita que o usuário renomeie as entradas nas coleções.") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_RENAME, - "Permitir renomear entradas" ) + "Permitir renomear entradas" ) MSG_HASH(MENU_ENUM_SUBLABEL_RENAME_ENTRY, "Renomear o título da entrada.") MSG_HASH(MENU_ENUM_LABEL_VALUE_RENAME_ENTRY, "Renomear") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_LOAD_CORE, - "Exibir Carregar Núcleo" - ) + "Exibir 'Carregar Núcleo'") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_LOAD_CORE, - "Exibir/ocultar a opção 'Carregar Núcleo'." - ) + "Exibir/ocultar a opção 'Carregar Núcleo'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_LOAD_CONTENT, - "Exibir Carregar Conteúdo" - ) + "Exibir Carregar Conteúdo") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_LOAD_CONTENT, - "Exibir/ocultar a opção 'Carregar Conteúdo'." - ) + "Exibir/ocultar a opção 'Carregar Conteúdo'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_INFORMATION, - "Exibir Informação" - ) + "Exibir Informação") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_INFORMATION, - "Exibir/ocultar a opção 'Informação'." - ) + "Exibir/ocultar a opção 'Informação'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_CONFIGURATIONS, - "Exibir Configurações" - ) + "Exibir Configurações") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_CONFIGURATIONS, - "Exibir/ocultar a opção 'Configurações'." - ) + "Exibir/ocultar a opção 'Configurações'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_HELP, - "Exibir Ajuda" - ) + "Exibir Ajuda") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_HELP, - "Exibir/ocultar a opção 'Ajuda'." - ) + "Exibir/ocultar a opção 'Ajuda'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_QUIT_RETROARCH, - "Exibir Sair do RetroArch" - ) + "Exibir Sair do RetroArch") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_QUIT_RETROARCH, - "Exibir/ocultar a opção 'Sair do RetroArch'." - ) + "Exibir/ocultar a opção 'Sair do RetroArch'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_REBOOT, - "Exibir Reiniciar" - ) + "Exibir Reiniciar") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_REBOOT, - "Exibir/ocultar a opção 'Reiniciar'." - ) + "Exibir/ocultar a opção 'Reiniciar'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_VIEWS_SETTINGS, - "Menu Rápido" - ) + "Menu Rápido") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_VIEWS_SETTINGS, - "Exibir ou ocultar elementos na tela de Menu Rápido." - ) + "Exibir ou ocultar elementos na tela de Menu Rápido.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_TAKE_SCREENSHOT, - "Exibir Captura de Tela" - ) + "Exibir 'Captura de Tela'") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_TAKE_SCREENSHOT, - "Exibir/ocultar a opção 'Captura de Tela'." - ) + "Exibir/ocultar a opção 'Captura de Tela'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SAVE_LOAD_STATE, - "Exibir Salvar/Carregar Estado" - ) + "Exibir Salvar/Carregar Estado") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SAVE_LOAD_STATE, - "Exibir/ocultar as opções para salvar/carregar estados." - ) + "Exibir/ocultar as opções para salvar/carregar estados.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_UNDO_SAVE_LOAD_STATE, - "Exibir Desfazer Salvar/Carregar Estado" - ) + "Exibir Desfazer Salvar/Carregar Estado") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_UNDO_SAVE_LOAD_STATE, - "Exibir/ocultar as opções para abolir o salvar/carregar estado." - ) + "Exibir/ocultar as opções para abolir o salvar/carregar estado.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_ADD_TO_FAVORITES, - "Exibir Adicionar aos Favoritos" - ) + "Exibir Adicionar aos Favoritos") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_ADD_TO_FAVORITES, - "Exibir/ocultar a opção 'Adicionar aos Favoritos'." - ) + "Exibir/ocultar a opção 'Adicionar aos Favoritos'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_OPTIONS, - "Exibir Opções" - ) + "Exibir Opções") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_OPTIONS, - "Exibir/ocultar a opção 'Opções'." - ) + "Exibir/ocultar a opção 'Opções'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_CONTROLS, - "Exibir Controles" - ) + "Exibir Controles") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_CONTROLS, - "Exibir/ocultar a opção 'Controles'." - ) + "Exibir/ocultar a opção 'Controles'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_CHEATS, - "Exibir Trapaças" - ) + "Exibir Trapaças") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_CHEATS, - "Exibir/ocultar a opção 'Trapaças'." - ) + "Exibir/ocultar a opção 'Trapaças'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SHADERS, - "Exibir Shaders" - ) + "Exibir 'Shaders'") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SHADERS, - "Exibir/ocultar a opção 'Shaders'." - ) + "Exibir/ocultar a opção 'Shaders'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SAVE_CORE_OVERRIDES, - "Exibir Salvar Redefinição de Núcleo" - ) + "Exibir Salvar Redefinição de Núcleo") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SAVE_CORE_OVERRIDES, - "Exibir/ocultar a opção 'Salvar Redefinição de Núcleo'." - ) + "Exibir/ocultar a opção 'Salvar Redefinição de Núcleo'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SAVE_GAME_OVERRIDES, - "Exibir Salvar Redefinição de Jogo" - ) + "Exibir Salvar Redefinição de Jogo") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SAVE_GAME_OVERRIDES, - "Exibir/ocultar a opção 'Salvar Redefinição de Jogo'." - ) + "Exibir/ocultar a opção 'Salvar Redefinição de Jogo'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_INFORMATION, - "Exibir Informação" - ) + "Exibir Informação") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_INFORMATION, "Exibir/ocultar a opção 'Informação'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_ENABLE, @@ -4255,29 +3432,21 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_BLUE, MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_OPACITY, "Opacidade da Notificação de Fundo") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_DISABLE_KIOSK_MODE, - "Desabilitar o Modo Quiosque" - ) + "Desabilitar o Modo Quiosque") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_DISABLE_KIOSK_MODE, - "Desabilita o Modo Quiosque. É necessária uma reinicialização para que a mudança tenha total efeito." - ) + "Desabilita o Modo Quiosque. É necessária uma reinicialização para que a mudança tenha total efeito.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_ENABLE_KIOSK_MODE, - "Habilitar o Modo Quiosque" - ) + "Habilitar o Modo Quiosque") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_ENABLE_KIOSK_MODE, - "Protege a configuração escondendo todas as configurações relacionadas à configuração." - ) + "Protege a configuração escondendo todas as configurações relacionadas à configuração.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_KIOSK_MODE_PASSWORD, - "Definir senha para desabilitar o Modo Quiosque" - ) + "Definir senha para desabilitar o Modo Quiosque") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_KIOSK_MODE_PASSWORD, - "Fornecer uma senha ao habilitar o Modo Quiosque tornando possível desabilitar mais tarde a partir do menu, indo para o Menu Principal, selecionando Desabilitar o Modo Quiosque e inserindo a senha." - ) + "Fornecer uma senha ao habilitar o Modo Quiosque tornando possível desabilitar mais tarde a partir do menu, indo para o Menu Principal, selecionando Desabilitar o Modo Quiosque e inserindo a senha.") MSG_HASH(MSG_INPUT_KIOSK_MODE_PASSWORD, - "Digite a Senha" - ) + "Digite a Senha") MSG_HASH(MSG_INPUT_KIOSK_MODE_PASSWORD_OK, - "Senha correta." - ) + "Senha correta.") MSG_HASH(MSG_INPUT_KIOSK_MODE_PASSWORD_NOK, "Senha incorreta.") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_COLOR_RED, @@ -4317,32 +3486,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_STATISTICS_SHOW, MSG_HASH(MENU_ENUM_SUBLABEL_STATISTICS_SHOW, "Mostrar estatísticas técnicas na tela.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_RGUI_BORDER_FILLER_ENABLE, - "Enable border filler") + "Ativar preenchimento de borda") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_RGUI_BORDER_FILLER_THICKNESS_ENABLE, - "Enable border filler thickness") + "Ativar espessura de preenchimento de borda") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_RGUI_BACKGROUND_FILLER_THICKNESS_ENABLE, - "Enable background filler thickness") -MSG_HASH(MENU_ENUM_SUBLABEL_CRT_SWITCH_RESOLUTION, "For 15 kHz CRT displays only. Attempts to use exact core/game resolution and refresh rate.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CRT_SWITCH_RESOLUTION, "CRT SwitchRes") -MSG_HASH(MENU_ENUM_SUBLABEL_CRT_SWITCH_RESOLUTION_SUPER, "When CRT SwitchRes is enabled, force ultrawide horizontal resolution to minimize mode switching.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CRT_SWITCH_RESOLUTION_SUPER, "CRT Super Resolution") + "Ativar espessura de preenchimento do plano de fundo") +MSG_HASH(MENU_ENUM_SUBLABEL_CRT_SWITCH_RESOLUTION, "Para monitores CRT de 15 kHz apenas. Tenta usar a resolução exata do núcleo/jogo e a taxa de atualização.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CRT_SWITCH_RESOLUTION, "Trocar para Resolução CRT") +MSG_HASH(MENU_ENUM_SUBLABEL_CRT_SWITCH_RESOLUTION_SUPER, "Quando Trocar para Resolução CRT está ativada, força a resolução horizontal ultrawide para minimizar a alternância de modo.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CRT_SWITCH_RESOLUTION_SUPER, "Super Resolução CRT") MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_REWIND, - "Show Rewind Settings") + "Mostrar Configurações de Rebobinagem") MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SHOW_REWIND, - "Show/hide the Rewind options.") + "Mostrar/ocultar as opções de Rebobinagem.") MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SHOW_LATENCY, - "Show/hide the Latency options.") + "Mostrar/ocultar as opções de Latência.") MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_LATENCY, - "Show Latency Settings") + "Mostrar Configurações de Latência") MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SHOW_OVERLAYS, - "Show/hide the Overlay options.") + "Mostrar/ocultar as opções de Sobreposição.") MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_OVERLAYS, - "Show Overlay Settings") + "Mostrar Configurações de Sobreposição") MSG_HASH(MENU_ENUM_LABEL_VALUE_AUDIO_ENABLE_MENU, - "Enable menu audio") + "Ativar áudio de menu") MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_ENABLE_MENU, - "Enable or disable menu sound.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_AUDIO_MIXER_SETTINGS, - "Mixer Settings") -MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_MIXER_SETTINGS, - "View and/or modify audio mixer settings.") + "Ativar ou desativar o som do menu.") diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 81269e52d7..7bcc79b997 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -871,6 +871,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_GRAB_MOUSE_TOGGLE, "Grab mouse toggle") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_GAME_FOCUS_TOGGLE, "Game focus toggle") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_UI_COMPANION_TOGGLE, + "Desktop menu toggle") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, "Load state") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, @@ -1657,6 +1659,10 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_UI_COMPANION_ENABLE, "UI Companion Enable") MSG_HASH(MENU_ENUM_LABEL_VALUE_UI_COMPANION_START_ON_BOOT, "UI Companion Start On Boot") +MSG_HASH(MENU_ENUM_LABEL_VALUE_UI_COMPANION_TOGGLE, + "Show desktop menu on startup") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DESKTOP_MENU_ENABLE, + "Enable desktop menu (restart)") MSG_HASH(MENU_ENUM_LABEL_VALUE_UI_MENUBAR_ENABLE, "Menubar") MSG_HASH(MENU_ENUM_LABEL_VALUE_UNABLE_TO_READ_COMPRESSED_FILE, @@ -2034,7 +2040,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_HELP_LIST, MSG_HASH(MSG_ADDED_TO_FAVORITES, "Added to favorites") MSG_HASH(MSG_RESET_CORE_ASSOCIATION, - "Playlist entry core association has been reset.") + "Playlist entry core association has been reset.") MSG_HASH(MSG_APPENDED_DISK, "Appended disk") MSG_HASH(MSG_APPLICATION_DIR, @@ -3490,10 +3496,14 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_RGUI_BORDER_FILLER_THICKNESS_ENABLE, "Enable border filler thickness") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_RGUI_BACKGROUND_FILLER_THICKNESS_ENABLE, "Enable background filler thickness") -MSG_HASH(MENU_ENUM_SUBLABEL_CRT_SWITCH_RESOLUTION, "For 15 kHz CRT displays only. Attempts to use exact core/game resolution and refresh rate.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CRT_SWITCH_RESOLUTION, "CRT SwitchRes") -MSG_HASH(MENU_ENUM_SUBLABEL_CRT_SWITCH_RESOLUTION_SUPER, "When CRT SwitchRes is enabled, force ultrawide horizontal resolution to minimize mode switching.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CRT_SWITCH_RESOLUTION_SUPER, "CRT Super Resolution") +MSG_HASH(MENU_ENUM_SUBLABEL_CRT_SWITCH_RESOLUTION, + "For 15 kHz CRT displays only. Attempts to use exact core/game resolution and refresh rate.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CRT_SWITCH_RESOLUTION, + "CRT SwitchRes") +MSG_HASH(MENU_ENUM_SUBLABEL_CRT_SWITCH_RESOLUTION_SUPER, + "When CRT SwitchRes is enabled, force ultrawide horizontal resolution to minimize mode switching.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CRT_SWITCH_RESOLUTION_SUPER, + "CRT Super Resolution") MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_REWIND, "Show Rewind Settings") MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SHOW_REWIND, @@ -3514,3 +3524,121 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_AUDIO_MIXER_SETTINGS, "Mixer Settings") MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_MIXER_SETTINGS, "View and/or modify audio mixer settings.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_INFO, + "Info") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_FILE, + "&File") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_FILE_LOAD_CORE, + "&Load Core...") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_FILE_UNLOAD_CORE, + "&Unload Core") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_FILE_EXIT, + "E&xit") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_EDIT, + "&Edit") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_EDIT_SEARCH, + "&Search") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW, + "&View") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_CLOSED_DOCKS, + "Closed Docks") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS, + "&Options...") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_SAVE_DOCK_POSITIONS, + "Remember dock positions:") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_SAVE_GEOMETRY, + "Remember window geometry:") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_SAVE_LAST_TAB, + "Remember last content browser tab:") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_THEME, + "Theme") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_THEME_SYSTEM_DEFAULT, + "") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_THEME_DARK, + "Dark") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_THEME_CUSTOM, + "Custom...") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_TITLE, + "Options") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_LOAD_CUSTOM_CORE, + "Load Custom Core...") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_LOAD_CORE, + "Load Core") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_LOADING_CORE, + "Loading Core...") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_NAME, + "Name") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_CORE_VERSION, + "Version") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_TAB_PLAYLISTS, + "Playlists") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_TAB_FILE_BROWSER, + "File Browser") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_TAB_FILE_BROWSER_TOP, + "Top") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_TAB_FILE_BROWSER_UP, + "Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_DOCK_CONTENT_BROWSER, + "Content Browser") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_THUMBNAIL_BOXART, + "Boxart") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_THUMBNAIL_SCREENSHOT, + "Screenshot") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_THUMBNAIL_TITLE_SCREEN, + "Title Screen") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_ALL_PLAYLISTS, + "All Playlists") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_CORE, + "Core") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_CORE_INFO, + "Core Info") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_CORE_SELECTION_ASK, + "") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_INFORMATION, + "Information") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_WARNING, + "Warning") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_ERROR, + "Error") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_RESTART_TO_TAKE_EFFECT, + "Please restart the program for the changes to take effect.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_LOG, + "Log") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_SCAN_FINISHED, + "Scan Finished.

\n" + "In order for content to be correctly scanned, you must:\n" + "
  • have a compatible core already downloaded
  • \n" + "
  • have \"Core Info Files\" updated via Online Updater
  • \n" + "
  • have \"Databases\" updated via Online Updater
  • \n" + "
  • restart RetroArch if any of the above was just done
\n" + "Finally, the content must match existing databases from here. If it is still not working, consider submitting a bug report.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_DONT_SHOW_AGAIN, + "Don't show this again") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_STOP, + "Stop") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_ASSOCIATE_CORE, + "Associate Core") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_HIDDEN_PLAYLISTS, + "Hidden Playlists") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_HIDE, + "Hide") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_HIGHLIGHT_COLOR, + "Highlight Color") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_CHOOSE, + "&Choose...") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_SELECT_COLOR, + "Select Color") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_SELECT_THEME, + "Select Theme") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_CUSTOM_THEME, + "Custom Theme") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_FILE_PATH_IS_BLANK, + "File path is blank.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_FILE_IS_EMPTY, + "File is empty.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_FILE_READ_OPEN_FAILED, + "Could not open file for reading.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_FILE_DOES_NOT_EXIST, + "File does not exist.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_SUGGEST_LOADED_CORE_FIRST, + "Suggest loaded core first") diff --git a/libretro-common/audio/audio_mixer.c b/libretro-common/audio/audio_mixer.c index d7a99a4dec..685e4f8716 100644 --- a/libretro-common/audio/audio_mixer.c +++ b/libretro-common/audio/audio_mixer.c @@ -1236,3 +1236,19 @@ void audio_mixer_mix(float* buffer, size_t num_frames, float volume_override, bo *sample = 1.0f; } } + +float audio_mixer_voice_get_volume(audio_mixer_voice_t *voice) +{ + if (!voice) + return 0.0f; + + return voice->volume; +} + +void audio_mixer_voice_set_volume(audio_mixer_voice_t *voice, float val) +{ + if (!voice) + return; + + voice->volume = val; +} diff --git a/libretro-common/include/audio/audio_mixer.h b/libretro-common/include/audio/audio_mixer.h index a9c588372e..bb8d35d0c7 100644 --- a/libretro-common/include/audio/audio_mixer.h +++ b/libretro-common/include/audio/audio_mixer.h @@ -73,6 +73,10 @@ audio_mixer_voice_t* audio_mixer_play(audio_mixer_sound_t* sound, void audio_mixer_stop(audio_mixer_voice_t* voice); +float audio_mixer_voice_get_volume(audio_mixer_voice_t *voice); + +void audio_mixer_voice_set_volume(audio_mixer_voice_t *voice, float val); + void audio_mixer_mix(float* buffer, size_t num_frames, float volume_override, bool override); RETRO_END_DECLS diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index 45827cc6da..a015d5ec39 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -31,6 +31,7 @@ #include "../../tasks/tasks_internal.h" #include "../../input/input_driver.h" +#include "../../audio/audio_driver.h" #include "../../core.h" #include "../../core_info.h" #include "../../configuration.h" @@ -56,6 +57,26 @@ extern struct key_desc key_descriptors[RARCH_MAX_KEYS]; +static void menu_action_setting_audio_mixer_stream_volume( + 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) +{ + unsigned offset = (type - MENU_SETTINGS_AUDIO_MIXER_STREAM_ACTIONS_VOLUME_BEGIN); + + *w = 19; + strlcpy(s2, path, len2); + + if (offset >= AUDIO_MIXER_MAX_STREAMS) + return; + + snprintf(s, len, "%.2f dB", audio_driver_mixer_get_stream_volume(offset)); +} + static void menu_action_setting_disp_set_label_cheat_num_passes( file_list_t* list, unsigned *w, unsigned type, unsigned i, @@ -2094,7 +2115,13 @@ static int menu_cbs_init_bind_get_string_representation_compare_label( static int menu_cbs_init_bind_get_string_representation_compare_type( menu_file_list_cbs_t *cbs, unsigned type) { - if (type >= MENU_SETTINGS_INPUT_DESC_BEGIN + if (type >= MENU_SETTINGS_AUDIO_MIXER_STREAM_ACTIONS_VOLUME_BEGIN + && type <= MENU_SETTINGS_AUDIO_MIXER_STREAM_ACTIONS_VOLUME_END) + { + BIND_ACTION_GET_VALUE(cbs, + menu_action_setting_audio_mixer_stream_volume); + } + else if (type >= MENU_SETTINGS_INPUT_DESC_BEGIN && type <= MENU_SETTINGS_INPUT_DESC_END) { BIND_ACTION_GET_VALUE(cbs, diff --git a/menu/cbs/menu_cbs_left.c b/menu/cbs/menu_cbs_left.c index c39289f671..ecd86c7d0c 100644 --- a/menu/cbs/menu_cbs_left.c +++ b/menu/cbs/menu_cbs_left.c @@ -333,6 +333,23 @@ static int shader_action_parameter_left(unsigned type, const char *label, bool w return ret; } +static int audio_mixer_stream_volume_left(unsigned type, const char *label, + bool wraparound) +{ + unsigned offset = (type - MENU_SETTINGS_AUDIO_MIXER_STREAM_ACTIONS_VOLUME_BEGIN); + float orig_volume = 0.0f; + + if (offset >= AUDIO_MIXER_MAX_STREAMS) + return 0; + + orig_volume = audio_driver_mixer_get_stream_volume(offset); + orig_volume = orig_volume - 1.00f; + + audio_driver_mixer_set_stream_volume(offset, orig_volume); + + return 0; +} + static int action_left_cheat(unsigned type, const char *label, bool wraparound) { @@ -865,6 +882,11 @@ static int menu_cbs_init_bind_left_compare_type(menu_file_list_cbs_t *cbs, { BIND_ACTION_LEFT(cbs, action_left_cheat); } + else if (type >= MENU_SETTINGS_AUDIO_MIXER_STREAM_ACTIONS_VOLUME_BEGIN + && type <= MENU_SETTINGS_AUDIO_MIXER_STREAM_ACTIONS_VOLUME_END) + { + BIND_ACTION_LEFT(cbs, audio_mixer_stream_volume_left); + } else if (type >= MENU_SETTINGS_SHADER_PARAMETER_0 && type <= MENU_SETTINGS_SHADER_PARAMETER_LAST) { diff --git a/menu/cbs/menu_cbs_right.c b/menu/cbs/menu_cbs_right.c index 82b287240e..9d3b8ab9a5 100644 --- a/menu/cbs/menu_cbs_right.c +++ b/menu/cbs/menu_cbs_right.c @@ -30,6 +30,7 @@ #include "../menu_setting.h" #include "../menu_shader.h" +#include "../../audio/audio_driver.h" #include "../../configuration.h" #include "../../core.h" #include "../../core_info.h" @@ -56,8 +57,6 @@ static int generic_shader_action_parameter_right(struct video_shader_parameter * param->current += param->step; param->current = MIN(MAX(param->minimum, param->current), param->maximum); - if (ui_companion_is_on_foreground()) - ui_companion_driver_notify_refresh(); return 0; } @@ -73,7 +72,7 @@ int shader_action_parameter_right(unsigned type, const char *label, bool wraparo video_shader_driver_get_current_shader(&shader_info); param_prev = &shader_info.data->parameters[type - MENU_SETTINGS_SHADER_PARAMETER_0]; - param_menu = shader ? &shader->parameters[type - + param_menu = shader ? &shader->parameters[type - MENU_SETTINGS_SHADER_PARAMETER_0] : NULL; if (!param_prev || !param_menu) @@ -111,8 +110,8 @@ int action_right_input_desc_kbd(unsigned type, const char *label, if (!settings) return 0; - offset = type / ((MENU_SETTINGS_INPUT_DESC_KBD_END - - (MENU_SETTINGS_INPUT_DESC_KBD_END - + offset = type / ((MENU_SETTINGS_INPUT_DESC_KBD_END - + (MENU_SETTINGS_INPUT_DESC_KBD_END - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN))) - 1; id = (type / (offset + 1)) - MENU_SETTINGS_INPUT_DESC_KBD_BEGIN; @@ -161,7 +160,7 @@ int action_right_input_desc(unsigned type, const char *label, /* skip the not used buttons (unless they are at the end by calling the right desc function recursively also skip all the axes until analog remapping is implemented */ - if ((string_is_empty(system->input_desc_btn[user_idx][remap_idx]) && remap_idx < RARCH_CUSTOM_BIND_LIST_END) /*|| + if ((string_is_empty(system->input_desc_btn[user_idx][remap_idx]) && remap_idx < RARCH_CUSTOM_BIND_LIST_END) /*|| (remap_idx >= RARCH_FIRST_CUSTOM_BIND && remap_idx < RARCH_CUSTOM_BIND_LIST_END)*/) action_right_input_desc(type, label, wraparound); @@ -204,6 +203,24 @@ static int action_right_scroll(unsigned type, const char *label, return 0; } +static int audio_mixer_stream_volume_right(unsigned type, const char *label, + bool wraparound) +{ + unsigned offset = (type - MENU_SETTINGS_AUDIO_MIXER_STREAM_ACTIONS_VOLUME_BEGIN); + float orig_volume = 0.0f; + + if (offset >= AUDIO_MIXER_MAX_STREAMS) + return 0; + + orig_volume = audio_driver_mixer_get_stream_volume(offset); + orig_volume = orig_volume + 1.00f; + + audio_driver_mixer_set_stream_volume(offset, orig_volume); + + return 0; +} + + static int action_right_goto_tab(void) { menu_ctx_list_t list_info; @@ -211,7 +228,7 @@ static int action_right_goto_tab(void) file_list_t *menu_stack = menu_entries_get_menu_stack_ptr(0); size_t selection = menu_navigation_get_selection(); menu_file_list_cbs_t *cbs = selection_buf ? (menu_file_list_cbs_t*) - file_list_get_actiondata_at_offset(selection_buf, selection) : NULL; + file_list_get_actiondata_at_offset(selection_buf, selection) : NULL; list_info.type = MENU_LIST_HORIZONTAL; list_info.action = MENU_ACTION_RIGHT; @@ -483,6 +500,11 @@ static int menu_cbs_init_bind_right_compare_type(menu_file_list_cbs_t *cbs, { BIND_ACTION_RIGHT(cbs, action_right_cheat); } + else if (type >= MENU_SETTINGS_AUDIO_MIXER_STREAM_ACTIONS_VOLUME_BEGIN + && type <= MENU_SETTINGS_AUDIO_MIXER_STREAM_ACTIONS_VOLUME_END) + { + BIND_ACTION_RIGHT(cbs, audio_mixer_stream_volume_right); + } else if (type >= MENU_SETTINGS_SHADER_PARAMETER_0 && type <= MENU_SETTINGS_SHADER_PARAMETER_LAST) { diff --git a/menu/cbs/menu_cbs_start.c b/menu/cbs/menu_cbs_start.c index 4564ecdf8a..7917cc9b0d 100644 --- a/menu/cbs/menu_cbs_start.c +++ b/menu/cbs/menu_cbs_start.c @@ -28,6 +28,7 @@ #include "../menu_setting.h" #include "../menu_shader.h" +#include "../../audio/audio_driver.h" #include "../../configuration.h" #include "../../core.h" #include "../../core_info.h" @@ -49,6 +50,18 @@ cbs->action_start_ident = #name; #endif +static int action_start_audio_mixer_stream_volume(unsigned type, const char *label) +{ + unsigned offset = (type - MENU_SETTINGS_AUDIO_MIXER_STREAM_ACTIONS_VOLUME_BEGIN); + + if (offset >= AUDIO_MIXER_MAX_STREAMS) + return 0; + + audio_driver_mixer_set_stream_volume(offset, 1.0f); + + return 0; +} + static int action_start_remap_file_load(unsigned type, const char *label) { input_remapping_set_defaults(true); @@ -369,6 +382,13 @@ int menu_cbs_init_bind_start(menu_file_list_cbs_t *cbs, if (!cbs) return -1; + if (type >= MENU_SETTINGS_AUDIO_MIXER_STREAM_ACTIONS_VOLUME_BEGIN + && type <= MENU_SETTINGS_AUDIO_MIXER_STREAM_ACTIONS_VOLUME_END) + { + BIND_ACTION_START(cbs, action_start_audio_mixer_stream_volume); + return 0; + } + BIND_ACTION_START(cbs, action_start_lookup_setting); if (menu_cbs_init_bind_start_compare_label(cbs) == 0) diff --git a/menu/cbs/menu_cbs_title.c b/menu/cbs/menu_cbs_title.c index 2774e07718..f26b20263d 100644 --- a/menu/cbs/menu_cbs_title.c +++ b/menu/cbs/menu_cbs_title.c @@ -76,6 +76,13 @@ static int action_get_title_action_generic(const char *path, const char *label, return 0; \ } +static int action_get_title_mixer_stream_actions(const char *path, const char *label, unsigned menu_type, char *s, size_t len) +{ + unsigned offset = (menu_type - MENU_SETTINGS_AUDIO_MIXER_STREAM_ACTIONS_BEGIN); + snprintf(s, len, "Mixer Stream #%d", offset + 1); + return 0; +} + default_title_macro(action_get_user_accounts_cheevos_list, MENU_ENUM_LABEL_VALUE_ACCOUNTS_RETRO_ACHIEVEMENTS) default_title_macro(action_get_download_core_content_list, MENU_ENUM_LABEL_VALUE_DOWNLOAD_CORE_CONTENT) default_title_macro(action_get_user_accounts_list, MENU_ENUM_LABEL_VALUE_ACCOUNTS_LIST) @@ -1122,6 +1129,13 @@ int menu_cbs_init_bind_title(menu_file_list_cbs_t *cbs, if (menu_cbs_init_bind_title_compare_type(cbs, type) == 0) return 0; + + if (string_is_equal(label, + msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_MIXER_STREAM_SETTINGS_LIST))) + { + BIND_ACTION_GET_TITLE(cbs, action_get_title_mixer_stream_actions); + return 0; + } if (string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_RPL_ENTRY_ACTIONS))) { diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index d9e8a5fd1d..7d1e643ba7 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -2848,7 +2848,7 @@ static int menu_displaylist_parse_horizontal_content_actions( msg_hash_to_str(MENU_ENUM_LABEL_RUN), MENU_ENUM_LABEL_RUN, FILE_TYPE_PLAYLIST_ENTRY, 0, idx); - if (settings->bools.playlist_entry_rename && + if (settings->bools.playlist_entry_rename && !settings->bools.kiosk_mode_enable) menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RENAME_ENTRY), @@ -2856,7 +2856,7 @@ static int menu_displaylist_parse_horizontal_content_actions( MENU_ENUM_LABEL_RENAME_ENTRY, FILE_TYPE_PLAYLIST_ENTRY, 0, idx); - if (settings->bools.playlist_entry_remove && + if (settings->bools.playlist_entry_remove && !settings->bools.kiosk_mode_enable) menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DELETE_ENTRY), @@ -3413,20 +3413,20 @@ static int menu_displaylist_parse_playlists( MENU_ENUM_LABEL_SCAN_FILE, MENU_SETTING_ACTION, 0, 0); #endif - if (settings->bools.menu_content_show_favorites) + if (settings->bools.menu_content_show_favorites) menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_GOTO_FAVORITES), msg_hash_to_str(MENU_ENUM_LABEL_GOTO_FAVORITES), MENU_ENUM_LABEL_GOTO_FAVORITES, MENU_SETTING_ACTION, 0, 0); - if (settings->bools.menu_content_show_images) + if (settings->bools.menu_content_show_images) menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_GOTO_IMAGES), msg_hash_to_str(MENU_ENUM_LABEL_GOTO_IMAGES), MENU_ENUM_LABEL_GOTO_IMAGES, MENU_SETTING_ACTION, 0, 0); - if (settings->bools.menu_content_show_music) + if (settings->bools.menu_content_show_music) menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_GOTO_MUSIC), msg_hash_to_str(MENU_ENUM_LABEL_GOTO_MUSIC), @@ -3434,7 +3434,7 @@ static int menu_displaylist_parse_playlists( MENU_SETTING_ACTION, 0, 0); #ifdef HAVE_FFMPEG - if (settings->bools.menu_content_show_video) + if (settings->bools.menu_content_show_video) menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_GOTO_VIDEO), msg_hash_to_str(MENU_ENUM_LABEL_GOTO_VIDEO), @@ -4265,10 +4265,13 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) char lbl_play_looped[128]; char lbl_remove[128]; char lbl_stop[128]; + char lbl_volume[128]; unsigned id = info->type - MENU_SETTINGS_AUDIO_MIXER_STREAM_ACTIONS_BEGIN; lbl_remove[0] = lbl_stop[0] = lbl_play[0] = lbl_play_looped[0] = '\0'; + lbl_volume[0] = '\0'; + snprintf(lbl_volume, sizeof(lbl_volume), "mixer_stream_%d_action_volume", id); snprintf(lbl_stop, sizeof(lbl_stop), "mixer_stream_%d_action_stop", id); snprintf(lbl_remove, sizeof(lbl_remove), "mixer_stream_%d_action_remove", id); snprintf(lbl_play, sizeof(lbl_play), "mixer_stream_%d_action_play", id); @@ -4298,6 +4301,12 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) MSG_UNKNOWN, (MENU_SETTINGS_AUDIO_MIXER_STREAM_ACTIONS_REMOVE_BEGIN + id), 0, 0); + menu_entries_append_enum(info->list, + "Volume", + lbl_volume, + MSG_UNKNOWN, + (MENU_SETTINGS_AUDIO_MIXER_STREAM_ACTIONS_VOLUME_BEGIN + id), + 0, 0); } info->need_push = true; @@ -5541,7 +5550,14 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_UI_MENUBAR_ENABLE, PARSE_ONLY_BOOL, false); - +#ifdef HAVE_QT + menu_displaylist_parse_settings_enum(menu, info, + MENU_ENUM_LABEL_DESKTOP_MENU_ENABLE, + PARSE_ONLY_BOOL, false); + menu_displaylist_parse_settings_enum(menu, info, + MENU_ENUM_LABEL_UI_COMPANION_TOGGLE, + PARSE_ONLY_BOOL, false); +#endif info->need_refresh = true; info->need_push = true; break; @@ -6424,21 +6440,21 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) MENU_ENUM_LABEL_FAVORITES, MENU_SETTING_ACTION, 0, 0); - if (settings->bools.menu_content_show_favorites) + if (settings->bools.menu_content_show_favorites) menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_GOTO_FAVORITES), msg_hash_to_str(MENU_ENUM_LABEL_GOTO_FAVORITES), MENU_ENUM_LABEL_GOTO_FAVORITES, MENU_SETTING_ACTION, 0, 0); - if (settings->bools.menu_content_show_images) + if (settings->bools.menu_content_show_images) menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_GOTO_IMAGES), msg_hash_to_str(MENU_ENUM_LABEL_GOTO_IMAGES), MENU_ENUM_LABEL_GOTO_IMAGES, MENU_SETTING_ACTION, 0, 0); - if (settings->bools.menu_content_show_music) + if (settings->bools.menu_content_show_music) menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_GOTO_MUSIC), msg_hash_to_str(MENU_ENUM_LABEL_GOTO_MUSIC), @@ -6446,7 +6462,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) MENU_SETTING_ACTION, 0, 0); #ifdef HAVE_FFMPEG - if (settings->bools.menu_content_show_video) + if (settings->bools.menu_content_show_video) menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_GOTO_VIDEO), msg_hash_to_str(MENU_ENUM_LABEL_GOTO_VIDEO), @@ -6617,7 +6633,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) if (frontend_driver_has_fork()) #endif { - if (settings->bools.menu_show_load_core) + if (settings->bools.menu_show_load_core) menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_CORE_LIST, PARSE_ACTION, false); } diff --git a/menu/menu_driver.h b/menu/menu_driver.h index d31d08b56b..c9286ede6b 100644 --- a/menu/menu_driver.h +++ b/menu/menu_driver.h @@ -201,6 +201,8 @@ enum menu_settings_type MENU_SETTINGS_AUDIO_MIXER_STREAM_ACTIONS_PLAY_END = MENU_SETTINGS_AUDIO_MIXER_STREAM_ACTIONS_PLAY_BEGIN + 7, MENU_SETTINGS_AUDIO_MIXER_STREAM_ACTIONS_PLAY_LOOPED_BEGIN, MENU_SETTINGS_AUDIO_MIXER_STREAM_ACTIONS_PLAY_LOOPED_END = MENU_SETTINGS_AUDIO_MIXER_STREAM_ACTIONS_PLAY_LOOPED_BEGIN + 7, + MENU_SETTINGS_AUDIO_MIXER_STREAM_ACTIONS_VOLUME_BEGIN, + MENU_SETTINGS_AUDIO_MIXER_STREAM_ACTIONS_VOLUME_END = MENU_SETTINGS_AUDIO_MIXER_STREAM_ACTIONS_VOLUME_BEGIN + 7, MENU_SETTINGS_BIND_BEGIN, MENU_SETTINGS_BIND_LAST = MENU_SETTINGS_BIND_BEGIN + RARCH_ANALOG_RIGHT_Y_MINUS, MENU_SETTINGS_BIND_ALL_LAST = MENU_SETTINGS_BIND_BEGIN + RARCH_MENU_TOGGLE, diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 5219aa4fce..c77609d10b 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -4601,7 +4601,10 @@ static bool setting_append_list( { if (!input_config_bind_map_get_meta(i)) continue; - +#ifndef HAVE_QT + if (i == RARCH_UI_COMPANION_TOGGLE) + continue; +#endif CONFIG_BIND_ALT( list, list_info, &input_config_binds[0][i], @@ -5630,7 +5633,7 @@ static bool setting_append_list( general_write_handler, general_read_handler); menu_settings_list_current_add_range(list, list_info, 0, XMB_THEME_LAST-1, 1, true, true); - } + } #endif CONFIG_BOOL( list, list_info, @@ -5804,20 +5807,20 @@ static bool setting_append_list( SD_FLAG_NONE); settings_data_list_current_add_flags(list, list_info, SD_FLAG_LAKKA_ADVANCED); - CONFIG_STRING( - list, list_info, - settings->paths.menu_content_show_settings_password, - sizeof(settings->paths.menu_content_show_settings_password), - MENU_ENUM_LABEL_CONTENT_SHOW_SETTINGS_PASSWORD, - MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS_PASSWORD, - "", - &group_info, - &subgroup_info, - parent_group, - general_write_handler, - general_read_handler); - settings_data_list_current_add_flags(list, list_info, SD_FLAG_ALLOW_INPUT | SD_FLAG_LAKKA_ADVANCED); - } + CONFIG_STRING( + list, list_info, + settings->paths.menu_content_show_settings_password, + sizeof(settings->paths.menu_content_show_settings_password), + MENU_ENUM_LABEL_CONTENT_SHOW_SETTINGS_PASSWORD, + MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS_PASSWORD, + "", + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + settings_data_list_current_add_flags(list, list_info, SD_FLAG_ALLOW_INPUT | SD_FLAG_LAKKA_ADVANCED); + } #endif CONFIG_BOOL( @@ -6054,7 +6057,7 @@ static bool setting_append_list( general_write_handler, general_read_handler); menu_settings_list_current_add_range(list, list_info, 0, 3, 1, true, true); - + CONFIG_BOOL( list, list_info, &settings->bools.menu_xmb_vertical_thumbnails, @@ -6516,8 +6519,37 @@ static bool setting_append_list( general_read_handler, SD_FLAG_NONE); } +#ifdef HAVE_QT + CONFIG_BOOL( + list, list_info, + &settings->bools.desktop_menu_enable, + MENU_ENUM_LABEL_DESKTOP_MENU_ENABLE, + MENU_ENUM_LABEL_VALUE_DESKTOP_MENU_ENABLE, + desktop_menu_enable, + MENU_ENUM_LABEL_VALUE_OFF, + MENU_ENUM_LABEL_VALUE_ON, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler, + SD_FLAG_ADVANCED); - + CONFIG_BOOL( + list, list_info, + &settings->bools.ui_companion_toggle, + MENU_ENUM_LABEL_UI_COMPANION_TOGGLE, + MENU_ENUM_LABEL_VALUE_UI_COMPANION_TOGGLE, + ui_companion_toggle, + MENU_ENUM_LABEL_VALUE_OFF, + MENU_ENUM_LABEL_VALUE_ON, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler, + SD_FLAG_ADVANCED); +#endif END_SUB_GROUP(list, list_info, parent_group); END_GROUP(list, list_info, parent_group); break; @@ -6562,7 +6594,7 @@ static bool setting_append_list( END_SUB_GROUP(list, list_info, parent_group); - START_SUB_GROUP(list, list_info, "Playlist", &group_info, &subgroup_info, parent_group); + START_SUB_GROUP(list, list_info, "Playlist", &group_info, &subgroup_info, parent_group); CONFIG_BOOL( list, list_info, @@ -6579,7 +6611,7 @@ static bool setting_append_list( general_read_handler, SD_FLAG_NONE); - CONFIG_BOOL( + CONFIG_BOOL( list, list_info, &settings->bools.playlist_entry_remove, MENU_ENUM_LABEL_PLAYLIST_ENTRY_REMOVE, diff --git a/msg_hash.h b/msg_hash.h index 89314172c7..d4411f9b26 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -630,6 +630,7 @@ enum msg_hash_enums MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_GRAB_MOUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GAME_FOCUS_TOGGLE, + MENU_ENUM_LABEL_VALUE_INPUT_META_UI_COMPANION_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_DEVICE_INDEX, @@ -806,6 +807,8 @@ enum msg_hash_enums MENU_LABEL(VIDEO_DISABLE_COMPOSITION), MENU_LABEL(UI_COMPANION_ENABLE), MENU_LABEL(UI_COMPANION_START_ON_BOOT), + MENU_LABEL(UI_COMPANION_TOGGLE), + MENU_LABEL(DESKTOP_MENU_ENABLE), MENU_LABEL(UI_MENUBAR_ENABLE), MENU_ENUM_LABEL_FILE_CONFIG, @@ -1770,6 +1773,63 @@ enum msg_hash_enums MENU_LABEL(NETPLAY_MITM_SERVER), MENU_LABEL(VIDEO_WINDOW_SHOW_DECORATIONS), + MENU_ENUM_LABEL_VALUE_QT_INFO, + MENU_ENUM_LABEL_VALUE_QT_MENU_FILE, + MENU_ENUM_LABEL_VALUE_QT_MENU_FILE_LOAD_CORE, + MENU_ENUM_LABEL_VALUE_QT_MENU_FILE_UNLOAD_CORE, + MENU_ENUM_LABEL_VALUE_QT_MENU_FILE_EXIT, + MENU_ENUM_LABEL_VALUE_QT_MENU_EDIT, + MENU_ENUM_LABEL_VALUE_QT_MENU_EDIT_SEARCH, + MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW, + MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_CLOSED_DOCKS, + MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS, + MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_SAVE_DOCK_POSITIONS, + MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_SAVE_GEOMETRY, + MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_SAVE_LAST_TAB, + MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_THEME, + MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_THEME_SYSTEM_DEFAULT, + MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_THEME_DARK, + MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_THEME_CUSTOM, + MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_TITLE, + MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_HIGHLIGHT_COLOR, + MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_SUGGEST_LOADED_CORE_FIRST, + MENU_ENUM_LABEL_VALUE_QT_MENU_DOCK_CONTENT_BROWSER, + MENU_ENUM_LABEL_VALUE_QT_THUMBNAIL_BOXART, + MENU_ENUM_LABEL_VALUE_QT_THUMBNAIL_SCREENSHOT, + MENU_ENUM_LABEL_VALUE_QT_THUMBNAIL_TITLE_SCREEN, + MENU_ENUM_LABEL_VALUE_QT_LOAD_CORE, + MENU_ENUM_LABEL_VALUE_QT_LOAD_CUSTOM_CORE, + MENU_ENUM_LABEL_VALUE_QT_LOADING_CORE, + MENU_ENUM_LABEL_VALUE_QT_NAME, + MENU_ENUM_LABEL_VALUE_QT_CORE_VERSION, + MENU_ENUM_LABEL_VALUE_QT_TAB_PLAYLISTS, + MENU_ENUM_LABEL_VALUE_QT_TAB_FILE_BROWSER, + MENU_ENUM_LABEL_VALUE_QT_TAB_FILE_BROWSER_TOP, + MENU_ENUM_LABEL_VALUE_QT_TAB_FILE_BROWSER_UP, + MENU_ENUM_LABEL_VALUE_QT_ALL_PLAYLISTS, + MENU_ENUM_LABEL_VALUE_QT_CORE, + MENU_ENUM_LABEL_VALUE_QT_CORE_INFO, + MENU_ENUM_LABEL_VALUE_QT_CORE_SELECTION_ASK, + MENU_ENUM_LABEL_VALUE_QT_INFORMATION, + MENU_ENUM_LABEL_VALUE_QT_WARNING, + MENU_ENUM_LABEL_VALUE_QT_ERROR, + MENU_ENUM_LABEL_VALUE_QT_RESTART_TO_TAKE_EFFECT, + MENU_ENUM_LABEL_VALUE_QT_LOG, + MENU_ENUM_LABEL_VALUE_QT_SCAN_FINISHED, + MENU_ENUM_LABEL_VALUE_QT_DONT_SHOW_AGAIN, + MENU_ENUM_LABEL_VALUE_QT_STOP, + MENU_ENUM_LABEL_VALUE_QT_ASSOCIATE_CORE, + MENU_ENUM_LABEL_VALUE_QT_HIDDEN_PLAYLISTS, + MENU_ENUM_LABEL_VALUE_QT_HIDE, + MENU_ENUM_LABEL_VALUE_QT_CHOOSE, + MENU_ENUM_LABEL_VALUE_QT_SELECT_COLOR, + MENU_ENUM_LABEL_VALUE_QT_SELECT_THEME, + MENU_ENUM_LABEL_VALUE_QT_CUSTOM_THEME, + MENU_ENUM_LABEL_VALUE_QT_FILE_PATH_IS_BLANK, + MENU_ENUM_LABEL_VALUE_QT_FILE_IS_EMPTY, + MENU_ENUM_LABEL_VALUE_QT_FILE_READ_OPEN_FAILED, + MENU_ENUM_LABEL_VALUE_QT_FILE_DOES_NOT_EXIST, + MSG_LAST }; diff --git a/qb/config.libs.sh b/qb/config.libs.sh index 701d8c162d..3e30d42185 100644 --- a/qb/config.libs.sh +++ b/qb/config.libs.sh @@ -270,6 +270,28 @@ check_val '' PULSE -lpulse check_val '' SDL -lSDL SDL check_val '' SDL2 -lSDL2 SDL2 +if [ "$HAVE_QT" != 'no' ]; then + check_pkgconf QT5CORE Qt5Core 5.2 + check_pkgconf QT5GUI Qt5Gui 5.2 + check_pkgconf QT5WIDGETS Qt5Widgets 5.2 + #check_pkgconf QT5WEBENGINE Qt5WebEngine 5.4 + + check_val '' QT5CORE -lQt5Core QT5CORE + check_val '' QT5GUI -lQt5Gui QT5GUI + check_val '' QT5WIDGETS -lQt5Widgets QT5WIDGETS + #check_val '' QT5WEBENGINE -lQt5WebEngine QT5WEBENGINE + + if [ "$HAVE_QT5CORE" = "no" ] || [ "$HAVE_QT5GUI" = "no" ] || [ "$HAVE_QT5WIDGETS" = "no" ]; then + die 1 'Error: Qt support requested, but required libraries could not be found.' + else + HAVE_QT=yes + fi + + #if [ "$HAVE_QT5WEBENGINE" = "no" ]; then + # die : 'Notice: Qt5WebEngine not found, disabling web browser support.' + #fi +fi + if [ "$HAVE_SDL2" = 'yes' ] && [ "$HAVE_SDL" = 'yes' ]; then die : 'Notice: SDL drivers will be replaced by SDL2 ones.' HAVE_SDL=no diff --git a/qb/config.params.sh b/qb/config.params.sh index 126744aabe..487bc003a5 100644 --- a/qb/config.params.sh +++ b/qb/config.params.sh @@ -101,8 +101,8 @@ HAVE_PRESERVE_DYLIB=no # Enable dlclose() for Valgrind support HAVE_PARPORT=auto # Parallel port joypad support HAVE_IMAGEVIEWER=yes # Built-in image viewer support. HAVE_MMAP=auto # MMAP support -HAVE_QT=no # Qt companion support -HAVE_QT_WRAPPER=no # Qt wrapper support +HAVE_QT=auto # Qt companion support +C89_QT=no HAVE_XSHM=no # XShm video driver support HAVE_CHEEVOS=yes # Retro Achievements HAVE_SHADERPIPELINE=yes # Additional shader-based pipelines diff --git a/qb/qb.comp.sh b/qb/qb.comp.sh index 147715443d..e47d512df0 100644 --- a/qb/qb.comp.sh +++ b/qb/qb.comp.sh @@ -83,6 +83,15 @@ if [ "$OS" = "Win32" ]; then echo "$echobuf ... $WINDRES" fi +if [ "$HAVE_QT" != "no" ]; then + echobuf="Checking for moc" + if [ -z "$MOC" ]; then + MOC="$(exists "moc")" || MOC="" + [ -z "$MOC" ] && die 1 "$echobuf ... Not found. Exiting." + fi + echo "$echobuf ... $MOC" +fi + if [ -z "$PKG_CONF_PATH" ]; then PKG_CONF_PATH="none" for pkgconf in pkgconf pkg-config; do diff --git a/qb/qb.libs.sh b/qb/qb.libs.sh index 453de6a612..2cf00c5998 100644 --- a/qb/qb.libs.sh +++ b/qb/qb.libs.sh @@ -226,6 +226,7 @@ create_config_make() [ "$USE_LANG_CXX" = 'yes' ] && printf %s\\n "CXX = $CXX" "CXXFLAGS = $CXXFLAGS" printf %s\\n "WINDRES = $WINDRES" \ + "MOC = $MOC" \ "ASFLAGS = $ASFLAGS" \ "LDFLAGS = $LDFLAGS" \ "INCLUDE_DIRS = $INCLUDE_DIRS" \ diff --git a/retroarch.c b/retroarch.c index 1d7edabe73..788ee318af 100644 --- a/retroarch.c +++ b/retroarch.c @@ -222,6 +222,7 @@ static bool rarch_ups_pref = false; static bool rarch_bps_pref = false; static bool rarch_ips_pref = false; static bool rarch_patch_blocked = false; +static bool rarch_first_start = true; static bool runloop_force_nonblock = false; static bool runloop_paused = false; @@ -238,7 +239,9 @@ static bool runloop_remaps_game_active = false; static bool runloop_game_options_active = false; static bool runloop_missing_bios = false; static bool runloop_autosave = false; - +#ifdef HAVE_DYNAMIC +static bool core_set_on_cmdline = false; +#endif static rarch_system_info_t runloop_system; static struct retro_frame_time_callback runloop_frame_time; static retro_keyboard_event_t runloop_key_event = NULL; @@ -258,6 +261,13 @@ static retro_time_t frame_limit_last_time = 0.0; extern bool input_driver_flushing_input; +#ifdef HAVE_DYNAMIC +bool retroarch_core_set_on_cmdline(void) +{ + return core_set_on_cmdline; +} +#endif + #ifdef HAVE_THREADS void runloop_msg_queue_lock(void) { @@ -864,6 +874,11 @@ static void retroarch_parse_input_and_config(int argc, char *argv[]) { settings_t *settings = config_get_ptr(); + if (rarch_first_start) + { + core_set_on_cmdline = true; + } + path_clear(RARCH_PATH_CORE); strlcpy(settings->paths.directory_libretro, optarg, sizeof(settings->paths.directory_libretro)); @@ -876,6 +891,11 @@ static void retroarch_parse_input_and_config(int argc, char *argv[]) } else if (filestream_exists(optarg)) { + if (rarch_first_start) + { + core_set_on_cmdline = true; + } + rarch_ctl(RARCH_CTL_SET_LIBRETRO_PATH, optarg); retroarch_override_setting_set(RARCH_OVERRIDE_SETTING_LIBRETRO, NULL); @@ -1352,11 +1372,18 @@ bool retroarch_main_init(int argc, char *argv[]) rarch_error_on_init = false; rarch_is_inited = true; + if (rarch_first_start) + rarch_first_start = false; + return true; error: command_event(CMD_EVENT_CORE_DEINIT, NULL); rarch_is_inited = false; + + if (rarch_first_start) + rarch_first_start = false; + return false; } @@ -1821,8 +1848,6 @@ bool rarch_ctl(enum rarch_ctl_state state, void *data) if (!idx) return false; core_option_manager_prev(runloop_core_options, *idx); - if (ui_companion_is_on_foreground()) - ui_companion_driver_notify_refresh(); } break; case RARCH_CTL_CORE_OPTION_NEXT: @@ -1831,8 +1856,6 @@ bool rarch_ctl(enum rarch_ctl_state state, void *data) if (!idx) return false; core_option_manager_next(runloop_core_options, *idx); - if (ui_companion_is_on_foreground()) - ui_companion_driver_notify_refresh(); } break; case RARCH_CTL_CORE_OPTIONS_GET: @@ -2322,13 +2345,8 @@ void runloop_msg_queue_push(const char *msg, msg_queue_push(runloop_msg_queue, msg_info.msg, msg_info.prio, msg_info.duration); - if (ui_companion_is_on_foreground()) - { - const ui_companion_driver_t *ui = ui_companion_get_ptr(); - if (ui->msg_queue_push) - ui->msg_queue_push(msg_info.msg, - msg_info.prio, msg_info.duration, msg_info.flush); - } + ui_companion_driver_msg_queue_push(msg_info.msg, + msg_info.prio, msg_info.duration, msg_info.flush); } #ifdef HAVE_THREADS @@ -2452,10 +2470,10 @@ static enum runloop_state runloop_check_state( #ifdef HAVE_MENU if (menu_is_alive && !(settings->bools.menu_unified_controls && !menu_input_dialog_get_display_kb())) - input_menu_keys_pressed(settings, ¤t_input); + input_menu_keys_pressed(settings, ¤t_input); else #endif - input_keys_pressed(settings, ¤t_input); + input_keys_pressed(settings, ¤t_input); #ifdef HAVE_MENU last_input = current_input; @@ -2659,7 +2677,6 @@ static enum runloop_state runloop_check_state( if (runloop_idle) return RUNLOOP_STATE_SLEEP; - /* Check game focus toggle */ { static bool old_pressed = false; @@ -2672,6 +2689,20 @@ static enum runloop_state runloop_check_state( old_pressed = pressed; } + /* Check UI companion toggle */ + { + static bool old_pressed = false; + bool pressed = BIT256_GET( + current_input, RARCH_UI_COMPANION_TOGGLE); + + if (pressed && !old_pressed) + { + command_event(CMD_EVENT_UI_COMPANION_TOGGLE, (void*)(intptr_t)0); + } + + old_pressed = pressed; + } + #ifdef HAVE_MENU /* Check menu toggle */ { @@ -2970,7 +3001,9 @@ static enum runloop_state runloop_check_state( } /* Checks if slowmotion toggle/hold was being pressed and/or held. */ - +#ifdef HAVE_CHEEVOS + if (!settings->bools.cheevos_enable) +#endif { static bool old_slowmotion_button_state = false; static bool old_slowmotion_hold_button_state = false; diff --git a/retroarch.cfg b/retroarch.cfg index 019c14c326..b399933a2f 100644 --- a/retroarch.cfg +++ b/retroarch.cfg @@ -729,6 +729,12 @@ video_message_bgcolor_opacity = 1.0 # Start UI companion driver's interface on boot (if available). # ui_companion_start_on_boot = true +# Toggle companion UI on startup (currently only used to show the WIMP UI) +# ui_companion_toggle = false + +# Only init the WIMP UI for this session if this is enabled +# desktop_menu_enable = true + #### Camera # Override the default camera device the camera driver uses. This is driver dependant. diff --git a/retroarch.h b/retroarch.h index 63c37428f1..02abfae515 100644 --- a/retroarch.h +++ b/retroarch.h @@ -357,6 +357,10 @@ void runloop_msg_queue_lock(void); void runloop_msg_queue_unlock(void); #endif +#ifdef HAVE_DYNAMIC +bool retroarch_core_set_on_cmdline(void); +#endif + RETRO_END_DECLS #endif diff --git a/tasks/task_audio_mixer.c b/tasks/task_audio_mixer.c index 9ba7b6ad64..69772849fe 100644 --- a/tasks/task_audio_mixer.c +++ b/tasks/task_audio_mixer.c @@ -89,7 +89,7 @@ static void task_audio_mixer_handle_upload_ogg(void *task_data, if (!img) return; - params.volume = 0.0f; + params.volume = 1.0f; params.type = AUDIO_MIXER_TYPE_OGG; params.state = AUDIO_STREAM_STATE_PLAYING; params.buf = img->buf; @@ -111,7 +111,7 @@ static void task_audio_mixer_handle_upload_flac(void *task_data, if (!img) return; - params.volume = 0.0f; + params.volume = 1.0f; params.type = AUDIO_MIXER_TYPE_FLAC; params.state = AUDIO_STREAM_STATE_PLAYING; params.buf = img->buf; @@ -133,7 +133,7 @@ static void task_audio_mixer_handle_upload_mp3(void *task_data, if (!img) return; - params.volume = 0.0f; + params.volume = 1.0f; params.type = AUDIO_MIXER_TYPE_MP3; params.state = AUDIO_STREAM_STATE_PLAYING; params.buf = img->buf; @@ -155,7 +155,7 @@ static void task_audio_mixer_handle_upload_mod(void *task_data, if (!img) return; - params.volume = 0.0f; + params.volume = 1.0f; params.type = AUDIO_MIXER_TYPE_MOD; params.state = AUDIO_STREAM_STATE_PLAYING; params.buf = img->buf; @@ -177,7 +177,7 @@ static void task_audio_mixer_handle_upload_wav(void *task_data, if (!img) return; - params.volume = 0.0f; + params.volume = 1.0f; params.type = AUDIO_MIXER_TYPE_WAV; params.state = AUDIO_STREAM_STATE_PLAYING; params.buf = img->buf; diff --git a/tasks/task_database.c b/tasks/task_database.c index 5e9fbdec46..285cef0118 100644 --- a/tasks/task_database.c +++ b/tasks/task_database.c @@ -38,7 +38,7 @@ #include "../retroarch.h" #endif #include "../verbosity.h" - +#include "../ui/ui_companion_driver.h" #ifndef COLLECTION_SIZE #define COLLECTION_SIZE 99999 #endif @@ -1264,6 +1264,7 @@ static void task_database_handler(retro_task_t *task) #else fprintf(stderr, "msg: %s\n", msg); #endif + ui_companion_driver_notify_refresh(); goto task_finished; } break; diff --git a/ui/drivers/cocoa/ui_cocoa_application.m b/ui/drivers/cocoa/ui_cocoa_application.m index 1feffc6c95..14975b3c10 100644 --- a/ui/drivers/cocoa/ui_cocoa_application.m +++ b/ui/drivers/cocoa/ui_cocoa_application.m @@ -23,9 +23,9 @@ #include "cocoa_common.h" #include "../../ui_companion_driver.h" -static bool ui_application_cocoa_initialize(void) +static void* ui_application_cocoa_initialize(void) { - return true; + return NULL; } static bool ui_application_cocoa_pending_events(void) @@ -49,9 +49,16 @@ static void ui_application_cocoa_process_events(void) } } -const ui_application_t ui_application_cocoa = { +static void ui_application_cocoa_run(void *args) +{ + (void)args; +} + +ui_application_t ui_application_cocoa = { ui_application_cocoa_initialize, ui_application_cocoa_pending_events, ui_application_cocoa_process_events, + ui_application_cocoa_run, + NULL, "cocoa" }; diff --git a/ui/drivers/cocoa/ui_cocoa_browser_window.m b/ui/drivers/cocoa/ui_cocoa_browser_window.m index c688a62b65..af96902c1c 100644 --- a/ui/drivers/cocoa/ui_cocoa_browser_window.m +++ b/ui/drivers/cocoa/ui_cocoa_browser_window.m @@ -60,7 +60,7 @@ static bool ui_browser_window_cocoa_save(ui_browser_window_state_t *state) return false; } -const ui_browser_window_t ui_browser_window_cocoa = { +ui_browser_window_t ui_browser_window_cocoa = { ui_browser_window_cocoa_open, ui_browser_window_cocoa_save, "cocoa" diff --git a/ui/drivers/cocoa/ui_cocoa_msg_window.m b/ui/drivers/cocoa/ui_cocoa_msg_window.m index 3a9892c79f..d5e4ec9713 100644 --- a/ui/drivers/cocoa/ui_cocoa_msg_window.m +++ b/ui/drivers/cocoa/ui_cocoa_msg_window.m @@ -129,7 +129,7 @@ static enum ui_msg_window_response ui_msg_window_cocoa_warning(ui_msg_window_sta return ui_msg_window_cocoa_dialog(state, UI_MSG_WINDOW_TYPE_WARNING); } -const ui_msg_window_t ui_msg_window_cocoa = { +ui_msg_window_t ui_msg_window_cocoa = { ui_msg_window_cocoa_error, ui_msg_window_cocoa_information, ui_msg_window_cocoa_question, diff --git a/ui/drivers/cocoa/ui_cocoa_window.m b/ui/drivers/cocoa/ui_cocoa_window.m index 881f60b657..3ec869e569 100644 --- a/ui/drivers/cocoa/ui_cocoa_window.m +++ b/ui/drivers/cocoa/ui_cocoa_window.m @@ -25,6 +25,11 @@ #include "../ui_cocoa.h" #include "../../ui_companion_driver.h" +static void* ui_window_cocoa_init(void) +{ + return NULL; +} + static void ui_window_cocoa_destroy(void *data) { ui_window_cocoa_t *cocoa = (ui_window_cocoa_t*)data; @@ -82,7 +87,8 @@ static bool ui_window_cocoa_focused(void *data) return false; } -const ui_window_t ui_window_cocoa = { +ui_window_t ui_window_cocoa = { + ui_window_cocoa_init, ui_window_cocoa_destroy, ui_window_cocoa_set_focused, ui_window_cocoa_set_visible, diff --git a/ui/drivers/null/ui_null_application.c b/ui/drivers/null/ui_null_application.c index ef2394f85e..0c3fea4d91 100644 --- a/ui/drivers/null/ui_null_application.c +++ b/ui/drivers/null/ui_null_application.c @@ -21,9 +21,9 @@ #include "../../ui_companion_driver.h" -static bool ui_application_null_initialize(void) +static void* ui_application_null_initialize(void) { - return true; + return NULL; } static bool ui_application_null_pending_events(void) @@ -35,9 +35,16 @@ static void ui_application_null_process_events(void) { } -const ui_application_t ui_application_null = { +static void ui_application_null_run(void *args) +{ + (void)args; +} + +ui_application_t ui_application_null = { ui_application_null_initialize, ui_application_null_pending_events, ui_application_null_process_events, + ui_application_null_run, + NULL, "null" }; diff --git a/ui/drivers/null/ui_null_browser_window.c b/ui/drivers/null/ui_null_browser_window.c index ab739a3c5f..548069f2f7 100644 --- a/ui/drivers/null/ui_null_browser_window.c +++ b/ui/drivers/null/ui_null_browser_window.c @@ -31,7 +31,7 @@ static bool ui_browser_window_null_save(ui_browser_window_state_t *state) return false; } -const ui_browser_window_t ui_browser_window_null = { +ui_browser_window_t ui_browser_window_null = { ui_browser_window_null_open, ui_browser_window_null_save, "null" diff --git a/ui/drivers/null/ui_null_msg_window.c b/ui/drivers/null/ui_null_msg_window.c index c4de4b7175..adc84ce467 100644 --- a/ui/drivers/null/ui_null_msg_window.c +++ b/ui/drivers/null/ui_null_msg_window.c @@ -41,7 +41,7 @@ static enum ui_msg_window_response ui_msg_window_null_warning(ui_msg_window_stat return UI_MSG_RESPONSE_CANCEL; } -const ui_msg_window_t ui_msg_window_null = { +ui_msg_window_t ui_msg_window_null = { ui_msg_window_null_error, ui_msg_window_null_information, ui_msg_window_null_question, diff --git a/ui/drivers/null/ui_null_window.c b/ui/drivers/null/ui_null_window.c index 4abdf028cb..793019803d 100644 --- a/ui/drivers/null/ui_null_window.c +++ b/ui/drivers/null/ui_null_window.c @@ -21,6 +21,11 @@ #include "../../ui_companion_driver.h" +static void* ui_window_null_init(void) +{ + return NULL; +} + static void ui_window_null_destroy(void *data) { } @@ -47,7 +52,8 @@ static bool ui_window_null_focused(void *data) return true; } -const ui_window_t ui_window_null = { +ui_window_t ui_window_null = { + ui_window_null_init, ui_window_null_destroy, ui_window_null_set_focused, ui_window_null_set_visible, diff --git a/ui/drivers/qt/ui_qt_application.cpp b/ui/drivers/qt/ui_qt_application.cpp index c6c0d42c19..aac3b237c5 100644 --- a/ui/drivers/qt/ui_qt_application.cpp +++ b/ui/drivers/qt/ui_qt_application.cpp @@ -1,5 +1,6 @@ /* RetroArch - A frontend for libretro. * Copyright (C) 2011-2017 - Daniel De Matteis + * Copyright (C) 2018 - Brad Parker * * 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- @@ -13,20 +14,130 @@ * If not, see . */ -#include -#include -#include -#include -#include - -#include -#include +#include +extern "C" { #include "../../ui_companion_driver.h" +#include "../../../retroarch.h" +#include "../../../verbosity.h" +#include "../../../version.h" +#include "../../../frontend/frontend.h" +#include "../../../tasks/tasks_internal.h" +#include +} -static bool ui_application_qt_initialize(void) +#include "../ui_qt.h" + +static AppHandler *appHandler; +static ui_application_qt_t ui_application; +static bool app_exiting = false; + +/* these must last for the lifetime of the QApplication */ +static int app_argc = 1; +static char app_name[] = "retroarch"; +static char *app_argv[] = { app_name, NULL }; + +static const unsigned retroarch_qt_icon_data[] = { + 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 +}; + +AppHandler::AppHandler(QObject *parent) : + QObject(parent) { - return true; +} + +AppHandler::~AppHandler() +{ +} + +void AppHandler::exit() +{ + app_exiting = true; + qApp->closeAllWindows(); +} + +bool AppHandler::isExiting() const +{ + return app_exiting; +} + +void AppHandler::onLastWindowClosed() +{ +} + +static void* ui_application_qt_initialize(void) +{ + appHandler = new AppHandler(); + +#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) + /* HiDpi supported since Qt 5.6 */ + QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); +#endif + + QApplication::setStyle("fusion"); + + ui_application.app = new QApplication(app_argc, app_argv); + ui_application.app->setOrganizationName("libretro"); + ui_application.app->setApplicationName("RetroArch"); + ui_application.app->setApplicationVersion(PACKAGE_VERSION); + ui_application.app->connect(ui_application.app, SIGNAL(lastWindowClosed()), appHandler, SLOT(onLastWindowClosed())); + + { + /* Can't declare the pixmap at the top, because: "QPixmap: Must construct a QGuiApplication before a QPixmap" */ + QImage iconImage(16, 16, QImage::Format_ARGB32); + QPixmap iconPixmap; + unsigned char *bits = iconImage.bits(); + + memcpy(bits, retroarch_qt_icon_data, 16 * 16 * sizeof(unsigned)); + + iconPixmap = QPixmap::fromImage(iconImage); + + ui_application.app->setWindowIcon(QIcon(iconPixmap)); + } + + return &ui_application; } static bool ui_application_qt_pending_events(void) @@ -36,13 +147,58 @@ static bool ui_application_qt_pending_events(void) static void ui_application_qt_process_events(void) { - while(ui_application_qt_pending_events()) + if(ui_application_qt_pending_events()) QApplication::processEvents(); } -const ui_application_t ui_application_qt = { +static void ui_application_qt_quit(void) +{ + appHandler->exit(); +} + +static void ui_application_qt_run(void *args) +{ +#ifdef HAVE_MAIN + int ret; + unsigned sleep_ms = 0; + + do + { + ui_application_qt_process_events(); + + ret = runloop_iterate(&sleep_ms); + + if (ret == 1 && sleep_ms > 0) + retro_sleep(sleep_ms); + + task_queue_check(); + + if (ret == -1 || app_exiting) + { + ui_application_qt_quit(); + break; + } + }while(1); + + main_exit(args); +#endif +} + +#ifdef HAVE_MAIN +#ifdef __cplusplus +extern "C" +#endif +int main(int argc, char *argv[]) +{ + return rarch_main(argc, argv, NULL); +} +#endif + +ui_application_t ui_application_qt = { ui_application_qt_initialize, ui_application_qt_pending_events, ui_application_qt_process_events, + ui_application_qt_run, + ui_application_qt_quit, "qt" }; diff --git a/ui/drivers/qt/ui_qt_browser_window.cpp b/ui/drivers/qt/ui_qt_browser_window.cpp index 7272b07701..cd7fa8034a 100644 --- a/ui/drivers/qt/ui_qt_browser_window.cpp +++ b/ui/drivers/qt/ui_qt_browser_window.cpp @@ -1,5 +1,6 @@ /* RetroArch - A frontend for libretro. * Copyright (C) 2011-2017 - Daniel De Matteis + * Copyright (C) 2018 - Brad Parker * * 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- @@ -34,7 +35,7 @@ static bool ui_browser_window_qt_save(ui_browser_window_state_t *state) return false; } -const ui_browser_window_t ui_browser_window_qt = { +ui_browser_window_t ui_browser_window_qt = { ui_browser_window_qt_open, ui_browser_window_qt_save, "qt" diff --git a/ui/drivers/qt/ui_qt_load_core_window.cpp b/ui/drivers/qt/ui_qt_load_core_window.cpp new file mode 100644 index 0000000000..65da0381fc --- /dev/null +++ b/ui/drivers/qt/ui_qt_load_core_window.cpp @@ -0,0 +1,283 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2010-2014 - Hans-Kristian Arntzen + * Copyright (C) 2011-2017 - Daniel De Matteis + * Copyright (C) 2018 - Brad Parker + * + * 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 "ui_qt_load_core_window.h" + +#include +#include + +extern "C" { +#include "../../../core_info.h" +#include "../../../verbosity.h" +#include "../../../configuration.h" +#include "../../../msg_hash.h" +#include "../../../retroarch.h" +#include "../../../command.h" +#include "../../../frontend/frontend_driver.h" +#include +#include +#include +}; + +#define CORE_NAME_COLUMN 0 +#define CORE_VERSION_COLUMN 1 + +LoadCoreTableWidget::LoadCoreTableWidget(QWidget *parent) : + QTableWidget(parent) +{ +} + +void LoadCoreTableWidget::keyPressEvent(QKeyEvent *event) +{ + if (event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter) + { + event->accept(); + emit enterPressed(); + } + else + QTableWidget::keyPressEvent(event); +} + +LoadCoreWindow::LoadCoreWindow(QWidget *parent) : + QMainWindow(parent) + ,m_layout() + ,m_table(new LoadCoreTableWidget()) + ,m_statusLabel(new QLabel()) +{ + QHBoxLayout *hbox = new QHBoxLayout(); + QPushButton *customCoreButton = new QPushButton(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_LOAD_CUSTOM_CORE)); + + connect(customCoreButton, SIGNAL(clicked()), this, SLOT(onLoadCustomCoreClicked())); + connect(m_table, SIGNAL(enterPressed()), this, SLOT(onCoreEnterPressed())); + connect(m_table, SIGNAL(cellDoubleClicked(int,int)), this, SLOT(onCellDoubleClicked(int,int))); + + setWindowTitle(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_LOAD_CORE)); + + setCentralWidget(new QWidget()); + + centralWidget()->setLayout(&m_layout); + + hbox->addWidget(customCoreButton); + hbox->addItem(new QSpacerItem(width(), 20, QSizePolicy::Expanding, QSizePolicy::Minimum)); + + m_layout.addWidget(m_table); + m_layout.addLayout(hbox); + + statusBar()->addPermanentWidget(m_statusLabel); +} + +void LoadCoreWindow::closeEvent(QCloseEvent *event) +{ + emit windowClosed(); + + QWidget::closeEvent(event); +} + +void LoadCoreWindow::keyPressEvent(QKeyEvent *event) +{ + if (event->key() == Qt::Key_Escape) + { + event->accept(); + close(); + } + else + QMainWindow::keyPressEvent(event); +} + +void LoadCoreWindow::setStatusLabel(QString label) +{ + m_statusLabel->setText(label); +} + +void LoadCoreWindow::onCellDoubleClicked(int, int) +{ + onCoreEnterPressed(); +} + +void LoadCoreWindow::loadCore(const char *path) +{ + QProgressDialog progress(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_LOADING_CORE), QString(), 0, 0, this); + progress.setWindowTitle(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_LOAD_CORE)); + progress.setMinimumDuration(0); + progress.setValue(progress.minimum()); + progress.show(); + + /* Because core loading will block, we need to go ahead and process pending events that would allow the progress dialog to fully show its contents before actually starting the core loading process. Must call processEvents() twice. */ + qApp->processEvents(); + qApp->processEvents(); + +#ifdef HAVE_DYNAMIC + /* const-removing cast is safe here because the path is never written to */ + rarch_ctl(RARCH_CTL_SET_LIBRETRO_PATH, const_cast(path)); + + if (!command_event(CMD_EVENT_LOAD_CORE, NULL)) + { + QMessageBox::critical(this, msg_hash_to_str(MSG_ERROR), msg_hash_to_str(MSG_FAILED_TO_OPEN_LIBRETRO_CORE)); + return; + } + + setProperty("last_launch_with_index", -1); + + emit coreLoaded(); +#endif +} + +void LoadCoreWindow::onCoreEnterPressed() +{ + QTableWidgetItem *selectedCoreItem = NULL; + QString path; + QByteArray pathArray; + const char *pathData = NULL; + QVariantHash hash; + + selectedCoreItem = m_table->item(m_table->currentRow(), CORE_NAME_COLUMN); + hash = selectedCoreItem->data(Qt::UserRole).toHash(); + path = hash["path"].toString(); + + pathArray.append(path); + pathData = pathArray.constData(); + + loadCore(pathData); +} + +void LoadCoreWindow::onLoadCustomCoreClicked() +{ + QString path; + QByteArray pathArray; + settings_t *settings = config_get_ptr(); + char core_ext[255] = {0}; + char filters[PATH_MAX_LENGTH] = {0}; + const char *pathData = NULL; + + frontend_driver_get_core_extension(core_ext, sizeof(core_ext)); + + strlcpy(filters, "Cores (*.", sizeof(filters)); + strlcat(filters, core_ext, sizeof(filters)); + strlcat(filters, ");;All Files (*.*)", sizeof(filters)); + + path = QFileDialog::getOpenFileName(this, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_LOAD_CORE), settings->paths.directory_libretro, filters, NULL); + + if (path.isEmpty()) + return; + + pathArray.append(path); + pathData = pathArray.constData(); + + loadCore(pathData); +} + +void LoadCoreWindow::initCoreList(const QStringList &extensionFilters) +{ + core_info_list_t *cores = NULL; + QStringList horizontal_header_labels; + QDesktopWidget *desktop = qApp->desktop(); + QRect desktopRect = desktop->availableGeometry(); + unsigned i = 0; + int j = 0; + + horizontal_header_labels << msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_NAME); + horizontal_header_labels << msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_CORE_VERSION); + + core_info_get_list(&cores); + + m_table->clear(); + m_table->setColumnCount(0); + m_table->setRowCount(0); + m_table->setSelectionBehavior(QAbstractItemView::SelectRows); + m_table->setSelectionMode(QAbstractItemView::SingleSelection); + m_table->setSortingEnabled(false); + m_table->setRowCount(cores->count); + m_table->setColumnCount(2); + m_table->setHorizontalHeaderLabels(horizontal_header_labels); + + for (i = 0; i < cores->count; i++) + { + core_info_t *core = core_info_get(cores, i); + QTableWidgetItem *name_item = NULL; + QTableWidgetItem *version_item = new QTableWidgetItem(core->display_version); + QVariantHash hash; + const char *name = core->display_name; + + if (string_is_empty(name)) + name = path_basename(core->path); + + name_item = new QTableWidgetItem(name); + + hash["path"] = core->path; + hash["extensions"] = QString(core->supported_extensions).split("|"); + + name_item->setData(Qt::UserRole, hash); + name_item->setFlags(name_item->flags() & ~Qt::ItemIsEditable); + version_item->setFlags(version_item->flags() & ~Qt::ItemIsEditable); + + m_table->setItem(i, CORE_NAME_COLUMN, name_item); + m_table->setItem(i, CORE_VERSION_COLUMN, version_item); + } + + if (!extensionFilters.isEmpty()) + { + QVector rowsToHide; + + for (j = 0; j < m_table->rowCount(); j++) + { + bool found = false; + QTableWidgetItem *item = m_table->item(j, CORE_NAME_COLUMN); + QVariantHash hash; + QStringList extensions; + int k = 0; + + if (!item) + continue; + + hash = item->data(Qt::UserRole).toHash(); + extensions = hash["extensions"].toStringList(); + + if (!extensions.isEmpty()) + { + for (k = 0; k < extensions.size(); k++) + { + QString ext = extensions.at(k).toLower(); + + if (extensionFilters.contains(ext, Qt::CaseInsensitive)) + { + found = true; + break; + } + } + + if (!found) + rowsToHide.append(j); + } + } + + if (rowsToHide.size() != m_table->rowCount()) + { + foreach (const int &row, rowsToHide) + { + m_table->setRowHidden(row, true); + } + } + } + + m_table->setSortingEnabled(true); + m_table->resizeColumnsToContents(); + m_table->sortByColumn(0, Qt::AscendingOrder); + m_table->selectRow(0); + m_table->setAlternatingRowColors(true); + + resize(qMin(desktopRect.width(), contentsMargins().left() + m_table->horizontalHeader()->length() + contentsMargins().right()), height()); +} diff --git a/ui/drivers/qt/ui_qt_load_core_window.h b/ui/drivers/qt/ui_qt_load_core_window.h new file mode 100644 index 0000000000..924af4f2cf --- /dev/null +++ b/ui/drivers/qt/ui_qt_load_core_window.h @@ -0,0 +1,67 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2010-2014 - Hans-Kristian Arntzen + * Copyright (C) 2011-2017 - Daniel De Matteis + * Copyright (C) 2018 - Brad Parker + * + * 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 . + */ + +#ifndef _QT_LOAD_CORE_WINDOW_H +#define _QT_LOAD_CORE_WINDOW_H + +extern "C" { +#include +} + +#include + +class LoadCoreTableWidget : public QTableWidget +{ + Q_OBJECT +public: + LoadCoreTableWidget(QWidget *parent = NULL); +signals: + void enterPressed(); +protected: + void keyPressEvent(QKeyEvent *event); +}; + +class LoadCoreWindow : public QMainWindow +{ + Q_OBJECT +public: + LoadCoreWindow(QWidget *parent = 0); + void initCoreList(const QStringList &extensionFilters = QStringList()); + void setStatusLabel(QString label); +signals: + void coreLoaded(); + void windowClosed(); +private slots: + void onLoadCustomCoreClicked(); + void onCoreEnterPressed(); + void onCellDoubleClicked(int row, int column); +protected: + void keyPressEvent(QKeyEvent *event); + void closeEvent(QCloseEvent *event); +private: + void loadCore(const char *path); + + QVBoxLayout m_layout; + LoadCoreTableWidget *m_table; + QLabel *m_statusLabel; +}; + +RETRO_BEGIN_DECLS + +RETRO_END_DECLS + +#endif diff --git a/ui/drivers/qt/ui_qt_msg_window.cpp b/ui/drivers/qt/ui_qt_msg_window.cpp index 3d4a3fb497..280aa68b2e 100644 --- a/ui/drivers/qt/ui_qt_msg_window.cpp +++ b/ui/drivers/qt/ui_qt_msg_window.cpp @@ -1,5 +1,6 @@ /* RetroArch - A frontend for libretro. * Copyright (C) 2011-2017 - Daniel De Matteis + * Copyright (C) 2018 - Brad Parker * * 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- @@ -97,7 +98,7 @@ static enum ui_msg_window_response ui_msg_window_qt_warning(ui_msg_window_state return ui_msg_window_qt_response(state, QMessageBox::warning((QWidget*)state->window, state->title, state->text, flags)); } -const ui_msg_window_t ui_msg_window_qt = { +ui_msg_window_t ui_msg_window_qt = { ui_msg_window_qt_error, ui_msg_window_qt_information, ui_msg_window_qt_question, diff --git a/ui/drivers/qt/ui_qt_themes.h b/ui/drivers/qt/ui_qt_themes.h new file mode 100644 index 0000000000..058a073bc7 --- /dev/null +++ b/ui/drivers/qt/ui_qt_themes.h @@ -0,0 +1,356 @@ +#include + +/* %1 is a placeholder for palette(highlight) or the equivalent chosen by the user */ +static const QString qt_theme_default_stylesheet = QStringLiteral(""); + +static const QString qt_theme_dark_stylesheet = QStringLiteral("" + "QWidget {\n" + " color:white;\n" + " background-color:rgb(53,53,53);\n" + " selection-background-color:%1;\n" + "}\n" + "QWidget#playlistWidget, QWidget#browserWidget, QWidget#tableWidget, QWidget#logWidget {\n" + " background-color:rgb(66,66,66);\n" + " border-top:1px solid rgba(175,175,175,50%);\n" + " border-left:1px solid rgba(125,125,125,50%);\n" + " border-right:1px solid rgba(125,125,125,50%);\n" + " border-bottom:1px solid rgba(25,25,25,75%);\n" + "}\n" + "QToolTip {\n" + " color:white;\n" + " background-color:rgb(53,53,53);\n" + " border:1px solid rgb(80,80,80);\n" + " border-radius:4px;\n" + "}\n" + "QMenuBar {\n" + " background-color:qlineargradient(x1:0,y1:0,x2:0,y2:1,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75));\n" + " border-bottom:2px solid rgba(25,25,25,75);\n" + "}\n" + "QMenuBar::item {\n" + " spacing:2px;\n" + " padding:3px 4px;\n" + " background-color:transparent;\n" + "}\n" + "QMenuBar::item:selected {\n" + " background-color:qlineargradient(x1:0,y1:0,x2:0,y2:1,stop:0 rgba(106,106,106,255),stop:1 rgba(106,106,106,75));\n" + " border:1px solid %1;\n" + "}\n" + "QMenuBar::item:pressed {\n" + " background-color:%1;\n" + " border-left:1px solid rgba(25,25,25,127);\n" + " border-right:1px solid rgba(25,25,25,127);\n" + "}\n" + "QMenu {\n" + " background-color:rgb(45,45,45);\n" + " border:1px solid palette(shadow);\n" + "}\n" + "QMenu::item {\n" + " padding:3px 25px 3px 25px;\n" + " border:1px solid transparent;\n" + "}\n" + "QMenu::item:disabled {\n" + " color:rgb(127,127,127);\n" + "}\n" + "QMenu::item:selected {\n" + " border-color:rgba(200,200,200,127);\n" + " background-color:%1;\n" + "}\n" + "QMenu::icon:checked {\n" + " background-color:qlineargradient(x1:0,y1:1,x2:0,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75));\n" + " border:1px solid %1;\n" + " border-radius:2px;\n" + "}\n" + "QMenu::separator {\n" + " height:1px;\n" + " background-color:rgb(100,100,100);\n" + " margin-left:5px;\n" + " margin-right:5px;\n" + "}\n" + "QMenu::indicator {\n" + " width:18px;\n" + " height:18px;\n" + "}\n" + "QToolBar::top {\n" + " background-color:qlineargradient(x1:0,y1:0,x2:0,y2:1,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75));\n" + " border-bottom:3px solid qlineargradient(x1:0,y1:0,x2:0,y2:1,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75));\n" + "}\n" + "QToolBar::bottom {\n" + " background-color:qlineargradient(x1:0,y1:1,x2:0,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75));\n" + " border-top:3px solid qlineargradient(x1:0,y1:1,x2:0,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75));\n" + "}\n" + "QToolBar::left {\n" + " background-color:qlineargradient(x1:0,y1:0,x2:1,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75));\n" + " border-right:3px solid qlineargradient(x1:0,y1:0,x2:1,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75));\n" + "}\n" + "QToolBar::right {\n" + " background-color:qlineargradient(x1:1,y1:0,x2:0,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75));\n" + " border-left:3px solid qlineargradient(x1:1,y1:0,x2:0,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75));\n" + "}\n" + "QMainWindow {\n" + " background-color:rgb(53,53,53);\n" + "}\n" + "QMainWindow::separator {\n" + " width:6px;\n" + " height:5px;\n" + " padding:2px;\n" + " background-color:rgba(25,25,25,50%);\n" + "}\n" + "QLineEdit {\n" + " color:white;\n" + " background-color:rgb(25,25,25);\n" + "}\n" + "QLineEdit::focus {\n" + " border:1px solid %1;\n" + " border-radius:3px;\n" + " color:white;\n" + " background-color:rgb(25,25,25);\n" + "}\n" + "QSplitter::handle:horizontal {\n" + " width:10px;\n" + "}\n" + "QSplitter::handle:vertical {\n" + " height:10px;\n" + "}\n" + "QMainWindow::separator:hover, QSplitter::handle:hover {\n" + "}\n" + "QDockWidget::title {\n" + " padding:4px;\n" + " background-color:qlineargradient(x1:0,y1:1,x2:0,y2:0,stop:0 rgba(25,25,25,175),stop:1 rgba(53,53,53,75));\n" + " border:1px solid rgba(25,25,25,75);\n" + " border-top:1px solid rgba(175,175,175,50%);\n" + " border-bottom:1px solid rgba(25,25,25,127);\n" + "}\n" + "QDockWidget::close-button, QDockWidget::float-button {\n" + " subcontrol-position:top right;\n" + " subcontrol-origin:margin;\n" + " position:absolute;\n" + " top:3px;\n" + " bottom:0px;\n" + " width:20px;\n" + " height:20px;\n" + "}\n" + "QDockWidget::close-button:hover, QDockWidget::float-button:hover {\n" + " border:1px solid %1;\n" + " border-radius:4px;\n" + "}\n" + "QDockWidget::close-button {\n" + " right:3px;\n" + "}\n" + "QDockWidget::float-button {\n" + " right:25px;\n" + "}\n" + "QGroupBox {\n" + " background-color:rgba(66,66,66,50%);\n" + " margin-top:27px;\n" + " border:1px solid rgba(25,25,25,127);\n" + " border-top-left-radius:4px;\n" + " border-top-right-radius:4px;\n" + "}\n" + "QGroupBox::title {\n" + " subcontrol-origin:margin;\n" + " subcontrol-position:left top;\n" + " padding:4px 6px;\n" + " margin-left:3px;\n" + " background-color:qlineargradient(x1:0,y1:1,x2:0,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75));\n" + " border:1px solid rgba(25,25,25,75);\n" + " border-top-left-radius:4px;\n" + " border-top-right-radius:4px;\n" + "}\n" + "QTabWidget::pane {\n" + " background-color:rgba(66,66,66,50%);\n" + "}\n" + "QTabWidget::tab-bar {\n" + "}\n" + "QTabBar {\n" + " background-color:transparent;\n" + " qproperty-drawBase:0;\n" + " border-bottom:1px solid rgba(25,25,25,50%);\n" + "}\n" + "QTabBar::tab {\n" + " padding:4px 6px;\n" + " background-color:rgba(25,25,25,127);\n" + " border:1px solid rgba(25,25,25,75);\n" + "}\n" + "QTabBar::tab:selected {\n" + " background-color:rgb(66,66,66);\n" + " border-bottom-color:rgba(66,66,66,75%);\n" + "}\n" + "QTabBar::tab:!selected {\n" + " color:rgb(175,175,175);\n" + "}\n" + "QComboBox {\n" + " min-height:20px;\n" + " padding:1px 18px 1px 3px;\n" + "}\n" + "QComboBox::focus {\n" + " background:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,stop: 0 rgba(255,255,255,50), stop: 1 rgba(100,100,100,25));\n" + " border:1px solid %1;\n" + " border-radius:4px;\n" + "}\n" + "QComboBox::hover {\n" + " background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,stop: 0 rgba(255,255,255,50), stop: 1 rgba(127,127,127,50));\n" + " border:1px solid %1;\n" + " border-radius:4px;\n" + "}\n" + "QComboBox::drop-down {\n" + " background-color:transparent;\n" + "}\n" + "QComboBox::selected:on, QComboBox::selected:off {\n" + " background-color:%1;\n" + "}\n" + "QTabBar::tab:hover {\n" + " color:white;\n" + " background-color:%1;\n" + "}\n" + "QComboBox::separator {\n" + " background-color:rgb(100,100,100);\n" + " height:1px;\n" + " margin-left:4px;\n" + " margin-right:4px;\n" + "}\n" + "QCheckBox::indicator {\n" + " width:18px;\n" + " height:18px;\n" + "}\n" + "QPushButton {\n" + " min-height:20px;\n" + " min-width:80px;\n" + " padding:1px 3px 1px 3px;\n" + "}\n" + "QPushButton::focus, QToolButton::focus {\n" + " background:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,stop: 0 rgba(255,255,255,50), stop: 1 rgba(100,100,100,25));\n" + " border:1px solid %1;\n" + " border-radius:4px;\n" + "}\n" + "QPushButton::hover, QToolButton::hover {\n" + " background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,stop: 0 rgba(255,255,255,75), stop: 1 rgba(100,100,100,50));\n" + " border:1px solid %1;\n" + " border-radius:4px;\n" + "}\n" + "QPushButton::pressed, QToolButton::pressed {\n" + " background-color:transparent;\n" + " border:1px solid %1;\n" + " border-radius:4px;\n" + "}\n" + "QRadioButton::indicator {\n" + " width:18px;\n" + " height:18px;\n" + "}\n" + "QListWidget::item:selected, QTreeView::item:selected, QTableView::item:selected {\n" + " color:white;\n" + " background-color:%1;\n" + "}\n" + "QTreeView {\n" + " background-color:rgb(25,25,25);\n" + " selection-background-color:%1;\n" + "}\n" + "QTreeView::branch:selected {\n" + " background-color:%1;\n" + "}\n" + "QTreeView::item:selected:disabled, QTableView::item:selected:disabled {\n" + " background-color:rgb(80,80,80);\n" + "}\n" + "QTreeView::branch:open, QTreeView::branch:closed {\n" + " background-color:solid;\n" + "}\n" + "QTableView, QListWidget {\n" + " background-color:rgb(25,25,25);\n" + "}\n" + "QTreeView QHeaderView::section, QTableView QHeaderView::section {\n" + " /*height:24px;*/\n" + " background-color:qlineargradient(x1:0,y1:1,x2:0,y2:0,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75));\n" + " border-style:none;\n" + " border-bottom:1px solid rgb(65,65,65);\n" + " padding-left:5px;\n" + " padding-right:5px;\n" + "}\n" + "QTableWidget {\n" + " background-color:rgb(25,25,25);\n" + " alternate-background-color:rgb(40,40,40);\n" + "}\n" + "QScrollBar:vertical, QScrollBar:horizontal {\n" + " background-color:rgb(35,35,35);\n" + "}\n" + "QScrollBar::handle:vertical, QScrollBar::handle:horizontal {\n" + " background-color:rgb(65,65,65);\n" + " border-right:1px solid rgba(175,175,175,50%);\n" + " border-top:1px solid rgba(175,175,175,50%);\n" + " border-bottom:1px solid rgba(25,25,25,75);\n" + " border-radius:2px;\n" + "}\n" + "QScrollBar::handle:horizontal:hover, QScrollBar::handle:vertical:hover {\n" + " border:1px solid %1;\n" + " background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,stop: 0 rgba(255,255,255,75), stop: 1 rgba(127,127,127,75));\n" + "}\n" + "QScrollBar:vertical {\n" + " border-top-right-radius:2px;\n" + " border-bottom-right-radius:2px;\n" + " width:16px;\n" + " margin:0px;\n" + "}\n" + "QScrollBar::handle:vertical {\n" + " min-height:20px;\n" + " margin:2px 4px 2px 4px;\n" + "}\n" + "QScrollBar::add-line:vertical {\n" + " background:none;\n" + " height:0px;\n" + " subcontrol-position:right;\n" + " subcontrol-origin:margin;\n" + "}\n" + "QScrollBar::sub-line:vertical {\n" + " background:none;\n" + " height:0px;\n" + " subcontrol-position:left;\n" + " subcontrol-origin:margin;\n" + "}\n" + "QScrollBar:horizontal {\n" + " height:16px;\n" + " margin:0px;\n" + "}\n" + "QScrollBar::handle:horizontal {\n" + " min-width:20px;\n" + " margin:4px 2px 4px 2px;\n" + "}\n" + "QScrollBar::add-line:horizontal {\n" + " background:none;\n" + " width:0px;\n" + " subcontrol-position:bottom;\n" + " subcontrol-origin:margin;\n" + "}\n" + "QScrollBar::sub-line:horizontal {\n" + " background:none;\n" + " width:0px;\n" + " subcontrol-position:top;\n" + " subcontrol-origin:margin;\n" + "}\n" + "QSlider::handle:horizontal {\n" + " border-radius:4px;\n" + " border:1px solid rgba(25,25,25,255);\n" + " background-color:palette(alternate-base);\n" + " min-height:20px;\n" + " margin:0 -4px;\n" + "}\n" + "QSlider::handle:horizontal:hover {\n" + " background-color:%1;\n" + "}\n" + "QSlider::add-page:horizontal {\n" + " background-color:palette(base);\n" + "}\n" + "QSlider::sub-page:horizontal {\n" + " background-color:%1;\n" + "}\n" + "QSlider::sub-page:horizontal:disabled {\n" + " background-color:rgb(80,80,80);\n" + "}\n" + "QStatusBar {\n" + " color:white;\n" + " background-color:qlineargradient(x1:0,y1:0,x2:0,y2:1,stop:0 rgba(25,25,25,127),stop:1 rgba(53,53,53,75));\n" + "}\n" + "QStatusBar QLabel {\n" + " background-color:transparent;\n" + "}\n" + "QSizeGrip {\n" + " background-color:solid;\n" + "}\n" +); diff --git a/ui/drivers/qt/ui_qt_window.cpp b/ui/drivers/qt/ui_qt_window.cpp index aca4448c22..4add946291 100644 --- a/ui/drivers/qt/ui_qt_window.cpp +++ b/ui/drivers/qt/ui_qt_window.cpp @@ -1,5 +1,6 @@ /* RetroArch - A frontend for libretro. * Copyright (C) 2011-2017 - Daniel De Matteis + * Copyright (C) 2018 - Brad Parker * * 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- @@ -13,59 +14,2902 @@ * If not, see . */ -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include -#include "wrapper/wrapper.h" #include "../ui_qt.h" +#include "ui_qt_load_core_window.h" +#include "ui_qt_themes.h" -#include "../../ui_companion_driver.h" +extern "C" { +#include "../../../version.h" +#include "../../../verbosity.h" +#include "../../../retroarch.h" +#include "../../../msg_hash.h" +#include "../../../core_info.h" +#include "../../../content.h" +#include "../../../paths.h" +#include "../../../configuration.h" +#include "../../../file_path_special.h" +#include "../../../playlist.h" +#include "../../../content.h" +#include "../../../menu/menu_driver.h" +#include "../../../tasks/tasks_internal.h" +#include +#include +#include +#include +} + +#define TIMER_MSEC 1000 /* periodic timer for gathering statistics */ + +#ifndef COLLECTION_SIZE +#define COLLECTION_SIZE 99999 +#endif + +#define GENERIC_FOLDER_ICON "/xmb/dot-art/png/folder.png" +#define ICON_PATH "/xmb/dot-art/png/" +#define THUMBNAIL_BOXART "Named_Boxarts" +#define THUMBNAIL_SCREENSHOT "Named_Snaps" +#define THUMBNAIL_TITLE "Named_Titles" +#define ALL_PLAYLISTS_TOKEN "|||ALL|||" +#define HIRAGANA_START 0x3041U +#define HIRAGANA_END 0x3096U +#define KATAKANA_START 0x30A1U +#define KATAKANA_END 0x30F6U +#define HIRA_KATA_OFFSET (KATAKANA_START - HIRAGANA_START) + +static ui_window_qt_t ui_window = {0}; + +enum CoreSelection +{ + CORE_SELECTION_CURRENT, + CORE_SELECTION_PLAYLIST_SAVED, + CORE_SELECTION_PLAYLIST_DEFAULT, + CORE_SELECTION_ASK, + CORE_SELECTION_LOAD_CORE +}; + +#ifdef HAVE_LIBRETRODB +static void scan_finished_handler(void *task_data, void *user_data, const char *err) +{ + menu_ctx_environment_t menu_environ; + menu_environ.type = MENU_ENVIRON_RESET_HORIZONTAL_LIST; + menu_environ.data = NULL; + + menu_driver_ctl(RARCH_MENU_CTL_ENVIRONMENT, &menu_environ); + + if (!ui_window.qtWindow->settings()->value("scan_finish_confirm", true).toBool()) + return; + + if (!ui_window.qtWindow->showMessageBox(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_SCAN_FINISHED), MainWindow::MSGBOX_TYPE_INFO, Qt::ApplicationModal)) + ui_window.qtWindow->settings()->setValue("scan_finish_confirm", false); +} +#endif + +TreeView::TreeView(QWidget *parent) : + QTreeView(parent) +{ +} + +void TreeView::columnCountChanged(int oldCount, int newCount) +{ + QTreeView::columnCountChanged(oldCount, newCount); +} + +void TreeView::selectionChanged(const QItemSelection &selected, const QItemSelection &deselected) +{ + QModelIndexList list = selected.indexes(); + + QTreeView::selectionChanged(selected, deselected); + + emit itemsSelected(list); +} + +TableWidget::TableWidget(QWidget *parent) : + QTableWidget(parent) +{ +} + +void TableWidget::keyPressEvent(QKeyEvent *event) +{ + if (event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter) + { + event->accept(); + emit enterPressed(); + } + else + QTableWidget::keyPressEvent(event); +} + +CoreInfoLabel::CoreInfoLabel(QString text, QWidget *parent) : + QLabel(text, parent) +{ + setTextInteractionFlags(Qt::TextSelectableByMouse | Qt::TextSelectableByKeyboard); +} + +CoreInfoDialog::CoreInfoDialog(MainWindow *mainwindow, QWidget *parent) : + QDialog(parent) + ,m_formLayout(new QFormLayout()) + ,m_mainwindow(mainwindow) +{ + QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok); + + connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); + connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); + + setWindowTitle(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_INFORMATION)); + + m_formLayout->setFormAlignment(Qt::AlignCenter); + m_formLayout->setLabelAlignment(Qt::AlignCenter); + + setLayout(new QVBoxLayout()); + + qobject_cast(layout())->addLayout(m_formLayout); + layout()->addItem(new QSpacerItem(20, 20, QSizePolicy::Minimum, QSizePolicy::Expanding)); + layout()->addWidget(buttonBox); +} + +void CoreInfoDialog::showCoreInfo() +{ + int row = 0; + int rowCount = m_formLayout->rowCount(); + int i = 0; + QList > infoList = m_mainwindow->getCoreInfo(); + + if (rowCount > 0) + { + for (row = 0; row < rowCount; row++) + { +#if (QT_VERSION >= QT_VERSION_CHECK(5, 8, 0)) + /* removeRow() and takeRow() was only added in 5.8! */ + m_formLayout->removeRow(0); +#else + /* something is buggy here... sometimes items appear duplicated, and other times not */ + QLayoutItem *item = m_formLayout->itemAt(0); + QWidget *w = NULL; + + if (item) + { + w = item->widget(); + + if (w) + { + QWidget *label = m_formLayout->labelForField(w); + + if (label) + delete label; + + m_formLayout->removeWidget(w); + + delete w; + } + } +#endif + } + } + + if (infoList.count() == 0) + return; + + for (i = 0; i < infoList.count(); i++) + { + const QHash &line = infoList.at(i); + QLabel *label = new QLabel(line.value("key")); + CoreInfoLabel *value = new CoreInfoLabel(line.value("value")); + QString labelStyle = line.value("label_style"); + QString valueStyle = line.value("value_style"); + + if (!labelStyle.isEmpty()) + label->setStyleSheet(labelStyle); + + if (!valueStyle.isEmpty()) + value->setStyleSheet(valueStyle); + + m_formLayout->addRow(label, value); + } + + show(); +} + +ViewOptionsDialog::ViewOptionsDialog(MainWindow *mainwindow, QWidget *parent) : + QDialog(parent) + ,m_mainwindow(mainwindow) + ,m_settings(mainwindow->settings()) + ,m_saveGeometryCheckBox(new QCheckBox(this)) + ,m_saveDockPositionsCheckBox(new QCheckBox(this)) + ,m_saveLastTabCheckBox(new QCheckBox(this)) + ,m_showHiddenFilesCheckBox(new QCheckBox(this)) + ,m_themeComboBox(new QComboBox(this)) + ,m_highlightColorPushButton(new QPushButton(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_CHOOSE), this)) + ,m_highlightColor() + ,m_highlightColorLabel(new QLabel(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_HIGHLIGHT_COLOR), this)) + ,m_customThemePath() + ,m_suggestLoadedCoreFirstCheckBox(new QCheckBox(this)) +{ + QFormLayout *form = new QFormLayout(); + QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); + + setWindowTitle(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_TITLE)); + + m_themeComboBox->addItem(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_THEME_SYSTEM_DEFAULT), MainWindow::THEME_SYSTEM_DEFAULT); + m_themeComboBox->addItem(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_THEME_DARK), MainWindow::THEME_DARK); + m_themeComboBox->addItem(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_THEME_CUSTOM), MainWindow::THEME_CUSTOM); + + form->setFormAlignment(Qt::AlignCenter); + form->setLabelAlignment(Qt::AlignCenter); + + setLayout(new QVBoxLayout(this)); + + connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); + connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); + + connect(this, SIGNAL(accepted()), this, SLOT(onAccepted())); + connect(this, SIGNAL(rejected()), this, SLOT(onRejected())); + + form->addRow(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_SAVE_GEOMETRY), m_saveGeometryCheckBox); + form->addRow(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_SAVE_DOCK_POSITIONS), m_saveDockPositionsCheckBox); + form->addRow(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_SAVE_LAST_TAB), m_saveLastTabCheckBox); + form->addRow(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SHOW_HIDDEN_FILES), m_showHiddenFilesCheckBox); + form->addRow(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_SUGGEST_LOADED_CORE_FIRST), m_suggestLoadedCoreFirstCheckBox); + form->addRow(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_THEME), m_themeComboBox); + form->addRow(m_highlightColorLabel, m_highlightColorPushButton); + + qobject_cast(layout())->addLayout(form); + layout()->addItem(new QSpacerItem(20, 20, QSizePolicy::Minimum, QSizePolicy::Expanding)); + layout()->addWidget(buttonBox); + + loadViewOptions(); + + connect(m_themeComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(onThemeComboBoxIndexChanged(int))); + connect(m_highlightColorPushButton, SIGNAL(clicked()), this, SLOT(onHighlightColorChoose())); +} + +void ViewOptionsDialog::onThemeComboBoxIndexChanged(int) +{ + MainWindow::Theme theme = static_cast(m_themeComboBox->currentData(Qt::UserRole).toInt()); + + if (theme == MainWindow::THEME_CUSTOM) + { + QString filePath = QFileDialog::getOpenFileName(this, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_SELECT_THEME)); + + if (filePath.isEmpty()) + { + int oldThemeIndex = m_themeComboBox->findData(m_mainwindow->getThemeFromString(m_settings->value("theme", "default").toString())); + + if (m_themeComboBox->count() > oldThemeIndex) + { + disconnect(m_themeComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(onThemeComboBoxIndexChanged(int))); + m_themeComboBox->setCurrentIndex(oldThemeIndex); + connect(m_themeComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(onThemeComboBoxIndexChanged(int))); + } + } + else + { + m_customThemePath = filePath; + + if (m_mainwindow->setCustomThemeFile(filePath)) + m_mainwindow->setTheme(theme); + } + } + else + m_mainwindow->setTheme(theme); + + showOrHideHighlightColor(); +} + +void ViewOptionsDialog::onHighlightColorChoose() +{ + QPixmap highlightPixmap(m_highlightColorPushButton->iconSize()); + QColor currentHighlightColor = m_settings->value("highlight_color", QApplication::palette().highlight().color()).value(); + QColor newHighlightColor = QColorDialog::getColor(currentHighlightColor, this, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_SELECT_COLOR)); + + if (newHighlightColor.isValid()) + { + MainWindow::Theme theme = static_cast(m_themeComboBox->currentData(Qt::UserRole).toInt()); + + m_highlightColor = newHighlightColor; + m_settings->setValue("highlight_color", m_highlightColor); + highlightPixmap.fill(m_highlightColor); + m_highlightColorPushButton->setIcon(highlightPixmap); + m_mainwindow->setTheme(theme); + } +} + +void ViewOptionsDialog::loadViewOptions() +{ + QColor highlightColor = m_settings->value("highlight_color", QApplication::palette().highlight().color()).value(); + QPixmap highlightPixmap(m_highlightColorPushButton->iconSize()); + int themeIndex = 0; + + m_saveGeometryCheckBox->setChecked(m_settings->value("save_geometry", false).toBool()); + m_saveDockPositionsCheckBox->setChecked(m_settings->value("save_dock_positions", false).toBool()); + m_saveLastTabCheckBox->setChecked(m_settings->value("save_last_tab", false).toBool()); + m_showHiddenFilesCheckBox->setChecked(m_settings->value("show_hidden_files", true).toBool()); + m_suggestLoadedCoreFirstCheckBox->setChecked(m_settings->value("suggest_loaded_core_first", false).toBool()); + + themeIndex = m_themeComboBox->findData(m_mainwindow->getThemeFromString(m_settings->value("theme", "default").toString())); + + if (m_themeComboBox->count() > themeIndex) + m_themeComboBox->setCurrentIndex(themeIndex); + + if (highlightColor.isValid()) + { + m_highlightColor = highlightColor; + highlightPixmap.fill(m_highlightColor); + m_highlightColorPushButton->setIcon(highlightPixmap); + } + + showOrHideHighlightColor(); +} + +void ViewOptionsDialog::showOrHideHighlightColor() +{ + if (m_mainwindow->theme() == MainWindow::THEME_DARK) + { + m_highlightColorLabel->show(); + m_highlightColorPushButton->show(); + } + else + { + m_highlightColorLabel->hide(); + m_highlightColorPushButton->hide(); + } +} + +void ViewOptionsDialog::saveViewOptions() +{ + m_settings->setValue("save_geometry", m_saveGeometryCheckBox->isChecked()); + m_settings->setValue("save_dock_positions", m_saveDockPositionsCheckBox->isChecked()); + m_settings->setValue("save_last_tab", m_saveLastTabCheckBox->isChecked()); + m_settings->setValue("theme", m_mainwindow->getThemeString(static_cast(m_themeComboBox->currentData(Qt::UserRole).toInt()))); + m_settings->setValue("show_hidden_files", m_showHiddenFilesCheckBox->isChecked()); + m_settings->setValue("highlight_color", m_highlightColor); + m_settings->setValue("suggest_loaded_core_first", m_suggestLoadedCoreFirstCheckBox->isChecked()); + + if (!m_mainwindow->customThemeString().isEmpty()) + m_settings->setValue("custom_theme", m_customThemePath); +} + +void ViewOptionsDialog::onAccepted() +{ + MainWindow::Theme newTheme = static_cast(m_themeComboBox->currentData(Qt::UserRole).toInt()); + + m_mainwindow->setTheme(newTheme); + + saveViewOptions(); +} + +void ViewOptionsDialog::onRejected() +{ + loadViewOptions(); +} + +void ViewOptionsDialog::showDialog() +{ + loadViewOptions(); + show(); +} + +void ViewOptionsDialog::hideDialog() +{ + reject(); +} + +CoreInfoWidget::CoreInfoWidget(CoreInfoLabel *label, QWidget *parent) : + QWidget(parent) + ,m_label(label) + ,m_scrollArea(new QScrollArea(this)) +{ + m_scrollArea->setFrameShape(QFrame::NoFrame); + m_scrollArea->setWidgetResizable(true); + m_scrollArea->setWidget(m_label); +} + +QSize CoreInfoWidget::sizeHint() const +{ + return QSize(256, 256); +} + +void CoreInfoWidget::resizeEvent(QResizeEvent *event) +{ + QWidget::resizeEvent(event); + m_scrollArea->resize(event->size()); +} + +LogTextEdit::LogTextEdit(QWidget *parent) : + QPlainTextEdit(parent) +{ + +} + +void LogTextEdit::appendMessage(const QString& text) +{ + if (text.isEmpty()) + return; + + appendPlainText(text); + verticalScrollBar()->setValue(verticalScrollBar()->maximum()); +} + +MainWindow::MainWindow(QWidget *parent) : + QMainWindow(parent) + ,m_loadCoreWindow(new LoadCoreWindow(this)) + ,m_timer(new QTimer(this)) + ,m_currentCore() + ,m_currentCoreVersion() + ,m_statusLabel(new QLabel(this)) + ,m_dirTree(new TreeView(this)) + ,m_dirModel(new QFileSystemModel(m_dirTree)) + ,m_listWidget(new QListWidget(this)) + ,m_tableWidget(new TableWidget(this)) + ,m_searchWidget(new QWidget(this)) + ,m_searchLineEdit(new QLineEdit(this)) + ,m_searchDock(new QDockWidget(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_MENU_EDIT_SEARCH), this)) + ,m_playlistFiles() + ,m_launchWithComboBox(new QComboBox(this)) + ,m_startCorePushButton(new QToolButton(this)) + ,m_coreInfoPushButton(new QToolButton(this)) + ,m_runPushButton(new QToolButton(this)) + ,m_stopPushButton(new QToolButton(this)) + ,m_browserAndPlaylistTabWidget(new QTabWidget(this)) + ,m_pendingRun(false) + ,m_thumbnailPixmap(NULL) + ,m_thumbnailPixmap2(NULL) + ,m_thumbnailPixmap3(NULL) + ,m_fileSanitizerRegex("[&*/:`<>?\\|]") + ,m_settings(NULL) + ,m_viewOptionsDialog(NULL) + ,m_coreInfoDialog(new CoreInfoDialog(this, NULL)) + ,m_defaultStyle(NULL) + ,m_defaultPalette() + ,m_currentTheme(THEME_SYSTEM_DEFAULT) + ,m_coreInfoDock(new QDockWidget(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_CORE_INFO), this)) + ,m_coreInfoLabel(new CoreInfoLabel(QString(), this)) + ,m_coreInfoWidget(new CoreInfoWidget(m_coreInfoLabel, this)) + ,m_logDock(new QDockWidget(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_LOG), this)) + ,m_logWidget(new QWidget(this)) + ,m_logTextEdit(new LogTextEdit(m_logWidget)) + ,m_imageFormats() + ,m_historyPlaylistsItem(NULL) + ,m_folderIcon() + ,m_customThemeString() +{ + settings_t *settings = config_get_ptr(); + QDir playlistDir(settings->paths.directory_playlist); + QString configDir = QFileInfo(path_get(RARCH_PATH_CONFIG)).dir().absolutePath(); + QToolButton *searchResetButton = NULL; + + m_tableWidget->setAlternatingRowColors(true); + + m_logWidget->setObjectName("logWidget"); + + m_folderIcon = QIcon(QString(settings->paths.directory_assets) + GENERIC_FOLDER_ICON); + m_imageFormats = QVector::fromList(QImageReader::supportedImageFormats()); + m_defaultStyle = QApplication::style(); + m_defaultPalette = QApplication::palette(); + + /* ViewOptionsDialog needs m_settings set before it's constructed */ + m_settings = new QSettings(configDir + "/retroarch_qt.cfg", QSettings::IniFormat, this); + m_viewOptionsDialog = new ViewOptionsDialog(this, 0); + + /* default NULL parameter for parent wasn't added until 5.7 */ + m_startCorePushButton->setDefaultAction(new QAction(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_START_CORE), m_startCorePushButton)); + m_startCorePushButton->setFixedSize(m_startCorePushButton->sizeHint()); + + m_runPushButton->setDefaultAction(new QAction(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RUN), m_runPushButton)); + m_runPushButton->setFixedSize(m_runPushButton->sizeHint()); + + m_stopPushButton->setDefaultAction(new QAction(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_STOP), m_stopPushButton)); + m_stopPushButton->setFixedSize(m_stopPushButton->sizeHint()); + + m_coreInfoPushButton->setDefaultAction(new QAction(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_INFO), m_coreInfoPushButton)); + m_coreInfoPushButton->setFixedSize(m_coreInfoPushButton->sizeHint()); + + searchResetButton = new QToolButton(m_searchWidget); + searchResetButton->setDefaultAction(new QAction("Clear", searchResetButton)); + searchResetButton->setFixedSize(searchResetButton->sizeHint()); + + connect(searchResetButton, SIGNAL(clicked()), this, SLOT(onSearchResetClicked())); + + m_dirModel->setFilter(QDir::NoDotAndDotDot | + QDir::AllDirs | + QDir::Drives | + (m_settings->value("show_hidden_files", true).toBool() ? (QDir::Hidden | QDir::System) : static_cast(0))); + +#if defined(Q_OS_WIN) + m_dirModel->setRootPath(""); +#else + m_dirModel->setRootPath("/"); +#endif + + m_dirTree->setModel(m_dirModel); + m_dirTree->setSelectionMode(QAbstractItemView::SingleSelection); + + if (m_dirModel->columnCount() > 3) + { + /* size */ + m_dirTree->hideColumn(1); + /* type */ + m_dirTree->hideColumn(2); + /* date modified */ + m_dirTree->hideColumn(3); + } + + m_dirTree->setCurrentIndex(m_dirModel->index(settings->paths.directory_menu_content)); + m_dirTree->scrollTo(m_dirTree->currentIndex(), QAbstractItemView::PositionAtTop); + m_dirTree->expand(m_dirTree->currentIndex()); + + reloadPlaylists(); + + m_searchWidget->setLayout(new QHBoxLayout()); + m_searchWidget->layout()->addWidget(m_searchLineEdit); + m_searchWidget->layout()->addWidget(searchResetButton); + + m_searchDock->setObjectName("searchDock"); + m_searchDock->setProperty("default_area", Qt::LeftDockWidgetArea); + m_searchDock->setProperty("menu_text", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SEARCH)); + m_searchDock->setWidget(m_searchWidget); + + addDockWidget(static_cast(m_searchDock->property("default_area").toInt()), m_searchDock); + + m_coreInfoLabel->setAlignment(Qt::AlignLeft | Qt::AlignTop); + m_coreInfoLabel->setTextFormat(Qt::RichText); + + m_coreInfoDock->setObjectName("coreInfoDock"); + m_coreInfoDock->setProperty("default_area", Qt::RightDockWidgetArea); + m_coreInfoDock->setProperty("menu_text", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_CORE_INFO)); + m_coreInfoDock->setWidget(m_coreInfoWidget); + + addDockWidget(static_cast(m_coreInfoDock->property("default_area").toInt()), m_coreInfoDock); + + m_logWidget->setLayout(new QVBoxLayout()); + m_logWidget->layout()->addWidget(m_logTextEdit); + + m_logDock->setObjectName("logDock"); + m_logDock->setProperty("default_area", Qt::BottomDockWidgetArea); + m_logDock->setProperty("menu_text", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_LOG)); + m_logDock->setWidget(m_logWidget); + + addDockWidget(static_cast(m_logDock->property("default_area").toInt()), m_logDock); + + /* Hide the log by default. If user has saved their dock positions with the log visible, + * then this hide() call will be reversed later by restoreState(). + * FIXME: If user unchecks "save dock positions", the log will not be unhidden even if + * it was previously saved in the config. + */ + m_logDock->hide(); + + m_dirTree->setContextMenuPolicy(Qt::CustomContextMenu); + m_listWidget->setContextMenuPolicy(Qt::CustomContextMenu); + + connect(m_searchLineEdit, SIGNAL(returnPressed()), this, SLOT(onSearchEnterPressed())); + connect(m_searchLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onSearchLineEditEdited(const QString&))); + connect(m_timer, SIGNAL(timeout()), this, SLOT(onTimeout())); + connect(m_loadCoreWindow, SIGNAL(coreLoaded()), this, SLOT(onCoreLoaded())); + connect(m_loadCoreWindow, SIGNAL(windowClosed()), this, SLOT(onCoreLoadWindowClosed())); + connect(m_listWidget, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), this, SLOT(onCurrentListItemChanged(QListWidgetItem*, QListWidgetItem*))); + connect(m_tableWidget, SIGNAL(currentItemChanged(QTableWidgetItem*, QTableWidgetItem*)), this, SLOT(onCurrentTableItemChanged(QTableWidgetItem*, QTableWidgetItem*))); + connect(m_tableWidget, SIGNAL(itemDoubleClicked(QTableWidgetItem*)), this, SLOT(onContentItemDoubleClicked(QTableWidgetItem*))); + connect(m_tableWidget, SIGNAL(enterPressed()), this, SLOT(onTableWidgetEnterPressed())); + connect(m_startCorePushButton, SIGNAL(clicked()), this, SLOT(onStartCoreClicked())); + connect(m_coreInfoPushButton, SIGNAL(clicked()), m_coreInfoDialog, SLOT(showCoreInfo())); + connect(m_runPushButton, SIGNAL(clicked()), this, SLOT(onRunClicked())); + connect(m_stopPushButton, SIGNAL(clicked()), this, SLOT(onStopClicked())); + connect(m_browserAndPlaylistTabWidget, SIGNAL(currentChanged(int)), this, SLOT(onTabWidgetIndexChanged(int))); + connect(m_dirTree, SIGNAL(itemsSelected(QModelIndexList)), this, SLOT(onTreeViewItemsSelected(QModelIndexList))); + connect(m_dirTree, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(onFileBrowserTreeContextMenuRequested(const QPoint&))); + connect(m_listWidget, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(onPlaylistWidgetContextMenuRequested(const QPoint&))); + connect(m_launchWithComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(onLaunchWithComboBoxIndexChanged(int))); + + /* make sure these use an auto connection so it will be queued if called from a different thread (some facilities in RA log messages from other threads) */ + connect(this, SIGNAL(gotLogMessage(const QString&)), this, SLOT(onGotLogMessage(const QString&)), Qt::AutoConnection); + connect(this, SIGNAL(gotStatusMessage(QString,unsigned,unsigned,bool)), this, SLOT(onGotStatusMessage(QString,unsigned,unsigned,bool)), Qt::AutoConnection); + connect(this, SIGNAL(gotReloadPlaylists()), this, SLOT(onGotReloadPlaylists())); + + m_timer->start(TIMER_MSEC); + + statusBar()->addPermanentWidget(m_statusLabel); + + setCurrentCoreLabel(); + setCoreActions(); + + /* both of these are necessary to get the folder to scroll to the top of the view */ + qApp->processEvents(); + QTimer::singleShot(0, this, SLOT(onBrowserStartClicked())); + + m_listWidget->setCurrentRow(0); + m_searchLineEdit->setFocus(); + m_loadCoreWindow->setWindowModality(Qt::ApplicationModal); + +#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) + resizeDocks(QList() << m_searchDock, QList() << 1, Qt::Vertical); +#endif +} + +MainWindow::~MainWindow() +{ + if (m_thumbnailPixmap) + delete m_thumbnailPixmap; + if (m_thumbnailPixmap2) + delete m_thumbnailPixmap2; + if (m_thumbnailPixmap3) + delete m_thumbnailPixmap3; +} + +void MainWindow::showWelcomeScreen() +{ + const QString welcomeText = QStringLiteral("" + "Welcome to the RetroArch Desktop Menu!
\n" + "
\n" + "Many settings and actions are currently only available in the familiar Big Picture menu, " + "but this Desktop Menu should be functional for launching content and managing playlists.
\n" + "
\n" + "Some useful hotkeys for interacting with the Big Picture menu include:\n" + "
  • F1 - Bring up the Big Picture menu
  • \n" + "
  • F - Switch between fullscreen and windowed modes
  • \n" + "
  • F5 - Bring the Desktop Menu back if closed
  • \n" + "
  • Esc - Exit RetroArch
\n" + "\n" + "For more hotkeys and their assignments, see:
\n" + "Settings -> Input -> Input Hotkey Binds
\n" + "
\n" + "Documentation for RetroArch, libretro and cores:
\n" + "https://docs.libretro.com/"); + + if (!ui_window.qtWindow->settings()->value("show_welcome_screen", true).toBool()) + return; + + if (!ui_window.qtWindow->showMessageBox(welcomeText, MainWindow::MSGBOX_TYPE_INFO, Qt::ApplicationModal)) + ui_window.qtWindow->settings()->setValue("show_welcome_screen", false); + +} + +const QString& MainWindow::customThemeString() const +{ + return m_customThemeString; +} + +bool MainWindow::setCustomThemeFile(QString filePath) +{ + if (filePath.isEmpty()) + { + QMessageBox::critical(this, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_CUSTOM_THEME), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_FILE_PATH_IS_BLANK)); + return false; + } + else + { + QFile file(filePath); + + if (file.exists()) + { + bool opened = file.open(QIODevice::ReadOnly); + + if (opened) + { + QByteArray fileArray = file.readAll(); + QString fileStr = QString::fromUtf8(fileArray); + + file.close(); + + if (fileStr.isEmpty()) + { + QMessageBox::critical(this, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_CUSTOM_THEME), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_FILE_IS_EMPTY)); + return false; + } + else + setCustomThemeString(fileStr); + } + else + { + QMessageBox::critical(this, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_CUSTOM_THEME), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_FILE_READ_OPEN_FAILED)); + return false; + } + } + else + { + QMessageBox::critical(this, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_CUSTOM_THEME), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_FILE_DOES_NOT_EXIST)); + return false; + } + } + + return true; +} + +void MainWindow::setCustomThemeString(QString qss) +{ + m_customThemeString = qss; +} + +bool MainWindow::showMessageBox(QString msg, MessageBoxType msgType, Qt::WindowModality modality) +{ + QScopedPointer msgBoxPtr; + QMessageBox *msgBox = NULL; + QCheckBox *checkBox = NULL; + + msgBoxPtr.reset(new QMessageBox(this)); + msgBox = msgBoxPtr.data(); + checkBox = new QCheckBox(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_DONT_SHOW_AGAIN), msgBox); + + msgBox->setWindowModality(modality); + msgBox->setTextFormat(Qt::RichText); + + /* QMessageBox::setCheckBox() is available since 5.2 */ + msgBox->setCheckBox(checkBox); + + switch (msgType) + { + case MSGBOX_TYPE_INFO: + { + msgBox->setIcon(QMessageBox::Information); + msgBox->setWindowTitle(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_INFORMATION)); + break; + } + case MSGBOX_TYPE_WARNING: + { + msgBox->setIcon(QMessageBox::Warning); + msgBox->setWindowTitle(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_WARNING)); + break; + } + case MSGBOX_TYPE_ERROR: + { + msgBox->setIcon(QMessageBox::Critical); + msgBox->setWindowTitle(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_ERROR)); + break; + } + default: + break; + } + + msgBox->setText(msg); + msgBox->exec(); + + if (checkBox->isChecked()) + return false; + + return true; +} + +void MainWindow::onPlaylistWidgetContextMenuRequested(const QPoint&) +{ + settings_t *settings = config_get_ptr(); + QScopedPointer menu; + QScopedPointer associateMenu; + QScopedPointer hiddenPlaylistsMenu; + QScopedPointer hideAction; + QAction *selectedAction = NULL; + QPoint cursorPos = QCursor::pos(); + QListWidgetItem *selectedItem = m_listWidget->itemAt(m_listWidget->viewport()->mapFromGlobal(cursorPos)); + QDir playlistDir(settings->paths.directory_playlist); + QString playlistDirAbsPath = playlistDir.absolutePath(); + QString currentPlaylistDirPath; + QString currentPlaylistPath; + QString currentPlaylistFileName; + QByteArray currentPlaylistFileNameArray; + QFileInfo currentPlaylistFileInfo; + QMap coreList; + core_info_list_t *core_info_list = NULL; + union string_list_elem_attr attr = {0}; + struct string_list *stnames = NULL; + struct string_list *stcores = NULL; + unsigned i = 0; + int j = 0; + size_t found = 0; + const char *currentPlaylistFileNameData = NULL; + char new_playlist_names[PATH_MAX_LENGTH]; + char new_playlist_cores[PATH_MAX_LENGTH]; + bool specialPlaylist = false; + bool foundHiddenPlaylist = false; + + if (!selectedItem) + return; + + new_playlist_names[0] = new_playlist_cores[0] = '\0'; + + stnames = string_split(settings->arrays.playlist_names, ";"); + stcores = string_split(settings->arrays.playlist_cores, ";"); + + currentPlaylistPath = selectedItem->data(Qt::UserRole).toString(); + currentPlaylistFileInfo = QFileInfo(currentPlaylistPath); + currentPlaylistFileName = currentPlaylistFileInfo.fileName(); + currentPlaylistDirPath = currentPlaylistFileInfo.absoluteDir().absolutePath(); + + currentPlaylistFileNameArray.append(currentPlaylistFileName); + currentPlaylistFileNameData = currentPlaylistFileNameArray.constData(); + + menu.reset(new QMenu(this)); + menu->setObjectName("menu"); + + hiddenPlaylistsMenu.reset(new QMenu(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_HIDDEN_PLAYLISTS), this)); + hiddenPlaylistsMenu->setObjectName("hiddenPlaylistsMenu"); + + hideAction.reset(new QAction(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_HIDE), this)); + + menu->addAction(hideAction.data()); + + if (m_listWidget->count() > 0) + { + for (j = 0; j < m_listWidget->count(); j++) + { + QListWidgetItem *item = m_listWidget->item(j); + bool hidden = m_listWidget->isItemHidden(item); + + if (hidden) + { + QAction *action = hiddenPlaylistsMenu->addAction(item->text()); + action->setProperty("row", j); + action->setProperty("core_path", item->data(Qt::UserRole).toString()); + foundHiddenPlaylist = true; + } + } + } + + if (!foundHiddenPlaylist) + { + QAction *action = hiddenPlaylistsMenu->addAction(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NONE)); + action->setProperty("row", -1); + } + + menu->addMenu(hiddenPlaylistsMenu.data()); + + if (currentPlaylistDirPath != playlistDirAbsPath) + { + /* special playlists like history etc. can't have an association */ + specialPlaylist = true; + } + + if (!specialPlaylist) + { + associateMenu.reset(new QMenu(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_ASSOCIATE_CORE), this)); + associateMenu->setObjectName("associateMenu"); + + core_info_get_list(&core_info_list); + + for (i = 0; i < core_info_list->count; i++) + { + const core_info_t *core = &core_info_list->list[i]; + coreList[core->core_name] = core; + } + + foreach (const QString &key, coreList.keys()) + { + const core_info_t *core = coreList.value(key); + QAction *action = associateMenu->addAction(core->core_name); + action->setProperty("core_path", core->path); + } + + menu->addMenu(associateMenu.data()); + } + + selectedAction = menu->exec(cursorPos); + + if (!selectedAction) + return; + + if (!specialPlaylist && selectedAction->parent() == associateMenu.data()) + { + found = string_list_find_elem(stnames, currentPlaylistFileNameData); + + if (found) + string_list_set(stcores, static_cast(found - 1), selectedAction->property("core_path").toString().toUtf8().constData()); + else + { + string_list_append(stnames, currentPlaylistFileNameData, attr); + string_list_append(stcores, "DETECT", attr); + + found = string_list_find_elem(stnames, currentPlaylistFileNameData); + + if (found) + string_list_set(stcores, static_cast(found - 1), selectedAction->property("core_path").toString().toUtf8().constData()); + } + + string_list_join_concat(new_playlist_names, + sizeof(new_playlist_names), stnames, ";"); + string_list_join_concat(new_playlist_cores, + sizeof(new_playlist_cores), stcores, ";"); + + strlcpy(settings->arrays.playlist_names, + new_playlist_names, sizeof(settings->arrays.playlist_names)); + strlcpy(settings->arrays.playlist_cores, + new_playlist_cores, sizeof(settings->arrays.playlist_cores)); + + if (stnames) + string_list_free(stnames); + if (stcores) + string_list_free(stcores); + } + else if (selectedAction == hideAction.data()) + { + int row = m_listWidget->row(selectedItem); + + if (row >= 0) + { + QStringList hiddenPlaylists = m_settings->value("hidden_playlists").toStringList(); + + if (!hiddenPlaylists.contains(currentPlaylistFileName)) + { + hiddenPlaylists.append(currentPlaylistFileName); + m_settings->setValue("hidden_playlists", hiddenPlaylists); + } + + m_listWidget->setRowHidden(row, true); + } + } + else if (selectedAction->parent() == hiddenPlaylistsMenu.data()) + { + QVariant rowVariant = selectedAction->property("row"); + + if (rowVariant.isValid()) + { + QStringList hiddenPlaylists = m_settings->value("hidden_playlists").toStringList(); + int row = rowVariant.toInt(); + + if (row >= 0) + { + QString playlistPath = selectedAction->property("core_path").toString(); + QFileInfo playlistFileInfo(playlistPath); + QString playlistFileName = playlistFileInfo.fileName(); + + if (hiddenPlaylists.contains(playlistFileName)) + { + hiddenPlaylists.removeOne(playlistFileName); + m_settings->setValue("hidden_playlists", hiddenPlaylists); + } + + m_listWidget->setRowHidden(row, false); + } + } + } + + setCoreActions(); +} + +void MainWindow::onFileBrowserTreeContextMenuRequested(const QPoint&) +{ +#ifdef HAVE_LIBRETRODB + QAction *action = NULL; + QList actions; + QScopedPointer scanAction; + QDir dir; + QString currentDirString = m_dirModel->filePath(m_dirTree->currentIndex()); + settings_t *settings = config_get_ptr(); + QByteArray dirArray; + const char *fullpath = NULL; + + if (currentDirString.isEmpty()) + return; + + dir = currentDirString; + + if (!dir.exists()) + return; + + /* default NULL parameter for parent wasn't added until 5.7 */ + scanAction.reset(new QAction(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCAN_DIRECTORY), 0)); + + actions.append(scanAction.data()); + + action = QMenu::exec(actions, QCursor::pos(), NULL, m_dirTree); + + if (!action) + return; + + dirArray = currentDirString.toUtf8(); + fullpath = dirArray.constData(); + + task_push_dbscan( + settings->paths.directory_playlist, + settings->paths.path_content_database, + fullpath, true, + m_settings->value("show_hidden_files", true).toBool(), + scan_finished_handler); +#endif +} + +void MainWindow::showStatusMessage(QString msg, unsigned priority, unsigned duration, bool flush) +{ + emit gotStatusMessage(msg, priority, duration, flush); +} + +void MainWindow::onGotStatusMessage(QString msg, unsigned priority, unsigned duration, bool flush) +{ + int msecDuration = 0; + QScreen *screen = qApp->primaryScreen(); + QStatusBar *status = statusBar(); + + if (msg.isEmpty()) + return; + + if (!status) + return; + + if (screen) + { + msecDuration = (duration / screen->refreshRate()) * 1000; + } + + if (msecDuration <= 0) + msecDuration = 1000; + + if (status->currentMessage().isEmpty() || flush) + status->showMessage(msg, msecDuration); +} + +void MainWindow::deferReloadPlaylists() +{ + emit gotReloadPlaylists(); +} + +void MainWindow::onGotReloadPlaylists() +{ + reloadPlaylists(); +} + +void MainWindow::reloadPlaylists() +{ + QListWidgetItem *allPlaylistsItem = NULL; + QListWidgetItem *favoritesPlaylistsItem = NULL; + QListWidgetItem *imagePlaylistsItem = NULL; + QListWidgetItem *musicPlaylistsItem = NULL; + QListWidgetItem *videoPlaylistsItem = NULL; + QListWidgetItem *firstItem = NULL; + QListWidgetItem *currentItem = NULL; + settings_t *settings = config_get_ptr(); + QDir playlistDir(settings->paths.directory_playlist); + QString currentPlaylistPath; + QStringList hiddenPlaylists = m_settings->value("hidden_playlists").toStringList(); + + currentItem = m_listWidget->currentItem(); + + if (currentItem) + { + currentPlaylistPath = currentItem->data(Qt::UserRole).toString(); + } + + getPlaylistFiles(); + + m_listWidget->clear(); + + allPlaylistsItem = new QListWidgetItem(m_folderIcon, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_ALL_PLAYLISTS)); + allPlaylistsItem->setData(Qt::UserRole, ALL_PLAYLISTS_TOKEN); + + favoritesPlaylistsItem = new QListWidgetItem(m_folderIcon, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_FAVORITES_TAB)); + favoritesPlaylistsItem->setData(Qt::UserRole, settings->paths.path_content_favorites); + + m_historyPlaylistsItem = new QListWidgetItem(m_folderIcon, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_HISTORY_TAB)); + m_historyPlaylistsItem->setData(Qt::UserRole, settings->paths.path_content_history); + + imagePlaylistsItem = new QListWidgetItem(m_folderIcon, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_IMAGES_TAB)); + imagePlaylistsItem->setData(Qt::UserRole, settings->paths.path_content_image_history); + + musicPlaylistsItem = new QListWidgetItem(m_folderIcon, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_MUSIC_TAB)); + musicPlaylistsItem->setData(Qt::UserRole, settings->paths.path_content_music_history); + + videoPlaylistsItem = new QListWidgetItem(m_folderIcon, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_TAB)); + videoPlaylistsItem->setData(Qt::UserRole, settings->paths.path_content_video_history); + + m_listWidget->addItem(allPlaylistsItem); + m_listWidget->addItem(favoritesPlaylistsItem); + m_listWidget->addItem(m_historyPlaylistsItem); + m_listWidget->addItem(imagePlaylistsItem); + m_listWidget->addItem(musicPlaylistsItem); + m_listWidget->addItem(videoPlaylistsItem); + + if (hiddenPlaylists.contains(ALL_PLAYLISTS_TOKEN)) + m_listWidget->setRowHidden(m_listWidget->row(allPlaylistsItem), true); + if (hiddenPlaylists.contains(QFileInfo(settings->paths.path_content_favorites).fileName())) + m_listWidget->setRowHidden(m_listWidget->row(favoritesPlaylistsItem), true); + if (hiddenPlaylists.contains(QFileInfo(settings->paths.path_content_history).fileName())) + m_listWidget->setRowHidden(m_listWidget->row(m_historyPlaylistsItem), true); + if (hiddenPlaylists.contains(QFileInfo(settings->paths.path_content_image_history).fileName())) + m_listWidget->setRowHidden(m_listWidget->row(imagePlaylistsItem), true); + if (hiddenPlaylists.contains(QFileInfo(settings->paths.path_content_music_history).fileName())) + m_listWidget->setRowHidden(m_listWidget->row(musicPlaylistsItem), true); + if (hiddenPlaylists.contains(QFileInfo(settings->paths.path_content_video_history).fileName())) + m_listWidget->setRowHidden(m_listWidget->row(videoPlaylistsItem), true); + + foreach (QString file, m_playlistFiles) + { + QListWidgetItem *item = NULL; + QString fileDisplayName = file; + QString fileName = file; + bool hasIcon = false; + QIcon icon; + QString iconPath; + + fileDisplayName.remove(file_path_str(FILE_PATH_LPL_EXTENSION)); + + iconPath = QString(settings->paths.directory_assets) + ICON_PATH + fileDisplayName + ".png"; + + hasIcon = QFile::exists(iconPath); + + if (hasIcon) + icon = QIcon(iconPath); + else + icon = m_folderIcon; + + item = new QListWidgetItem(icon, fileDisplayName); + item->setData(Qt::UserRole, playlistDir.absoluteFilePath(file)); + + m_listWidget->addItem(item); + + if (hiddenPlaylists.contains(fileName)) + { + int row = m_listWidget->row(item); + + if (row >= 0) + m_listWidget->setRowHidden(row, true); + } + } + + if (m_listWidget->count() > 0) + { + firstItem = m_listWidget->item(0); + + if (firstItem) + { + int i = 0; + bool found = false; + + for (i = 0; i < m_listWidget->count(); i++) + { + QListWidgetItem *item = m_listWidget->item(i); + QString path; + + if (item) + { + path = item->data(Qt::UserRole).toString(); + + if (!currentPlaylistPath.isEmpty() && !path.isEmpty()) + { + if (path == currentPlaylistPath) + { + found = true; + m_listWidget->setCurrentItem(item); + break; + } + } + } + } + + /* the previous playlist must be gone now, just select the first one */ + if (!found) + m_listWidget->setCurrentItem(firstItem); + } + } +} + +void MainWindow::appendLogMessage(const QString &msg) +{ + emit gotLogMessage(msg); +} + +void MainWindow::onGotLogMessage(const QString &msg) +{ + QString newMsg = msg; + + if (newMsg.at(newMsg.size() - 1) == '\n') + newMsg.chop(1); + + m_logTextEdit->appendMessage(newMsg); +} + +void MainWindow::onLaunchWithComboBoxIndexChanged(int) +{ + QList > infoList = getCoreInfo(); + QString coreInfoText; + QVariantMap coreMap = m_launchWithComboBox->currentData(Qt::UserRole).value(); + CoreSelection coreSelection = static_cast(coreMap.value("core_selection").toInt()); + int i = 0; + + if (infoList.count() == 0) + return; + + for (i = 0; i < infoList.count(); i++) + { + const QHash &hash = infoList.at(i); + const QString &key = hash.value("html_key", hash.value("key")); + const QString &value = hash.value("html_value", hash.value("value")); + + if (!key.isEmpty()) + coreInfoText += key; + + if (!value.isEmpty()) + { + if (!key.isEmpty()) + coreInfoText += " "; + + coreInfoText += value; + } + + if (i < infoList.count() - 1) + coreInfoText += "
\n"; + } + + m_coreInfoLabel->setText(coreInfoText); + + if (coreSelection == CORE_SELECTION_LOAD_CORE) + { + onLoadCoreClicked(); + } + else + { + m_loadCoreWindow->setProperty("last_launch_with_index", m_launchWithComboBox->currentIndex()); + } +} + +MainWindow::Theme MainWindow::getThemeFromString(QString themeString) +{ + if (themeString == "default") + return THEME_SYSTEM_DEFAULT; + else if (themeString == "dark") + return THEME_DARK; + else if (themeString == "custom") + return THEME_CUSTOM; + + return THEME_SYSTEM_DEFAULT; +} + +QString MainWindow::getThemeString(Theme theme) +{ + switch (theme) + { + case THEME_SYSTEM_DEFAULT: + return "default"; + case THEME_DARK: + return "dark"; + case THEME_CUSTOM: + return "custom"; + default: + break; + } + + return "default"; +} + +MainWindow::Theme MainWindow::theme() +{ + return m_currentTheme; +} + +void MainWindow::setTheme(Theme theme) +{ + m_currentTheme = theme; + + switch(theme) + { + case THEME_SYSTEM_DEFAULT: + { + qApp->setStyleSheet(qt_theme_default_stylesheet); + + break; + } + case THEME_DARK: + { + qApp->setStyleSheet(qt_theme_dark_stylesheet.arg(m_settings->value("highlight_color", "palette(highlight)").toString())); + + break; + } + case THEME_CUSTOM: + { + qApp->setStyleSheet(m_customThemeString); + + break; + } + default: + break; + } +} + +QList > MainWindow::getCoreInfo() +{ + QList > infoList; + QHash currentCore = getSelectedCore(); + core_info_list_t *core_info_list = NULL; + const core_info_t *core_info = NULL; + unsigned i = 0; + + core_info_get_list(&core_info_list); + + for (i = 0; i < core_info_list->count; i++) + { + const core_info_t *core = &core_info_list->list[i]; + + if (currentCore["core_path"] == core->path) + { + core_info = core; + break; + } + } + + if (currentCore["core_path"].isEmpty() || !core_info || !core_info->config_data) + { + QHash hash; + + hash["key"] = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_CORE_INFORMATION_AVAILABLE); + hash["value"] = ""; + + infoList.append(hash); + + return infoList; + } + + if (core_info->core_name) + { + QHash hash; + + hash["key"] = QString(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_INFO_CORE_NAME)) + ":"; + hash["value"] = core_info->core_name; + + infoList.append(hash); + } + + if (core_info->display_name) + { + QHash hash; + + hash["key"] = QString(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_INFO_CORE_LABEL)) + ":"; + hash["value"] = core_info->display_name; + + infoList.append(hash); + } + + if (core_info->systemname) + { + QHash hash; + + hash["key"] = QString(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_INFO_SYSTEM_NAME)) + ":"; + hash["value"] = core_info->systemname; + + infoList.append(hash); + } + + if (core_info->system_manufacturer) + { + QHash hash; + + hash["key"] = QString(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_INFO_SYSTEM_MANUFACTURER)) + ":"; + hash["value"] = core_info->system_manufacturer; + + infoList.append(hash); + } + + if (core_info->categories_list) + { + QHash hash; + QString categories; + + for (i = 0; i < core_info->categories_list->size; i++) + { + categories += core_info->categories_list->elems[i].data; + + if (i < core_info->categories_list->size - 1) + categories += ", "; + } + + hash["key"] = QString(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_INFO_CATEGORIES)) + ":"; + hash["value"] = categories; + + infoList.append(hash); + } + + if (core_info->authors_list) + { + QHash hash; + QString authors; + + for (i = 0; i < core_info->authors_list->size; i++) + { + authors += core_info->authors_list->elems[i].data; + + if (i < core_info->authors_list->size - 1) + authors += ", "; + } + + hash["key"] = QString(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_INFO_AUTHORS)) + ":"; + hash["value"] = authors; + + infoList.append(hash); + } + + if (core_info->permissions_list) + { + QHash hash; + QString permissions; + + for (i = 0; i < core_info->permissions_list->size; i++) + { + permissions += core_info->permissions_list->elems[i].data; + + if (i < core_info->permissions_list->size - 1) + permissions += ", "; + } + + hash["key"] = QString(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_INFO_PERMISSIONS)) + ":"; + hash["value"] = permissions; + + infoList.append(hash); + } + + if (core_info->licenses_list) + { + QHash hash; + QString licenses; + + for (i = 0; i < core_info->licenses_list->size; i++) + { + licenses += core_info->licenses_list->elems[i].data; + + if (i < core_info->licenses_list->size - 1) + licenses += ", "; + } + + hash["key"] = QString(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_INFO_LICENSES)) + ":"; + hash["value"] = licenses; + + infoList.append(hash); + } + + if (core_info->supported_extensions_list) + { + QHash hash; + QString supported_extensions; + + for (i = 0; i < core_info->supported_extensions_list->size; i++) + { + supported_extensions += core_info->supported_extensions_list->elems[i].data; + + if (i < core_info->supported_extensions_list->size - 1) + supported_extensions += ", "; + } + + hash["key"] = QString(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_INFO_SUPPORTED_EXTENSIONS)) + ":"; + hash["value"] = supported_extensions; + + infoList.append(hash); + } + + if (core_info->firmware_count > 0) + { + core_info_ctx_firmware_t firmware_info; + bool update_missing_firmware = false; + bool set_missing_firmware = false; + settings_t *settings = config_get_ptr(); + + firmware_info.path = core_info->path; + firmware_info.directory.system = settings->paths.directory_system; + + rarch_ctl(RARCH_CTL_UNSET_MISSING_BIOS, NULL); + + update_missing_firmware = core_info_list_update_missing_firmware(&firmware_info, &set_missing_firmware); + + if (set_missing_firmware) + rarch_ctl(RARCH_CTL_SET_MISSING_BIOS, NULL); + + if (update_missing_firmware) + { + QHash hash; + + hash["key"] = QString(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_INFO_FIRMWARE)) + ":"; + hash["value"] = ""; + + infoList.append(hash); + + /* FIXME: This looks hacky and probably + * needs to be improved for good translation support. */ + + for (i = 0; i < core_info->firmware_count; i++) + { + if (core_info->firmware[i].desc) + { + QString labelText = "(!) "; + QString valueText; + QHash hash; + bool missing = false; + + if (core_info->firmware[i].missing) + { + missing = true; + labelText += msg_hash_to_str(MENU_ENUM_LABEL_VALUE_MISSING); + } + else + { + labelText += msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PRESENT); + } + + labelText += ", "; + + if (core_info->firmware[i].optional) + { + labelText += msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OPTIONAL); + } + else + { + labelText += msg_hash_to_str(MENU_ENUM_LABEL_VALUE_REQUIRED); + } + + labelText += ":"; + + if (core_info->firmware[i].desc) + { + valueText = core_info->firmware[i].desc; + } + else + { + valueText = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_NAME); + } + + hash["key"] = labelText; + hash["value"] = valueText; + + if (missing) + { + QString style = "font-weight: bold; color: #ff0000"; + hash["label_style"] = style; + hash["value_style"] = style; + hash["html_key"] = "" + hash["key"] + ""; + hash["html_value"] = "" + hash["value"] + ""; + } + else + { + QString style = "font-weight: bold; color: rgb(0, 175, 0)"; + hash["label_style"] = style; + hash["value_style"] = style; + hash["html_key"] = "" + hash["key"] + ""; + hash["html_value"] = "" + hash["value"] + ""; + } + + infoList.append(hash); + } + } + } + } + + if (core_info->notes) + { + for (i = 0; i < core_info->note_list->size; i++) + { + QHash hash; + + hash["key"] = ""; + hash["value"] = core_info->note_list->elems[i].data; + + infoList.append(hash); + } + } + + return infoList; +} + +void MainWindow::onSearchResetClicked() +{ + m_searchLineEdit->clear(); + onSearchEnterPressed(); +} + +QToolButton* MainWindow::coreInfoPushButton() +{ + return m_coreInfoPushButton; +} + +void MainWindow::onTreeViewItemsSelected(QModelIndexList selectedIndexes) +{ + QString dir; + + if (selectedIndexes.isEmpty()) + return; + + dir = m_dirModel->filePath(selectedIndexes.first()); + + selectBrowserDir(dir); +} + +void MainWindow::selectBrowserDir(QString path) +{ + QStringList horizontal_header_labels; + QDir dir = path; + QStringList dirList; + int i = 0; + + horizontal_header_labels << msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_NAME); + + m_tableWidget->clear(); + m_tableWidget->setColumnCount(0); + m_tableWidget->setRowCount(0); + m_tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); + m_tableWidget->setSelectionMode(QAbstractItemView::SingleSelection); + m_tableWidget->setSortingEnabled(false); + m_tableWidget->setColumnCount(1); + m_tableWidget->setRowCount(0); + m_tableWidget->setHorizontalHeaderLabels(horizontal_header_labels); + m_tableWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); + m_tableWidget->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel); + + dirList = dir.entryList(QDir::NoDotAndDotDot | + QDir::Readable | + QDir::Files | + (m_settings->value("show_hidden_files", true).toBool() ? (QDir::Hidden | QDir::System) : static_cast(0)), + QDir::Name); + + if (dirList.count() == 0) + return; + + m_tableWidget->setRowCount(dirList.count()); + + for (i = 0; i < dirList.count(); i++) + { + QString fileName = dirList.at(i); + QTableWidgetItem *item = new QTableWidgetItem(fileName); + QHash hash; + QString filePath(dir.absoluteFilePath(fileName)); + QFileInfo fileInfo(filePath); + + hash["path"] = filePath; + hash["label"] = hash["path"]; + hash["label_noext"] = fileInfo.fileName().remove(QString(".") + fileInfo.completeSuffix()); + hash["db_name"] = fileInfo.dir().dirName(); + + item->setData(Qt::UserRole, QVariant::fromValue >(hash)); + item->setFlags(item->flags() & ~Qt::ItemIsEditable); + + m_tableWidget->setItem(i, 0, item); + } + + m_tableWidget->setSortingEnabled(true); + m_tableWidget->resizeColumnsToContents(); + m_tableWidget->sortByColumn(0, Qt::AscendingOrder); + m_tableWidget->selectRow(0); + + onSearchEnterPressed(); +} + +QTabWidget* MainWindow::browserAndPlaylistTabWidget() +{ + return m_browserAndPlaylistTabWidget; +} + +void MainWindow::onTableWidgetEnterPressed() +{ + onRunClicked(); +} + +void MainWindow::onContentItemDoubleClicked(QTableWidgetItem*) +{ + onRunClicked(); +} + +void MainWindow::onStartCoreClicked() +{ + content_ctx_info_t content_info; + + content_info.argc = 0; + content_info.argv = NULL; + content_info.args = NULL; + content_info.environ_get = NULL; + + path_clear(RARCH_PATH_BASENAME); + + if (!task_push_start_current_core(&content_info)) + { + QMessageBox::critical(this, msg_hash_to_str(MSG_ERROR), msg_hash_to_str(MSG_FAILED_TO_LOAD_CONTENT)); + } +} + +QHash MainWindow::getSelectedCore() +{ + QVariantMap coreMap = m_launchWithComboBox->currentData(Qt::UserRole).value(); + CoreSelection coreSelection = static_cast(coreMap.value("core_selection").toInt()); + QHash coreHash; + QHash contentHash; + QTableWidgetItem *contentItem = m_tableWidget->currentItem(); + + if (contentItem) + contentHash = contentItem->data(Qt::UserRole).value >(); + + switch(coreSelection) + { + case CORE_SELECTION_CURRENT: + { + coreHash["core_path"] = path_get(RARCH_PATH_CORE); + + break; + } + case CORE_SELECTION_PLAYLIST_SAVED: + { + if (!contentItem || contentHash["core_path"].isEmpty()) + break; + + coreHash["core_path"] = contentHash["core_path"]; + + break; + } + case CORE_SELECTION_PLAYLIST_DEFAULT: + { + QList > cores; + int i = 0; + + if (!contentItem || contentHash["db_name"].isEmpty()) + break; + + cores = getPlaylistDefaultCores(); + + for (i = 0; i < cores.count(); i++) + { + if (cores[i]["playlist_filename"] == contentHash["db_name"]) + { + if (cores[i]["core_path"].isEmpty()) + break; + + coreHash["core_path"] = cores[i]["core_path"]; + + break; + } + } + + break; + } + default: + break; + } + + return coreHash; +} + +void MainWindow::onRunClicked() +{ +#ifdef HAVE_MENU + content_ctx_info_t content_info; + QHash contentHash; + QTableWidgetItem *item = m_tableWidget->currentItem(); + QByteArray corePathArray; + QByteArray contentPathArray; + QByteArray contentLabelArray; + const char *corePath = NULL; + const char *contentPath = NULL; + const char *contentLabel = NULL; + QVariantMap coreMap = m_launchWithComboBox->currentData(Qt::UserRole).value(); + CoreSelection coreSelection = static_cast(coreMap.value("core_selection").toInt()); + + if (!item) + return; + + if (m_pendingRun) + coreSelection = CORE_SELECTION_CURRENT; + + contentHash = item->data(Qt::UserRole).value >(); + + if (coreSelection == CORE_SELECTION_ASK) + { + QTableWidgetItem *item = m_tableWidget->currentItem(); + QStringList extensionFilters; + + if (item) + { + QHash hash; + + hash = item->data(Qt::UserRole).value >(); + + if (hash.contains("path")) + { + int lastIndex = hash["path"].lastIndexOf('.'); + QString extensionStr; + QByteArray pathArray = hash["path"].toUtf8(); + const char *pathData = pathArray.constData(); + + if (lastIndex >= 0) + { + extensionStr = hash["path"].mid(lastIndex + 1); + + if (!extensionStr.isEmpty()) + { + extensionFilters.append(extensionStr.toLower()); + } + } + + if (path_is_compressed_file(pathData)) + { + unsigned i = 0; + struct string_list *list = file_archive_get_file_list(pathData, NULL); + + if (list) + { + if (list->size > 0) + { + for (i = 0; i < list->size; i++) + { + const char *filePath = list->elems[i].data; + const char *extension = path_get_extension(filePath); + + if (!extensionFilters.contains(extension, Qt::CaseInsensitive)) + extensionFilters.append(extension); + } + } + + string_list_free(list); + } + } + } + } + + m_pendingRun = true; + onLoadCoreClicked(extensionFilters); + + return; + } + + switch(coreSelection) + { + case CORE_SELECTION_CURRENT: + { + corePathArray = path_get(RARCH_PATH_CORE); + contentPathArray = contentHash["path"].toUtf8(); + contentLabelArray = contentHash["label_noext"].toUtf8(); + + break; + } + case CORE_SELECTION_PLAYLIST_SAVED: + { + corePathArray = contentHash["core_path"].toUtf8(); + contentPathArray = contentHash["path"].toUtf8(); + contentLabelArray = contentHash["label_noext"].toUtf8(); + + break; + } + case CORE_SELECTION_PLAYLIST_DEFAULT: + { + QList > cores = getPlaylistDefaultCores(); + int i = 0; + + for (i = 0; i < cores.count(); i++) + { + if (cores[i]["playlist_filename"] == contentHash["db_name"]) + { + corePathArray = cores[i]["core_path"].toUtf8(); + contentPathArray = contentHash["path"].toUtf8(); + contentLabelArray = contentHash["label_noext"].toUtf8(); + break; + } + } + + break; + } + default: + return; + } + + corePath = corePathArray.constData(); + contentPath = contentPathArray.constData(); + contentLabel = contentLabelArray.constData(); + + content_info.argc = 0; + content_info.argv = NULL; + content_info.args = NULL; + content_info.environ_get = NULL; + + menu_navigation_set_selection(0); + command_event(CMD_EVENT_UNLOAD_CORE, NULL); + + if (!task_push_load_content_from_playlist_from_menu( + corePath, contentPath, contentLabel, + &content_info, + NULL, NULL)) + { + QMessageBox::critical(this, msg_hash_to_str(MSG_ERROR), msg_hash_to_str(MSG_FAILED_TO_LOAD_CONTENT)); + return; + } + + menu_driver_ctl(RARCH_MENU_CTL_SET_PENDING_QUICK_MENU, NULL); +#endif +} + +bool MainWindow::isContentLessCore() +{ + rarch_system_info_t *system = runloop_get_system_info(); + + return system->load_no_content; +} + +bool MainWindow::isCoreLoaded() +{ + if (m_currentCore.isEmpty() || m_currentCore == msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_CORE)) + return false; + + return true; +} + +ViewOptionsDialog* MainWindow::viewOptionsDialog() +{ + return m_viewOptionsDialog; +} + +QList > MainWindow::getPlaylistDefaultCores() +{ + settings_t *settings = config_get_ptr(); + struct string_list *playlists = string_split(settings->arrays.playlist_names, ";"); + struct string_list *cores = string_split(settings->arrays.playlist_cores, ";"); + unsigned i = 0; + QList > coreList; + + if (!playlists || !cores) + { + RARCH_WARN("[Qt]: Could not parse one of playlist_names or playlist_cores\n"); + goto finish; + } + else if (playlists->size != cores->size) + { + RARCH_WARN("[Qt]: playlist_names array size differs from playlist_cores\n"); + goto finish; + } + + if (playlists->size == 0) + goto finish; + + for (i = 0; i < playlists->size; i++) + { + const char *playlist = playlists->elems[i].data; + const char *core = cores->elems[i].data; + QHash hash; + + hash["playlist_filename"] = playlist; + hash["playlist_filename"].remove(file_path_str(FILE_PATH_LPL_EXTENSION)); + hash["core_path"] = core; + + coreList.append(hash); + } + +finish: + if (playlists) + string_list_free(playlists); + if (cores) + string_list_free(cores); + + return coreList; +} + +void MainWindow::setCoreActions() +{ + QTableWidgetItem *currentContentItem = m_tableWidget->currentItem(); + QListWidgetItem *currentPlaylistItem = m_listWidget->currentItem(); + QHash hash; + + m_launchWithComboBox->clear(); + + if (isContentLessCore()) + m_startCorePushButton->show(); + else + m_startCorePushButton->hide(); + + if (isCoreLoaded() && m_settings->value("suggest_loaded_core_first", false).toBool()) + { + QVariantMap comboBoxMap; + comboBoxMap["core_name"] = m_currentCore; + comboBoxMap["core_path"] = path_get(RARCH_PATH_CORE); + comboBoxMap["core_selection"] = CORE_SELECTION_CURRENT; + m_launchWithComboBox->addItem(m_currentCore, QVariant::fromValue(comboBoxMap)); + } + + if (currentContentItem) + hash = currentContentItem->data(Qt::UserRole).value >(); + + if (m_browserAndPlaylistTabWidget->tabText(m_browserAndPlaylistTabWidget->currentIndex()) == msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_TAB_PLAYLISTS)) + { + if (currentContentItem) + { + QString coreName = hash["core_name"]; + + if (coreName.isEmpty()) + { + coreName = ""; + } + else + { + const char *detect_str = file_path_str(FILE_PATH_DETECT); + + if (coreName != detect_str) + { + if (m_launchWithComboBox->findText(coreName) == -1) + { + int i = 0; + bool found_existing = false; + + for (i = 0; i < m_launchWithComboBox->count(); i++) + { + QVariantMap map = m_launchWithComboBox->itemData(i, Qt::UserRole).toMap(); + + if (map.value("core_path").toString() == hash["core_path"] || map.value("core_name").toString() == coreName) + { + found_existing = true; + break; + } + } + + if (!found_existing) + { + QVariantMap comboBoxMap; + comboBoxMap["core_name"] = coreName; + comboBoxMap["core_path"] = hash["core_path"]; + comboBoxMap["core_selection"] = CORE_SELECTION_PLAYLIST_SAVED; + m_launchWithComboBox->addItem(coreName, QVariant::fromValue(comboBoxMap)); + } + } + } + } + } + } + + if (!hash["db_name"].isEmpty()) + { + QList > defaultCores = getPlaylistDefaultCores(); + int i = 0; + + if (defaultCores.count() > 0) + { + QString currentPlaylistItemDataString; + QHash hash; + bool allPlaylists = false; + int row = 0; + + if (currentPlaylistItem) + { + currentPlaylistItemDataString = currentPlaylistItem->data(Qt::UserRole).toString(); + allPlaylists = (currentPlaylistItemDataString == ALL_PLAYLISTS_TOKEN); + } + + if (currentContentItem) + hash = currentContentItem->data(Qt::UserRole).value >(); + + for (row = 0; row < m_listWidget->count(); row++) + { + if (allPlaylists) + { + QListWidgetItem *listItem = m_listWidget->item(row); + QString listItemString = listItem->data(Qt::UserRole).toString(); + QFileInfo info; + + info.setFile(listItemString); + + if (listItemString == ALL_PLAYLISTS_TOKEN) + continue; + } + + for (i = 0; i < defaultCores.count(); i++) + { + QString playlist = defaultCores.at(i)["playlist_filename"]; + QString core = defaultCores.at(i)["core_path"]; + QString currentPlaylistFileName = hash["db_name"]; + + playlist.remove(file_path_str(FILE_PATH_LPL_EXTENSION)); + + if (currentPlaylistFileName == playlist) + { + core_info_list_t *coreInfoList = NULL; + unsigned j = 0; + + core_info_get_list(&coreInfoList); + + for (j = 0; j < coreInfoList->count; j++) + { + const core_info_t *info = &coreInfoList->list[j]; + + if (core == info->path) + { + if (m_launchWithComboBox->findText(info->core_name) == -1) + { + int i = 0; + bool found_existing = false; + + for (i = 0; i < m_launchWithComboBox->count(); i++) + { + QVariantMap map = m_launchWithComboBox->itemData(i, Qt::UserRole).toMap(); + + if (map.value("core_path").toString() == info->path || map.value("core_name").toString() == info->core_name) + { + found_existing = true; + break; + } + } + + if (!found_existing) + { + QVariantMap comboBoxMap; + comboBoxMap["core_name"] = info->core_name; + comboBoxMap["core_path"] = info->path; + comboBoxMap["core_selection"] = CORE_SELECTION_PLAYLIST_DEFAULT; + m_launchWithComboBox->addItem(info->core_name, QVariant::fromValue(comboBoxMap)); + } + } + } + } + } + } + + if (!allPlaylists) + break; + } + } + } + + { + QVariantMap comboBoxMap; + comboBoxMap["core_selection"] = CORE_SELECTION_ASK; + m_launchWithComboBox->addItem(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_CORE_SELECTION_ASK), QVariant::fromValue(comboBoxMap)); + m_launchWithComboBox->insertSeparator(m_launchWithComboBox->count()); + comboBoxMap["core_selection"] = CORE_SELECTION_LOAD_CORE; + m_launchWithComboBox->addItem(QString(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_LOAD_CORE)) + "...", QVariant::fromValue(comboBoxMap)); + } +} + +void MainWindow::onTabWidgetIndexChanged(int index) +{ + Q_UNUSED(index) + + if (m_browserAndPlaylistTabWidget->tabText(m_browserAndPlaylistTabWidget->currentIndex()) == msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_TAB_FILE_BROWSER)) + { + QModelIndex index = m_dirTree->currentIndex(); + + m_tableWidget->clear(); + m_tableWidget->setColumnCount(0); + m_tableWidget->setRowCount(0); + + if (index.isValid()) + { + m_dirTree->clearSelection(); + m_dirTree->setCurrentIndex(index); + } + } + else if (m_browserAndPlaylistTabWidget->tabText(m_browserAndPlaylistTabWidget->currentIndex()) == msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_TAB_PLAYLISTS)) + { + QListWidgetItem *item = m_listWidget->currentItem(); + + m_tableWidget->clear(); + m_tableWidget->setColumnCount(0); + m_tableWidget->setRowCount(0); + + if (item) + { + m_listWidget->setCurrentItem(NULL); + m_listWidget->setCurrentItem(item); + } + } + + setCoreActions(); +} + +QToolButton* MainWindow::runPushButton() +{ + return m_runPushButton; +} + +QToolButton* MainWindow::stopPushButton() +{ + return m_stopPushButton; +} + +QToolButton* MainWindow::startCorePushButton() +{ + return m_startCorePushButton; +} + +QComboBox* MainWindow::launchWithComboBox() +{ + return m_launchWithComboBox; +} + +void MainWindow::getPlaylistFiles() +{ + settings_t *settings = config_get_ptr(); + QDir playlistDir(settings->paths.directory_playlist); + + m_playlistFiles = playlistDir.entryList(QDir::NoDotAndDotDot | QDir::Readable | QDir::Files, QDir::Name); +} + +void MainWindow::onSearchLineEditEdited(const QString &text) +{ + int i = 0; + QList items; + QVector textUnicode = text.toUcs4(); + QVector textHiraToKata; + QVector textKataToHira; + bool foundHira = false; + bool foundKata = false; + + if (text.isEmpty()) + { + for (i = 0; i < m_tableWidget->rowCount(); i++) + { + m_tableWidget->setRowHidden(i, false); + } + return; + } + + items.append(m_tableWidget->findItems(text, Qt::MatchContains)); + + for (i = 0; i < textUnicode.size(); i++) + { + unsigned code = textUnicode.at(i); + + if (code >= HIRAGANA_START && code <= HIRAGANA_END) + { + foundHira = true; + textHiraToKata += code + HIRA_KATA_OFFSET; + } + else if (code >= KATAKANA_START && code <= KATAKANA_END) + { + foundKata = true; + textKataToHira += code - HIRA_KATA_OFFSET; + } + else + { + textHiraToKata += code; + textKataToHira += code; + } + } + + if (foundHira) + { + items.append(m_tableWidget->findItems(QString::fromUcs4(textHiraToKata.constData(), textHiraToKata.size()), Qt::MatchContains)); + } + + if (foundKata) + { + items.append(m_tableWidget->findItems(QString::fromUcs4(textKataToHira.constData(), textKataToHira.size()), Qt::MatchContains)); + } + + if (items.isEmpty()) + { + for (i = 0; i < m_tableWidget->rowCount(); i++) + { + m_tableWidget->setRowHidden(i, true); + } + + return; + } + else + { + for (i = 0; i < m_tableWidget->rowCount(); i++) + { + if (items.contains(m_tableWidget->item(i, 0))) + m_tableWidget->setRowHidden(i, false); + else + m_tableWidget->setRowHidden(i, true); + } + } +} + +void MainWindow::onViewClosedDocksAboutToShow() +{ + QMenu *menu = qobject_cast(sender()); + QList dockWidgets; + bool found = false; + + if (!menu) + return; + + dockWidgets = findChildren(); + + menu->clear(); + + if (dockWidgets.isEmpty()) + { + menu->addAction(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NONE)); + return; + } + + foreach (QDockWidget *dock, dockWidgets) + { + if (!dock->isVisible()) + { + QAction *action = menu->addAction(dock->property("menu_text").toString(), this, SLOT(onShowHiddenDockWidgetAction())); + action->setProperty("dock_name", dock->objectName()); + found = true; + } + } + + if (!found) + { + menu->addAction(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NONE)); + } +} + +void MainWindow::onShowHiddenDockWidgetAction() +{ + QAction *action = qobject_cast(sender()); + QDockWidget *dock = NULL; + + if (!action) + return; + + dock = findChild(action->property("dock_name").toString()); + + if (!dock) + return; + + if (!dock->isVisible()) + { + addDockWidget(static_cast(dock->property("default_area").toInt()), dock); + dock->setVisible(true); + dock->setFloating(false); + } +} + +QWidget* MainWindow::searchWidget() +{ + return m_searchWidget; +} + +QLineEdit* MainWindow::searchLineEdit() +{ + return m_searchLineEdit; +} + +void MainWindow::onSearchEnterPressed() +{ + onSearchLineEditEdited(m_searchLineEdit->text()); +} + +void MainWindow::onCurrentTableItemChanged(QTableWidgetItem *current, QTableWidgetItem *) +{ + settings_t *settings = config_get_ptr(); + QHash hash; + QString label; + QString playlist_name; + QByteArray extension; + QString extensionStr; + int lastIndex = -1; + + if (!current) + return; + + hash = current->data(Qt::UserRole).value >(); + + label = hash["label_noext"]; + label.replace(m_fileSanitizerRegex, "_"); + + lastIndex = hash["path"].lastIndexOf('.'); + + if (lastIndex >= 0) + { + extensionStr = hash["path"].mid(lastIndex + 1); + + if (!extensionStr.isEmpty()) + { + extension = extensionStr.toLower().toUtf8(); + } + } + + playlist_name = hash["db_name"]; + + if (m_thumbnailPixmap) + delete m_thumbnailPixmap; + if (m_thumbnailPixmap2) + delete m_thumbnailPixmap2; + if (m_thumbnailPixmap3) + delete m_thumbnailPixmap3; + + if (!extension.isEmpty() && m_imageFormats.contains(extension)) + { + /* use thumbnail widgets to show regular image files */ + m_thumbnailPixmap = new QPixmap(hash["path"]); + m_thumbnailPixmap2 = new QPixmap(*m_thumbnailPixmap); + m_thumbnailPixmap3 = new QPixmap(*m_thumbnailPixmap); + } + else + { + m_thumbnailPixmap = new QPixmap(QString(settings->paths.directory_thumbnails) + "/" + playlist_name + "/" + THUMBNAIL_BOXART + "/" + label + ".png"); + m_thumbnailPixmap2 = new QPixmap(QString(settings->paths.directory_thumbnails) + "/" + playlist_name + "/" + THUMBNAIL_TITLE + "/" + label + ".png"); + m_thumbnailPixmap3 = new QPixmap(QString(settings->paths.directory_thumbnails) + "/" + playlist_name + "/" + THUMBNAIL_SCREENSHOT + "/" + label + ".png"); + } + + resizeThumbnails(true, true, true); + + setCoreActions(); +} + +void MainWindow::onResizeThumbnailOne() +{ + resizeThumbnails(true, false, false); +} + +void MainWindow::onResizeThumbnailTwo() +{ + resizeThumbnails(false, true, false); +} + +void MainWindow::onResizeThumbnailThree() +{ + resizeThumbnails(false, false, true); +} + +void MainWindow::resizeThumbnails(bool one, bool two, bool three) +{ + QPixmap pixmap; + QPixmap pixmap2; + QPixmap pixmap3; + ThumbnailLabel *thumbnail = NULL; + ThumbnailLabel *thumbnail2 = NULL; + ThumbnailLabel *thumbnail3 = NULL; + + if (m_thumbnailPixmap) + pixmap = *m_thumbnailPixmap; + if (m_thumbnailPixmap2) + pixmap2 = *m_thumbnailPixmap2; + if (m_thumbnailPixmap3) + pixmap3 = *m_thumbnailPixmap3; + + thumbnail = findChild("thumbnail"); + thumbnail2 = findChild("thumbnail2"); + thumbnail3 = findChild("thumbnail3"); + + if (thumbnail && one) + { + if (pixmap.isNull()) + thumbnail->hide(); + else + { + thumbnail->show(); + emit thumbnailChanged(pixmap); + thumbnail->update(); + } + } + + if (thumbnail2 && two) + { + if (pixmap2.isNull()) + thumbnail2->hide(); + else + { + thumbnail2->show(); + emit thumbnail2Changed(pixmap2); + thumbnail2->update(); + } + } + + if (thumbnail3 && three) + { + if (pixmap3.isNull()) + thumbnail3->hide(); + else + { + thumbnail3->show(); + emit thumbnail3Changed(pixmap3); + thumbnail3->update(); + } + } +} + +void MainWindow::onCurrentListItemChanged(QListWidgetItem *current, QListWidgetItem *previous) +{ + Q_UNUSED(current) + Q_UNUSED(previous) + + if (m_browserAndPlaylistTabWidget->tabText(m_browserAndPlaylistTabWidget->currentIndex()) != msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_TAB_PLAYLISTS)) + return; + + initContentTableWidget(); + setCoreActions(); +} + +TableWidget* MainWindow::contentTableWidget() +{ + return m_tableWidget; +} + +void MainWindow::onBrowserDownloadsClicked() +{ + settings_t *settings = config_get_ptr(); + QDir dir(settings->paths.directory_core_assets); + + m_dirTree->setCurrentIndex(m_dirModel->index(dir.absolutePath())); + /* for some reason, scrollTo only seems to work right when the button is clicked twice (only tested on Linux) */ + m_dirTree->scrollTo(m_dirTree->currentIndex(), QAbstractItemView::PositionAtTop); +} + +void MainWindow::onBrowserUpClicked() +{ + QDir dir(m_dirModel->filePath(m_dirTree->currentIndex())); + + dir.cdUp(); + + m_dirTree->setCurrentIndex(m_dirModel->index(dir.absolutePath())); + m_dirTree->scrollTo(m_dirTree->currentIndex(), QAbstractItemView::EnsureVisible); +} + +void MainWindow::onBrowserStartClicked() +{ + settings_t *settings = config_get_ptr(); + + m_dirTree->setCurrentIndex(m_dirModel->index(settings->paths.directory_menu_content)); + m_dirTree->scrollTo(m_dirTree->currentIndex(), QAbstractItemView::PositionAtTop); +} + +QListWidget* MainWindow::playlistListWidget() +{ + return m_listWidget; +} + +TreeView* MainWindow::dirTreeView() +{ + return m_dirTree; +} + +void MainWindow::onTimeout() +{ + bool contentless = false; + bool is_inited = false; + + content_get_status(&contentless, &is_inited); + + if (is_inited) + { + if (m_runPushButton->isVisible()) + m_runPushButton->hide(); + if (!m_stopPushButton->isVisible()) + m_stopPushButton->show(); + } + else + { + if (!m_runPushButton->isVisible()) + m_runPushButton->show(); + if (m_stopPushButton->isVisible()) + m_stopPushButton->hide(); + } + + setCurrentCoreLabel(); +} + +void MainWindow::onStopClicked() +{ + menu_navigation_set_selection(0); + command_event(CMD_EVENT_UNLOAD_CORE, NULL); + setCurrentCoreLabel(); + activateWindow(); + raise(); +} + +void MainWindow::setCurrentCoreLabel() +{ + rarch_system_info_t *system = runloop_get_system_info(); + bool update = false; + QString libraryName = system->info.library_name; + const char *no_core_str = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_CORE); + + if (m_statusLabel->text().isEmpty() || (m_currentCore != no_core_str && libraryName.isEmpty())) + { + m_currentCore = no_core_str; + m_currentCoreVersion = ""; + update = true; + } + else + { + if (m_currentCore != libraryName && !libraryName.isEmpty()) + { + m_currentCore = system->info.library_name; + m_currentCoreVersion = (string_is_empty(system->info.library_version) ? "" : system->info.library_version); + update = true; + } + } + + if (update) + { + QAction *unloadCoreAction = findChild("unloadCoreAction"); + QString text = QString(PACKAGE_VERSION) + " - " + m_currentCore + " " + m_currentCoreVersion; + m_statusLabel->setText(text); + m_loadCoreWindow->setStatusLabel(text); + setCoreActions(); + + if (unloadCoreAction) + { + if (libraryName.isEmpty()) + unloadCoreAction->setEnabled(false); + else + unloadCoreAction->setEnabled(true); + } + } +} + +void MainWindow::onCoreLoadWindowClosed() +{ + QVariant lastLaunchWithVariant = m_loadCoreWindow->property("last_launch_with_index"); + int lastLaunchWithIndex = lastLaunchWithVariant.toInt(); + + m_pendingRun = false; + + if (lastLaunchWithVariant.isValid() && lastLaunchWithIndex >= 0) + { + m_launchWithComboBox->setCurrentIndex(lastLaunchWithIndex); + m_loadCoreWindow->setProperty("last_launch_with_index", -1); + } +} + +void MainWindow::onCoreLoaded() +{ + QAction *unloadAction = findChild("unloadCoreAction"); + + activateWindow(); + raise(); + setCurrentCoreLabel(); + setCoreActions(); + + if (unloadAction) + unloadAction->setEnabled(true); + + m_loadCoreWindow->hide(); + + if (m_pendingRun) + { + onRunClicked(); + m_pendingRun = false; + } +} + +void MainWindow::onUnloadCoreMenuAction() +{ + QAction *action = qobject_cast(sender()); + + menu_navigation_set_selection(0); + + if (!command_event(CMD_EVENT_UNLOAD_CORE, NULL)) + { + /* TODO */ + return; + } + + setCurrentCoreLabel(); + setCoreActions(); + + if (!action) + return; + + action->setEnabled(false); + activateWindow(); + raise(); +} + +void MainWindow::onLoadCoreClicked(const QStringList &extensionFilters) +{ + m_loadCoreWindow->show(); + m_loadCoreWindow->resize(width() / 2, height()); + m_loadCoreWindow->setGeometry(QStyle::alignedRect(Qt::LeftToRight, Qt::AlignCenter, m_loadCoreWindow->size(), geometry())); + m_loadCoreWindow->initCoreList(extensionFilters); +} + +void MainWindow::initContentTableWidget() +{ + QListWidgetItem *item = m_listWidget->currentItem(); + QStringList horizontal_header_labels; + QString path; + + if (!item) + return; + + horizontal_header_labels << msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_NAME); + + m_tableWidget->clear(); + m_tableWidget->setColumnCount(0); + m_tableWidget->setRowCount(0); + m_tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); + m_tableWidget->setSelectionMode(QAbstractItemView::SingleSelection); + m_tableWidget->setSortingEnabled(false); + m_tableWidget->setColumnCount(1); + m_tableWidget->setRowCount(0); + m_tableWidget->setHorizontalHeaderLabels(horizontal_header_labels); + m_tableWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); + m_tableWidget->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel); + + path = item->data(Qt::UserRole).toString(); + + if (path == ALL_PLAYLISTS_TOKEN) + { + settings_t *settings = config_get_ptr(); + QDir playlistDir(settings->paths.directory_playlist); + + foreach (QString playlist, m_playlistFiles) + { + addPlaylistItemsToTable(playlistDir.absoluteFilePath(playlist)); + } + } + else + addPlaylistItemsToTable(path); + + m_tableWidget->setSortingEnabled(true); + + if (item != m_historyPlaylistsItem) + m_tableWidget->sortByColumn(0, Qt::AscendingOrder); + + m_tableWidget->resizeColumnsToContents(); + m_tableWidget->selectRow(0); + + onSearchEnterPressed(); +} + +void MainWindow::addPlaylistItemsToTable(QString pathString) +{ + QByteArray pathArray; + const char *pathData = NULL; + playlist_t *playlist = NULL; + unsigned playlistSize = 0; + unsigned i = 0; + int oldRowCount = m_tableWidget->rowCount(); + + pathArray.append(pathString); + pathData = pathArray.constData(); + + playlist = playlist_init(pathData, COLLECTION_SIZE); + playlistSize = playlist_get_size(playlist); + + m_tableWidget->setRowCount(oldRowCount + playlistSize); + + for (i = 0; i < playlistSize; i++) + { + const char *path = NULL; + const char *label = NULL; + const char *core_path = NULL; + const char *core_name = NULL; + const char *crc32 = NULL; + const char *db_name = NULL; + QTableWidgetItem *labelItem = NULL; + QHash hash; + + playlist_get_index(playlist, i, + &path, &label, &core_path, + &core_name, &crc32, &db_name); + + if (string_is_empty(path)) + continue; + else + hash["path"] = path; + + if (string_is_empty(label)) + { + hash["label"] = path; + hash["label_noext"] = path; + } + else + { + hash["label"] = label; + hash["label_noext"] = label; + } + + if (!string_is_empty(core_path)) + hash["core_path"] = core_path; + + if (!string_is_empty(core_name)) + hash["core_name"] = core_name; + + if (!string_is_empty(crc32)) + hash["crc32"] = crc32; + + if (!string_is_empty(db_name)) + { + hash["db_name"] = db_name; + hash["db_name"].remove(file_path_str(FILE_PATH_LPL_EXTENSION)); + } + + labelItem = new QTableWidgetItem(hash["label"]); + labelItem->setData(Qt::UserRole, QVariant::fromValue >(hash)); + labelItem->setFlags(labelItem->flags() & ~Qt::ItemIsEditable); + + m_tableWidget->setItem(oldRowCount + i, 0, labelItem); + } + + playlist_free(playlist); + playlist = NULL; +} + +void MainWindow::keyPressEvent(QKeyEvent *event) +{ +/* + if (event->key() == Qt::Key_F5) + { + event->accept(); + hide(); + + return; + } +*/ + QMainWindow::keyPressEvent(event); +} + +QSettings* MainWindow::settings() +{ + return m_settings; +} + +void MainWindow::closeEvent(QCloseEvent *event) +{ + if (m_settings->value("save_geometry", false).toBool()) + m_settings->setValue("geometry", saveGeometry()); + if (m_settings->value("save_dock_positions", false).toBool()) + m_settings->setValue("dock_positions", saveState()); + if (m_settings->value("save_last_tab", false).toBool()) + m_settings->setValue("last_tab", m_browserAndPlaylistTabWidget->currentIndex()); + + QMainWindow::closeEvent(event); +} + +static void* ui_window_qt_init(void) +{ + ui_window.qtWindow = new MainWindow(); + + return &ui_window; +} static void ui_window_qt_destroy(void *data) { + (void)data; +/* ui_window_qt_t *window = (ui_window_qt_t*)data; delete window->qtWindow; +*/ } static void ui_window_qt_set_focused(void *data) { + (void)data; +/* ui_window_qt_t *window = (ui_window_qt_t*)data; window->qtWindow->raise(); window->qtWindow->activateWindow(); +*/ } static void ui_window_qt_set_visible(void *data, bool set_visible) { + (void)data; + (void)set_visible; /* TODO/FIXME */ } static void ui_window_qt_set_title(void *data, char *buf) { + (void)data; + (void)buf; +/* ui_window_qt_t *window = (ui_window_qt_t*)data; window->qtWindow->setWindowTitle(QString::fromUtf8(buf)); +*/ } static void ui_window_qt_set_droppable(void *data, bool droppable) { + (void)data; + (void)droppable; +/* ui_window_qt_t *window = (ui_window_qt_t*)data; - window->qtWindow->setAcceptDrops(droppable); + window->qtWindow->setAcceptDrops(droppable); +*/ } static bool ui_window_qt_focused(void *data) { + (void)data; +/* ui_window_qt_t *window = (ui_window_qt_t*)data; return window->qtWindow->isActiveWindow() && !window->qtWindow->isMinimized(); +*/ + return true; } -const ui_window_t ui_window_qt = { +ui_window_t ui_window_qt = { + ui_window_qt_init, ui_window_qt_destroy, ui_window_qt_set_focused, ui_window_qt_set_visible, diff --git a/ui/drivers/qt/wimp-test/main.cpp b/ui/drivers/qt/wimp-test/main.cpp deleted file mode 100644 index 7f0f8f6217..0000000000 --- a/ui/drivers/qt/wimp-test/main.cpp +++ /dev/null @@ -1,45 +0,0 @@ -#include -#include "../wrapper/wrapper.h" -#include "../wimp/wimp.h" - -#include -#include -#include - -struct Wimp* t; - - -int i=0; - -void *initGui(void *arg) -{ - char **arguments = (char**)arg; - t = ctrWimp(i,arguments); - CreateMainWindow(t); //-->uncomment this to open the Qt GUI - return 0; -} - -int main(int argc, char *argv[]) -{ - i = argc; - - pthread_t gui; - int rc; - rc=pthread_create(&gui, NULL, initGui, (void *)argv); - if(rc!=0) - { - printf("failed"); - exit(1); - } - - for(int j=0;j<100;j++) - { - Sleep(1000); - printf("test = %d\n",i); - i++; - } - - pthread_join(gui,NULL); - return 0; -} - diff --git a/ui/drivers/qt/wimp-test/wimp-test.pro b/ui/drivers/qt/wimp-test/wimp-test.pro deleted file mode 100644 index cd3966adf0..0000000000 --- a/ui/drivers/qt/wimp-test/wimp-test.pro +++ /dev/null @@ -1,33 +0,0 @@ -TARGET = wimp-test -CONFIG += console - -SOURCES += main.cpp - -Release:DESTDIR = ../build/release -Release:OBJECTS_DIR = ../build/release/obj -Release:MOC_DIR = ../build/release/moc -Release:RCC_DIR = ../build/release/rcc -Release:UI_DIR = ../build/release/ui - -Debug:DESTDIR = ../build/debug -Debug:OBJECTS_DIR = ../build/debug/obj -Debug:MOC_DIR = ../build/debug/moc -Debug:RCC_DIR = ../build/debug/rcc -Debug:UI_DIR = ../build/debug/ui - -win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../build/release/ -lwimp.dll -else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/build/debug/ -lwimp.dll -else:unix: LIBS += -L$$PWD/../wimp/build/ -lwimp.dll - -win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../build/release/ -lwrapper.dll -else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../build/debug/ -lwrapper.dll -else:unix:CONFIG(debug, debug|release): LIBS += -L$$PWD/../build/debug/ -lwrapper.so -else:unix:CONFIG(release, debug|release): LIBS += -L$$PWD/../build/debug/ -lwrapper.so - -INCLUDEPATH += $$PWD/../../../../ -INCLUDEPATH += $$PWD/../../../../libretro-common/include/ - -win32:CONFIG(release, debug|release): INCLUDEPATH += $$PWD/../build/release -else:win32:CONFIG(debug, debug|release): INCLUDEPATH += $$PWD/../build/debug -else:unix:CONFIG(debug, debug|release): INCLUDEPATH += $$PWD/../build/release -else:unix:CONFIG(release, debug|release): INCLUDEPATH += $$PWD/../build/release diff --git a/ui/drivers/qt/wimp/main.qml b/ui/drivers/qt/wimp/main.qml deleted file mode 100644 index d917ed83ff..0000000000 --- a/ui/drivers/qt/wimp/main.qml +++ /dev/null @@ -1,163 +0,0 @@ -import QtQuick 2.2 -import Material 0.1 -import Material.ListItems 0.1 as ListItem - -ApplicationWindow { - id: mainWindow - title: "RetroArch" - width: 1280 - height: 720 - color: "#211822" - visible: true - theme { - primaryColor: Palette.colors["blue"]["500"] - primaryDarkColor: Palette.colors["blue"]["700"] - accentColor: Palette.colors["red"]["A200"] - tabHighlightColor: "white" - } - - /* temporary top level folder list */ - property var folders: [ - "C:\\", "D:\\" - ] - - property var sections: [ collections, cores, folders ] - property var sectionTitles: [ "Collections", "Cores", "File Browser" ] - - property string selectedItem: collections[0] - - - initialPage: Page { - id: page - - title: "Qt!" - - tabs: navDrawer.enabled ? [] : sectionTitles - - actionBar.maxActionCount: navDrawer.enabled ? 3 : 4 - - actions: [ - Action { - iconName: "action/search" - name: "Search" - enabled: true - }, - - Action { - iconName: "image/color_lens" - name: "Colors" - onTriggered: colorPicker.show() - }, - - Action { - iconName: "action/settings" - name: "Settings" - hoverAnimation: true - }, - - - Action { - iconName: "action/language" - name: "Language" - enabled: true - }, - - Action { - iconName: "action/account_circle" - name: "Accounts" - } - ] - - backAction: navDrawer.action - - NavigationDrawer { - id: navDrawer - enabled: page.width < Units.dp(500) - - - Flickable { - anchors.fill: parent - - contentHeight: Math.max(content.implicitHeight, height) - - Column { - id: content - anchors.fill: parent - - Repeater { - model: sections - - delegate: ListItem.Standard { - width: parent.width - ListItem.Subheader { - text: sectionTitles[index] - } - } - } - } - } - } - - - } - - Dialog { - id: colorPicker - title: "Pick color" - - positiveButtonText: "Done" - - MenuField { - id: selection - model: ["Primary color", "Accent color", "Background color"] - width: Units.dp(160) - } - - Grid { - columns: 7 - spacing: Units.dp(8) - - Repeater { - model: [ - "red", "pink", "purple", "deepPurple", "indigo", - "blue", "lightBlue", "cyan", "teal", "green", - "lightGreen", "lime", "yellow", "amber", "orange", - "deepOrange", "grey", "blueGrey", "brown", "black", - "white" - ] - - Rectangle { - width: Units.dp(30) - height: Units.dp(30) - radius: Units.dp(2) - color: Palette.colors[modelData]["500"] - border.width: modelData === "white" ? Units.dp(2) : 0 - border.color: Theme.alpha("#000", 0.26) - - Ink { - anchors.fill: parent - - onPressed: { - switch(selection.selectedIndex) { - case 0: - theme.primaryColor = parent.color - break; - case 1: - theme.accentColor = parent.color - break; - case 2: - theme.backgroundColor = parent.color - break; - } - } - } - } - } - } - - onRejected: { - // TODO set default colors again but we currently don't know what that is - } - } - -} diff --git a/ui/drivers/qt/wimp/qml.qrc b/ui/drivers/qt/wimp/qml.qrc deleted file mode 100644 index 219fc5bcb4..0000000000 --- a/ui/drivers/qt/wimp/qml.qrc +++ /dev/null @@ -1,5 +0,0 @@ - - - main.qml - - diff --git a/ui/drivers/qt/wimp/wimp.cpp b/ui/drivers/qt/wimp/wimp.cpp deleted file mode 100644 index 7c65bb14c1..0000000000 --- a/ui/drivers/qt/wimp/wimp.cpp +++ /dev/null @@ -1,51 +0,0 @@ -/* RetroArch - A frontend for libretro. - * Copyright (C) 2011-2017 - Andres Suarez - * - * 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 "wimp.h" -#include "stdio.h" -#include -#include -#include -#include -#include -#include - -#include "../../../../file_path_special.h" - -QObject *topLevel; - -int Wimp::CreateMainWindow() -{ - - engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); - topLevel = engine.rootObjects().value(0); - window = qobject_cast(topLevel); - - collections.append("Collection dir not defined"); - - engine.rootContext()->setContextProperty("collections", QVariant::fromValue(collections)); - - cores.append("Core dir not defined"); - - engine.rootContext()->setContextProperty("cores", QVariant::fromValue(cores)); - - return this->exec(); - -} - -void Wimp::GetSettings(settings_t *s) -{ - settings = s; -} diff --git a/ui/drivers/qt/wimp/wimp.h b/ui/drivers/qt/wimp/wimp.h deleted file mode 100644 index e456307592..0000000000 --- a/ui/drivers/qt/wimp/wimp.h +++ /dev/null @@ -1,63 +0,0 @@ -/* RetroArch - A frontend for libretro. - * Copyright (C) 2011-2017 - Andrés Suárez - * - * 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 . - */ - -#ifndef WIMP_H -#define WIMP_H - -/* this is the only define missing from config.h remove these once - * we can build everything with a single makefile - */ - -#ifndef HAVE_MENU -#define HAVE_MENU -#endif - -#include "config.h" -#include "configuration.h" - -#include "wimp_global.h" -#include -#include -#include -#include - -class WIMPSHARED_EXPORT Wimp : public QGuiApplication -{ - QQuickWindow *window; - - Q_OBJECT - public: - Wimp(int argc, char *argv[]): QGuiApplication(argc, argv) {} - - /* create the main Qt window */ - int CreateMainWindow(); - - /* get a pointer to RetroArch settings */ - void GetSettings(settings_t *s); - - void GetCollections(char* path); - void GetCores(char* path); - - private: - /* pointer to RetroArch settings */ - settings_t *settings; - QStringList collections; - QStringList cores; - QQmlApplicationEngine engine; - -}; - -#endif // WIMP_H - diff --git a/ui/drivers/qt/wimp/wimp.pro b/ui/drivers/qt/wimp/wimp.pro deleted file mode 100644 index 4917f2c1ea..0000000000 --- a/ui/drivers/qt/wimp/wimp.pro +++ /dev/null @@ -1,37 +0,0 @@ -#------------------------------------------------- -# -# Project created by QtCreator 2014-10-21T21:15:44 -# -#------------------------------------------------- - -QT += qml quick widgets - -TARGET = wimp -TEMPLATE = lib - -DEFINES += WIMP_LIBRARY - -SOURCES += \ - wimp.cpp - -HEADERS +=\ - wimp.h \ - wimp_global.h - -RESOURCES += \ - qml.qrc - -Release:DESTDIR = ../build/release -Release:OBJECTS_DIR = ../build/release/obj -Release:MOC_DIR = ../build/release/moc -Release:RCC_DIR = ../build/release/rcc -Release:UI_DIR = ../build/release/ui - -Debug:DESTDIR = ../build/debug -Debug:OBJECTS_DIR = ../build/debug/obj -Debug:MOC_DIR = ../build/debug/moc -Debug:RCC_DIR = ../build/debug/rcc -Debug:UI_DIR = ../build/debug/ui - -INCLUDEPATH += $$PWD/../../../../ -INCLUDEPATH += $$PWD/../../../../libretro-common/include/ diff --git a/ui/drivers/qt/wimp/wimp_global.h b/ui/drivers/qt/wimp/wimp_global.h deleted file mode 100644 index fbad654773..0000000000 --- a/ui/drivers/qt/wimp/wimp_global.h +++ /dev/null @@ -1,28 +0,0 @@ -/* RetroArch - A frontend for libretro. - * Copyright (C) 2011-2017 - Andrés Suárez - * - * 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 . - */ - - -#ifndef WIMP_GLOBAL_H -#define WIMP_GLOBAL_H - -#include - -#if defined(WIMP_LIBRARY) -# define WIMPSHARED_EXPORT Q_DECL_EXPORT -#else -# define WIMPSHARED_EXPORT Q_DECL_IMPORT -#endif - -#endif // WIMP_GLOBAL_H diff --git a/ui/drivers/qt/wrapper/deployment.pri b/ui/drivers/qt/wrapper/deployment.pri deleted file mode 100644 index 4642d1b5ac..0000000000 --- a/ui/drivers/qt/wrapper/deployment.pri +++ /dev/null @@ -1,191 +0,0 @@ -# This file was generated by an application wizard of Qt Creator. -# The code below handles deployment to Android and Maemo, aswell as copying -# of the application data to shadow build directories on desktop. -# It is recommended not to modify this file, since newer versions of Qt Creator -# may offer an updated version of it. - -defineTest(qtcAddDeployment) { -for(deploymentfolder, DEPLOYMENTFOLDERS) { - item = item$${deploymentfolder} - greaterThan(QT_MAJOR_VERSION, 4) { - itemsources = $${item}.files - } else { - itemsources = $${item}.sources - } - $$itemsources = $$eval($${deploymentfolder}.source) - itempath = $${item}.path - $$itempath= $$eval($${deploymentfolder}.target) - export($$itemsources) - export($$itempath) - DEPLOYMENT += $$item -} - -MAINPROFILEPWD = $$PWD - -android-no-sdk { - for(deploymentfolder, DEPLOYMENTFOLDERS) { - item = item$${deploymentfolder} - itemfiles = $${item}.files - $$itemfiles = $$eval($${deploymentfolder}.source) - itempath = $${item}.path - $$itempath = /data/user/qt/$$eval($${deploymentfolder}.target) - export($$itemfiles) - export($$itempath) - INSTALLS += $$item - } - - target.path = /data/user/qt - - export(target.path) - INSTALLS += target -} else:android { - for(deploymentfolder, DEPLOYMENTFOLDERS) { - item = item$${deploymentfolder} - itemfiles = $${item}.files - $$itemfiles = $$eval($${deploymentfolder}.source) - itempath = $${item}.path - $$itempath = /assets/$$eval($${deploymentfolder}.target) - export($$itemfiles) - export($$itempath) - INSTALLS += $$item - } - - x86 { - target.path = /libs/x86 - } else: armeabi-v7a { - target.path = /libs/armeabi-v7a - } else { - target.path = /libs/armeabi - } - - export(target.path) - INSTALLS += target -} else:win32 { - copyCommand = - for(deploymentfolder, DEPLOYMENTFOLDERS) { - source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source) - source = $$replace(source, /, \\) - sourcePathSegments = $$split(source, \\) - target = $$OUT_PWD/$$eval($${deploymentfolder}.target)/$$last(sourcePathSegments) - target = $$replace(target, /, \\) - target ~= s,\\\\\\.?\\\\,\\, - !isEqual(source,$$target) { - !isEmpty(copyCommand):copyCommand += && - isEqual(QMAKE_DIR_SEP, \\) { - copyCommand += $(COPY_DIR) \"$$source\" \"$$target\" - } else { - source = $$replace(source, \\\\, /) - target = $$OUT_PWD/$$eval($${deploymentfolder}.target) - target = $$replace(target, \\\\, /) - copyCommand += test -d \"$$target\" || mkdir -p \"$$target\" && cp -r \"$$source\" \"$$target\" - } - } - } - !isEmpty(copyCommand) { - copyCommand = @echo Copying application data... && $$copyCommand - copydeploymentfolders.commands = $$copyCommand - first.depends = $(first) copydeploymentfolders - export(first.depends) - export(copydeploymentfolders.commands) - QMAKE_EXTRA_TARGETS += first copydeploymentfolders - } -} else:ios { - copyCommand = - for(deploymentfolder, DEPLOYMENTFOLDERS) { - source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source) - source = $$replace(source, \\\\, /) - target = $CODESIGNING_FOLDER_PATH/$$eval($${deploymentfolder}.target) - target = $$replace(target, \\\\, /) - sourcePathSegments = $$split(source, /) - targetFullPath = $$target/$$last(sourcePathSegments) - targetFullPath ~= s,/\\.?/,/, - !isEqual(source,$$targetFullPath) { - !isEmpty(copyCommand):copyCommand += && - copyCommand += mkdir -p \"$$target\" - copyCommand += && cp -r \"$$source\" \"$$target\" - } - } - !isEmpty(copyCommand) { - copyCommand = echo Copying application data... && $$copyCommand - !isEmpty(QMAKE_POST_LINK): QMAKE_POST_LINK += ";" - QMAKE_POST_LINK += "$$copyCommand" - export(QMAKE_POST_LINK) - } -} else:unix { - maemo5 { - desktopfile.files = $${TARGET}.desktop - desktopfile.path = /usr/share/applications/hildon - icon.files = $${TARGET}64.png - icon.path = /usr/share/icons/hicolor/64x64/apps - } else:!isEmpty(MEEGO_VERSION_MAJOR) { - desktopfile.files = $${TARGET}_harmattan.desktop - desktopfile.path = /usr/share/applications - icon.files = $${TARGET}80.png - icon.path = /usr/share/icons/hicolor/80x80/apps - } else { # Assumed to be a Desktop Unix - copyCommand = - for(deploymentfolder, DEPLOYMENTFOLDERS) { - source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source) - source = $$replace(source, \\\\, /) - macx { - target = $$OUT_PWD/$${TARGET}.app/Contents/Resources/$$eval($${deploymentfolder}.target) - } else { - target = $$OUT_PWD/$$eval($${deploymentfolder}.target) - } - target = $$replace(target, \\\\, /) - sourcePathSegments = $$split(source, /) - targetFullPath = $$target/$$last(sourcePathSegments) - targetFullPath ~= s,/\\.?/,/, - !isEqual(source,$$targetFullPath) { - !isEmpty(copyCommand):copyCommand += && - copyCommand += $(MKDIR) \"$$target\" - copyCommand += && $(COPY_DIR) \"$$source\" \"$$target\" - } - } - !isEmpty(copyCommand) { - copyCommand = @echo Copying application data... && $$copyCommand - copydeploymentfolders.commands = $$copyCommand - first.depends = $(first) copydeploymentfolders - export(first.depends) - export(copydeploymentfolders.commands) - QMAKE_EXTRA_TARGETS += first copydeploymentfolders - } - } - !isEmpty(target.path) { - installPrefix = $${target.path} - } else { - installPrefix = /opt/$${TARGET} - } - for(deploymentfolder, DEPLOYMENTFOLDERS) { - item = item$${deploymentfolder} - itemfiles = $${item}.files - $$itemfiles = $$eval($${deploymentfolder}.source) - itempath = $${item}.path - $$itempath = $${installPrefix}/$$eval($${deploymentfolder}.target) - export($$itemfiles) - export($$itempath) - INSTALLS += $$item - } - - !isEmpty(desktopfile.path) { - export(icon.files) - export(icon.path) - export(desktopfile.files) - export(desktopfile.path) - INSTALLS += icon desktopfile - } - - isEmpty(target.path) { - target.path = $${installPrefix}/bin - export(target.path) - } - INSTALLS += target -} - -export (ICON) -export (INSTALLS) -export (DEPLOYMENT) -export (LIBS) -export (QMAKE_EXTRA_TARGETS) -} - diff --git a/ui/drivers/qt/wrapper/wrapper.cpp b/ui/drivers/qt/wrapper/wrapper.cpp deleted file mode 100644 index 8781b0402f..0000000000 --- a/ui/drivers/qt/wrapper/wrapper.cpp +++ /dev/null @@ -1,44 +0,0 @@ -/* RetroArch - A frontend for libretro. - * Copyright (C) 2011-2017 - Andrés Suárez - * - * 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 "../wimp/wimp.h" -#include "../wimp/wimp_global.h" -#include "wrapper.h" - - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct Wimp Wimp; - -Wimp* ctrWimp(int argc, char *argv[]){ - return new Wimp(argc,argv); -} - -int CreateMainWindow(Wimp* p) -{ - return p->CreateMainWindow(); -} - -void GetSettings(Wimp* p, settings_t *s) -{ - return p->GetSettings(s); -} - -#ifdef __cplusplus -} -#endif diff --git a/ui/drivers/qt/wrapper/wrapper.h b/ui/drivers/qt/wrapper/wrapper.h deleted file mode 100644 index 6a0ad757c0..0000000000 --- a/ui/drivers/qt/wrapper/wrapper.h +++ /dev/null @@ -1,38 +0,0 @@ -/* RetroArch - A frontend for libretro. - * Copyright (C) 2011-2017 - Andrés Suárez - * - * 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 . - */ - -#ifndef HAVE_MENU -#define HAVE_MENU -#endif - -#include "config.h" -#include "configuration.h" - -#ifndef WRAPPER_H -#define WRAPPER_H - -RETRO_BEGIN_DECLS - -typedef struct Wimp Wimp; -typedef settings_t (*config_get_ptr_cb); - -Wimp* ctrWimp(int argc, char *argv[]); - -int CreateMainWindow(Wimp* p); -void GetSettings(Wimp* p, settings_t *s); - -RETRO_END_DECLS - -#endif // WRAPPER_H diff --git a/ui/drivers/qt/wrapper/wrapper.pro b/ui/drivers/qt/wrapper/wrapper.pro deleted file mode 100644 index cc4b69c9a8..0000000000 --- a/ui/drivers/qt/wrapper/wrapper.pro +++ /dev/null @@ -1,40 +0,0 @@ -TEMPLATE = lib -CONFIG += console -CONFIG -= app_bundle -#CONFIG -= qt -QT += qml quick widgets - -SOURCES += \ - wrapper.cpp - -include(deployment.pri) -qtcAddDeployment() - -HEADERS += \ - wrapper.h - - -Release:DESTDIR = ../build/release -Release:OBJECTS_DIR = ../build/release/obj -Release:MOC_DIR = ../build/release/moc -Release:RCC_DIR = ../build/release/rcc -Release:UI_DIR = ../build/release/ui - -Debug:DESTDIR = ../build/debug -Debug:OBJECTS_DIR = ../build/debug/obj -Debug:MOC_DIR = ../build/debug/moc -Debug:RCC_DIR = ../build/debug/rcc -Debug:UI_DIR = ../build/debug/ui - -win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../build/release/ -lwimp.dll -else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../build/debug/ -lwimp.dll -else:unix:CONFIG(debug, debug|release): LIBS += -L$$PWD/../build/debug/ -lwimp.so -else:unix:CONFIG(release, debug|release): LIBS += -L$$PWD/../build/debug/ -lwimp.so - -win32:CONFIG(release, debug|release): INCLUDEPATH += $$PWD/../build/release -else:win32:CONFIG(debug, debug|release): INCLUDEPATH += $$PWD/../build/debug -else:unix:CONFIG(debug, debug|release): INCLUDEPATH += $$PWD/../build/release -else:unix:CONFIG(release, debug|release): INCLUDEPATH += $$PWD/../build/release - -INCLUDEPATH += $$PWD/../../../../ -INCLUDEPATH += $$PWD/../../../../libretro-common/include/ diff --git a/ui/drivers/ui_cocoa.m b/ui/drivers/ui_cocoa.m index df87c017d4..d790dda58e 100644 --- a/ui/drivers/ui_cocoa.m +++ b/ui/drivers/ui_cocoa.m @@ -197,13 +197,13 @@ static char** waiting_argv; SEL selector = NSSelectorFromString(BOXSTRING("setCollectionBehavior:")); SEL fsselector = NSSelectorFromString(BOXSTRING("toggleFullScreen:")); apple_platform = self; - + if ([self.window respondsToSelector:selector]) { if ([self.window respondsToSelector:fsselector]) [self.window setCollectionBehavior:NS_WINDOW_COLLECTION_BEHAVIOR_FULLSCREEN_PRIMARY]; } - + [self.window setAcceptsMouseMovedEvents: YES]; [[CocoaView get] setFrame: [[self.window contentView] bounds]]; @@ -245,7 +245,7 @@ static char** waiting_argv; if (ret == -1) break; }while(1); - + main_exit(NULL); } @@ -286,7 +286,7 @@ static char** waiting_argv; if (system) core_name = system->library_name; - + if (core_name) { content_ctx_info_t content_info = {0}; @@ -329,10 +329,10 @@ static void open_core_handler(ui_browser_window_state_t *state, bool result) return; settings_t *settings = config_get_ptr(); - + rarch_ctl(RARCH_CTL_SET_LIBRETRO_PATH, (void*)state->result); ui_companion_event_command(CMD_EVENT_LOAD_CORE); - + if (info && info->load_no_content && settings->bools.set_supports_no_game_enable) { @@ -354,16 +354,16 @@ static void open_document_handler(ui_browser_window_state_t *state, bool result) return; if (!result) return; - + rarch_system_info_t *info = runloop_get_system_info(); struct retro_system_info *system = &info->info; const char *core_name = NULL; - + if (system) core_name = system->library_name; - + path_set(RARCH_PATH_CONTENT, state->result); - + if (core_name) { content_ctx_info_t content_info = {0}; @@ -377,20 +377,20 @@ static void open_document_handler(ui_browser_window_state_t *state, bool result) - (IBAction)openCore:(id)sender { const ui_browser_window_t *browser = ui_companion_driver_get_browser_window_ptr(); - + if (browser) { ui_browser_window_state_t browser_state; settings_t *settings = config_get_ptr(); - + browser_state.filters = strdup("dylib"); browser_state.filters_title = strdup("Core"); browser_state.title = strdup("Load Core"); browser_state.startdir = strdup(settings->paths.directory_libretro); - + bool result = browser->open(&browser_state); open_core_handler(&browser_state, result); - + free(browser_state.filters); free(browser_state.filters_title); free(browser_state.title); @@ -401,22 +401,22 @@ static void open_document_handler(ui_browser_window_state_t *state, bool result) - (void)openDocument:(id)sender { const ui_browser_window_t *browser = ui_companion_driver_get_browser_window_ptr(); - + if (browser) { ui_browser_window_state_t browser_state = {{0}}; settings_t *settings = config_get_ptr(); NSString *startdir = BOXSTRING(settings->paths.directory_menu_content); - + if (!startdir.length) startdir = BOXSTRING("/"); - + browser_state.title = strdup("Load Content"); browser_state.startdir = strdup([startdir UTF8String]); - + bool result = browser->open(&browser_state); open_document_handler(&browser_state, result); - + free(browser_state.startdir); free(browser_state.title); } @@ -440,7 +440,7 @@ static void open_document_handler(ui_browser_window_state_t *state, bool result) { enum event_command cmd; unsigned sender_tag = (unsigned)[sender tag]; - + switch (sender_tag) { case 1: @@ -477,7 +477,7 @@ static void open_document_handler(ui_browser_window_state_t *state, bool result) cmd = CMD_EVENT_NONE; break; } - + if (sender_tag >= 10 && sender_tag <= 19) { unsigned idx = (sender_tag - (10-1)); @@ -503,7 +503,7 @@ int main(int argc, char *argv[]) if (!strncmp(argv[1], "-psn", 4)) argc = 1; } - + waiting_argc = argc; waiting_argv = argv; @@ -520,9 +520,10 @@ static void ui_companion_cocoa_notify_content_loaded(void *data) (void)data; } -static void ui_companion_cocoa_toggle(void *data) +static void ui_companion_cocoa_toggle(void *data, bool force) { (void)data; + (void)force; } static int ui_companion_cocoa_iterate(void *data, unsigned action) @@ -571,7 +572,7 @@ static void *ui_companion_cocoa_get_main_window(void *data) return ((RetroArch_OSX*)[[NSApplication sharedApplication] delegate]).window; } -const ui_companion_driver_t ui_companion_cocoa = { +ui_companion_driver_t ui_companion_cocoa = { ui_companion_cocoa_init, ui_companion_cocoa_deinit, ui_companion_cocoa_iterate, @@ -583,6 +584,7 @@ const ui_companion_driver_t ui_companion_cocoa = { NULL, NULL, ui_companion_cocoa_get_main_window, + NULL, &ui_browser_window_cocoa, &ui_msg_window_cocoa, &ui_window_cocoa, diff --git a/ui/drivers/ui_cocoatouch.m b/ui/drivers/ui_cocoatouch.m index 481ff7f827..6ae8fa5cae 100644 --- a/ui/drivers/ui_cocoatouch.m +++ b/ui/drivers/ui_cocoatouch.m @@ -698,7 +698,7 @@ static void ui_companion_cocoatouch_msg_queue_push(const char *msg, } } -const ui_companion_driver_t ui_companion_cocoatouch = { +ui_companion_driver_t ui_companion_cocoatouch = { ui_companion_cocoatouch_init, ui_companion_cocoatouch_deinit, ui_companion_cocoatouch_iterate, diff --git a/ui/drivers/ui_null.c b/ui/drivers/ui_null.c index 833bb73887..6e901a63bd 100644 --- a/ui/drivers/ui_null.c +++ b/ui/drivers/ui_null.c @@ -58,9 +58,10 @@ static void ui_companion_null_notify_content_loaded(void *data) (void)data; } -static void ui_companion_null_toggle(void *data) +static void ui_companion_null_toggle(void *data, bool force) { (void)data; + (void)force; } static void ui_companion_null_event_command(void *data, enum event_command cmd) @@ -77,7 +78,7 @@ static void ui_companion_null_notify_list_pushed(void *data, (void)menu_list; } -const ui_companion_driver_t ui_companion_null = { +ui_companion_driver_t ui_companion_null = { ui_companion_null_init, ui_companion_null_deinit, ui_companion_null_iterate, @@ -89,6 +90,7 @@ const ui_companion_driver_t ui_companion_null = { NULL, NULL, NULL, + NULL, &ui_browser_window_null, &ui_msg_window_null, &ui_window_null, diff --git a/ui/drivers/ui_qt.cpp b/ui/drivers/ui_qt.cpp index 7f71aa121e..3936af5719 100644 --- a/ui/drivers/ui_qt.cpp +++ b/ui/drivers/ui_qt.cpp @@ -1,5 +1,6 @@ /* RetroArch - A frontend for libretro. * Copyright (C) 2011-2017 - Daniel De Matteis + * Copyright (C) 2018 - Brad Parker * * 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- @@ -13,59 +14,168 @@ * If not, see . */ -#include -#include -#include -#include -#include - +extern "C" { #include -#include #ifdef HAVE_CONFIG_H #include "../../config.h" #endif -#ifdef HAVE_QT_WRAPPER -#include "qt/wrapper/wrapper.h" -#else -#include "ui_qt.h" -#endif - #include "../ui_companion_driver.h" #include "../../core.h" #include "../../configuration.h" #include "../../retroarch.h" +#include "../../verbosity.h" +#include "../../msg_hash.h" #include "../../tasks/tasks_internal.h" +} -#ifdef HAVE_QT_WRAPPER -struct Wimp* wimp; -char* args[] = {""}; +#include "ui_qt.h" + +#include +#include +#include +#include +#include + +#define INITIAL_WIDTH 1280 +#define INITIAL_HEIGHT 720 + +#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) +#define GROUPED_DRAGGING QMainWindow::GroupedDragging +#else +#define GROUPED_DRAGGING static_cast(0) #endif +static bool already_started = false; + typedef struct ui_companion_qt { - void *empty; -#ifdef HAVE_QT_WRAPPER - volatile bool quit; - slock_t *lock; - sthread_t *thread; -#endif + ui_application_qt_t *app; + ui_window_qt_t *window; } ui_companion_qt_t; -#ifdef HAVE_QT_WRAPPER -static void qt_thread(void *data) +ThumbnailWidget::ThumbnailWidget(QWidget *parent) : + QWidget(parent) { - ui_companion_qt_t *handle = (ui_companion_qt_t*)data; - wimp = ctrWimp(0, NULL); - if(wimp) - { - settings_t *settings = config_get_ptr(); - GetSettings(wimp, settings); - CreateMainWindow(wimp); - } } -#endif + +void ThumbnailWidget::paintEvent(QPaintEvent *event) +{ + QStyleOption o; + QPainter p; + o.initFrom(this); + p.begin(this); + style()->drawPrimitive( + QStyle::PE_Widget, &o, &p, this); + p.end(); + + QWidget::paintEvent(event); +} + +void ThumbnailWidget::resizeEvent(QResizeEvent *event) +{ + QWidget::resizeEvent(event); +} + +QSize ThumbnailWidget::sizeHint() const +{ + return QSize(256, 256); +} + +ThumbnailLabel::ThumbnailLabel(QWidget *parent) : + QWidget(parent) + ,m_pixmap(NULL) + ,m_pixmapWidth(0) + ,m_pixmapHeight(0) +{ +} + +ThumbnailLabel::~ThumbnailLabel() +{ + if (m_pixmap) + delete m_pixmap; +} + +void ThumbnailLabel::setPixmap(const QPixmap &pixmap) +{ + m_pixmapWidth = pixmap.width(); + m_pixmapHeight = pixmap.height(); + + if (m_pixmap) + delete m_pixmap; + + m_pixmap = new QPixmap(pixmap); +} + +QSize ThumbnailLabel::sizeHint() const +{ + return QSize(256, 256); +} + +void ThumbnailLabel::paintEvent(QPaintEvent *event) +{ + int w = width(); + int h = height(); + QStyleOption o; + QPainter p; + + event->accept(); + + o.initFrom(this); + p.begin(this); + style()->drawPrimitive( + QStyle::PE_Widget, &o, &p, this); + p.end(); + + if (!m_pixmap || m_pixmap->isNull()) + { + m_pixmap = new QPixmap(sizeHint()); + m_pixmap->fill(QColor(0, 0, 0, 0)); + } + + if (w > 0 && h > 0 && m_pixmap && !m_pixmap->isNull()) + { + int newHeight = (m_pixmap->height() / static_cast(m_pixmap->width())) * width(); + QPixmap pixmapScaled = *m_pixmap; + QPixmap pixmap; + QPainter pScale; + int pw = 0; + int ph = 0; + unsigned *buf = new unsigned[w * h]; + + if (newHeight > h) + pixmapScaled = pixmapScaled.scaledToHeight(h, Qt::SmoothTransformation); + else + pixmapScaled = pixmapScaled.scaledToWidth(w, Qt::SmoothTransformation); + + pw = pixmapScaled.width(); + ph = pixmapScaled.height(); + + pixmap = QPixmap(w, h); + pixmap.fill(QColor(0, 0, 0, 0)); + + pScale.begin(&pixmap); + pScale.drawPixmap(QRect((w - pw) / 2, (h - ph) / 2, pw, ph), pixmapScaled, pixmapScaled.rect()); + pScale.end(); + + if (!pixmap.isNull()) + { + p.begin(this); + p.drawPixmap(rect(), pixmap, pixmap.rect()); + p.end(); + } + + delete []buf; + } + else + QWidget::paintEvent(event); +} + +void ThumbnailLabel::resizeEvent(QResizeEvent *event) +{ + QWidget::resizeEvent(event); +} static void ui_companion_qt_deinit(void *data) { @@ -74,32 +184,305 @@ static void ui_companion_qt_deinit(void *data) if (!handle) return; -#ifdef HAVE_QT_WRAPPER - slock_free(handle->lock); - sthread_join(handle->thread); -#endif + /* why won't deleteLater() here call the destructor? */ + delete handle->window->qtWindow; free(handle); } -static void *ui_companion_qt_init(void) +static void* ui_companion_qt_init(void) { ui_companion_qt_t *handle = (ui_companion_qt_t*)calloc(1, sizeof(*handle)); + MainWindow *mainwindow = NULL; + QHBoxLayout *browserButtonsHBoxLayout = NULL; + QVBoxLayout *layout = NULL; + QVBoxLayout *launchWithWidgetLayout = NULL; + QHBoxLayout *coreComboBoxLayout = NULL; + QMenuBar *menu = NULL; + QDesktopWidget *desktop = NULL; + QMenu *fileMenu = NULL; + QMenu *editMenu = NULL; + QMenu *viewMenu = NULL; + QMenu *viewClosedDocksMenu = NULL; + QRect desktopRect; + QDockWidget *thumbnailDock = NULL; + QDockWidget *thumbnail2Dock = NULL; + QDockWidget *thumbnail3Dock = NULL; + QDockWidget *browserAndPlaylistTabDock = NULL; + QDockWidget *coreSelectionDock = NULL; + QTabWidget *browserAndPlaylistTabWidget = NULL; + QWidget *widget = NULL; + QWidget *browserWidget = NULL; + QWidget *playlistWidget = NULL; + QWidget *coreSelectionWidget = NULL; + QWidget *launchWithWidget = NULL; + ThumbnailWidget *thumbnailWidget = NULL; + ThumbnailWidget *thumbnail2Widget = NULL; + ThumbnailWidget *thumbnail3Widget = NULL; + QPushButton *browserDownloadsButton = NULL; + QPushButton *browserUpButton = NULL; + QPushButton *browserStartButton = NULL; + ThumbnailLabel *thumbnail = NULL; + ThumbnailLabel *thumbnail2 = NULL; + ThumbnailLabel *thumbnail3 = NULL; + QAction *editSearchAction = NULL; + QAction *loadCoreAction = NULL; + QAction *unloadCoreAction = NULL; + QAction *exitAction = NULL; + QComboBox *launchWithComboBox = NULL; + QSettings *qsettings = NULL; + if (!handle) return NULL; -#ifdef HAVE_QT_WRAPPER - settings_t *settings = config_get_ptr(); - handle->lock = slock_new(); - handle->thread = sthread_create(qt_thread, handle); - if (!handle->thread) - { - slock_free(handle->lock); - free(handle); - return NULL; - } + handle->app = static_cast(ui_application_qt.initialize()); + handle->window = static_cast(ui_window_qt.init()); + + desktop = qApp->desktop(); + desktopRect = desktop->availableGeometry(); + + mainwindow = handle->window->qtWindow; + + qsettings = mainwindow->settings(); + + mainwindow->resize(qMin(desktopRect.width(), INITIAL_WIDTH), qMin(desktopRect.height(), INITIAL_HEIGHT)); + mainwindow->setGeometry(QStyle::alignedRect(Qt::LeftToRight, Qt::AlignCenter, mainwindow->size(), desktopRect)); + + mainwindow->setWindowTitle("RetroArch"); + mainwindow->setDockOptions(QMainWindow::AnimatedDocks | QMainWindow::AllowNestedDocks | QMainWindow::AllowTabbedDocks | GROUPED_DRAGGING); + + widget = new QWidget(mainwindow); + widget->setObjectName("tableWidget"); + + layout = new QVBoxLayout(); + layout->addWidget(mainwindow->contentTableWidget()); + + widget->setLayout(layout); + + mainwindow->setCentralWidget(widget); + + menu = mainwindow->menuBar(); + + fileMenu = menu->addMenu(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_MENU_FILE)); + + loadCoreAction = fileMenu->addAction(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_MENU_FILE_LOAD_CORE), mainwindow, SLOT(onLoadCoreClicked())); + loadCoreAction->setShortcut(QKeySequence("Ctrl+L")); + + unloadCoreAction = fileMenu->addAction(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_MENU_FILE_UNLOAD_CORE), mainwindow, SLOT(onUnloadCoreMenuAction())); + unloadCoreAction->setObjectName("unloadCoreAction"); + unloadCoreAction->setEnabled(false); + unloadCoreAction->setShortcut(QKeySequence("Ctrl+U")); + + exitAction = fileMenu->addAction(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_MENU_FILE_EXIT), mainwindow, SLOT(close())); + exitAction->setShortcut(QKeySequence::Quit); + + editMenu = menu->addMenu(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_MENU_EDIT)); + editSearchAction = editMenu->addAction(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_MENU_EDIT_SEARCH), mainwindow->searchLineEdit(), SLOT(setFocus())); + editSearchAction->setShortcut(QKeySequence::Find); + + viewMenu = menu->addMenu(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW)); + viewClosedDocksMenu = viewMenu->addMenu(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_CLOSED_DOCKS)); + viewClosedDocksMenu->setObjectName("viewClosedDocksMenu"); + + QObject::connect(viewClosedDocksMenu, SIGNAL(aboutToShow()), mainwindow, SLOT(onViewClosedDocksAboutToShow())); + + viewMenu->addAction(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS), mainwindow->viewOptionsDialog(), SLOT(showDialog())); + + playlistWidget = new QWidget(); + playlistWidget->setLayout(new QVBoxLayout()); + playlistWidget->setObjectName("playlistWidget"); + + playlistWidget->layout()->addWidget(mainwindow->playlistListWidget()); + + browserWidget = new QWidget(); + browserWidget->setLayout(new QVBoxLayout()); + browserWidget->setObjectName("browserWidget"); + + browserDownloadsButton = new QPushButton(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_ASSETS_DIRECTORY)); + browserUpButton = new QPushButton(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_TAB_FILE_BROWSER_UP)); + browserStartButton = new QPushButton(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_FAVORITES)); + + QObject::connect(browserDownloadsButton, SIGNAL(clicked()), mainwindow, SLOT(onBrowserDownloadsClicked())); + QObject::connect(browserUpButton, SIGNAL(clicked()), mainwindow, SLOT(onBrowserUpClicked())); + QObject::connect(browserStartButton, SIGNAL(clicked()), mainwindow, SLOT(onBrowserStartClicked())); + + browserButtonsHBoxLayout = new QHBoxLayout(); + browserButtonsHBoxLayout->addWidget(browserUpButton); + browserButtonsHBoxLayout->addWidget(browserStartButton); + browserButtonsHBoxLayout->addWidget(browserDownloadsButton); + + qobject_cast(browserWidget->layout())->addLayout(browserButtonsHBoxLayout); + browserWidget->layout()->addWidget(mainwindow->dirTreeView()); + + browserAndPlaylistTabWidget = mainwindow->browserAndPlaylistTabWidget(); + browserAndPlaylistTabWidget->setObjectName("browserAndPlaylistTabWidget"); + + /* Several functions depend on the same tab title strings here, so if you change these, make sure to change those too + * setCoreActions() + * onTabWidgetIndexChanged() + * onCurrentListItemChanged() + */ + browserAndPlaylistTabWidget->addTab(playlistWidget, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_TAB_PLAYLISTS)); + browserAndPlaylistTabWidget->addTab(browserWidget, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_TAB_FILE_BROWSER)); + + browserAndPlaylistTabDock = new QDockWidget(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_MENU_DOCK_CONTENT_BROWSER), mainwindow); + browserAndPlaylistTabDock->setObjectName("browserAndPlaylistTabDock"); + browserAndPlaylistTabDock->setProperty("default_area", Qt::LeftDockWidgetArea); + browserAndPlaylistTabDock->setProperty("menu_text", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_MENU_DOCK_CONTENT_BROWSER)); + browserAndPlaylistTabDock->setWidget(browserAndPlaylistTabWidget); + + mainwindow->addDockWidget(static_cast(browserAndPlaylistTabDock->property("default_area").toInt()), browserAndPlaylistTabDock); + + browserButtonsHBoxLayout->addItem(new QSpacerItem(browserAndPlaylistTabWidget->tabBar()->width(), 20, QSizePolicy::Expanding, QSizePolicy::Minimum)); + + thumbnailWidget = new ThumbnailWidget(); + thumbnail2Widget = new ThumbnailWidget(); + thumbnail3Widget = new ThumbnailWidget(); + + thumbnailWidget->setLayout(new QVBoxLayout()); + thumbnail2Widget->setLayout(new QVBoxLayout()); + thumbnail3Widget->setLayout(new QVBoxLayout()); + + thumbnailWidget->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); + thumbnail2Widget->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); + thumbnail3Widget->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); + + thumbnail = new ThumbnailLabel(); + thumbnail->setObjectName("thumbnail"); + + thumbnail2 = new ThumbnailLabel(); + thumbnail2->setObjectName("thumbnail2"); + + thumbnail3 = new ThumbnailLabel(); + thumbnail3->setObjectName("thumbnail3"); + + thumbnail->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); + thumbnail2->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); + thumbnail3->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); + + QObject::connect(mainwindow, SIGNAL(thumbnailChanged(const QPixmap&)), thumbnail, SLOT(setPixmap(const QPixmap&))); + QObject::connect(mainwindow, SIGNAL(thumbnail2Changed(const QPixmap&)), thumbnail2, SLOT(setPixmap(const QPixmap&))); + QObject::connect(mainwindow, SIGNAL(thumbnail3Changed(const QPixmap&)), thumbnail3, SLOT(setPixmap(const QPixmap&))); + + thumbnailWidget->layout()->addWidget(thumbnail); + thumbnail2Widget->layout()->addWidget(thumbnail2); + thumbnail3Widget->layout()->addWidget(thumbnail3); + + thumbnailDock = new QDockWidget(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_THUMBNAIL_BOXART), mainwindow); + thumbnailDock->setObjectName("thumbnailDock"); + thumbnailDock->setProperty("default_area", Qt::RightDockWidgetArea); + thumbnailDock->setProperty("menu_text", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_THUMBNAIL_BOXART)); + thumbnailDock->setWidget(thumbnailWidget); + + mainwindow->addDockWidget(static_cast(thumbnailDock->property("default_area").toInt()), thumbnailDock); + + thumbnail2Dock = new QDockWidget(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_THUMBNAIL_TITLE_SCREEN), mainwindow); + thumbnail2Dock->setObjectName("thumbnail2Dock"); + thumbnail2Dock->setProperty("default_area", Qt::RightDockWidgetArea); + thumbnail2Dock->setProperty("menu_text", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_THUMBNAIL_TITLE_SCREEN)); + thumbnail2Dock->setWidget(thumbnail2Widget); + + mainwindow->addDockWidget(static_cast(thumbnail2Dock->property("default_area").toInt()), thumbnail2Dock); + + thumbnail3Dock = new QDockWidget(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_THUMBNAIL_SCREENSHOT), mainwindow); + thumbnail3Dock->setObjectName("thumbnail3Dock"); + thumbnail3Dock->setProperty("default_area", Qt::RightDockWidgetArea); + thumbnail3Dock->setProperty("menu_text", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_THUMBNAIL_SCREENSHOT)); + thumbnail3Dock->setWidget(thumbnail3Widget); + + mainwindow->addDockWidget(static_cast(thumbnail3Dock->property("default_area").toInt()), thumbnail3Dock); + + mainwindow->tabifyDockWidget(thumbnailDock, thumbnail2Dock); + mainwindow->tabifyDockWidget(thumbnailDock, thumbnail3Dock); + + /* when tabifying the dock widgets, the last tab added is selected by default, so we need to re-select the first tab */ + thumbnailDock->raise(); + + coreSelectionWidget = new QWidget(); + coreSelectionWidget->setLayout(new QVBoxLayout()); + + launchWithComboBox = mainwindow->launchWithComboBox(); + + launchWithWidgetLayout = new QVBoxLayout(); + + launchWithWidget = new QWidget(); + launchWithWidget->setLayout(launchWithWidgetLayout); + + coreComboBoxLayout = new QHBoxLayout(); + + mainwindow->runPushButton()->setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding)); + mainwindow->stopPushButton()->setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding)); + mainwindow->startCorePushButton()->setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding)); + + coreComboBoxLayout->addWidget(launchWithComboBox); + coreComboBoxLayout->addWidget(mainwindow->startCorePushButton()); + coreComboBoxLayout->addWidget(mainwindow->coreInfoPushButton()); + coreComboBoxLayout->addWidget(mainwindow->runPushButton()); + coreComboBoxLayout->addWidget(mainwindow->stopPushButton()); + + mainwindow->stopPushButton()->hide(); + + coreComboBoxLayout->setStretchFactor(launchWithComboBox, 1); + + launchWithWidgetLayout->addLayout(coreComboBoxLayout); + + coreSelectionWidget->layout()->addWidget(launchWithWidget); + + coreSelectionWidget->layout()->addItem(new QSpacerItem(20, browserAndPlaylistTabWidget->height(), QSizePolicy::Minimum, QSizePolicy::Expanding)); + + coreSelectionDock = new QDockWidget(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_CORE), mainwindow); + coreSelectionDock->setObjectName("coreSelectionDock"); + coreSelectionDock->setProperty("default_area", Qt::LeftDockWidgetArea); + coreSelectionDock->setProperty("menu_text", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_CORE)); + coreSelectionDock->setWidget(coreSelectionWidget); + + mainwindow->addDockWidget(static_cast(coreSelectionDock->property("default_area").toInt()), coreSelectionDock); + + mainwindow->splitDockWidget(browserAndPlaylistTabDock, coreSelectionDock, Qt::Vertical); + +#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) + mainwindow->resizeDocks(QList() << coreSelectionDock, QList() << 1, Qt::Vertical); #endif + /* this should come last */ + mainwindow->resizeThumbnails(true, true, true); + + if (qsettings->contains("geometry")) + if (qsettings->contains("save_geometry")) + mainwindow->restoreGeometry(qsettings->value("geometry").toByteArray()); + + if (qsettings->value("save_dock_positions", false).toBool()) + if (qsettings->contains("dock_positions")) + mainwindow->restoreState(qsettings->value("dock_positions").toByteArray()); + + if (qsettings->value("save_last_tab", false).toBool()) + { + if (qsettings->contains("last_tab")) + { + int lastTabIndex = qsettings->value("last_tab", 0).toInt(); + + if (lastTabIndex >= 0 && browserAndPlaylistTabWidget->count() > lastTabIndex) + browserAndPlaylistTabWidget->setCurrentIndex(lastTabIndex); + } + } + + if (qsettings->contains("theme")) + { + QString themeStr = qsettings->value("theme").toString(); + MainWindow::Theme theme = mainwindow->getThemeFromString(themeStr); + + if (qsettings->contains("custom_theme") && theme == MainWindow::THEME_CUSTOM) + { + QString customThemeFilePath = qsettings->value("custom_theme").toString(); + + mainwindow->setCustomThemeFile(customThemeFilePath); + } + + mainwindow->setTheme(theme); + } + else + mainwindow->setTheme(); + return handle; } @@ -115,23 +498,41 @@ static void ui_companion_qt_notify_content_loaded(void *data) (void)data; } -static void ui_companion_qt_toggle(void *data) +static void ui_companion_qt_toggle(void *data, bool force) { - ui_companion_qt_init(); + ui_companion_qt_t *handle = (ui_companion_qt_t*)data; + ui_window_qt_t *win_handle = (ui_window_qt_t*)handle->window; + settings_t *settings = config_get_ptr(); + +#ifdef HAVE_DYNAMIC + if (!retroarch_core_set_on_cmdline()) +#endif + if (settings->bools.ui_companion_toggle || force) + { + video_driver_show_mouse(); + win_handle->qtWindow->show(); + + if (video_driver_started_fullscreen()) + win_handle->qtWindow->lower(); + + if (!already_started) + { + already_started = true; + + if (win_handle->qtWindow->settings()->value("show_welcome_screen", true).toBool()) + win_handle->qtWindow->showWelcomeScreen(); + } + } } static void ui_companion_qt_event_command(void *data, enum event_command cmd) { ui_companion_qt_t *handle = (ui_companion_qt_t*)data; + (void)cmd; + if (!handle) return; - -#ifdef HAVE_QT_WRAPPER - slock_lock(handle->lock); - command_event(cmd, NULL); - slock_unlock(handle->lock); -#endif } static void ui_companion_qt_notify_list_pushed(void *data, file_list_t *list, @@ -142,7 +543,37 @@ static void ui_companion_qt_notify_list_pushed(void *data, file_list_t *list, (void)menu_list; } -const ui_companion_driver_t ui_companion_qt = { +static void ui_companion_qt_notify_refresh(void *data) +{ + ui_companion_qt_t *handle = (ui_companion_qt_t*)data; + ui_window_qt_t *win_handle = (ui_window_qt_t*)handle->window; + + win_handle->qtWindow->deferReloadPlaylists(); +} + +static void ui_companion_qt_log_msg(void *data, const char *msg) +{ + ui_companion_qt_t *handle = (ui_companion_qt_t*)data; + ui_window_qt_t *win_handle = (ui_window_qt_t*)handle->window; + + win_handle->qtWindow->appendLogMessage(msg); +} + +void ui_companion_qt_msg_queue_push(void *data, const char *msg, unsigned priority, unsigned duration, bool flush) +{ + ui_companion_qt_t *handle = (ui_companion_qt_t*)data; + ui_window_qt_t *win_handle = NULL; + + if (!handle) + return; + + win_handle = (ui_window_qt_t*)handle->window; + + if (win_handle) + win_handle->qtWindow->showStatusMessage(msg, priority, duration, flush); +} + +ui_companion_driver_t ui_companion_qt = { ui_companion_qt_init, ui_companion_qt_deinit, ui_companion_qt_iterate, @@ -150,20 +581,14 @@ const ui_companion_driver_t ui_companion_qt = { ui_companion_qt_event_command, ui_companion_qt_notify_content_loaded, ui_companion_qt_notify_list_pushed, + ui_companion_qt_notify_refresh, + ui_companion_qt_msg_queue_push, NULL, NULL, - NULL, - NULL, -#ifdef HAVE_QT_WRAPPER - NULL, - NULL, - NULL, - NULL, -#else + ui_companion_qt_log_msg, &ui_browser_window_qt, &ui_msg_window_qt, &ui_window_qt, &ui_application_qt, -#endif "qt", }; diff --git a/ui/drivers/ui_qt.h b/ui/drivers/ui_qt.h new file mode 100644 index 0000000000..5ebd251212 --- /dev/null +++ b/ui/drivers/ui_qt.h @@ -0,0 +1,367 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2010-2014 - Hans-Kristian Arntzen + * Copyright (C) 2011-2017 - Daniel De Matteis + * Copyright (C) 2018 - Brad Parker + * + * 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 . + */ + +#ifndef _QT_UI +#define _QT_UI + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +extern "C" { +#include +#include "../ui_companion_driver.h" +} + +class QApplication; +class QCloseEvent; +class QKeyEvent; +class QTimer; +class QFileSystemModel; +class QListWidget; +class QListWidgetItem; +class QTableWidgetItem; +class QResizeEvent; +class QDockWidget; +class QComboBox; +class QPushButton; +class QToolButton; +class QTabWidget; +class QPixmap; +class QPaintEvent; +class QSettings; +class QCheckBox; +class QFormLayout; +class QStyle; +class QScrollArea; +class LoadCoreWindow; +class MainWindow; + +class ThumbnailWidget : public QWidget +{ + Q_OBJECT +public: + ThumbnailWidget(QWidget *parent = 0); + QSize sizeHint() const; +protected: + void paintEvent(QPaintEvent *event); + void resizeEvent(QResizeEvent *event); +}; + +class ThumbnailLabel : public QWidget +{ + Q_OBJECT +public: + ThumbnailLabel(QWidget *parent = 0); + ~ThumbnailLabel(); + QSize sizeHint() const; +public slots: + void setPixmap(const QPixmap &pixmap); +protected: + void paintEvent(QPaintEvent *event); + void resizeEvent(QResizeEvent *event); +private: + void updateMargins(); + + QPixmap *m_pixmap; + int m_pixmapWidth; + int m_pixmapHeight; +}; + +class TreeView : public QTreeView +{ + Q_OBJECT +public: + TreeView(QWidget *parent = 0); +signals: + void itemsSelected(QModelIndexList selectedIndexes); +protected slots: + void columnCountChanged(int oldCount, int newCount); + void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected); +}; + +class TableWidget : public QTableWidget +{ + Q_OBJECT +public: + TableWidget(QWidget *parent = 0); +signals: + void enterPressed(); +protected slots: + void keyPressEvent(QKeyEvent *event); +}; + +class AppHandler : public QObject +{ + Q_OBJECT + +public: + AppHandler(QObject *parent = 0); + ~AppHandler(); + void exit(); + bool isExiting() const; + +private slots: + void onLastWindowClosed(); +}; + +class ViewOptionsDialog : public QDialog +{ + Q_OBJECT +public: + ViewOptionsDialog(MainWindow *mainwindow, QWidget *parent = 0); +public slots: + void showDialog(); + void hideDialog(); + void onAccepted(); + void onRejected(); +private slots: + void onThemeComboBoxIndexChanged(int index); + void onHighlightColorChoose(); +private: + void loadViewOptions(); + void saveViewOptions(); + void showOrHideHighlightColor(); + + MainWindow *m_mainwindow; + QSettings *m_settings; + QCheckBox *m_saveGeometryCheckBox; + QCheckBox *m_saveDockPositionsCheckBox; + QCheckBox *m_saveLastTabCheckBox; + QCheckBox *m_showHiddenFilesCheckBox; + QComboBox *m_themeComboBox; + QPushButton *m_highlightColorPushButton; + QColor m_highlightColor; + QLabel *m_highlightColorLabel; + QString m_customThemePath; + QCheckBox *m_suggestLoadedCoreFirstCheckBox; +}; + +class CoreInfoLabel : public QLabel +{ + Q_OBJECT +public: + CoreInfoLabel(QString text = QString(), QWidget *parent = 0); +}; + +class CoreInfoDialog : public QDialog +{ + Q_OBJECT +public: + CoreInfoDialog(MainWindow *mainwindow, QWidget *parent = 0); +public slots: + void showCoreInfo(); +private: + QFormLayout *m_formLayout; + MainWindow *m_mainwindow; +}; + +class CoreInfoWidget : public QWidget +{ + Q_OBJECT +public: + CoreInfoWidget(CoreInfoLabel *label, QWidget *parent = 0); + QSize sizeHint() const; +protected: + void resizeEvent(QResizeEvent *event); +private: + CoreInfoLabel *m_label; + QScrollArea *m_scrollArea; +}; + +class LogTextEdit : public QPlainTextEdit +{ + Q_OBJECT +public: + LogTextEdit(QWidget *parent = 0); +public slots: + void appendMessage(const QString& text); +}; + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + enum Theme + { + THEME_SYSTEM_DEFAULT, + THEME_DARK, + THEME_CUSTOM + }; + + enum MessageBoxType + { + MSGBOX_TYPE_INFO, + MSGBOX_TYPE_WARNING, + MSGBOX_TYPE_ERROR, + }; + + MainWindow(QWidget *parent = NULL); + ~MainWindow(); + TreeView* dirTreeView(); + QListWidget* playlistListWidget(); + TableWidget* contentTableWidget(); + QWidget* searchWidget(); + QLineEdit* searchLineEdit(); + QComboBox* launchWithComboBox(); + QToolButton* startCorePushButton(); + QToolButton* coreInfoPushButton(); + QToolButton* runPushButton(); + QToolButton* stopPushButton(); + QTabWidget* browserAndPlaylistTabWidget(); + QList > getPlaylistDefaultCores(); + ViewOptionsDialog* viewOptionsDialog(); + QSettings* settings(); + QList > getCoreInfo(); + void setTheme(Theme theme = THEME_SYSTEM_DEFAULT); + Theme theme(); + Theme getThemeFromString(QString themeString); + QString getThemeString(Theme theme); + QHash getSelectedCore(); + void showStatusMessage(QString msg, unsigned priority, unsigned duration, bool flush); + bool showMessageBox(QString msg, MessageBoxType msgType = MSGBOX_TYPE_INFO, Qt::WindowModality modality = Qt::ApplicationModal); + bool setCustomThemeFile(QString filePath); + void setCustomThemeString(QString qss); + const QString& customThemeString() const; + +signals: + void thumbnailChanged(const QPixmap &pixmap); + void thumbnail2Changed(const QPixmap &pixmap); + void thumbnail3Changed(const QPixmap &pixmap); + void gotLogMessage(const QString &msg); + void gotStatusMessage(QString msg, unsigned priority, unsigned duration, bool flush); + void gotReloadPlaylists(); + +public slots: + void onBrowserDownloadsClicked(); + void onBrowserUpClicked(); + void onBrowserStartClicked(); + void initContentTableWidget(); + void onViewClosedDocksAboutToShow(); + void onShowHiddenDockWidgetAction(); + void setCoreActions(); + void onRunClicked(); + void onStartCoreClicked(); + void onTableWidgetEnterPressed(); + void selectBrowserDir(QString path); + void resizeThumbnails(bool one, bool two, bool three); + void onResizeThumbnailOne(); + void onResizeThumbnailTwo(); + void onResizeThumbnailThree(); + void appendLogMessage(const QString &msg); + void onGotLogMessage(const QString &msg); + void onGotStatusMessage(QString msg, unsigned priority, unsigned duration, bool flush); + void reloadPlaylists(); + void deferReloadPlaylists(); + void onGotReloadPlaylists(); + void showWelcomeScreen(); + +private slots: + void onLoadCoreClicked(const QStringList &extensionFilters = QStringList()); + void onUnloadCoreMenuAction(); + void onTimeout(); + void onCoreLoaded(); + void onCurrentListItemChanged(QListWidgetItem *current, QListWidgetItem *previous); + void onCurrentTableItemChanged(QTableWidgetItem *current, QTableWidgetItem *previous); + void onSearchEnterPressed(); + void onSearchLineEditEdited(const QString &text); + void addPlaylistItemsToTable(QString path); + void onContentItemDoubleClicked(QTableWidgetItem *item); + void onCoreLoadWindowClosed(); + void onTabWidgetIndexChanged(int index); + void onTreeViewItemsSelected(QModelIndexList selectedIndexes); + void onSearchResetClicked(); + void onLaunchWithComboBoxIndexChanged(int index); + void onFileBrowserTreeContextMenuRequested(const QPoint &pos); + void onPlaylistWidgetContextMenuRequested(const QPoint &pos); + void onStopClicked(); + +private: + void setCurrentCoreLabel(); + void getPlaylistFiles(); + bool isCoreLoaded(); + bool isContentLessCore(); + + LoadCoreWindow *m_loadCoreWindow; + QTimer *m_timer; + QString m_currentCore; + QString m_currentCoreVersion; + QLabel *m_statusLabel; + TreeView *m_dirTree; + QFileSystemModel *m_dirModel; + QListWidget *m_listWidget; + TableWidget *m_tableWidget; + QWidget *m_searchWidget; + QLineEdit *m_searchLineEdit; + QDockWidget *m_searchDock; + QStringList m_playlistFiles; + QComboBox *m_launchWithComboBox; + QToolButton *m_startCorePushButton; + QToolButton *m_coreInfoPushButton; + QToolButton *m_runPushButton; + QToolButton *m_stopPushButton; + QTabWidget *m_browserAndPlaylistTabWidget; + bool m_pendingRun; + QPixmap *m_thumbnailPixmap; + QPixmap *m_thumbnailPixmap2; + QPixmap *m_thumbnailPixmap3; + QRegularExpression m_fileSanitizerRegex; + QSettings *m_settings; + ViewOptionsDialog *m_viewOptionsDialog; + CoreInfoDialog *m_coreInfoDialog; + QStyle *m_defaultStyle; + QPalette m_defaultPalette; + Theme m_currentTheme; + QDockWidget *m_coreInfoDock; + CoreInfoLabel *m_coreInfoLabel; + CoreInfoWidget *m_coreInfoWidget; + QDockWidget *m_logDock; + QWidget *m_logWidget; + LogTextEdit *m_logTextEdit; + QVector m_imageFormats; + QListWidgetItem *m_historyPlaylistsItem; + QIcon m_folderIcon; + QString m_customThemeString; + +protected: + void closeEvent(QCloseEvent *event); + void keyPressEvent(QKeyEvent *event); +}; + +RETRO_BEGIN_DECLS + +typedef struct ui_application_qt +{ + QApplication *app; +} ui_application_qt_t; + +typedef struct ui_window_qt +{ + MainWindow *qtWindow; +} ui_window_qt_t; + +RETRO_END_DECLS + +#endif diff --git a/ui/drivers/ui_win32.c b/ui/drivers/ui_win32.c index ec7c2265cc..9b7eff96cf 100644 --- a/ui/drivers/ui_win32.c +++ b/ui/drivers/ui_win32.c @@ -149,7 +149,7 @@ static void shader_dlg_params_refresh(void) { case SHADER_PARAM_CTRL_CHECKBOX: { - bool checked; + bool checked; video_shader_ctx_t shader_info; video_shader_driver_get_current_shader(&shader_info); @@ -769,9 +769,10 @@ static void ui_companion_win32_notify_content_loaded(void *data) (void)data; } -static void ui_companion_win32_toggle(void *data) +static void ui_companion_win32_toggle(void *data, bool force) { (void)data; + (void)force; } static void ui_companion_win32_event_command( @@ -789,7 +790,7 @@ static void ui_companion_win32_notify_list_pushed(void *data, (void)menu_list; } -const ui_companion_driver_t ui_companion_win32 = { +ui_companion_driver_t ui_companion_win32 = { ui_companion_win32_init, ui_companion_win32_deinit, ui_companion_win32_iterate, @@ -801,6 +802,7 @@ const ui_companion_driver_t ui_companion_win32 = { NULL, NULL, NULL, + NULL, &ui_browser_window_win32, &ui_msg_window_win32, &ui_window_win32, diff --git a/ui/drivers/win32/ui_win32_application.c b/ui/drivers/win32/ui_win32_application.c index be5c8eace7..b40f927fcd 100644 --- a/ui/drivers/win32/ui_win32_application.c +++ b/ui/drivers/win32/ui_win32_application.c @@ -23,9 +23,9 @@ #include "../../ui_companion_driver.h" -static bool ui_application_win32_initialize(void) +static void* ui_application_win32_initialize(void) { - return true; + return NULL; } static bool ui_application_win32_pending_events(void) @@ -48,9 +48,16 @@ static void ui_application_win32_process_events(void) } } -const ui_application_t ui_application_win32 = { +static void ui_application_win32_run(void *args) +{ + (void)args; +} + +ui_application_t ui_application_win32 = { ui_application_win32_initialize, ui_application_win32_pending_events, ui_application_win32_process_events, + ui_application_win32_run, + NULL, "win32" }; diff --git a/ui/drivers/win32/ui_win32_browser_window.c b/ui/drivers/win32/ui_win32_browser_window.c index 6ebcc3b670..bf653fd77e 100644 --- a/ui/drivers/win32/ui_win32_browser_window.c +++ b/ui/drivers/win32/ui_win32_browser_window.c @@ -74,7 +74,7 @@ static bool ui_browser_window_win32_save(ui_browser_window_state_t *state) return ui_browser_window_win32_core(state, true); } -const ui_browser_window_t ui_browser_window_win32 = { +ui_browser_window_t ui_browser_window_win32 = { ui_browser_window_win32_open, ui_browser_window_win32_save, "win32" diff --git a/ui/drivers/win32/ui_win32_msg_window.c b/ui/drivers/win32/ui_win32_msg_window.c index 113a3d58eb..8ef8a17079 100644 --- a/ui/drivers/win32/ui_win32_msg_window.c +++ b/ui/drivers/win32/ui_win32_msg_window.c @@ -97,7 +97,7 @@ static enum ui_msg_window_response ui_msg_window_win32_warning(ui_msg_window_sta return ui_msg_window_win32_response(state, MessageBoxA(NULL, (LPCSTR)state->text, (LPCSTR)state->title, flags)); } -const ui_msg_window_t ui_msg_window_win32 = { +ui_msg_window_t ui_msg_window_win32 = { ui_msg_window_win32_error, ui_msg_window_win32_information, ui_msg_window_win32_question, diff --git a/ui/drivers/win32/ui_win32_window.c b/ui/drivers/win32/ui_win32_window.c index bd39aa50d6..089b12b877 100644 --- a/ui/drivers/win32/ui_win32_window.c +++ b/ui/drivers/win32/ui_win32_window.c @@ -50,6 +50,11 @@ #include "../../../retroarch.h" #include "../../../tasks/tasks_internal.h" +static void* ui_window_win32_init(void) +{ + return NULL; +} + static void ui_window_win32_destroy(void *data) { ui_window_win32_t *window = (ui_window_win32_t*)data; @@ -89,7 +94,8 @@ static bool ui_window_win32_focused(void *data) return (GetForegroundWindow() == window->hwnd); } -const ui_window_t ui_window_win32 = { +ui_window_t ui_window_win32 = { + ui_window_win32_init, ui_window_win32_destroy, ui_window_win32_set_focused, ui_window_win32_set_visible, diff --git a/ui/ui_companion_driver.c b/ui/ui_companion_driver.c index d75df1f80d..79974c6610 100644 --- a/ui/ui_companion_driver.c +++ b/ui/ui_companion_driver.c @@ -26,11 +26,7 @@ #include "ui_companion_driver.h" - static const ui_companion_driver_t *ui_companion_drivers[] = { -#ifdef HAVE_QT_WRAPPER - &ui_companion_qt, -#endif #if defined(_WIN32) && !defined(_XBOX) &ui_companion_win32, #endif @@ -39,17 +35,19 @@ static const ui_companion_driver_t *ui_companion_drivers[] = { #endif #ifdef HAVE_COCOATOUCH &ui_companion_cocoatouch, -#endif -#ifdef HAVE_QT - &ui_companion_qt, #endif &ui_companion_null, NULL }; -static bool main_ui_companion_is_on_foreground; -static const ui_companion_driver_t *ui_companion; -static void *ui_companion_data; +static bool main_ui_companion_is_on_foreground = false; +static const ui_companion_driver_t *ui_companion = NULL; +static void *ui_companion_data = NULL; + +#ifdef HAVE_QT +static void *ui_companion_qt_data = NULL; +static bool qt_is_inited = false; +#endif /** * ui_companion_find_driver: @@ -110,39 +108,76 @@ void ui_companion_event_command(enum event_command action) void ui_companion_driver_deinit(void) { const ui_companion_driver_t *ui = ui_companion_get_ptr(); + if (!ui) return; if (ui->deinit) ui->deinit(ui_companion_data); + +#ifdef HAVE_QT + if (qt_is_inited) + { + ui_companion_qt.deinit(ui_companion_qt_data); + ui_companion_qt_data = NULL; + } +#endif ui_companion_data = NULL; } void ui_companion_driver_init_first(void) { - settings_t *settings = config_get_ptr(); + settings_t *settings = config_get_ptr(); ui_companion = (ui_companion_driver_t*)ui_companion_init_first(); - if (ui_companion && ui_companion->toggle) +#ifdef HAVE_QT + if (settings->bools.desktop_menu_enable) + { + ui_companion_qt_data = ui_companion_qt.init(); + qt_is_inited = true; + } +#endif + + if (ui_companion) { if (settings->bools.ui_companion_start_on_boot) - ui_companion->toggle(ui_companion_data); + { + if (ui_companion->init) + ui_companion_data = ui_companion->init(); + + ui_companion_driver_toggle(false); + } } } -void ui_companion_driver_toggle(void) +void ui_companion_driver_toggle(bool force) { + settings_t *settings = config_get_ptr(); + if (ui_companion && ui_companion->toggle) - ui_companion->toggle(ui_companion_data); + ui_companion->toggle(ui_companion_data, false); + +#ifdef HAVE_QT + if (settings->bools.desktop_menu_enable) + if (ui_companion_qt.toggle) + ui_companion_qt.toggle(ui_companion_qt_data, force); +#endif } void ui_companion_driver_notify_refresh(void) { const ui_companion_driver_t *ui = ui_companion_get_ptr(); + settings_t *settings = config_get_ptr(); + if (!ui) return; if (ui->notify_refresh) ui->notify_refresh(ui_companion_data); +#ifdef HAVE_QT + if (settings->bools.desktop_menu_enable) + if (ui_companion_qt.notify_refresh) + ui_companion_qt.notify_refresh(ui_companion_qt_data); +#endif } void ui_companion_driver_notify_list_loaded(file_list_t *list, file_list_t *menu_list) @@ -192,6 +227,13 @@ const ui_browser_window_t *ui_companion_driver_get_browser_window_ptr(void) return ui->browser_window; } +#ifdef HAVE_QT +const ui_application_t *ui_companion_driver_get_qt_application_ptr(void) +{ + return ui_companion_qt.application; +} +#endif + const ui_application_t *ui_companion_driver_get_application_ptr(void) { const ui_companion_driver_t *ui = ui_companion_get_ptr(); @@ -200,6 +242,20 @@ const ui_application_t *ui_companion_driver_get_application_ptr(void) return ui->application; } +void ui_companion_driver_msg_queue_push(const char *msg, unsigned priority, unsigned duration, bool flush) +{ + const ui_companion_driver_t *ui = ui_companion_get_ptr(); + settings_t *settings = config_get_ptr(); + + if (ui && ui->msg_queue_push) + ui->msg_queue_push(ui_companion_data, msg, priority, duration, flush); +#ifdef HAVE_QT + if (settings->bools.desktop_menu_enable) + if (ui_companion_qt.msg_queue_push) + ui_companion_qt.msg_queue_push(ui_companion_qt_data, msg, priority, duration, flush); +#endif +} + void *ui_companion_driver_get_main_window(void) { const ui_companion_driver_t *ui = ui_companion_get_ptr(); @@ -215,3 +271,14 @@ const char *ui_companion_driver_get_ident(void) return "null"; return ui->ident; } + +void ui_companion_driver_log_msg(const char *msg) +{ +#ifdef HAVE_QT + settings_t *settings = config_get_ptr(); + + if (settings->bools.desktop_menu_enable) + if (ui_companion_qt_data) + ui_companion_qt.log_msg(ui_companion_qt_data, msg); +#endif +} diff --git a/ui/ui_companion_driver.h b/ui/ui_companion_driver.h index ab93c114e2..f358843272 100644 --- a/ui/ui_companion_driver.h +++ b/ui/ui_companion_driver.h @@ -104,14 +104,17 @@ typedef struct ui_msg_window typedef struct ui_application { - bool (*initialize)(void); + void* (*initialize)(void); bool (*pending_events)(void); void (*process_events)(void); + void (*run)(void *args); + void (*quit)(void); const char *ident; } ui_application_t; typedef struct ui_window { + void* (*init)(void); void (*destroy)(void *data); void (*set_focused)(void *data); void (*set_visible)(void *data, bool visible); @@ -126,46 +129,47 @@ typedef struct ui_companion_driver void *(*init)(void); void (*deinit)(void *data); int (*iterate)(void *data, unsigned action); - void (*toggle)(void *data); + void (*toggle)(void *data, bool force); void (*event_command)(void *data, enum event_command action); void (*notify_content_loaded)(void *data); void (*notify_list_loaded)(void *data, file_list_t *list, file_list_t *menu_list); void (*notify_refresh)(void *data); - void (*msg_queue_push)(const char *msg, unsigned priority, unsigned duration, bool flush); + void (*msg_queue_push)(void *data, const char *msg, unsigned priority, unsigned duration, bool flush); void (*render_messagebox)(const char *msg); void *(*get_main_window)(void *data); - const ui_browser_window_t *browser_window; - const ui_msg_window_t *msg_window; - const ui_window_t *window; - const ui_application_t *application; + void (*log_msg)(void *data, const char *msg); + ui_browser_window_t *browser_window; + ui_msg_window_t *msg_window; + ui_window_t *window; + ui_application_t *application; const char *ident; } ui_companion_driver_t; -extern const ui_browser_window_t ui_browser_window_null; -extern const ui_browser_window_t ui_browser_window_cocoa; -extern const ui_browser_window_t ui_browser_window_qt; -extern const ui_browser_window_t ui_browser_window_win32; +extern ui_browser_window_t ui_browser_window_null; +extern ui_browser_window_t ui_browser_window_cocoa; +extern ui_browser_window_t ui_browser_window_qt; +extern ui_browser_window_t ui_browser_window_win32; -extern const ui_window_t ui_window_null; -extern const ui_window_t ui_window_cocoa; -extern const ui_window_t ui_window_qt; -extern const ui_window_t ui_window_win32; +extern ui_window_t ui_window_null; +extern ui_window_t ui_window_cocoa; +extern ui_window_t ui_window_qt; +extern ui_window_t ui_window_win32; -extern const ui_msg_window_t ui_msg_window_null; -extern const ui_msg_window_t ui_msg_window_win32; -extern const ui_msg_window_t ui_msg_window_qt; -extern const ui_msg_window_t ui_msg_window_cocoa; +extern ui_msg_window_t ui_msg_window_null; +extern ui_msg_window_t ui_msg_window_win32; +extern ui_msg_window_t ui_msg_window_qt; +extern ui_msg_window_t ui_msg_window_cocoa; -extern const ui_application_t ui_application_null; -extern const ui_application_t ui_application_cocoa; -extern const ui_application_t ui_application_qt; -extern const ui_application_t ui_application_win32; +extern ui_application_t ui_application_null; +extern ui_application_t ui_application_cocoa; +extern ui_application_t ui_application_qt; +extern ui_application_t ui_application_win32; -extern const ui_companion_driver_t ui_companion_null; -extern const ui_companion_driver_t ui_companion_cocoa; -extern const ui_companion_driver_t ui_companion_cocoatouch; -extern const ui_companion_driver_t ui_companion_qt; -extern const ui_companion_driver_t ui_companion_win32; +extern ui_companion_driver_t ui_companion_null; +extern ui_companion_driver_t ui_companion_cocoa; +extern ui_companion_driver_t ui_companion_cocoatouch; +extern ui_companion_driver_t ui_companion_qt; +extern ui_companion_driver_t ui_companion_win32; /** * ui_companion_find_driver: @@ -204,7 +208,7 @@ void ui_companion_driver_notify_list_loaded(file_list_t *list, file_list_t *menu void ui_companion_driver_notify_content_loaded(void); -void ui_companion_driver_toggle(void); +void ui_companion_driver_toggle(bool force); void ui_companion_driver_free(void); @@ -216,6 +220,14 @@ const ui_window_t *ui_companion_driver_get_window_ptr(void); const ui_application_t *ui_companion_driver_get_application_ptr(void); +#ifdef HAVE_QT +const ui_application_t *ui_companion_driver_get_qt_application_ptr(void); +#endif + +void ui_companion_driver_log_msg(const char *msg); + +void ui_companion_driver_msg_queue_push(const char *msg, unsigned priority, unsigned duration, bool flush); + void *ui_companion_driver_get_main_window(void); const char *ui_companion_driver_get_ident(void); diff --git a/verbosity.c b/verbosity.c index 6102669a78..85a207471e 100644 --- a/verbosity.c +++ b/verbosity.c @@ -52,6 +52,10 @@ #include "file_path_special.h" #include "verbosity.h" +#ifdef HAVE_QT +#include "ui/ui_companion_driver.h" +#endif + /* If this is non-NULL. RARCH_LOG and friends * will write to this file. */ static FILE *log_file_fp = NULL; @@ -174,16 +178,35 @@ void RARCH_LOG_V(const char *tag, const char *fmt, va_list ap) #else { +#ifdef HAVE_QT + char buffer[1024]; +#endif #ifdef HAVE_FILE_LOGGER FILE *fp = (FILE*)retro_main_log_file(); #else FILE *fp = stderr; #endif - fprintf(fp, "%s ", - tag ? tag : file_path_str(FILE_PATH_LOG_INFO)); - vfprintf(fp, fmt, ap); - fflush(fp); +#ifdef HAVE_QT + buffer[0] = '\0'; + vsnprintf(buffer, sizeof(buffer), fmt, ap); + + if (fp) + { + fprintf(fp, "%s", buffer); + fflush(fp); + } + + ui_companion_driver_log_msg(buffer); +#else + if (fp) + { + fprintf(fp, "%s ", + tag ? tag : file_path_str(FILE_PATH_LOG_INFO)); + vfprintf(fp, fmt, ap); + fflush(fp); + } +#endif } #endif }