diff --git a/.gitignore b/.gitignore index 4e752c40c4..f5b1883eb7 100644 --- a/.gitignore +++ b/.gitignore @@ -62,7 +62,6 @@ apple/RetroArch_iOS.xcodeproj/project.xcworkspace/* /freetype2/ /ft2build.h /iconv.h -/libxml2/ /phoenix/ /python/ /rsound.h @@ -77,6 +76,10 @@ convert_rumble.awk *~ assets info +content_image_history.lpl +saves +screenshots + # Wii U *.depend @@ -165,6 +168,10 @@ retroarch_switch.nacp retroarch_switch.nro retroarch_switch.nso +# PS2 +ps2/irx/*.c +ps2/libcdvd/lib/ + # Wayland gfx/common/wayland/idle-inhibit-unstable-v1.c gfx/common/wayland/idle-inhibit-unstable-v1.h diff --git a/.vscode/settings.json b/.vscode/settings.json index e6425ac914..c2e6cabd58 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -66,7 +66,9 @@ "xutility": "c", "menu_input_dialog.h": "c", "menu_filebrowser.h": "c", - "ozone_sidebar.h": "c" + "ozone_sidebar.h": "c", + "menu_thumbnail_path.h": "c", + "badges.h": "c" }, "C_Cpp.dimInactiveRegions": false, } \ No newline at end of file diff --git a/CHANGES.md b/CHANGES.md index d1f2177601..d9145377a0 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,11 +1,14 @@ # 1.7.7 (future) - 3DS: Add unique IDs to prevent cores overwriting each other. +- 3DS: Fix screen tearing when running 50Hz content. - ANDROID: We now target API level 26 (minimum is still API level 9). - ANDROID: Add option to vibrate on touch (works in menu or overlay). - ANDROID: Add device vibration option for cores that support rumble. - ANDROID: Add gamepad vibration support for cores that support rumble. +- ANDROID: Allow stylus/pen to move mouse without pressing down. - AUDIO: Avoid deadlocks in certain audio drivers when toggling menu sounds on. - BLISS-BOX: Support PSX Jogcon (requires firmware 3.0). +- CHEEVOS: Fix crash when reading memory that is out of range. - CRT: Dynamic super resolution support. - DISCORD: Fix potential crash when username is empty and discord is disabled. - DISCORD: Ask to join support for Linux. @@ -21,13 +24,30 @@ - COMMON: Show CPU model name in log. - COMMON: Add "Help -> Send Debug Info" option (and F10 hotkey) to send diagnostic info to the RetroArch team for help with problems. - COMMON: Show GPU device name/version in log. +- COMMON: Add menu option to write log info to a file. +- COMMON: Add subsystem support for playlists. Subsystem info is automatically saved to the history playlist for easy relaunching. - GL: Add new "gl1" OpenGL 1.1 compliant video driver for legacy GPUs and software renderers - GL: Draw OSD on top of overlay. - GL: Add a new "glcore" driver with slang support (requires GL 3.2+ or GLES3). - GONG: Add savestate support. - GONG: Add video refresh rate core options. - GONG: Two player support via core option. +- GUI: Fix text alignment when using stb_unicode. +- GUI: Fix text display issues when using Japanese (and other unicode-dependent language) text with stb_unicode. +- GUI: Set language on first startup to the user's preferred OS language (Windows, *nix and Android). +- INPUT: Add (scaled radial) analog deadzone and sensitivity options. +- LIBRETRO: Add Turkish language support. +- LIBRETRO: Allow non-accelerated video to rotate the display. +- LOCALIZATION: Update Chinese (Simplified) translation. +- LOCALIZATION: Update Chinese (Traditional) translation. +- LOCALIZATION: Update Dutch translation. +- LOCALIZATION: Update French translation. +- LOCALIZATION: Update German translation. +- LOCALIZATION: Update Japanese translation. - LOCALIZATION: Update Polish translation. +- LOCALIZATION: Update Russian translation. +- LOCALIZATION: Update Spanish translation. +- LOCALIZATION: Add new Turkish translation. - MIDI: Fix startup crash in midi driver. - MENU: Add memory statistics support to more context drivers. - MENU: Enable ozone driver for UWP builds. @@ -40,12 +60,15 @@ - MENU: Enable "Add to Favorites" without loading a core. - MENU: Allow core name to be hidden on history/favorites playlists. - MENU: Populate crc32 and db_name fields when adding history/favourites playlist entries. +- MENU: Fix TTF files not showing in OSD/menu font selection screen. +- MENU: Fix audio/video filters not showing in file browser. - MENU/GLUI: Add subsystem support. - MENU/OZONE: Add mouse support on entries (no sidebar yet). - MENU/OZONE: Allow collapsing the sidebar. - MENU/OZONE: Add thumbnail support. -- MENU/QT: Add git version and build date to Help->About window. -- MENU/QT: Fix content loading via the file browser. +- MENU/QT/WIMP: Add git version and build date to Help->About window. +- MENU/QT/WIMP: Fix content loading via the file browser. +- MENU/QT/WIMP: Add new settings window to control all RetroArch settings. - MENU/RGUI: Improve playlist titles. - MENU/RGUI: Add option to hide associated cores in playlists. - MENU/RGUI: Add internal upscaling option. @@ -57,6 +80,14 @@ - MENU/RGUI: Add "full width" layout option. - MENU/RGUI: Ensure menu color theme is applied immediately. - MENU/RGUI: Fix "Lock Menu Aspect Ratio" option when using custom viewports. +- MENU/RGUI: Add widescreen support. +- MENU/RGUI: Allow text to be centred when selecting widescreen layouts. +- MENU/RGUI: Add inline playlist thumbnail support. +- MENU/RGUI: Add optional shadow effects. +- MENU/RGUI: Performance optimizations. +- MENU/RGUI: Add optional extended ASCII support. +- MENU/RGUI: Add optional delay when loading thumbnails. +- MENU/RGUI: Add on-screen keyboard. - MENU/XMB: Prevent crashes when resizing to a tiny window. - NETPLAY: Fix stall-out causing total disconnection with >2 players. - NETPLAY: Different (more intuitive?) default netplay share policy. @@ -65,12 +96,16 @@ - OSX: Prevent crash on exit. - OSX: Metal is now the default video driver. - OSX: Enable CoreAudio v3 driver for Metal. +- PS2: CDFS support. - PS2: Implemented analog support for ps2 controllers. - PS2: Fix audio freeze after restarting core. - PS2: Fix issues with load state and the font driver. - PS2: File I/O now works for USB and network host. - PS2: Support cores with extra padding in their frame buffers. +- SHADERS: Don't alphabetize shader presets. - SWITCH: Add rumble support. +- SWITCH: Add USB keyboard support. +- VITA: Add bluetooth mouse and keyboard support. - VULKAN: Fix color issues with RGBA8888 swapchains in readback (screenshots). - WII: Don't init overlay when RAM is beyond 72MB. - WII: Skip CRC calculation on content load, can improve load times of larger games by several seconds. diff --git a/Makefile.common b/Makefile.common index c35f06a369..28e7cd1a4f 100644 --- a/Makefile.common +++ b/Makefile.common @@ -102,9 +102,9 @@ ifeq ($(HAVE_NETPLAYDISCOVERY), 1) endif ifeq ($(HAVE_NETLOGGER), 1) - DEF_FLAGS += -DHAVE_LOGGER - DEFINES += -DHAVE_LOGGER - OBJ += network/net_logger.o + DEF_FLAGS += -DHAVE_LOGGER + DEFINES += -DHAVE_LOGGER + OBJ += network/net_logger.o endif # System @@ -309,7 +309,8 @@ ifeq ($(HAVE_LANGEXTRA), 1) intl/msg_hash_chs.o \ intl/msg_hash_cht.o \ intl/msg_hash_ar.o \ - intl/msg_hash_el.o + intl/msg_hash_el.o \ + intl/msg_hash_tr.o endif ifneq ($(HAVE_GETOPT_LONG), 1) @@ -357,6 +358,27 @@ ifeq ($(HAVE_QT), 1) ui/drivers/qt/thumbnaildownload.o \ ui/drivers/qt/thumbnailpackdownload.o \ ui/drivers/qt/playlistthumbnaildownload.o + ifeq ($(HAVE_MENU), 1) + OBJ += ui/drivers/qt/settingswidgets.o \ + ui/drivers/qt/options/achievements.o \ + ui/drivers/qt/options/audio.o \ + ui/drivers/qt/options/configuration.o \ + ui/drivers/qt/options/core.o \ + ui/drivers/qt/options/directory.o \ + ui/drivers/qt/options/drivers.o \ + ui/drivers/qt/options/input.o \ + ui/drivers/qt/options/latency.o \ + ui/drivers/qt/options/logging.o \ + ui/drivers/qt/options/network.o \ + ui/drivers/qt/options/osd.o \ + ui/drivers/qt/options/playlists.o \ + ui/drivers/qt/options/recording.o \ + ui/drivers/qt/options/saving.o \ + ui/drivers/qt/options/throttle.o \ + ui/drivers/qt/options/ui.o \ + ui/drivers/qt/options/user.o \ + ui/drivers/qt/options/video.o + endif MOC_HEADERS += ui/drivers/ui_qt.h \ ui/drivers/qt/ui_qt_load_core_window.h \ @@ -367,6 +389,10 @@ ifeq ($(HAVE_QT), 1) ui/drivers/qt/coreinfodialog.h \ ui/drivers/qt/playlistentrydialog.h \ ui/drivers/qt/viewoptionsdialog.h + ifeq ($(HAVE_MENU), 1) + MOC_HEADERS += ui/drivers/qt/settingswidgets.h \ + ui/drivers/qt/options/options.h + endif DEFINES += $(QT5CORE_CFLAGS) $(QT5GUI_CFLAGS) $(QT5WIDGETS_CFLAGS) $(QT5CONCURRENT_CFLAGS) $(QT5NETWORK_CFLAGS) -DHAVE_MAIN #DEFINES += $(QT5WEBENGINE_CFLAGS) @@ -519,16 +545,16 @@ endif ifeq ($(HAVE_COREAUDIO), 1) OBJ += audio/drivers/coreaudio.o - HAVE_COREAUDIO_LIBS = 1 + HAVE_COREAUDIO_LIBS = 1 endif ifeq ($(HAVE_COREAUDIO3), 1) OBJ += audio/drivers/coreaudio3.o - HAVE_COREAUDIO_LIBS = 1 + HAVE_COREAUDIO_LIBS = 1 endif ifeq ($(HAVE_COREAUDIO_LIBS), 1) - LIBS += -framework CoreServices -framework CoreAudio -framework AudioUnit + LIBS += -framework CoreServices -framework CoreAudio -framework AudioUnit endif ifeq ($(HAVE_CORETEXT), 1) @@ -792,11 +818,12 @@ ifeq ($(HAVE_MENU_COMMON), 1) menu/menu_displaylist.o \ menu/menu_animation.o \ menu/drivers/menu_generic.o \ - menu/drivers/null.o + menu/drivers/null.o \ + menu/menu_thumbnail_path.o ifeq ($(HAVE_MENU_COMMON),1) - OBJ += menu/drivers_display/menu_display_null.o - endif + OBJ += menu/drivers_display/menu_display_null.o + endif ifeq ($(HAVE_MENU_WIDGETS), 1) OBJ += menu/widgets/menu_widgets.o @@ -806,8 +833,8 @@ endif ifeq ($(HAVE_OVERLAY), 1) DEFINES += -DHAVE_OVERLAY OBJ += tasks/task_overlay.o \ - input/input_overlay.o \ - led/drivers/led_overlay.o + input/input_overlay.o \ + led/drivers/led_overlay.o endif ifeq ($(HAVE_STB_FONT), 1) @@ -824,6 +851,7 @@ endif ifeq ($(HAVE_THREADS), 1) OBJ += $(LIBRETRO_COMM_DIR)/rthreads/rthreads.o \ + $(LIBRETRO_COMM_DIR)/rthreads/rsemaphore.o \ gfx/video_thread_wrapper.o \ audio/audio_thread_wrapper.o DEFINES += -DHAVE_THREADS @@ -894,11 +922,11 @@ endif ifeq ($(HAVE_WAYLAND), 1) OBJ += gfx/drivers_context/wayland_ctx.o \ - input/drivers/wayland_input.o \ - gfx/common/wayland/xdg-shell.o \ - gfx/common/wayland/xdg-shell-unstable-v6.o \ - gfx/common/wayland/idle-inhibit-unstable-v1.o \ - gfx/common/wayland/xdg-decoration-unstable-v1.o + input/drivers/wayland_input.o \ + gfx/common/wayland/xdg-shell.o \ + gfx/common/wayland/xdg-shell-unstable-v6.o \ + gfx/common/wayland/idle-inhibit-unstable-v1.o \ + gfx/common/wayland/xdg-decoration-unstable-v1.o ifeq ($(HAVE_EGL), 1) LIBS += $(EGL_LIBS) endif @@ -1173,7 +1201,7 @@ ifeq ($(HAVE_GL_CONTEXT), 1) OBJ += gfx/drivers_context/cgl_ctx.o else ifneq ($(findstring Win32,$(OS)),) GL_LIBS := -lopengl32 -lgdi32 -lcomdlg32 - WANT_WGL=1 + WANT_WGL=1 endif LIBS += $(GL_LIBS) endif @@ -1346,8 +1374,8 @@ ifeq ($(HAVE_D3D11), 1) gfx/common/d3d11_common.o \ gfx/drivers_font/d3d11_font.o ifeq ($(HAVE_MENU_COMMON), 1) - OBJ += menu/drivers_display/menu_display_d3d11.o - endif + OBJ += menu/drivers_display/menu_display_d3d11.o + endif DEFINES += -DHAVE_D3D11 HAVE_SLANG = 1 HAVE_GLSLANG = 1 @@ -1473,13 +1501,6 @@ ifeq ($(WANT_WGL), 1) LIBS += -lcomctl32 endif -#ifeq ($(HAVE_LIBXML2), 1) - #LIBS += $(LIBXML2_LIBS) - #DEFINES += $(LIBXML2_CFLAGS) -#else - #OBJ += $(LIBRETRO_COMM_DIR)/formats/xml/rxml.o -#endif - # Compression/Archive OBJ += $(LIBRETRO_COMM_DIR)/file/archive_file.o \ @@ -1616,6 +1637,7 @@ endif OBJ += $(LIBRETRO_COMM_DIR)/formats/bmp/rbmp_encode.o \ $(LIBRETRO_COMM_DIR)/formats/json/jsonsax.o \ $(LIBRETRO_COMM_DIR)/formats/json/jsonsax_full.o \ + $(LIBRETRO_COMM_DIR)/formats/xml/rxml.o \ $(LIBRETRO_COMM_DIR)/formats/image_transfer.o ifdef HAVE_COMPRESSION @@ -1674,8 +1696,8 @@ ifeq ($(HAVE_NETWORKING), 1) endif # Netplay - DEFINES += -DHAVE_NETWORK_CMD - OBJ += network/netplay/netplay_delta.o \ + DEFINES += -DHAVE_NETWORK_CMD + OBJ += network/netplay/netplay_delta.o \ network/netplay/netplay_frontend.o \ network/netplay/netplay_handshake.o \ network/netplay/netplay_init.o \ @@ -1823,8 +1845,8 @@ ifneq ($(findstring Win32,$(OS)),) gfx/display_servers/dispserv_win32.o ifeq ($(HAVE_MENU_COMMON), 1) - OBJ += menu/drivers_display/menu_display_gdi.o - endif + OBJ += menu/drivers_display/menu_display_gdi.o + endif LIBS += -lmsimg32 -lhid -lsetupapi endif diff --git a/Makefile.griffin b/Makefile.griffin index a5ab7229d9..945b9ad5e9 100644 --- a/Makefile.griffin +++ b/Makefile.griffin @@ -271,7 +271,7 @@ else ifeq ($(platform), vita) PLATCFLAGS := -mfloat-abi=hard -fsingle-precision-constant \ -mword-relocations -fno-unwind-tables -fno-asynchronous-unwind-tables -ftree-vectorize -fno-optimize-sibling-calls LIBS += -lSceDisplay_stub -lSceGxm_stub -lSceNet_stub -lSceNetCtl_stub\ - -lSceSysmodule_stub -lSceCtrl_stub -lSceTouch_stub -lSceAudio_stub -lSceFiber_stub\ + -lSceSysmodule_stub -lSceCtrl_stub -lSceHid_stub -lSceTouch_stub -lSceAudio_stub -lSceFiber_stub\ -lScePower_stub -lSceRtc_stub -lSceCommonDialog_stub -lScePgf_stub \ -lSceMotion_stub -lSceAppMgr_stub -lpng -lm -lc diff --git a/Makefile.ps2 b/Makefile.ps2 index 313163abd6..9638fd087c 100644 --- a/Makefile.ps2 +++ b/Makefile.ps2 @@ -5,16 +5,19 @@ HAVE_LOGGER = 0 HAVE_FILE_LOGGER = 0 HAVE_THREADS = 0 BIG_STACK = 0 -MUTE_WARNINGS = 0 +MUTE_WARNINGS = 1 PS2_IP = 192.168.1.150 -#Configuration for IRX -EE_BIN2O = bin2o -IRX_DIR = $(PS2SDK)/iop/irx - TARGET = retroarchps2.elf TARGET_RELEASE = retroarchps2-release.elf +# Lib CDVD +CDVD_DIR = ps2/libcdvd + +# Compile the IRXs first +IRX_DIR = ps2/irx +IRX_FILES = $(wildcard ps2/irx/*.c) + ifeq ($(DEBUG), 1) OPTIMIZE_LV := -O0 -g RARCH_DEFINES += -DDEBUG @@ -27,7 +30,7 @@ ifeq ($(MUTE_WARNINGS), 1) DISABLE_WARNINGS := -Wno-sign-compare -Wno-unused -Wno-parentheses endif -INCDIR = -I$(PS2DEV)/gsKit/include -I$(PS2SDK)/ports/include +INCDIR = -I$(PS2DEV)/gsKit/include -I$(PS2SDK)/ports/include -I$(CDVD_DIR)/ee INCDIR += -Ips2 -Ips2/include -Ilibretro-common/include INCDIR += -Ideps -Ideps/stb -Ideps/libz -Ideps/7zip -Ideps/pthreads -Ideps/pthreads/platform/ps2 -Ideps/pthreads/platform/helper GPVAL = -G0 @@ -38,14 +41,10 @@ RARCH_DEFINES += -DPS2 -DUSE_IOP_CTYPE_MACRO -D_MIPS_ARCH_R5900 -DHAVE_ZLIB -DHA RARCH_DEFINES += -DHAVE_GRIFFIN=1 -DRARCH_INTERNAL -DRARCH_CONSOLE -DHAVE_MENU -DHAVE_RGUI -DHAVE_FILTERS_BUILTIN -DHAVE_7ZIP -DHAVE_CC_RESAMPLER LIBDIR = -LDFLAGS += -L$(PS2SDK)/ports/lib -L$(PS2DEV)/gsKit/lib -L$(PS2SDK)/ee/lib -L. -LIBS += -lretro_ps2 -lgskit -ldmakit -lgskit_toolkit -laudsrv -lmf -lpad -lmc -lhdd -lsdl -lfileXio -lpatches -lpoweroff +LDFLAGS += -L$(PS2SDK)/ports/lib -L$(PS2DEV)/gsKit/lib -L$(PS2SDK)/ee/lib -L$(CDVD_DIR)/lib -L. +LIBS += -lretro_ps2 -lgskit -ldmakit -lgskit_toolkit -laudsrv -lmf -lpadx -lmtap -lmc -lhdd -lsdl -lfileXio +LIBS += -lcdvdfs -lpatches -lpoweroff -#IRX modules -# IRX modules - modules have to be in IRX_DIR -IRX = iomanX.irx fileXio.irx mcman.irx mcserv.irx usbd.irx usbhdfsd.irx freesd.irx audsrv.irx poweroff.irx ps2dev9.irx ps2atad.irx ps2hdd.irx ps2fs.irx -IRX_OBJ = $(IRX:.irx=.o) -EE_OBJS += $(IRX_OBJ) ifeq ($(HAVE_THREADS), 1) RARCH_DEFINES += -DHAVE_THREADS @@ -65,8 +64,15 @@ endif CFLAGS += $(RARCH_DEFINES) +# All the IRX objects +EE_OBJS += $(IRX_DIR)/freemtap_irx.o $(IRX_DIR)/freepad_irx.o $(IRX_DIR)/freesio2_irx.o $(IRX_DIR)/iomanX_irx.o +EE_OBJS += $(IRX_DIR)/fileXio_irx.o $(IRX_DIR)/mcman_irx.o $(IRX_DIR)/mcserv_irx.o $(IRX_DIR)/usbd_irx.o +EE_OBJS += $(IRX_DIR)/usbhdfsd_irx.o $(IRX_DIR)/freesd_irx.o $(IRX_DIR)/audsrv_irx.o $(IRX_DIR)/poweroff_irx.o +EE_OBJS += $(IRX_DIR)/cdvd_irx.o + # Missing objecst on the PS2SDK -EE_OBJS += ps2/compat_files/compat_ctype.o ps2/compat_files/time.o ps2/compat_files/ps2_devices.o +EE_OBJS += ps2/compat_files/compat_ctype.o ps2/compat_files/time.o ps2/compat_files/ps2_devices.o +EE_OBJS += ps2/compat_files/fileXio_cdvd.o ps2/compat_files/ps2_descriptor.o #EE_OBJS = griffin/griffin.o bootstrap/ps2/kernel_functions.o EE_OBJS += griffin/griffin.o @@ -77,14 +83,18 @@ EE_LDFLAGS = $(LDFLAGS) EE_LIBS = $(LIBS) EE_ASFLAGS = $(ASFLAGS) EE_INCS = $(INCDIR) -EE_IRX_OBJ = $(IRX_OBJ) EE_BIN = $(TARGET) EE_GPVAL = $(GPVAL) -all: $(EE_IRX_OBJ) $(EE_BIN) + +all: irxdir $(EE_BIN) + +irxdir: + $(MAKE) -C $(IRX_DIR) clean: rm -f $(EE_BIN) $(EE_OBJS) + $(MAKE) -C $(IRX_DIR) clean prepare: ps2client -h $(PS2_IP) reset @@ -100,10 +110,6 @@ package: release: clean all package -#Specific file name and output per IRX Module -$(EE_IRX_OBJ): - $(EE_BIN2O) $(EE_GPVAL) $(IRX_DIR)/$(@:.o=.irx) $@ $(@:.o=_irx) - #Include preferences include $(PS2SDK)/samples/Makefile.pref include $(PS2SDK)/samples/Makefile.eeglobal diff --git a/Makefile.vita b/Makefile.vita index abc953ccec..ae79600c32 100644 --- a/Makefile.vita +++ b/Makefile.vita @@ -116,7 +116,7 @@ endif CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions VITA_LIBS := -lSceDisplay_stub -lSceGxm_stub -lSceNet_stub -lSceNetCtl_stub \ - -lSceSysmodule_stub -lSceCtrl_stub -lSceTouch_stub -lSceAudio_stub \ + -lSceSysmodule_stub -lSceCtrl_stub -lSceHid_stub -lSceTouch_stub -lSceAudio_stub \ -lScePower_stub -lSceRtc_stub -lSceCommonDialog_stub -lScePgf_stub \ -lSceFiber_stub -lSceMotion_stub -lSceAppMgr_stub -lpthread -lpng -lz diff --git a/Makefile.vita.salamander b/Makefile.vita.salamander index 20160de36e..f479726e6d 100644 --- a/Makefile.vita.salamander +++ b/Makefile.vita.salamander @@ -22,7 +22,7 @@ RARCH_DEFINES = -DVITA -DIS_SALAMANDER -DRARCH_CONSOLE LIBDIR = LDFLAGS = LIBS = -lSceDisplay_stub -lSceGxm_stub -lSceNet_stub -lSceNetCtl_stub\ - -lSceSysmodule_stub -lSceCtrl_stub -lSceAudio_stub -lSceFiber_stub\ + -lSceSysmodule_stub -lSceCtrl_stub -lSceHid_stub -lSceAudio_stub -lSceFiber_stub\ -lScePower_stub -lSceRtc_stub -lSceCommonDialog_stub -lScePgf_stub \ -lSceMotion_stub -lSceAppMgr_stub -lfreetype -lpng -lm -lc diff --git a/Makefile.win b/Makefile.win index bdab1a775b..7614b080fa 100644 --- a/Makefile.win +++ b/Makefile.win @@ -32,7 +32,6 @@ HAVE_FREETYPE := 1 HAVE_FFMPEG := 0 HAVE_CG := 1 -HAVE_LIBXML2 := 0 HAVE_ZLIB := 1 WANT_ZLIB := 1 HAVE_CC_RESAMPLER := 1 @@ -46,11 +45,6 @@ FREETYPE_CFLAGS := -DHAVE_FREETYPE -Ifreetype2 FREETYPE_LIBS := -lfreetype endif -ifeq ($(HAVE_LIBXML2), 1) -LIBXML2_CFLAGS := -Ilibxml2 -DHAVE_LIBXML2 -DHAVE_GLSL -LIBXML2_LIBS := -lxml2 -liconv -endif - ifeq ($(HAVE_SDL), 1) SDL_LIBS := -lSDL SDL_CFLAGS := -ISDL -DHAVE_SDL diff --git a/README-mali_fbdev_r4p0.md b/README-mali_fbdev_r4p0.md index 4449795d49..c004efdbaa 100644 --- a/README-mali_fbdev_r4p0.md +++ b/README-mali_fbdev_r4p0.md @@ -80,7 +80,7 @@ To enable mali_fbdev you must configure RetroArch with --enable-gles and --enabl This is an example of what you would use on a CubieBoard2 for a lightweight RetroArch: -./configure --enable-gles --enable-mali_fbdev --disable-x11 --disable-sdl2 --enable-floathard --disable-ffmpeg --disable-netplay --enable-udev --disable-sdl --disable-pulse --disable-oss --disable-freetype --disable-7zip --disable-libxml2 +./configure --enable-gles --enable-mali_fbdev --disable-x11 --disable-sdl2 --enable-floathard --disable-ffmpeg --disable-netplay --enable-udev --disable-sdl --disable-pulse --disable-oss --disable-freetype --disable-7zip NOTE: A TTY hack is used to auto-clean the console on exit, and the fbdev ioctls are used to retrieve current video mode. Both things work good, but they are not exactly ideal solutions. diff --git a/README.md b/README.md index c9f7b7b4b8..ff828e3d93 100644 --- a/README.md +++ b/README.md @@ -105,7 +105,6 @@ OSX port of RetroArch requires latest versions of XCode to build. RetroArch can utilize these libraries if enabled: - nvidia-cg-toolkit - - libxml2 (GLSL XML shaders) - libfreetype2 (TTF font rendering on screen) RetroArch needs at least one of these audio driver libraries: diff --git a/audio/drivers/coreaudio3.m b/audio/drivers/coreaudio3.m index 298dd3cb19..176024411b 100644 --- a/audio/drivers/coreaudio3.m +++ b/audio/drivers/coreaudio3.m @@ -89,7 +89,7 @@ static void rb_init(ringbuffer_h r, size_t cap) static void rb_free(ringbuffer_h r) { free(r->buffer); - bzero(r, sizeof(*r)); + memset(r, 0, sizeof(*r)); } #define UNLIKELY(x) __builtin_expect((x), 0) @@ -115,9 +115,10 @@ static void rb_write_data(ringbuffer_h r, const float *data, size_t len) rb_len_add(r, (int)n); } -static void rb_read_data(ringbuffer_h r, float *d0, float *d1, size_t len) +static void rb_read_data(ringbuffer_h r, + float *d0, float *d1, size_t len) { - size_t need = len*2; + size_t need = len * 2; do { size_t have = rb_len(r); @@ -136,13 +137,15 @@ static void rb_read_data(ringbuffer_h r, float *d0, float *d1, size_t len) if (UNLIKELY(need > 0)) { + const float quiet = 0.0f; + size_t fill; + /* we got more data */ if (rb_len(r) > 0) continue; - // underflow - const float quiet = 0.0f; - size_t fill = (need/2)*sizeof(float); + /* underflow */ + fill = (need/2)*sizeof(float); memset_pattern4(&d0[i], &quiet, fill); memset_pattern4(&d1[i], &quiet, fill); } @@ -180,35 +183,38 @@ static bool g_interrupted; latency:(NSUInteger)latency { if (self = [super init]) { - _sema = dispatch_semaphore_create(0); + NSError *err; + AUAudioUnit *au; + AudioComponentDescription desc; + AVAudioFormat *format, *renderFormat; - _bufferSize = (latency * rate) / 1000; - _bufferSize *= 2; // stereo + _sema = dispatch_semaphore_create(0); + + _bufferSize = (latency * rate) / 1000; + _bufferSize *= 2; /* stereo */ rb_init(&_rb, _bufferSize); - AudioComponentDescription desc = { - .componentType = kAudioUnitType_Output, - .componentSubType = kAudioUnitSubType_DefaultOutput, - .componentManufacturer = kAudioUnitManufacturer_Apple, - }; + desc.componentType = kAudioUnitType_Output; + desc.componentSubType = kAudioUnitSubType_DefaultOutput; + desc.componentManufacturer = kAudioUnitManufacturer_Apple; - NSError *err; - AUAudioUnit *au = [[AUAudioUnit alloc] initWithComponentDescription:desc error:&err]; + au = [[AUAudioUnit alloc] initWithComponentDescription:desc error:&err]; if (err != nil) return nil; - AVAudioFormat *format = au.outputBusses[0].format; + format = au.outputBusses[0].format; if (format.channelCount != 2) return nil; - AVAudioFormat *renderFormat = [[AVAudioFormat alloc] initStandardFormatWithSampleRate:rate channels:2]; + renderFormat = [[AVAudioFormat alloc] initStandardFormatWithSampleRate:rate channels:2]; [au.inputBusses[0] setFormat:renderFormat error:&err]; if (err != nil) return nil; ringbuffer_h rb = &_rb; __block dispatch_semaphore_t sema = _sema; - au.outputProvider = ^AUAudioUnitStatus(AudioUnitRenderActionFlags * actionFlags, const AudioTimeStamp * timestamp, AUAudioFrameCount frameCount, NSInteger inputBusNumber, AudioBufferList * inputData) { + au.outputProvider = ^AUAudioUnitStatus(AudioUnitRenderActionFlags * actionFlags, const AudioTimeStamp * timestamp, AUAudioFrameCount frameCount, NSInteger inputBusNumber, AudioBufferList * inputData) + { rb_read_data(rb, inputData->mBuffers[0].mData, inputData->mBuffers[1].mData, frameCount); dispatch_semaphore_signal(sema); return 0; @@ -288,9 +294,9 @@ static void coreaudio3_free(void *data) } static void *coreaudio3_init(const char *device, - unsigned rate, unsigned latency, - unsigned block_frames, - unsigned *new_rate) + unsigned rate, unsigned latency, + unsigned block_frames, + unsigned *new_rate) { CoreAudio3 *dev = [[CoreAudio3 alloc] initWithRate:rate latency:latency]; @@ -300,10 +306,12 @@ static void *coreaudio3_init(const char *device, return (__bridge_retained void *)dev; } -static ssize_t coreaudio3_write(void *data, const void *buf_, size_t size) +static ssize_t coreaudio3_write(void *data, + const void *buf_, size_t size) { CoreAudio3 *dev = (__bridge CoreAudio3 *)data; - return [dev writeFloat:(const float *)buf_ samples:size/sizeof(float)] * sizeof(float); + return [dev writeFloat:(const float *) + buf_ samples:size/sizeof(float)] * sizeof(float); } static void coreaudio3_set_nonblock_state(void *data, bool state) @@ -377,6 +385,8 @@ audio_driver_t audio_coreaudio3 = { coreaudio3_free, coreaudio3_use_float, "coreaudio3", + NULL, /* device_list_new */ + NULL, /* device_list_free */ coreaudio3_write_avail, coreaudio3_buffer_size, }; diff --git a/audio/drivers/xaudio.c b/audio/drivers/xaudio.c index 4549a5f8d4..7c05c3cc39 100644 --- a/audio/drivers/xaudio.c +++ b/audio/drivers/xaudio.c @@ -219,7 +219,7 @@ static xaudio2_t *xaudio2_new(unsigned samplerate, unsigned channels, goto error; #if (_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/) - if (FAILED(IXAudio2_CreateMasteringVoice(handle->pXAudio2, &handle->pMasterVoice, channels, samplerate, 0, device, NULL, AudioCategory_GameEffects))) + if (FAILED(IXAudio2_CreateMasteringVoice(handle->pXAudio2, &handle->pMasterVoice, channels, samplerate, 0, (LPCWSTR)(uintptr_t)device, NULL, AudioCategory_GameEffects))) goto error; #else if (FAILED(IXAudio2_CreateMasteringVoice(handle->pXAudio2, &handle->pMasterVoice, channels, samplerate, 0, device, NULL))) diff --git a/cheevos-new/cheevos.c b/cheevos-new/cheevos.c index a588a17bdb..c9822cb93a 100644 --- a/cheevos-new/cheevos.c +++ b/cheevos-new/cheevos.c @@ -35,6 +35,9 @@ #ifdef HAVE_MENU #include "../menu/menu_driver.h" #include "../menu/menu_entries.h" +#ifdef HAVE_MENU_WIDGETS +#include "../menu/widgets/menu_widgets.h" +#endif #endif #ifdef HAVE_THREADS @@ -492,9 +495,14 @@ static void rcheevos_award(rcheevos_cheevo_t* cheevo, int mode) cheevo->active &= ~RCHEEVOS_ACTIVE_SOFTCORE; /* Show the OSD message. */ - snprintf(buffer, sizeof(buffer), "Achievement Unlocked: %s", cheevo->info->title); - runloop_msg_queue_push(buffer, 0, 2 * 60, false, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); - runloop_msg_queue_push(cheevo->info->description, 0, 3 * 60, false, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); +#if defined(HAVE_MENU) && defined(HAVE_MENU_WIDGETS) + if (!video_driver_has_widgets() || !menu_widgets_push_achievement(cheevo->info->title, cheevo->info->badge)) +#endif + { + snprintf(buffer, sizeof(buffer), "Achievement Unlocked: %s", cheevo->info->title); + runloop_msg_queue_push(buffer, 0, 2 * 60, false, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); + runloop_msg_queue_push(cheevo->info->description, 0, 3 * 60, false, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); + } /* Start the award task. */ if ((mode & RCHEEVOS_ACTIVE_HARDCORE) != 0) @@ -527,11 +535,14 @@ static unsigned rcheevos_peek(unsigned address, unsigned num_bytes, void* ud) address, rcheevos_locals.patchdata.console_id); unsigned value = 0; - switch (num_bytes) + if (data) { - case 4: value |= data[2] << 16 | data[3] << 24; - case 2: value |= data[1] << 8; - case 1: value |= data[0]; + switch (num_bytes) + { + case 4: value |= data[2] << 16 | data[3] << 24; + case 2: value |= data[1] << 8; + case 1: value |= data[0]; + } } return value; @@ -1678,6 +1689,9 @@ found: badges_ctx = new_badges_ctx; +#ifdef HAVE_MENU_WIDGETS + if (false) /* we always want badges if menu widgets are enabled */ +#endif { settings_t *settings = config_get_ptr(); if (!( diff --git a/cheevos/badges.c b/cheevos/badges.c index 3232a9d449..6dec002aa6 100644 --- a/cheevos/badges.c +++ b/cheevos/badges.c @@ -47,7 +47,7 @@ void set_badge_menu_texture(badges_ctx_t * badges, int i) PATH_MAX_LENGTH * sizeof(char), APPLICATION_SPECIAL_DIRECTORY_THUMBNAILS_CHEEVOS_BADGES); -#ifdef HAVE_MENU +#if defined(HAVE_MENU) || defined(HAVE_MENU_WIDGETS) menu_display_reset_textures_list(badge_file, fullpath, &badges->menu_texture_list[i],TEXTURE_FILTER_MIPMAP_LINEAR, NULL, NULL); #endif diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c index 4608b0222c..251475a52c 100644 --- a/cheevos/cheevos.c +++ b/cheevos/cheevos.c @@ -36,6 +36,9 @@ #ifdef HAVE_MENU #include "../menu/menu_driver.h" #include "../menu/menu_entries.h" +#ifdef HAVE_MENU_WIDGETS +#include "../menu/widgets/menu_widgets.h" +#endif #endif #ifdef HAVE_THREADS @@ -1643,9 +1646,8 @@ static void cheevos_test_cheevo_set(const cheevoset_t *set) } else if (valid) { - char msg[256]; char url[256]; - msg[0] = url[0] = '\0'; + url[0] = '\0'; cheevo->active &= ~mode; @@ -1655,11 +1657,18 @@ static void cheevos_test_cheevo_set(const cheevoset_t *set) CHEEVOS_LOG("[CHEEVOS]: awarding cheevo %u: %s (%s).\n", cheevo->id, cheevo->title, cheevo->description); - snprintf(msg, sizeof(msg), "Achievement Unlocked: %s", - cheevo->title); - msg[sizeof(msg) - 1] = 0; - runloop_msg_queue_push(msg, 0, 2 * 60, false, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); - runloop_msg_queue_push(cheevo->description, 0, 3 * 60, false, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); +#if defined(HAVE_MENU) && defined(HAVE_MENU_WIDGETS) + if (!video_driver_has_widgets() || !menu_widgets_push_achievement(cheevo->title, cheevo->badge)) +#endif + { + char msg[256]; + msg[0] = '\0'; + snprintf(msg, sizeof(msg), "Achievement Unlocked: %s", + cheevo->title); + msg[sizeof(msg) - 1] = 0; + runloop_msg_queue_push(msg, 0, 2 * 60, false, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); + runloop_msg_queue_push(cheevo->description, 0, 3 * 60, false, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); + } cheevos_make_unlock_url(cheevo, url, sizeof(url)); task_push_http_transfer(url, true, NULL, @@ -3193,6 +3202,9 @@ found: badges_ctx = new_badges_ctx; +#ifdef HAVE_MENU_WIDGETS + if (false) /* we always want badges if menu widgets are enabled */ +#endif { settings_t *settings = config_get_ptr(); if (!( diff --git a/cheevos/var.c b/cheevos/var.c index dfd3035681..d0d53cecb6 100644 --- a/cheevos/var.c +++ b/cheevos/var.c @@ -290,45 +290,51 @@ Testing uint8_t* cheevos_var_get_memory(const cheevos_var_t* var) { uint8_t* memory = NULL; + size_t length = 0; - if (var->bank_id >= 0) + if (var->bank_id < 0) + return NULL; + + rarch_system_info_t* system = runloop_get_system_info(); + + if (system->mmaps.num_descriptors != 0) { - rarch_system_info_t* system = runloop_get_system_info(); + memory = (uint8_t*)system->mmaps.descriptors[var->bank_id].core.ptr; + length = system->mmaps.descriptors[var->bank_id].core.len; + } + else + { + retro_ctx_memory_info_t meminfo = {NULL, 0, 0}; - if (system->mmaps.num_descriptors != 0) - memory = (uint8_t*)system->mmaps.descriptors[var->bank_id].core.ptr; - else + switch (var->bank_id) { - retro_ctx_memory_info_t meminfo = {NULL, 0, 0}; - - switch (var->bank_id) - { - case 0: - meminfo.id = RETRO_MEMORY_SYSTEM_RAM; - break; - case 1: - meminfo.id = RETRO_MEMORY_SAVE_RAM; - break; - case 2: - meminfo.id = RETRO_MEMORY_VIDEO_RAM; - break; - case 3: - meminfo.id = RETRO_MEMORY_RTC; - break; - default: - CHEEVOS_ERR(CHEEVOS_TAG "invalid bank id: %d\n", var->bank_id); - break; - } - - core_get_memory(&meminfo); - memory = (uint8_t*)meminfo.data; + case 0: + meminfo.id = RETRO_MEMORY_SYSTEM_RAM; + break; + case 1: + meminfo.id = RETRO_MEMORY_SAVE_RAM; + break; + case 2: + meminfo.id = RETRO_MEMORY_VIDEO_RAM; + break; + case 3: + meminfo.id = RETRO_MEMORY_RTC; + break; + default: + CHEEVOS_ERR(CHEEVOS_TAG "invalid bank id: %d\n", var->bank_id); + break; } - if (memory) - memory += var->value; + core_get_memory(&meminfo); + + memory = (uint8_t*)meminfo.data; + length = meminfo.size; } - return memory; + if (memory == NULL || var->value >= length) + return NULL; + + return memory + var->value; } unsigned cheevos_var_get_value(cheevos_var_t* var) diff --git a/command.c b/command.c index b061525f6a..a1efc824fd 100755 --- a/command.c +++ b/command.c @@ -57,6 +57,9 @@ #include "menu/menu_content.h" #include "menu/menu_shader.h" #include "menu/widgets/menu_dialog.h" +#ifdef HAVE_MENU_WIDGETS +#include "menu/widgets/menu_widgets.h" +#endif #endif #ifdef HAVE_NETWORKING @@ -286,7 +289,7 @@ static bool command_read_ram(const char *arg) unsigned int alloc_size = 0; unsigned int addr = -1; - if (sscanf(arg, "%x %d", &addr, &nbytes) != 2) + if (sscanf(arg, "%x %u", &addr, &nbytes) != 2) return true; alloc_size = 40 + nbytes * 3; /* We alloc more than needed, saving 20 bytes is not really relevant */ reply = (char*) malloc(alloc_size); @@ -984,7 +987,10 @@ static void command_event_set_volume(float gain) msg_hash_to_str(MSG_AUDIO_VOLUME), new_volume); - runloop_msg_queue_push(msg, 1, 180, true, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); +#if defined(HAVE_MENU) && defined(HAVE_MENU_WIDGETS) + if (!video_driver_has_widgets() || !menu_widgets_volume_update_and_show()) +#endif + runloop_msg_queue_push(msg, 1, 180, true, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); RARCH_LOG("%s\n", msg); @@ -2134,9 +2140,11 @@ TODO: Add a setting for these tweaks */ return false; } - runloop_msg_queue_push(msg, 1, 180, true, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); +#if defined(HAVE_MENU) && defined(HAVE_MENU_WIDGETS) + if (!video_driver_has_widgets() || !menu_widgets_volume_update_and_show()) +#endif + runloop_msg_queue_push(msg, 1, 180, true, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); - RARCH_LOG("%s\n", msg); } break; case CMD_EVENT_SEND_DEBUG_INFO: @@ -2429,15 +2437,19 @@ TODO: Add a setting for these tweaks */ { if (str_list->size >= 6) { + struct playlist_entry entry = {0}; + + entry.path = str_list->elems[0].data; /* content_path */ + entry.label = str_list->elems[1].data; /* content_label */ + entry.core_path = str_list->elems[2].data; /* core_path */ + entry.core_name = str_list->elems[3].data; /* core_name */ + entry.crc32 = str_list->elems[4].data; /* crc32 */ + entry.db_name = str_list->elems[5].data; /* db_name */ + /* Write playlist entry */ command_playlist_push_write( g_defaults.content_favorites, - str_list->elems[0].data, /* content_path */ - str_list->elems[1].data, /* content_label */ - str_list->elems[2].data, /* core_path */ - str_list->elems[3].data, /* core_name */ - str_list->elems[4].data, /* crc32 */ - str_list->elems[5].data /* db_name */ + &entry ); runloop_msg_queue_push(msg_hash_to_str(MSG_ADDED_TO_FAVORITES), 1, 180, true, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); } @@ -2450,16 +2462,16 @@ TODO: Add a setting for these tweaks */ const char *core_name = "DETECT"; const char *core_path = "DETECT"; size_t *playlist_index = (size_t*)data; + struct playlist_entry entry = {0}; + + /* the update function reads our entry as const, so these casts are safe */ + entry.core_path = (char*)core_path; + entry.core_name = (char*)core_name; command_playlist_update_write( NULL, *playlist_index, - NULL, - NULL, - core_path, - core_name, - NULL, - NULL); + &entry); runloop_msg_queue_push(msg_hash_to_str(MSG_RESET_CORE_ASSOCIATION), 1, 180, true, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); break; @@ -2518,6 +2530,9 @@ TODO: Add a setting for these tweaks */ RARCH_LOG("%s\n", msg_hash_to_str(MSG_PAUSED)); command_event(CMD_EVENT_AUDIO_STOP, NULL); +#if defined(HAVE_MENU) && defined(HAVE_MENU_WIDGETS) + if (!video_driver_has_widgets() || !menu_widgets_set_paused(is_paused)) +#endif runloop_msg_queue_push(msg_hash_to_str(MSG_PAUSED), 1, 1, true, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); @@ -2532,6 +2547,10 @@ TODO: Add a setting for these tweaks */ } else { +#if defined(HAVE_MENU) && defined(HAVE_MENU_WIDGETS) + if (video_driver_has_widgets()) + menu_widgets_set_paused(is_paused); +#endif RARCH_LOG("%s\n", msg_hash_to_str(MSG_UNPAUSED)); command_event(CMD_EVENT_AUDIO_START, NULL); } diff --git a/config.def.h b/config.def.h index 563ed9555d..da181acbd0 100644 --- a/config.def.h +++ b/config.def.h @@ -32,6 +32,11 @@ #include "network/netplay/netplay.h" #endif +/* Required for 3DS display mode setting */ +#if defined(_3DS) +#include "gfx/common/ctr_common.h" +#endif + #if defined(HW_RVL) #define MAX_GAMMA_SETTING 30 #elif defined(GEKKO) @@ -384,10 +389,16 @@ static unsigned menu_shader_pipeline = 2; static bool show_advanced_settings = false; static unsigned rgui_color_theme = RGUI_THEME_CLASSIC_GREEN; +static bool rgui_inline_thumbnails = false; +static bool rgui_swap_thumbnails = false; static unsigned rgui_thumbnail_downscaler = RGUI_THUMB_SCALE_POINT; -static bool rgui_lock_aspect = false; +static unsigned rgui_thumbnail_delay = 0; static unsigned rgui_internal_upscale_level = RGUI_UPSCALE_NONE; static bool rgui_full_width_layout = true; +static unsigned rgui_aspect = RGUI_ASPECT_RATIO_4_3; +static unsigned rgui_aspect_lock = RGUI_ASPECT_RATIO_LOCK_NONE; +static bool rgui_shadows = false; +static bool rgui_extended_ascii = false; #else static bool default_block_config_read = false; @@ -438,6 +449,9 @@ static bool menu_swap_ok_cancel_buttons = false; static bool quit_press_twice = false; +static bool default_log_to_file = false; +static bool log_to_file_timestamp = false; + /* Crop overscanned frames. */ static const bool crop_overscan = true; @@ -509,9 +523,11 @@ static const float crt_refresh_rate = 60/1.001; * Used for setups where one manually rotates the monitor. */ static const bool allow_rotate = true; -#ifdef _3DS +#if defined(_3DS) /* Enable bottom LCD screen */ static const bool video_3ds_lcd_bottom = true; +/* Sets video display mode (3D, 2D, etc.) */ +static const unsigned video_3ds_display_mode = CTR_VIDEO_MODE_3D; #endif /* AUDIO */ @@ -716,13 +732,15 @@ static const bool playlist_sort_alphabetical = true; /* File format to use when writing playlists to disk */ static const bool playlist_use_old_format = false; +#ifdef HAVE_MENU /* Specify when to display 'core name' inline on playlist entries */ static const unsigned playlist_show_inline_core_name = PLAYLIST_INLINE_CORE_DISPLAY_HIST_FAV; -static const bool playlist_show_sublabels = false; - /* Specifies which runtime record to use on playlist sublabels */ static const unsigned playlist_sublabel_runtime_type = PLAYLIST_RUNTIME_PER_CORE; +#endif + +static const bool playlist_show_sublabels = false; /* Show Menu start-up screen on boot. */ static const bool default_menu_show_start_screen = true; @@ -752,7 +770,11 @@ static const unsigned libretro_log_level = 1; /* Axis threshold (between 0.0 and 1.0) * How far an axis must be tilted to result in a button press. */ -static const float axis_threshold = 0.5; +static const float axis_threshold = 0.5f; + +static const float analog_deadzone = 0.0f; + +static const float analog_sensitivity = 1.0f; /* Describes speed of which turbo-enabled buttons toggle. */ static const unsigned turbo_period = 6; diff --git a/config.features.h b/config.features.h index cc50979ef0..0dcba0dfcf 100644 --- a/config.features.h +++ b/config.features.h @@ -260,12 +260,6 @@ static const bool _hlsl_supp = true; static const bool _hlsl_supp = false; #endif -#ifdef HAVE_LIBXML2 -static const bool _libxml2_supp = true; -#else -static const bool _libxml2_supp = false; -#endif - #ifdef HAVE_SDL_IMAGE static const bool _sdl_image_supp = true; #else diff --git a/configuration.c b/configuration.c index d06da91870..1ddbf297fe 100644 --- a/configuration.c +++ b/configuration.c @@ -1310,6 +1310,8 @@ static struct config_path_setting *populate_settings_path(settings_t *settings, global->record.config_dir, false, NULL, true); } + SETTING_ARRAY("log_dir", settings->paths.log_dir, true, NULL, true); + *size = count; return tmp; @@ -1506,8 +1508,11 @@ static struct config_bool_setting *populate_settings_bool(settings_t *settings, SETTING_BOOL("rgui_background_filler_thickness_enable", &settings->bools.menu_rgui_background_filler_thickness_enable, true, true, false); SETTING_BOOL("rgui_border_filler_thickness_enable", &settings->bools.menu_rgui_border_filler_thickness_enable, true, true, false); SETTING_BOOL("rgui_border_filler_enable", &settings->bools.menu_rgui_border_filler_enable, true, true, false); - SETTING_BOOL("menu_rgui_lock_aspect", &settings->bools.menu_rgui_lock_aspect, true, rgui_lock_aspect, false); + SETTING_BOOL("menu_rgui_shadows", &settings->bools.menu_rgui_shadows, true, rgui_shadows, false); SETTING_BOOL("menu_rgui_full_width_layout", &settings->bools.menu_rgui_full_width_layout, true, rgui_full_width_layout, false); + SETTING_BOOL("rgui_inline_thumbnails", &settings->bools.menu_rgui_inline_thumbnails, true, rgui_inline_thumbnails, false); + SETTING_BOOL("rgui_swap_thumbnails", &settings->bools.menu_rgui_swap_thumbnails, true, rgui_swap_thumbnails, false); + SETTING_BOOL("rgui_extended_ascii", &settings->bools.menu_rgui_extended_ascii, true, rgui_extended_ascii, false); #endif #ifdef HAVE_XMB SETTING_BOOL("xmb_shadows_enable", &settings->bools.menu_xmb_shadows_enable, true, xmb_shadows_enable, false); @@ -1595,6 +1600,9 @@ static struct config_bool_setting *populate_settings_bool(settings_t *settings, SETTING_BOOL("ozone_collapse_sidebar", &settings->bools.ozone_collapse_sidebar, true, ozone_collapse_sidebar, false); #endif + SETTING_BOOL("log_to_file", &settings->bools.log_to_file, true, default_log_to_file, false); + SETTING_BOOL("log_to_file_timestamp", &settings->bools.log_to_file_timestamp, true, log_to_file_timestamp, false); + *size = count; return tmp; @@ -1633,6 +1641,8 @@ static struct config_float_setting *populate_settings_float(settings_t *settings SETTING_FLOAT("fastforward_ratio", &settings->floats.fastforward_ratio, true, fastforward_ratio, false); SETTING_FLOAT("slowmotion_ratio", &settings->floats.slowmotion_ratio, true, slowmotion_ratio, false); SETTING_FLOAT("input_axis_threshold", input_driver_get_float(INPUT_ACTION_AXIS_THRESHOLD), true, axis_threshold, false); + SETTING_FLOAT("input_analog_deadzone", &settings->floats.input_analog_deadzone, true, analog_deadzone, false); + SETTING_FLOAT("input_analog_sensitivity", &settings->floats.input_analog_sensitivity, true, analog_sensitivity, false); SETTING_FLOAT("video_msg_bgcolor_opacity", &settings->floats.video_msg_bgcolor_opacity, true, message_bgcolor_opacity, false); *size = count; @@ -1691,7 +1701,10 @@ static struct config_uint_setting *populate_settings_uint(settings_t *settings, #ifdef HAVE_RGUI SETTING_UINT("rgui_menu_color_theme", &settings->uints.menu_rgui_color_theme, true, rgui_color_theme, false); SETTING_UINT("rgui_thumbnail_downscaler", &settings->uints.menu_rgui_thumbnail_downscaler, true, rgui_thumbnail_downscaler, false); + SETTING_UINT("rgui_thumbnail_delay", &settings->uints.menu_rgui_thumbnail_delay, true, rgui_thumbnail_delay, false); SETTING_UINT("rgui_internal_upscale_level", &settings->uints.menu_rgui_internal_upscale_level, true, rgui_internal_upscale_level, false); + SETTING_UINT("rgui_aspect_ratio", &settings->uints.menu_rgui_aspect_ratio, true, rgui_aspect, false); + SETTING_UINT("rgui_aspect_ratio_lock", &settings->uints.menu_rgui_aspect_ratio_lock, true, rgui_aspect_lock, false); #endif #ifdef HAVE_LIBNX SETTING_UINT("split_joycon_p1", &settings->uints.input_split_joycon[0], true, 0, false); @@ -1743,7 +1756,7 @@ static struct config_uint_setting *populate_settings_uint(settings_t *settings, SETTING_UINT("netplay_share_analog", &settings->uints.netplay_share_analog, true, netplay_share_analog, false); #endif #ifdef HAVE_LANGEXTRA - SETTING_UINT("user_language", msg_hash_get_uint(MSG_HASH_USER_LANGUAGE), true, RETRO_LANGUAGE_ENGLISH, false); + SETTING_UINT("user_language", msg_hash_get_uint(MSG_HASH_USER_LANGUAGE), true, def_user_language, false); #endif SETTING_UINT("bundle_assets_extract_version_current", &settings->uints.bundle_assets_extract_version_current, true, 0, false); SETTING_UINT("bundle_assets_extract_last_version", &settings->uints.bundle_assets_extract_last_version, true, 0, false); @@ -1772,8 +1785,14 @@ static struct config_uint_setting *populate_settings_uint(settings_t *settings, SETTING_UINT("libnx_overclock", &settings->uints.libnx_overclock, true, SWITCH_DEFAULT_CPU_PROFILE, false); #endif +#ifdef _3DS + SETTING_UINT("video_3ds_display_mode", &settings->uints.video_3ds_display_mode, true, video_3ds_display_mode, false); +#endif + +#ifdef HAVE_MENU SETTING_UINT("playlist_show_inline_core_name", &settings->uints.playlist_show_inline_core_name, true, playlist_show_inline_core_name, false); SETTING_UINT("playlist_sublabel_runtime_type", &settings->uints.playlist_sublabel_runtime_type, true, playlist_sublabel_runtime_type, false); +#endif *size = count; @@ -2119,6 +2138,8 @@ void config_set_defaults(void) *settings->paths.directory_content_history = '\0'; *settings->paths.path_audio_dsp_plugin = '\0'; + *settings->paths.log_dir = '\0'; + video_driver_default_settings(); if (!string_is_empty(g_defaults.dirs[DEFAULT_DIR_WALLPAPERS])) @@ -2255,6 +2276,11 @@ void config_set_defaults(void) g_defaults.dirs[DEFAULT_DIR_CONTENT_HISTORY], sizeof(settings->paths.directory_content_history)); + if (!string_is_empty(g_defaults.dirs[DEFAULT_DIR_LOGS])) + strlcpy(settings->paths.log_dir, + g_defaults.dirs[DEFAULT_DIR_LOGS], + sizeof(settings->paths.log_dir)); + if (!string_is_empty(g_defaults.path.config)) { char *temp_str = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); @@ -2834,7 +2860,9 @@ static bool config_load_file(const char *path, bool set_defaults, if (config_get_bool(conf, "log_verbosity", &tmp_bool)) { if (tmp_bool) + { verbosity_enable(); + } else verbosity_disable(); } @@ -3144,6 +3172,20 @@ static bool config_load_file(const char *path, bool set_defaults, if (string_is_equal(settings->paths.directory_system, "default")) *settings->paths.directory_system = '\0'; + /* Log directory is a special case, since it must contain + * a valid path as soon as possible - if config file + * value is 'default' must copy g_defaults.dirs[DEFAULT_DIR_LOGS] + * directly... */ + if (string_is_equal(settings->paths.log_dir, "default")) + { + if (!string_is_empty(g_defaults.dirs[DEFAULT_DIR_LOGS])) + strlcpy(settings->paths.log_dir, + g_defaults.dirs[DEFAULT_DIR_LOGS], + sizeof(settings->paths.log_dir)); + else + *settings->paths.log_dir = '\0'; + } + if (settings->floats.slowmotion_ratio < 1.0f) configuration_set_float(settings, settings->floats.slowmotion_ratio, 1.0f); @@ -3245,8 +3287,10 @@ static bool config_load_file(const char *path, bool set_defaults, frontend_driver_set_sustained_performance_mode(settings->bools.sustained_performance_mode); recording_driver_update_streaming_url(); - ret = true; + if (!config_entry_exists(conf, "user_language")) + msg_hash_set_uint(MSG_HASH_USER_LANGUAGE, frontend_driver_get_user_language()); + ret = true; end: if (conf) config_file_free(conf); diff --git a/configuration.h b/configuration.h index 029c1fade3..fee6d81663 100644 --- a/configuration.h +++ b/configuration.h @@ -171,8 +171,11 @@ typedef struct settings bool menu_rgui_background_filler_thickness_enable; bool menu_rgui_border_filler_thickness_enable; bool menu_rgui_border_filler_enable; - bool menu_rgui_lock_aspect; bool menu_rgui_full_width_layout; + bool menu_rgui_shadows; + bool menu_rgui_inline_thumbnails; + bool menu_rgui_swap_thumbnails; + bool menu_rgui_extended_ascii; bool menu_xmb_shadows_enable; bool menu_xmb_vertical_thumbnails; bool menu_content_show_settings; @@ -321,6 +324,9 @@ typedef struct settings #ifdef HAVE_OZONE bool ozone_collapse_sidebar; #endif + + bool log_to_file; + bool log_to_file_timestamp; } bools; struct @@ -353,6 +359,8 @@ typedef struct settings float slowmotion_ratio; float fastforward_ratio; + float input_analog_deadzone; + float input_analog_sensitivity; } floats; struct @@ -423,11 +431,13 @@ typedef struct settings unsigned video_stream_quality; unsigned video_record_scale_factor; unsigned video_stream_scale_factor; + unsigned video_3ds_display_mode; unsigned menu_timedate_style; unsigned menu_thumbnails; unsigned menu_left_thumbnails; unsigned menu_rgui_thumbnail_downscaler; + unsigned menu_rgui_thumbnail_delay; unsigned menu_dpi_override_value; unsigned menu_rgui_color_theme; unsigned menu_xmb_layout; @@ -442,6 +452,8 @@ typedef struct settings unsigned menu_font_color_green; unsigned menu_font_color_blue; unsigned menu_rgui_internal_upscale_level; + unsigned menu_rgui_aspect_ratio; + unsigned menu_rgui_aspect_ratio_lock; unsigned menu_ticker_type; unsigned playlist_show_inline_core_name; @@ -590,6 +602,8 @@ typedef struct settings char directory_menu_config[PATH_MAX_LENGTH]; char directory_menu_content[PATH_MAX_LENGTH]; char streaming_title[PATH_MAX_LENGTH]; + + char log_dir[PATH_MAX_LENGTH]; } paths; bool modified; diff --git a/content.h b/content.h index 20ff9cd9aa..fb44c05e21 100644 --- a/content.h +++ b/content.h @@ -112,6 +112,9 @@ char* content_get_subsystem_rom(unsigned index); /* Sets the subsystem by name */ bool content_set_subsystem_by_name(const char* subsystem_name); +/* Get the current subsystem "friendly name" */ +void content_get_subsystem_friendly_name(const char* subsystem_name, char* subsystem_friendly_name, size_t len); + RETRO_END_DECLS #endif diff --git a/cores/dynamic_dummy.c b/cores/dynamic_dummy.c index d456c4ed01..9edc06d74d 100644 --- a/cores/dynamic_dummy.c +++ b/cores/dynamic_dummy.c @@ -21,10 +21,19 @@ #include +#if defined(HAVE_MENU) && defined(HAVE_RGUI) +#include +#include "../configuration.h" +#include "../menu/menu_defines.h" +#endif + #include "internal_cores.h" static uint16_t *dummy_frame_buf; +static uint16_t frame_buf_width; +static uint16_t frame_buf_height; + #if defined(HAVE_LIBNX) && defined(HAVE_STATIC_DUMMY) void retro_init(void) { libretro_dummy_retro_init(); } void retro_deinit(void) { libretro_dummy_retro_deinit(); } @@ -55,10 +64,38 @@ void retro_cheat_set(unsigned idx, bool enabled, const char *code) { libretro_du void libretro_dummy_retro_init(void) { +#if defined(HAVE_MENU) && defined(HAVE_RGUI) + settings_t *settings = config_get_ptr(); +#endif unsigned i; - dummy_frame_buf = (uint16_t*)calloc(320 * 240, sizeof(uint16_t)); - for (i = 0; i < 320 * 240; i++) + /* Sensible defaults */ + frame_buf_width = 320; + frame_buf_height = 240; + +#if defined(HAVE_MENU) && defined(HAVE_RGUI) + if (string_is_equal(settings->arrays.menu_driver, "rgui")) + { + switch (settings->uints.menu_rgui_aspect_ratio) + { + case RGUI_ASPECT_RATIO_16_9: + case RGUI_ASPECT_RATIO_16_9_CENTRE: + frame_buf_width = 426; + break; + case RGUI_ASPECT_RATIO_16_10: + case RGUI_ASPECT_RATIO_16_10_CENTRE: + frame_buf_width = 384; + break; + default: + /* 4:3 */ + frame_buf_width = 320; + break; + } + } +#endif + + dummy_frame_buf = (uint16_t*)calloc(frame_buf_width * frame_buf_height, sizeof(uint16_t)); + for (i = 0; i < (unsigned)(frame_buf_width * frame_buf_height); i++) dummy_frame_buf[i] = 4 << 5; } @@ -109,11 +146,11 @@ void libretro_dummy_retro_get_system_av_info( info->timing.fps = refresh_rate; info->timing.sample_rate = 30000.0; - info->geometry.base_width = 320; - info->geometry.base_height = 240; - info->geometry.max_width = 320; - info->geometry.max_height = 240; - info->geometry.aspect_ratio = 4.0 / 3.0; + info->geometry.base_width = frame_buf_width; + info->geometry.base_height = frame_buf_height; + info->geometry.max_width = frame_buf_width; + info->geometry.max_height = frame_buf_height; + info->geometry.aspect_ratio = (float)frame_buf_width / (float)frame_buf_height; } void libretro_dummy_retro_set_environment(retro_environment_t cb) @@ -158,7 +195,7 @@ void libretro_dummy_retro_reset(void) void libretro_dummy_retro_run(void) { dummy_input_poll_cb(); - dummy_video_cb(dummy_frame_buf, 320, 240, 640); + dummy_video_cb(dummy_frame_buf, frame_buf_width, frame_buf_height, 2 * frame_buf_width); } /* This should never be called, it's only used as a placeholder. */ diff --git a/cores/libretro-gong/gong.c b/cores/libretro-gong/gong.c index 58dbfd3f16..9d2b3c91b4 100644 --- a/cores/libretro-gong/gong.c +++ b/cores/libretro-gong/gong.c @@ -351,12 +351,6 @@ static void load_state(const void *data, size_t size) check_variables(); } -static INLINE bool pressed(Game_Button_State state) -{ - return state.half_transition_count > 1 || - (state.half_transition_count == 1 && state.ended_down); -} - static INLINE bool is_down(Game_Button_State state) { return state.ended_down; @@ -393,11 +387,11 @@ void GONG_CORE_PREFIX(retro_init)(void) else GONG_CORE_PREFIX(log_cb) = NULL; - video_buf = (unsigned char*)calloc(1, WIDTH * HEIGHT * sizeof(unsigned)); + video_buf = (unsigned char*)calloc(1, WIDTH * HEIGHT * sizeof(unsigned char)); - game_buffer.width = WIDTH; + game_buffer.width = WIDTH; game_buffer.height = HEIGHT; - game_buffer.pitch = WIDTH * sizeof(unsigned); + game_buffer.pitch = WIDTH * sizeof(unsigned); game_buffer.memory = video_buf; } diff --git a/defaults.h b/defaults.h index 117e14a39a..6ffd885498 100644 --- a/defaults.h +++ b/defaults.h @@ -54,6 +54,7 @@ enum default_dirs DEFAULT_DIR_CHEATS, DEFAULT_DIR_RECORD_CONFIG, DEFAULT_DIR_RECORD_OUTPUT, + DEFAULT_DIR_LOGS, DEFAULT_DIR_LAST }; diff --git a/deps/stb/stb_truetype.h b/deps/stb/stb_truetype.h index 7c67a1fc28..5798c45658 100644 --- a/deps/stb/stb_truetype.h +++ b/deps/stb/stb_truetype.h @@ -1876,6 +1876,7 @@ static void stbtt__handle_clipped_edge(float *scanline, int x, stbtt__active_edg y1 = e->ey; } +#if 0 if (x0 == x) assert(x1 <= x+1); else if (x0 == x+1) @@ -1886,13 +1887,16 @@ static void stbtt__handle_clipped_edge(float *scanline, int x, stbtt__active_edg assert(x1 >= x+1); else assert(x1 >= x && x1 <= x+1); +#endif if (x0 <= x && x1 <= x) scanline[x] += e->direction * (y1-y0); else if (x0 >= x+1 && x1 >= x+1) ; else { +#if 0 assert(x0 >= x && x0 <= x+1 && x1 >= x && x1 <= x+1); +#endif scanline[x] += e->direction * (y1-y0) * (1-((x0-x)+(x1-x))/2); /* coverage = 1 - average x position */ } } diff --git a/dirs.c b/dirs.c index aa253ceb8e..ee2c980861 100644 --- a/dirs.c +++ b/dirs.c @@ -314,6 +314,8 @@ void dir_check_defaults(void) */ #ifdef ORBIS if (filestream_exists("host0:app/custom.ini")) +#elif defined(ANDROID) + if (filestream_exists("host0:app/custom.ini")) #else if (filestream_exists("custom.ini")) #endif diff --git a/discord/discord.c b/discord/discord.c index af36ee22b9..4115b86291 100644 --- a/discord/discord.c +++ b/discord/discord.c @@ -345,15 +345,19 @@ void discord_update(enum discord_presence presence) { const char *system_id = core_info->system_id ? core_info->system_id : "core"; - char *label = NULL; + const char *label = NULL; + const struct playlist_entry *entry = NULL; playlist_t *current_playlist = playlist_get_cached(); if (current_playlist) + { playlist_get_index_by_path( - current_playlist, path_get(RARCH_PATH_CONTENT), NULL, &label, NULL, NULL, NULL, NULL); + current_playlist, path_get(RARCH_PATH_CONTENT), &entry); + label = entry->label; + } if (!label) - label = (char *)path_basename(path_get(RARCH_PATH_BASENAME)); + label = path_basename(path_get(RARCH_PATH_BASENAME)); #if 0 RARCH_LOG("[discord] current core: %s\n", system_id); RARCH_LOG("[discord] current content: %s\n", label); diff --git a/dist-scripts/dist-cores.sh b/dist-scripts/dist-cores.sh index c2fd89ba4c..8f2b3365f5 100755 --- a/dist-scripts/dist-cores.sh +++ b/dist-scripts/dist-cores.sh @@ -231,6 +231,9 @@ for f in `ls -v *_${platform}.${EXT}`; do make -C ../ -f Makefile.${platform} $OPTS LIBRETRO=$name $whole_archive $big_stack -j3 || exit 1 elif [ $PLATFORM = "libnx" ]; then make -C ../ -f Makefile.${platform} $OPTS APP_TITLE="$name" LIBRETRO=$name $whole_archive $big_stack -j3 || exit 1 + elif [ $PLATFORM = "ps2" ]; then + # TODO PS2 should be able to compile in parallel + make -C ../ -f Makefile.${platform} $OPTS $whole_archive $big_stack || exit 1 else make -C ../ -f Makefile.${platform} $OPTS $whole_archive $big_stack -j3 || exit 1 fi diff --git a/dynamic.c b/dynamic.c index 3b0f4ee49b..e10b1ea261 100644 --- a/dynamic.c +++ b/dynamic.c @@ -1395,7 +1395,7 @@ bool rarch_environment_cb(unsigned cmd, void *data) { unsigned retro_id; const struct retro_input_descriptor *desc = NULL; - memset(&system->input_desc_btn, 0, + memset((void*)&system->input_desc_btn, 0, sizeof(system->input_desc_btn)); desc = (const struct retro_input_descriptor*)data; diff --git a/file_path_special.h b/file_path_special.h index 8b7cc3e3ef..481528dd47 100644 --- a/file_path_special.h +++ b/file_path_special.h @@ -94,7 +94,9 @@ enum file_path_enum FILE_PATH_XM_EXTENSION, FILE_PATH_CONFIG_EXTENSION, FILE_PATH_CORE_INFO_EXTENSION, - FILE_PATH_RUNTIME_EXTENSION + FILE_PATH_RUNTIME_EXTENSION, + FILE_PATH_DEFAULT_EVENT_LOG, + FILE_PATH_EVENT_LOG_EXTENSION }; enum application_special_type diff --git a/file_path_str.c b/file_path_str.c index 46aad7605f..43515babc9 100644 --- a/file_path_str.c +++ b/file_path_str.c @@ -227,6 +227,12 @@ const char *file_path_str(enum file_path_enum enum_idx) case FILE_PATH_RUNTIME_EXTENSION: str = ".lrtl"; break; + case FILE_PATH_DEFAULT_EVENT_LOG: + str = "retroarch.log"; + break; + case FILE_PATH_EVENT_LOG_EXTENSION: + str = ".log"; + break; case FILE_PATH_UNKNOWN: default: break; diff --git a/frontend/drivers/platform_ctr.c b/frontend/drivers/platform_ctr.c index 6db1865dbb..6f6f3236a9 100644 --- a/frontend/drivers/platform_ctr.c +++ b/frontend/drivers/platform_ctr.c @@ -93,14 +93,6 @@ static void frontend_ctr_get_environment_settings(int* argc, char* argv[], { (void)args; -#ifndef IS_SALAMANDER -#if defined(HAVE_LOGGER) - logger_init(); -#elif defined(HAVE_FILE_LOGGER) - retro_main_log_file_init("sdmc:/retroarch/retroarch-log.txt"); -#endif -#endif - fill_pathname_basedir(g_defaults.dirs[DEFAULT_DIR_PORT], elf_path_cst, sizeof(g_defaults.dirs[DEFAULT_DIR_PORT])); RARCH_LOG("port dir: [%s]\n", g_defaults.dirs[DEFAULT_DIR_PORT]); @@ -125,11 +117,13 @@ static void frontend_ctr_get_environment_settings(int* argc, char* argv[], fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_REMAP], g_defaults.dirs[DEFAULT_DIR_PORT], "config/remaps", sizeof(g_defaults.dirs[DEFAULT_DIR_REMAP])); fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_VIDEO_FILTER], g_defaults.dirs[DEFAULT_DIR_PORT], - "filters", sizeof(g_defaults.dirs[DEFAULT_DIR_REMAP])); + "filters", sizeof(g_defaults.dirs[DEFAULT_DIR_VIDEO_FILTER])); fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_DATABASE], g_defaults.dirs[DEFAULT_DIR_PORT], "database/rdb", sizeof(g_defaults.dirs[DEFAULT_DIR_DATABASE])); fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CURSOR], g_defaults.dirs[DEFAULT_DIR_PORT], "database/cursors", sizeof(g_defaults.dirs[DEFAULT_DIR_CURSOR])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_LOGS], g_defaults.dirs[DEFAULT_DIR_PORT], + "logs", sizeof(g_defaults.dirs[DEFAULT_DIR_LOGS])); fill_pathname_join(g_defaults.path.config, g_defaults.dirs[DEFAULT_DIR_PORT], file_path_str(FILE_PATH_MAIN_CONFIG), sizeof(g_defaults.path.config)); } @@ -139,17 +133,25 @@ static void frontend_ctr_deinit(void* data) Handle lcd_handle; u32 parallax_layer_reg_state; u8 not_2DS; + u8 device_model = 0xFF; extern PrintConsole* currentConsole; (void)data; #ifndef IS_SALAMANDER + /* Note: frontend_ctr_deinit() is normally called when + * forking to load new content. When this happens, the + * log messages generated in frontend_ctr_exec() *must* + * be printed to screen (provided bottom screen is not + * turned off...), since the 'first core launch' warning + * can prevent sdcard corruption. We therefore close any + * existing log file, enable verbose logging and revert + * to console output. (Normal logging will be resumed + * once retroarch.cfg has been re-read) */ + retro_main_log_file_deinit(); verbosity_enable(); - -#ifdef HAVE_FILE_LOGGER - command_event(CMD_EVENT_LOG_FILE_DEINIT, NULL); -#endif + retro_main_log_file_init(NULL, false); if ((gfxBottomFramebuffers[0] == (u8*)currentConsole->frameBuffer) && (ctr_fork_mode == FRONTEND_FORK_NONE)) @@ -166,8 +168,16 @@ static void frontend_ctr_deinit(void* data) svcCloseHandle(lcd_handle); } - parallax_layer_reg_state = (*(float*)0x1FF81080 == 0.0) ? 0x0 : 0x00010001; - GSPGPU_WriteHWRegs(0x202000, ¶llax_layer_reg_state, 4); + /* Only O3DS and O3DSXL support running in 'dual-framebuffer' + * mode with the parallax barrier disabled + * (i.e. these are the only platforms that can use + * CTR_VIDEO_MODE_2D_400x240 and CTR_VIDEO_MODE_2D_800x240) */ + CFGU_GetSystemModel(&device_model); /* (0 = O3DS, 1 = O3DSXL, 2 = N3DS, 3 = 2DS, 4 = N3DSXL, 5 = N2DSXL) */ + if ((device_model == 0) || (device_model == 1)) + { + parallax_layer_reg_state = (*(float*)0x1FF81080 == 0.0) ? 0x0 : 0x00010001; + GSPGPU_WriteHWRegs(0x202000, ¶llax_layer_reg_state, 4); + } mcuHwcExit(); ptmuExit(); @@ -203,9 +213,9 @@ static void frontend_ctr_exec(const char* path, bool should_load_game) if (should_load_game && !path_is_empty(RARCH_PATH_CONTENT)) { strcpy(game_path, path_get(RARCH_PATH_CONTENT)); - arg_data[args] = game_path; - arg_data[args + 1] = NULL; - args++; + arg_data[args] = game_path; + arg_data[args + 1] = NULL; + args++; RARCH_LOG("content path: [%s].\n", path_get(RARCH_PATH_CONTENT)); } #endif @@ -603,5 +613,6 @@ frontend_ctx_driver_t frontend_ctx_ctr = NULL, /* check_for_path_changes */ NULL, /* set_sustained_performance_mode */ NULL, /* get_cpu_model_name */ + NULL, /* get_user_language */ "ctr", }; diff --git a/frontend/drivers/platform_darwin.m b/frontend/drivers/platform_darwin.m index 5bf829b316..5fbe53ca9d 100644 --- a/frontend/drivers/platform_darwin.m +++ b/frontend/drivers/platform_darwin.m @@ -53,6 +53,7 @@ #include #include #include +#include #ifdef HAVE_MENU #include "../../menu/menu_driver.h" @@ -400,6 +401,7 @@ static void frontend_darwin_get_environment_settings(int *argc, char *argv[], fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_SAVESTATE], home_dir_buf, "states", sizeof(g_defaults.dirs[DEFAULT_DIR_SAVESTATE])); fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_RECORD_CONFIG], home_dir_buf, "records_config", sizeof(g_defaults.dirs[DEFAULT_DIR_RECORD_CONFIG])); fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_RECORD_OUTPUT], home_dir_buf, "records", sizeof(g_defaults.dirs[DEFAULT_DIR_RECORD_OUTPUT])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_LOGS], home_dir_buf, "logs", sizeof(g_defaults.dirs[DEFAULT_DIR_LOGS])); #if defined(IOS) fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_PLAYLIST], home_dir_buf, "playlists", sizeof(g_defaults.dirs[DEFAULT_DIR_PLAYLIST])); #endif @@ -771,10 +773,11 @@ frontend_ctx_driver_t frontend_ctx_darwin = { NULL, /* watch_path_for_changes */ NULL, /* check_for_path_changes */ NULL, /* set_sustained_performance_mode */ - #if (defined(OSX) && !(defined(__ppc__) || defined(__ppc64__))) +#if (defined(OSX) && !(defined(__ppc__) || defined(__ppc64__))) frontend_darwin_get_cpu_model_name, - #else +#else NULL, - #endif +#endif + NULL, /* get_user_language */ "darwin", }; diff --git a/frontend/drivers/platform_dos.c b/frontend/drivers/platform_dos.c index daac64064f..dfce99e2d1 100644 --- a/frontend/drivers/platform_dos.c +++ b/frontend/drivers/platform_dos.c @@ -72,5 +72,6 @@ frontend_ctx_driver_t frontend_ctx_dos = { NULL, /* check_for_path_changes */ NULL, /* set_sustained_performance_mode */ NULL, /* get_cpu_model_name */ + NULL, /* get_user_language */ "dos", }; diff --git a/frontend/drivers/platform_emscripten.c b/frontend/drivers/platform_emscripten.c index 4aaf6a7d13..8cfcce53dd 100644 --- a/frontend/drivers/platform_emscripten.c +++ b/frontend/drivers/platform_emscripten.c @@ -198,6 +198,8 @@ static void frontend_emscripten_get_env(int *argc, char *argv[], "system", sizeof(g_defaults.dirs[DEFAULT_DIR_SYSTEM])); fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_THUMBNAILS], user_path, "thumbnails", sizeof(g_defaults.dirs[DEFAULT_DIR_THUMBNAILS])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_LOGS], user_path, + "logs", sizeof(g_defaults.dirs[DEFAULT_DIR_LOGS])); /* cache dir */ fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CACHE], "/tmp/", @@ -265,5 +267,6 @@ frontend_ctx_driver_t frontend_ctx_emscripten = { NULL, /* check_for_path_changes */ NULL, /* set_sustained_performance_mode */ NULL, /* get_cpu_model_name */ + NULL, /* get_user_language */ "emscripten" }; diff --git a/frontend/drivers/platform_gx.c b/frontend/drivers/platform_gx.c index 47e983cf6d..0e47dd0d5d 100644 --- a/frontend/drivers/platform_gx.c +++ b/frontend/drivers/platform_gx.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -65,17 +66,6 @@ extern void system_exec_wii(const char *path, bool should_load_game); static enum frontend_fork gx_fork_mode = FRONTEND_FORK_NONE; #endif -#ifndef IS_SALAMANDER -#include "../../paths.h" - -enum -{ - GX_DEVICE_SD = 0, - GX_DEVICE_USB, - GX_DEVICE_END -}; - -#if defined(HAVE_LOGGER) || defined(HAVE_FILE_LOGGER) static devoptab_t dotab_stdout = { "stdout", /* device name */ 0, /* size of file structure */ @@ -101,7 +91,16 @@ static devoptab_t dotab_stdout = { NULL, /* device fsync_r */ NULL, /* deviceData; */ }; -#endif + +#ifndef IS_SALAMANDER +#include "../../paths.h" + +enum +{ + GX_DEVICE_SD = 0, + GX_DEVICE_USB, + GX_DEVICE_END +}; #ifdef HW_RVL static struct @@ -151,22 +150,6 @@ static void gx_devthread(void *a) } #endif -#ifdef HAVE_LOGGER -static int gx_logger_net(struct _reent *r, int fd, const char *ptr, size_t len) -{ -#ifdef HAVE_LOGGER - static char temp[4000]; - size_t l = (len >= 4000) ? 3999 : len - 1; - memcpy(temp, ptr, l); - temp[l] = 0; - logger_send("%s", temp); -#elif defined(HAVE_FILE_LOGGER) - fwrite(ptr, 1, len, retro_main_log_file()); -#endif - return len; -} -#endif - #endif #ifdef IS_SALAMANDER @@ -180,11 +163,6 @@ static void frontend_gx_get_environment_settings( char *last_slash = NULL; char *device_end = NULL; #ifndef IS_SALAMANDER -#if defined(HAVE_LOGGER) - logger_init(); -#elif defined(HAVE_FILE_LOGGER) - retro_main_log_file_init("/retroarch-log.txt"); -#endif /* This situation can happen on some loaders so we really need some fake args or else retroarch will just crash on parsing NULL pointers */ @@ -253,6 +231,8 @@ static void frontend_gx_get_environment_settings( "savefiles", sizeof(g_defaults.dirs[DEFAULT_DIR_SAVESTATE])); fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_PLAYLIST], g_defaults.dirs[DEFAULT_DIR_PORT], "playlists", sizeof(g_defaults.dirs[DEFAULT_DIR_PLAYLIST])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_LOGS], g_defaults.dirs[DEFAULT_DIR_PORT], + "logs", sizeof(g_defaults.dirs[DEFAULT_DIR_LOGS])); #ifdef IS_SALAMANDER if (*argc > 2 && argv[1] != NULL && argv[2] != NULL) @@ -326,15 +306,8 @@ static void frontend_gx_init(void *data) fatInitDefault(); -#ifdef HAVE_LOGGER devoptab_list[STD_OUT] = &dotab_stdout; devoptab_list[STD_ERR] = &dotab_stdout; - dotab_stdout.write_r = gx_logger_net; -#elif defined(HAVE_FILE_LOGGER) && !defined(IS_SALAMANDER) - devoptab_list[STD_OUT] = &dotab_stdout; - devoptab_list[STD_ERR] = &dotab_stdout; - dotab_stdout.write_r = gx_logger_file; -#endif #if defined(HW_RVL) && !defined(IS_SALAMANDER) gx_devices[GX_DEVICE_SD].interface = &__io_wiisd; @@ -575,5 +548,6 @@ frontend_ctx_driver_t frontend_ctx_gx = { NULL, /* check_for_path_changes */ NULL, /* set_sustained_performance_mode */ NULL, /* get_cpu_model_name */ + NULL, /* get_user_language */ "gx", }; diff --git a/frontend/drivers/platform_null.c b/frontend/drivers/platform_null.c index 7d4ec37558..1954dd0a34 100644 --- a/frontend/drivers/platform_null.c +++ b/frontend/drivers/platform_null.c @@ -48,5 +48,6 @@ frontend_ctx_driver_t frontend_ctx_null = { NULL, /* check_for_path_changes */ NULL, /* set_sustained_performance_mode */ NULL, /* get_cpu_model_name */ + NULL, /* get_user_language */ "null", }; diff --git a/frontend/drivers/platform_orbis.c b/frontend/drivers/platform_orbis.c index b46d11f4e9..cb2e64fe8f 100644 --- a/frontend/drivers/platform_orbis.c +++ b/frontend/drivers/platform_orbis.c @@ -169,6 +169,8 @@ static void frontend_orbis_get_environment_settings(int *argc, char *argv[], "overlays", sizeof(g_defaults.dirs[DEFAULT_DIR_OVERLAY])); fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_THUMBNAILS], user_path, "thumbnails", sizeof(g_defaults.dirs[DEFAULT_DIR_THUMBNAILS])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_LOGS], user_path, + "logs", sizeof(g_defaults.dirs[DEFAULT_DIR_LOGS])); strlcpy(g_defaults.dirs[DEFAULT_DIR_CONTENT_HISTORY], user_path, sizeof(g_defaults.dirs[DEFAULT_DIR_CONTENT_HISTORY])); fill_pathname_join(g_defaults.path.config, user_path, @@ -367,5 +369,6 @@ frontend_ctx_driver_t frontend_ctx_orbis = { NULL, /* check_for_path_changes */ NULL, /* set_sustained_performance_mode */ NULL, /* get_cpu_model_name */ + NULL, /* get_user_language */ "orbis", }; diff --git a/frontend/drivers/platform_ps2.c b/frontend/drivers/platform_ps2.c index 08e449cdf1..09ac87c187 100644 --- a/frontend/drivers/platform_ps2.c +++ b/frontend/drivers/platform_ps2.c @@ -23,49 +23,16 @@ #include #include #include +#include +#include #include #include +#include +#include +#include #include - - -extern unsigned char poweroff_irx_start[]; -extern unsigned int poweroff_irx_size; - -extern unsigned char ps2dev9_irx_start[]; -extern unsigned int ps2dev9_irx_size; - -extern unsigned char ps2atad_irx_start[]; -extern unsigned int ps2atad_irx_size; - -extern unsigned char ps2hdd_irx_start[]; -extern unsigned int ps2hdd_irx_size; - -extern unsigned char ps2fs_irx_start[]; -extern unsigned int ps2fs_irx_size; - -extern unsigned char iomanX_irx_start[]; -extern unsigned int iomanX_irx_size; - -extern unsigned char fileXio_irx_start[]; -extern unsigned int fileXio_irx_size; - -extern unsigned char freesd_irx_start[]; -extern unsigned int freesd_irx_size; - -extern unsigned char audsrv_irx_start[]; -extern unsigned int audsrv_irx_size; - -extern unsigned char usbd_irx_start[]; -extern unsigned int usbd_irx_size; - -extern unsigned char usbhdfsd_irx_start[]; -extern unsigned int usbhdfsd_irx_size; - -extern unsigned char mcman_irx_start[]; -extern unsigned int mcman_irx_size; - -extern unsigned char mcserv_irx_start[]; -extern unsigned int mcserv_irx_size; +#include +#include char eboot_path[512]; char user_path[512]; @@ -110,6 +77,8 @@ static void create_path_names(void) "SCREENSHOTS", sizeof(g_defaults.dirs[DEFAULT_DIR_SCREENSHOT])); fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_SYSTEM], user_path, "SYSTEM", sizeof(g_defaults.dirs[DEFAULT_DIR_SYSTEM])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_LOGS], user_path, + "LOGS", sizeof(g_defaults.dirs[DEFAULT_DIR_LOGS])); /* cache dir */ fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CACHE], user_path, @@ -196,36 +165,59 @@ static void frontend_ps2_init(void *data) SifInitRpc(0); sbv_patch_enable_lmb(); - /* Controllers */ - SifLoadModule("rom0:SIO2MAN", 0, NULL); - SifLoadModule("rom0:PADMAN", 0, NULL); - /* I/O Files */ - SifExecModuleBuffer(iomanX_irx_start, iomanX_irx_size, 0, NULL, NULL); - SifExecModuleBuffer(fileXio_irx_start, fileXio_irx_size, 0, NULL, NULL); + SifExecModuleBuffer(&iomanX_irx, size_iomanX_irx, 0, NULL, NULL); + SifExecModuleBuffer(&fileXio_irx, size_fileXio_irx, 0, NULL, NULL); + SifExecModuleBuffer(&freesio2_irx, size_freesio2_irx, 0, NULL, NULL); /* Memory Card */ - SifExecModuleBuffer(mcman_irx_start, mcman_irx_size, 0, NULL, NULL); - SifExecModuleBuffer(mcserv_irx_start, mcserv_irx_size, 0, NULL, NULL); + SifExecModuleBuffer(&mcman_irx, size_mcman_irx, 0, NULL, NULL); + SifExecModuleBuffer(&mcserv_irx, size_mcserv_irx, 0, NULL, NULL); + + /* Controllers */ + SifExecModuleBuffer(&freemtap_irx, size_freemtap_irx, 0, NULL, NULL); + SifExecModuleBuffer(&freepad_irx, size_freepad_irx, 0, NULL, NULL); /* USB */ - SifExecModuleBuffer(usbd_irx_start, usbd_irx_size, 0, NULL, NULL); - SifExecModuleBuffer(usbhdfsd_irx_start, usbhdfsd_irx_size, 0, NULL, NULL); + SifExecModuleBuffer(&usbd_irx, size_usbd_irx, 0, NULL, NULL); + SifExecModuleBuffer(&usbhdfsd_irx, size_usbhdfsd_irx, 0, NULL, NULL); /* Audio */ - SifExecModuleBuffer(freesd_irx_start, freesd_irx_size, 0, NULL, NULL); - SifExecModuleBuffer(audsrv_irx_start, audsrv_irx_size, 0, NULL, NULL); + SifExecModuleBuffer(&freesd_irx, size_freesd_irx, 0, NULL, NULL); + SifExecModuleBuffer(&audsrv_irx, size_audsrv_irx, 0, NULL, NULL); + + /* CDVD */ + SifExecModuleBuffer(&cdvd_irx, size_cdvd_irx, 0, NULL, NULL); + + if (mcInit(MC_TYPE_XMC)) { + RARCH_ERR("mcInit library not initalizated\n"); + } /* Initializes audsrv library */ if (audsrv_init()) { RARCH_ERR("audsrv library not initalizated\n"); } - /* Initializes pad library + /* Initializes pad libraries Must be init with 0 as parameter*/ + if (mtapInit() != 1) { + RARCH_ERR("mtapInit library not initalizated\n"); + } if (padInit(0) != 1) { RARCH_ERR("padInit library not initalizated\n"); } + if (mtapPortOpen(0) != 1) { + RARCH_ERR("mtapPortOpen library not initalizated\n"); + } + + /* Initializes CDVD library */ + /* SCECdINoD init without check for a disc. Reduces risk of a lockup if the drive is in a erroneous state. */ + sceCdInit(SCECdINoD); + if (CDVD_Init() != 1) { + RARCH_ERR("CDVD_Init library not initalizated\n"); + } + + _init_ps2_io(); /* Prepare device */ getcwd(cwd, sizeof(cwd)); @@ -245,6 +237,8 @@ static void frontend_ps2_deinit(void *data) verbosity_disable(); command_event(CMD_EVENT_LOG_FILE_DEINIT, NULL); #endif + _free_ps2_io(); + CDVD_Stop(); padEnd(); audsrv_quit(); fileXioExit(); @@ -359,6 +353,11 @@ static int frontend_ps2_parse_drive_list(void *data, bool load_content) msg_hash_to_str(MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR), enum_idx, FILE_TYPE_DIRECTORY, 0, 0); + menu_entries_append_enum(list, + rootDevicePath(BOOT_DEVICE_CDFS), + msg_hash_to_str(MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR), + enum_idx, + FILE_TYPE_DIRECTORY, 0, 0); menu_entries_append_enum(list, rootDevicePath(BOOT_DEVICE_MASS), msg_hash_to_str(MENU_ENUM_LABEL_FILE_DETECT_CORE_LIST_PUSH_DIR), @@ -416,5 +415,6 @@ frontend_ctx_driver_t frontend_ctx_ps2 = { NULL, /* check_for_path_changes */ NULL, /* set_sustained_performance_mode */ NULL, /* get_cpu_model_name */ + NULL, /* get_user_language */ "null", }; diff --git a/frontend/drivers/platform_ps3.c b/frontend/drivers/platform_ps3.c index 656d1e604b..94299c5760 100644 --- a/frontend/drivers/platform_ps3.c +++ b/frontend/drivers/platform_ps3.c @@ -263,6 +263,9 @@ static void frontend_ps3_get_environment_settings(int *argc, char *argv[], fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_AUTOCONFIG], g_defaults.dirs[DEFAULT_DIR_CORE], "autoconfig", sizeof(g_defaults.dirs[DEFAULT_DIR_AUTOCONFIG])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_LOGS], + g_defaults.dirs[DEFAULT_DIR_CORE], + "logs", sizeof(g_defaults.dirs[DEFAULT_DIR_LOGS])); } #ifndef IS_SALAMANDER @@ -636,5 +639,6 @@ frontend_ctx_driver_t frontend_ctx_ps3 = { NULL, /* check_for_path_changes */ NULL, /* set_sustained_performance_mode */ NULL, /* get_cpu_model_name */ + NULL, /* get_user_language */ "ps3", }; diff --git a/frontend/drivers/platform_psp.c b/frontend/drivers/platform_psp.c index fa8e86e472..3832f7fcf3 100644 --- a/frontend/drivers/platform_psp.c +++ b/frontend/drivers/platform_psp.c @@ -147,6 +147,8 @@ static void frontend_psp_get_environment_settings(int *argc, char *argv[], "overlays", sizeof(g_defaults.dirs[DEFAULT_DIR_OVERLAY])); fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_THUMBNAILS], user_path, "thumbnails", sizeof(g_defaults.dirs[DEFAULT_DIR_THUMBNAILS])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_LOGS], user_path, + "logs", sizeof(g_defaults.dirs[DEFAULT_DIR_LOGS])); strlcpy(g_defaults.dirs[DEFAULT_DIR_CONTENT_HISTORY], user_path, sizeof(g_defaults.dirs[DEFAULT_DIR_CONTENT_HISTORY])); fill_pathname_join(g_defaults.path.config, user_path, @@ -177,6 +179,8 @@ static void frontend_psp_get_environment_settings(int *argc, char *argv[], "SCREENSHOTS", sizeof(g_defaults.dirs[DEFAULT_DIR_SCREENSHOT])); fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_SYSTEM], user_path, "SYSTEM", sizeof(g_defaults.dirs[DEFAULT_DIR_SYSTEM])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_LOGS], user_path, + "LOGS", sizeof(g_defaults.dirs[DEFAULT_DIR_LOGS])); /* cache dir */ fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CACHE], user_path, @@ -530,6 +534,7 @@ frontend_ctx_driver_t frontend_ctx_psp = { NULL, /* check_for_path_changes */ NULL, /* set_sustained_performance_mode */ NULL, /* get_cpu_model_name */ + NULL, /* get_user_language */ #ifdef VITA "vita", #else diff --git a/frontend/drivers/platform_qnx.c b/frontend/drivers/platform_qnx.c index 168a7462ca..30cb376523 100644 --- a/frontend/drivers/platform_qnx.c +++ b/frontend/drivers/platform_qnx.c @@ -130,6 +130,8 @@ static void frontend_qnx_get_environment_settings(int *argc, char *argv[], "thumbnails", sizeof(g_defaults.dirs[DEFAULT_DIR_THUMBNAIL])); fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_WALLPAPERS], user_path, "wallpapers", sizeof(g_defaults.dirs[DEFAULT_DIR_WALLPAPERS])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_LOGS], user_path, + "logs", sizeof(g_defaults.dirs[DEFAULT_DIR_LOGS])); /* tmp */ strlcpy(g_defaults.dirs[DEFAULT_DIR_CACHE], @@ -206,5 +208,6 @@ frontend_ctx_driver_t frontend_ctx_qnx = { NULL, /* check_for_path_changes */ NULL, /* set_sustained_performance_mode */ NULL, /* get_cpu_model_name */ + NULL, /* get_user_language */ "qnx", }; diff --git a/frontend/drivers/platform_switch.c b/frontend/drivers/platform_switch.c index d3927eff84..8ee91405a1 100644 --- a/frontend/drivers/platform_switch.c +++ b/frontend/drivers/platform_switch.c @@ -223,6 +223,9 @@ static void frontend_switch_get_environment_settings(int *argc, char *argv[], vo fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_THUMBNAILS], g_defaults.dirs[DEFAULT_DIR_PORT], "thumbnails", sizeof(g_defaults.dirs[DEFAULT_DIR_THUMBNAILS])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_LOGS], g_defaults.dirs[DEFAULT_DIR_PORT], + "logs", sizeof(g_defaults.dirs[DEFAULT_DIR_LOGS])); + int i = 0; for (i; i < DEFAULT_DIR_LAST; i++) { @@ -942,5 +945,6 @@ frontend_ctx_driver_t frontend_ctx_switch = NULL, /* check_for_path_changes */ NULL, /* set_sustained_performance_mode */ NULL, /* get_cpu_model_name */ + NULL, /* get_user_language */ "switch", }; diff --git a/frontend/drivers/platform_unix.c b/frontend/drivers/platform_unix.c index 2f9e41e6b2..b08d01c6e7 100644 --- a/frontend/drivers/platform_unix.c +++ b/frontend/drivers/platform_unix.c @@ -1660,6 +1660,10 @@ static void frontend_unix_get_env(int *argc, sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS])); } + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_LOGS], + internal_storage_app_path, "logs", + sizeof(g_defaults.dirs[DEFAULT_DIR_LOGS])); + break; /* only the internal app dir is writable, this should never happen*/ @@ -1722,6 +1726,10 @@ static void frontend_unix_get_env(int *argc, sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS])); } + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_LOGS], + app_dir, "logs", + sizeof(g_defaults.dirs[DEFAULT_DIR_LOGS])); + break; /* sdcard is writable, this should be the case most of the time*/ case INTERNAL_STORAGE_WRITABLE: @@ -1742,6 +1750,10 @@ static void frontend_unix_get_env(int *argc, internal_storage_path, "RetroArch/downloads", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_LOGS], + internal_storage_path, "RetroArch/logs", + sizeof(g_defaults.dirs[DEFAULT_DIR_LOGS])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_MENU_CONFIG], internal_storage_path, "RetroArch/config", sizeof(g_defaults.dirs[DEFAULT_DIR_MENU_CONFIG])); @@ -1908,6 +1920,8 @@ static void frontend_unix_get_env(int *argc, "screenshots", sizeof(g_defaults.dirs[DEFAULT_DIR_SCREENSHOT])); fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_THUMBNAILS], base_path, "thumbnails", sizeof(g_defaults.dirs[DEFAULT_DIR_THUMBNAILS])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_LOGS], base_path, + "logs", sizeof(g_defaults.dirs[DEFAULT_DIR_LOGS])); #endif for (i = 0; i < DEFAULT_DIR_LAST; i++) @@ -2038,6 +2052,8 @@ static void frontend_unix_init(void *data) "setScreenOrientation", "(I)V"); GET_METHOD_ID(env, android_app->doVibrate, class, "doVibrate", "(IIII)V"); + GET_METHOD_ID(env, android_app->getUserLanguageString, class, + "getUserLanguageString", "()Ljava/lang/String;"); CALL_OBJ_METHOD(env, obj, android_app->activity->clazz, android_app->getIntent); @@ -2480,6 +2496,37 @@ static const char* frontend_unix_get_cpu_model_name(void) #endif } +enum retro_language frontend_unix_get_user_language(void) +{ + enum retro_language lang = RETRO_LANGUAGE_ENGLISH; +#ifdef HAVE_LANGEXTRA +#ifdef ANDROID + jstring jstr = NULL; + JNIEnv *env = jni_thread_getenv(); + + if (!env || !g_android) + return lang; + + if (g_android->getUserLanguageString) + { + CALL_OBJ_METHOD(env, jstr, g_android->activity->clazz, g_android->getUserLanguageString); + + if (jstr) + { + const char *langStr = (*env)->GetStringUTFChars(env, jstr, 0); + + lang = rarch_get_language_from_iso(langStr); + + (*env)->ReleaseStringUTFChars(env, jstr, langStr); + } + } +#else + lang = rarch_get_language_from_iso(getenv("LANG")); +#endif +#endif + return lang; +} + frontend_ctx_driver_t frontend_ctx_unix = { frontend_unix_get_env, /* environment_get */ frontend_unix_init, /* init */ @@ -2525,6 +2572,7 @@ frontend_ctx_driver_t frontend_ctx_unix = { frontend_unix_check_for_path_changes, frontend_unix_set_sustained_performance_mode, frontend_unix_get_cpu_model_name, + frontend_unix_get_user_language, #ifdef ANDROID "android" #else diff --git a/frontend/drivers/platform_unix.h b/frontend/drivers/platform_unix.h index c244abfedb..0252e3993d 100644 --- a/frontend/drivers/platform_unix.h +++ b/frontend/drivers/platform_unix.h @@ -163,6 +163,7 @@ struct android_app jmethodID getBatteryLevel; jmethodID setSustainedPerformanceMode; jmethodID setScreenOrientation; + jmethodID getUserLanguageString; jmethodID doVibrate; }; diff --git a/frontend/drivers/platform_uwp.c b/frontend/drivers/platform_uwp.c index 7859f8ac5b..fecced3b6d 100644 --- a/frontend/drivers/platform_uwp.c +++ b/frontend/drivers/platform_uwp.c @@ -374,6 +374,8 @@ static void frontend_uwp_environment_get(int *argc, char *argv[], "~\\states", sizeof(g_defaults.dirs[DEFAULT_DIR_SAVESTATE])); fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SYSTEM], "~\\system", sizeof(g_defaults.dirs[DEFAULT_DIR_SYSTEM])); + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_LOGS], + "~\\logs", sizeof(g_defaults.dirs[DEFAULT_DIR_LOGS])); #ifdef HAVE_MENU #if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) @@ -445,5 +447,6 @@ frontend_ctx_driver_t frontend_ctx_uwp = { NULL, /* check_for_path_changes */ NULL, /* set_sustained_performance_mode */ NULL, /* get_cpu_model_name */ + NULL, /* get_user_language */ "uwp" }; diff --git a/frontend/drivers/platform_wiiu.c b/frontend/drivers/platform_wiiu.c index f3a6831019..cf4bc15edc 100644 --- a/frontend/drivers/platform_wiiu.c +++ b/frontend/drivers/platform_wiiu.c @@ -104,6 +104,8 @@ static void frontend_wiiu_get_environment_settings(int *argc, char *argv[], "database/rdb", sizeof(g_defaults.dirs[DEFAULT_DIR_DATABASE])); fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CURSOR], g_defaults.dirs[DEFAULT_DIR_PORT], "database/cursors", sizeof(g_defaults.dirs[DEFAULT_DIR_CURSOR])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_LOGS], g_defaults.dirs[DEFAULT_DIR_CORE], + "logs", sizeof(g_defaults.dirs[DEFAULT_DIR_LOGS])); fill_pathname_join(g_defaults.path.config, g_defaults.dirs[DEFAULT_DIR_PORT], file_path_str(FILE_PATH_MAIN_CONFIG), sizeof(g_defaults.path.config)); @@ -300,6 +302,7 @@ frontend_ctx_driver_t frontend_ctx_wiiu = NULL, /* check_for_path_changes */ NULL, /* set_sustained_performance_mode */ NULL, /* get_cpu_model_name */ + NULL, /* get_user_language */ "wiiu", NULL, /* get_video_driver */ }; diff --git a/frontend/drivers/platform_win32.c b/frontend/drivers/platform_win32.c index da5142956d..032d27a656 100644 --- a/frontend/drivers/platform_win32.c +++ b/frontend/drivers/platform_win32.c @@ -465,7 +465,8 @@ static void frontend_win32_environment_get(int *argc, char *argv[], ":\\states", sizeof(g_defaults.dirs[DEFAULT_DIR_SAVESTATE])); fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_SYSTEM], ":\\system", sizeof(g_defaults.dirs[DEFAULT_DIR_SYSTEM])); - + fill_pathname_expand_special(g_defaults.dirs[DEFAULT_DIR_LOGS], + ":\\logs", sizeof(g_defaults.dirs[DEFAULT_DIR_LOGS])); #ifdef HAVE_MENU #if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) snprintf(g_defaults.settings.menu, @@ -574,6 +575,61 @@ static const char* frontend_win32_get_cpu_model_name(void) #endif } +enum retro_language frontend_win32_get_user_language(void) +{ + enum retro_language lang = RETRO_LANGUAGE_ENGLISH; +#if defined(HAVE_LANGEXTRA) && !defined(_XBOX) +#if (defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0500) || !defined(_MSC_VER) + LANGID langid = GetUserDefaultUILanguage(); + unsigned i; + + struct lang_pair + { + unsigned short lang_ident; + enum retro_language lang; + }; + + /* https://docs.microsoft.com/en-us/windows/desktop/Intl/language-identifier-constants-and-strings */ + const struct lang_pair pairs[] = + { + {0x9, RETRO_LANGUAGE_ENGLISH}, + {0x11, RETRO_LANGUAGE_JAPANESE}, + {0xc, RETRO_LANGUAGE_FRENCH}, + {0xa, RETRO_LANGUAGE_SPANISH}, + {0x7, RETRO_LANGUAGE_GERMAN}, + {0x10, RETRO_LANGUAGE_ITALIAN}, + {0x13, RETRO_LANGUAGE_DUTCH}, + {0x416, RETRO_LANGUAGE_PORTUGUESE_BRAZIL}, + {0x816, RETRO_LANGUAGE_PORTUGUESE_PORTUGAL}, + {0x16, RETRO_LANGUAGE_PORTUGUESE_PORTUGAL}, + {0x19, RETRO_LANGUAGE_RUSSIAN}, + {0x12, RETRO_LANGUAGE_KOREAN}, + {0xC04, RETRO_LANGUAGE_CHINESE_TRADITIONAL}, /* HK/PRC */ + {0x1404, RETRO_LANGUAGE_CHINESE_TRADITIONAL}, /* MO */ + {0x1004, RETRO_LANGUAGE_CHINESE_SIMPLIFIED}, /* SG */ + {0x7c04, RETRO_LANGUAGE_CHINESE_TRADITIONAL}, /* neutral */ + {0x4, RETRO_LANGUAGE_CHINESE_SIMPLIFIED}, /* neutral */ + /* MS does not support Esperanto */ + /*{0x0, RETRO_LANGUAGE_ESPERANTO},*/ + {0x15, RETRO_LANGUAGE_POLISH}, + {0x2a, RETRO_LANGUAGE_VIETNAMESE}, + {0x1, RETRO_LANGUAGE_ARABIC}, + {0x8, RETRO_LANGUAGE_GREEK}, + }; + + for (i = 0; i < sizeof(pairs) / sizeof(pairs[0]); i++) + { + if ((langid & pairs[i].lang_ident) == pairs[i].lang_ident) + { + lang = pairs[i].lang; + break; + } + } +#endif +#endif + return lang; +} + frontend_ctx_driver_t frontend_ctx_win32 = { frontend_win32_environment_get, frontend_win32_init, @@ -602,5 +658,6 @@ frontend_ctx_driver_t frontend_ctx_win32 = { NULL, /* check_for_path_changes */ NULL, /* set_sustained_performance_mode */ frontend_win32_get_cpu_model_name, + frontend_win32_get_user_language, "win32" }; diff --git a/frontend/drivers/platform_xdk.c b/frontend/drivers/platform_xdk.c index 73b1e978eb..a638ebe1f5 100644 --- a/frontend/drivers/platform_xdk.c +++ b/frontend/drivers/platform_xdk.c @@ -132,6 +132,9 @@ static void frontend_xdk_get_environment_settings(int *argc, char *argv[], fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_PLAYLIST], g_defaults.dirs[DEFAULT_DIR_CORE], "playlists", sizeof(g_defaults.dirs[DEFAULT_DIR_PLAYLIST])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_LOGS], + g_defaults.dirs[DEFAULT_DIR_CORE], + "logs", sizeof(g_defaults.dirs[DEFAULT_DIR_LOGS])); #elif defined(_XBOX360) strlcpy(g_defaults.dirs[DEFAULT_DIR_CORE], "game:", @@ -152,6 +155,9 @@ static void frontend_xdk_get_environment_settings(int *argc, char *argv[], sizeof(g_defaults.dirs[DEFAULT_DIR_SRAM])); strlcpy(g_defaults.dirs[DEFAULT_DIR_SYSTEM], "game:\\system", sizeof(g_defaults.dirs[DEFAULT_DIR_SYSTEM])); + strlcpy(g_defaults.dirs[DEFAULT_DIR_LOGS], + "game:\\logs", + sizeof(g_defaults.dirs[DEFAULT_DIR_LOGS])); #endif fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CORE_INFO], g_defaults.dirs[DEFAULT_DIR_CORE], @@ -428,5 +434,6 @@ frontend_ctx_driver_t frontend_ctx_xdk = { NULL, /* check_for_path_changes */ NULL, /* set_sustained_performance_mode */ NULL, /* get_cpu_model_name */ + NULL, /* get_user_language */ "xdk", }; diff --git a/frontend/drivers/platform_xenon.c b/frontend/drivers/platform_xenon.c index 0e9988f0a4..654b76d92e 100644 --- a/frontend/drivers/platform_xenon.c +++ b/frontend/drivers/platform_xenon.c @@ -95,5 +95,6 @@ frontend_ctx_driver_t frontend_ctx_qnx = { NULL, /* check_for_path_changes */ NULL, /* set_sustained_performance_mode */ NULL, /* get_cpu_model_name */ + NULL, /* get_user_language */ "xenon", }; diff --git a/frontend/frontend_driver.c b/frontend/frontend_driver.c index cfb0ce8955..9c6c6e3ce6 100644 --- a/frontend/frontend_driver.c +++ b/frontend/frontend_driver.c @@ -18,6 +18,7 @@ #include #include +#include #if defined(_3DS) #include <3ds.h> @@ -464,4 +465,12 @@ const char* frontend_driver_get_cpu_model_name(void) return NULL; return frontend->get_cpu_model_name(); } + +enum retro_language frontend_driver_get_user_language(void) +{ + frontend_ctx_driver_t *frontend = frontend_get_ptr(); + if (!frontend || !frontend->get_user_language) + return RETRO_LANGUAGE_ENGLISH; + return frontend->get_user_language(); +} #endif diff --git a/frontend/frontend_driver.h b/frontend/frontend_driver.h index 76119f660e..55515b512a 100644 --- a/frontend/frontend_driver.h +++ b/frontend/frontend_driver.h @@ -24,6 +24,8 @@ #include #include +#include + RETRO_BEGIN_DECLS enum frontend_powerstate @@ -107,6 +109,7 @@ typedef struct frontend_ctx_driver bool (*check_for_path_changes)(path_change_data_t *change_data); void (*set_sustained_performance_mode)(bool on); const char* (*get_cpu_model_name)(void); + enum retro_language (*get_user_language)(void); const char *ident; @@ -214,6 +217,8 @@ void frontend_driver_set_sustained_performance_mode(bool on); const char* frontend_driver_get_cpu_model_name(void); +enum retro_language frontend_driver_get_user_language(void); + RETRO_END_DECLS #endif diff --git a/gfx/common/ctr_common.h b/gfx/common/ctr_common.h index ff8e2236b5..6f12e2bf0d 100644 --- a/gfx/common/ctr_common.h +++ b/gfx/common/ctr_common.h @@ -42,11 +42,12 @@ typedef struct typedef enum { - CTR_VIDEO_MODE_NORMAL, - CTR_VIDEO_MODE_800x240, - CTR_VIDEO_MODE_400x240, - CTR_VIDEO_MODE_3D -}ctr_video_mode_enum; + CTR_VIDEO_MODE_3D = 0, + CTR_VIDEO_MODE_2D, + CTR_VIDEO_MODE_2D_400x240, + CTR_VIDEO_MODE_2D_800x240, + CTR_VIDEO_MODE_LAST +} ctr_video_mode_enum; typedef struct ctr_video { @@ -95,8 +96,9 @@ typedef struct ctr_video unsigned rotation; bool keep_aspect; bool should_resize; - bool lcd_buttom_on; bool msg_rendering_enabled; + bool supports_parallax_disable; + bool enable_3d; void* empty_framebuffer; diff --git a/gfx/common/d3d8_common.h b/gfx/common/d3d8_common.h index 556086440b..84125e2d21 100644 --- a/gfx/common/d3d8_common.h +++ b/gfx/common/d3d8_common.h @@ -515,6 +515,8 @@ static INLINE INT32 d3d8_get_xrgb8888_format(void) #endif } +void d3d8_set_mvp(void *data, const void *userdata); + RETRO_END_DECLS #endif diff --git a/gfx/common/d3d9_common.h b/gfx/common/d3d9_common.h index 992447dcf6..56128981a0 100644 --- a/gfx/common/d3d9_common.h +++ b/gfx/common/d3d9_common.h @@ -812,6 +812,8 @@ static INLINE void d3d9_convert_geometry( } } +void d3d9_set_mvp(void *data, const void *userdata); + RETRO_END_DECLS #endif diff --git a/gfx/common/gl1_common.h b/gfx/common/gl1_common.h index 7c8f4ffaca..c855dca3cb 100644 --- a/gfx/common/gl1_common.h +++ b/gfx/common/gl1_common.h @@ -75,6 +75,14 @@ typedef struct gl1 bool smooth; bool menu_smooth; void *readback_buffer_screenshot; + bool overlay_enable; + bool overlay_full_screen; + GLuint *overlay_tex; + unsigned overlays; + float *overlay_vertex_coord; + float *overlay_tex_coord; + float *overlay_color_coord; + bool fullscreen; } gl1_t; static INLINE void gl1_bind_texture(GLuint id, GLint wrap_mode, GLint mag_filter, diff --git a/gfx/common/metal/Context.m b/gfx/common/metal/Context.m index a16d486860..1cef6ec0a7 100644 --- a/gfx/common/metal/Context.m +++ b/gfx/common/metal/Context.m @@ -744,12 +744,14 @@ static const NSUInteger kConstantAlignment = 4; - (bool)allocRange:(BufferRange *)range length:(NSUInteger)length { - bzero(range, sizeof(*range)); + MTLResourceOptions opts; + + memset(range, 0, sizeof(*range)); #if TARGET_OS_OSX - MTLResourceOptions opts = MTLResourceStorageModeManaged; + opts = MTLResourceStorageModeManaged; #else - MTLResourceOptions opts = MTLResourceStorageModeShared; + opts = MTLResourceStorageModeShared; #endif if (!_head) diff --git a/gfx/common/vulkan_common.c b/gfx/common/vulkan_common.c index 95faa57fa8..bf0cdcab1a 100644 --- a/gfx/common/vulkan_common.c +++ b/gfx/common/vulkan_common.c @@ -1,4 +1,4 @@ -/* RetroArch - A frontend for libretro. +/* RetroArch - A frontend for libretro. * Copyright (C) 2016-2017 - Hans-Kristian Arntzen * * RetroArch is free software: you can redistribute it and/or modify it under the terms @@ -618,7 +618,7 @@ struct vk_texture vulkan_create_texture(vk_t *vk, RARCH_LOG("[Vulkan]: GPU supports linear images as textures, but not DEVICE_LOCAL. Falling back to copy path.\n"); type = VULKAN_TEXTURE_STAGING; vkDestroyImage(device, tex.image, NULL); - tex.image = NULL; + tex.image = (VkImage)NULL; info.initialLayout = VK_IMAGE_LAYOUT_GENERAL; buffer_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT; @@ -1580,7 +1580,7 @@ static bool vulkan_find_device_extensions(VkPhysicalDevice gpu, goto end; } - memcpy(enabled, exts, num_exts * sizeof(*exts)); + memcpy((void*)enabled, exts, num_exts * sizeof(*exts)); *enabled_count = num_exts; for (i = 0; i < num_optional_exts; i++) diff --git a/gfx/common/x11_common.c b/gfx/common/x11_common.c index cba21c6ded..f0e7d28249 100644 --- a/gfx/common/x11_common.c +++ b/gfx/common/x11_common.c @@ -572,17 +572,17 @@ bool x11_alive(void *data) case KeyRelease: /* When you receive a key release and the next event is a key press - of the same key combination, then it's auto-repeat and the + of the same key combination, then it's auto-repeat and the key wasn't actually released. */ if(XEventsQueued(g_x11_dpy, QueuedAfterReading)) { XEvent next_event; XPeekEvent(g_x11_dpy, &next_event); - if (next_event.type == KeyPress && + if (next_event.type == KeyPress && next_event.xkey.time == event.xkey.time && next_event.xkey.keycode == event.xkey.keycode) { - break; // Key wasn't actually released + break; /* Key wasn't actually released */ } } case KeyPress: diff --git a/gfx/display_servers/dispserv_x11.c b/gfx/display_servers/dispserv_x11.c index 0c1abd3a38..8727ac5a94 100644 --- a/gfx/display_servers/dispserv_x11.c +++ b/gfx/display_servers/dispserv_x11.c @@ -57,6 +57,7 @@ typedef struct bool decorations; } dispserv_x11_t; +#ifdef HAVE_XRANDR static Display* x11_display_server_open_display(void) { Display *dpy = g_x11_dpy; @@ -72,7 +73,9 @@ static Display* x11_display_server_open_display(void) return dpy; } +#endif +#ifdef HAVE_XRANDR static void x11_display_server_close_display(Display *dpy) { if (!dpy || x11_display_server_using_global_dpy || dpy == g_x11_dpy) @@ -80,6 +83,7 @@ static void x11_display_server_close_display(Display *dpy) XCloseDisplay(dpy); } +#endif static void* x11_display_server_init(void) { diff --git a/gfx/drivers/caca_gfx.c b/gfx/drivers/caca_gfx.c index 05f5d17205..a7028cac17 100644 --- a/gfx/drivers/caca_gfx.c +++ b/gfx/drivers/caca_gfx.c @@ -306,8 +306,6 @@ static void caca_set_osd_msg(void *data, static const video_poke_interface_t caca_poke_interface = { NULL, /* get_flags */ - NULL, /* set_coords */ - NULL, /* set_mvp */ NULL, NULL, NULL, diff --git a/gfx/drivers/ctr_gfx.c b/gfx/drivers/ctr_gfx.c index ee59e53baf..70cf1b935f 100644 --- a/gfx/drivers/ctr_gfx.c +++ b/gfx/drivers/ctr_gfx.c @@ -53,46 +53,59 @@ * when reinitialising... */ static bool ctr_bottom_screen_enabled = true; -static INLINE void ctr_check_3D_slider(ctr_video_t* ctr) +static INLINE void ctr_check_3D_slider(ctr_video_t* ctr, ctr_video_mode_enum video_mode) { float slider_val = *(float*)0x1FF81080; - ctr_video_mode_enum old_mode = ctr->video_mode; - if (slider_val == 0.0) - ctr->video_mode = CTR_VIDEO_MODE_NORMAL; - else if (slider_val < 0.2) - ctr->video_mode = CTR_VIDEO_MODE_800x240; - else if (slider_val < 0.5) - ctr->video_mode = CTR_VIDEO_MODE_400x240; - else - ctr->video_mode = CTR_VIDEO_MODE_3D; - - if (ctr->video_mode) + if (slider_val == 0.0f) { - switch (ctr->video_mode) - { - case CTR_VIDEO_MODE_800x240: - case CTR_VIDEO_MODE_400x240: - ctr_set_parallax_layer(false); - break; - case CTR_VIDEO_MODE_3D: - { - s16 offset = (slider_val - 0.6) * 10.0; - ctr->frame_coords[1] = ctr->frame_coords[0]; - ctr->frame_coords[2] = ctr->frame_coords[0]; + ctr->video_mode = CTR_VIDEO_MODE_2D; + ctr->enable_3d = false; + return; + } - ctr->frame_coords[1].x0 -= offset; - ctr->frame_coords[1].x1 -= offset; - ctr->frame_coords[2].x0 += offset; - ctr->frame_coords[2].x1 += offset; + switch (video_mode) + { + case CTR_VIDEO_MODE_3D: + { + s16 offset = slider_val * 10.0f; - GSPGPU_FlushDataCache(ctr->frame_coords, 3 * sizeof(ctr_vertex_t)); + ctr->video_mode = CTR_VIDEO_MODE_3D; + + ctr->frame_coords[1] = ctr->frame_coords[0]; + ctr->frame_coords[2] = ctr->frame_coords[0]; + + ctr->frame_coords[1].x0 -= offset; + ctr->frame_coords[1].x1 -= offset; + ctr->frame_coords[2].x0 += offset; + ctr->frame_coords[2].x1 += offset; + + GSPGPU_FlushDataCache(ctr->frame_coords, 3 * sizeof(ctr_vertex_t)); + + if (ctr->supports_parallax_disable) ctr_set_parallax_layer(true); - break; - } - default: - break; - } + ctr->enable_3d = true; + } + break; + case CTR_VIDEO_MODE_2D_400x240: + case CTR_VIDEO_MODE_2D_800x240: + if (ctr->supports_parallax_disable) + { + ctr->video_mode = video_mode; + ctr_set_parallax_layer(false); + ctr->enable_3d = true; + } + else + { + ctr->video_mode = CTR_VIDEO_MODE_2D; + ctr->enable_3d = false; + } + break; + case CTR_VIDEO_MODE_2D: + default: + ctr->video_mode = CTR_VIDEO_MODE_2D; + ctr->enable_3d = false; + break; } } @@ -128,13 +141,12 @@ static INLINE void ctr_set_screen_coords(ctr_video_t * ctr) } } -static void ctr_update_viewport(ctr_video_t* ctr, video_frame_info_t *video_info) +static void ctr_update_viewport(ctr_video_t* ctr, settings_t *settings, video_frame_info_t *video_info) { int x = 0; int y = 0; float width = ctr->vp.full_width; float height = ctr->vp.full_height; - settings_t *settings = config_get_ptr(); float desired_aspect = video_driver_get_aspect_ratio(); if(ctr->rotation & 0x1) @@ -248,7 +260,7 @@ static void ctr_lcd_aptHook(APT_HookType hook, void* param) ctr->p3d_event_pending = false; } - if((hook == APTHOOK_ONSUSPEND) && (ctr->video_mode == CTR_VIDEO_MODE_400x240)) + if((hook == APTHOOK_ONSUSPEND) && (ctr->video_mode == CTR_VIDEO_MODE_2D_400x240)) { memcpy(gfxTopRightFramebuffers[ctr->current_buffer_top], gfxTopLeftFramebuffers[ctr->current_buffer_top], @@ -256,7 +268,7 @@ static void ctr_lcd_aptHook(APT_HookType hook, void* param) GSPGPU_FlushDataCache(gfxTopRightFramebuffers[ctr->current_buffer_top], 400 * 240 * 3); } - if ((hook == APTHOOK_ONSUSPEND)) + if ((hook == APTHOOK_ONSUSPEND) && ctr->supports_parallax_disable) ctr_set_parallax_layer(*(float*)0x1FF81080 != 0.0); if((hook == APTHOOK_ONSUSPEND) || (hook == APTHOOK_ONRESTORE)) @@ -317,9 +329,10 @@ static void* ctr_init(const video_info_t* video, const input_driver_t** input, void** input_data) { float refresh_rate; - void* ctrinput = NULL; + u8 device_model = 0xFF; + void* ctrinput = NULL; settings_t *settings = config_get_ptr(); - ctr_video_t* ctr = (ctr_video_t*)linearAlloc(sizeof(ctr_video_t)); + ctr_video_t* ctr = (ctr_video_t*)linearAlloc(sizeof(ctr_video_t)); if (!ctr) return NULL; @@ -455,9 +468,15 @@ static void* ctr_init(const video_info_t* video, ctr->should_resize = true; ctr->smooth = video->smooth; ctr->vsync = video->vsync; - ctr->lcd_buttom_on = true; /* Unused */ ctr->current_buffer_top = 0; + /* Only O3DS and O3DSXL support running in 'dual-framebuffer' + * mode with the parallax barrier disabled + * (i.e. these are the only platforms that can use + * CTR_VIDEO_MODE_2D_400x240 and CTR_VIDEO_MODE_2D_800x240) */ + CFGU_GetSystemModel(&device_model); /* (0 = O3DS, 1 = O3DSXL, 2 = N3DS, 3 = 2DS, 4 = N3DSXL, 5 = N2DSXL) */ + ctr->supports_parallax_disable = (device_model == 0) || (device_model == 1); + ctr->empty_framebuffer = linearAlloc(320 * 240 * 2); memset(ctr->empty_framebuffer, 0, 320 * 240 * 2); @@ -500,6 +519,7 @@ static bool ctr_frame(void* data, const void* frame, extern u8* gfxSharedMemory; extern u8 gfxThreadID; uint32_t state_tmp = 0; + settings_t *settings = config_get_ptr(); ctr_video_t *ctr = (ctr_video_t*)data; static float fps = 0.0; static int total_frames = 0; @@ -507,7 +527,7 @@ static bool ctr_frame(void* data, const void* frame, extern bool select_pressed; - if (!width || !height) + if (!width || !height || !settings) { gspWaitForEvent(GSPGPU_EVENT_VBlank0, true); return true; @@ -542,7 +562,6 @@ static bool ctr_frame(void* data, const void* frame, gspWaitForEvent(GSPGPU_EVENT_PPF, false); ctr->ppf_event_pending = false; } - frames++; #ifndef HAVE_THREADS if(task_queue_find(&ctr_tasks_finder_data)) { @@ -560,72 +579,120 @@ static bool ctr_frame(void* data, const void* frame, } #endif if (ctr->vsync) - gspWaitForEvent(GSPGPU_EVENT_VBlank0, false); + { + /* If we are running at the display refresh rate, + * then all is well - just wait on the *current* VBlank0 + * event and carry on. + * + * If we are running at below the display refresh rate, + * then we have problems: frame updates will happen + * entirely out of sync with VBlank0 events. To elaborate, + * we'll wait for a VBlank0 here, but it will already have + * happened partway through the previous frame. So it's: + * 'oh good - let's render the current frame', but the next + * VBlank0 will occur in less time than it takes to draw the + * current frame, resulting in 'overlap' and screen tearing. + * + * This seems to be a consequence of using the GPU directly. + * Other 3DS homebrew typically uses the ctrulib function + * gfxSwapBuffers(), which ensures an immediate buffer + * swap every time, and no tearing. We can't do this: + * instead, we use a variant of the ctrulib function + * gfxSwapBuffersGpu(), which seems to send a notification, + * and the swap happens when it happens... + * + * I don't know how to fix this 'properly' (probably needs + * some low level rewriting, maybe switching to an implementation + * based on citro3d), but I can at least implement a hack/workaround + * that allows 50Hz content to be run without tearing. This involves + * the following: + * + * If content frame rate is more than 10% lower than the 3DS + * display refresh rate, don't wait on the *current* VBlank0 + * event (because it is 'tainted'), but instead wait on the + * *next* VBlank0 event (which will ensure we have enough time + * to write/flush the display buffers). + * + * This fixes screen tearing, but it has a significant impact on + * performance... + * */ + bool next_event = false; + struct retro_system_av_info *av_info = video_viewport_get_system_av_info(); + if (av_info) + next_event = av_info->timing.fps < video_info->refresh_rate * 0.9f; + gspWaitForEvent(GSPGPU_EVENT_VBlank0, next_event); + } ctr->vsync_event_pending = true; - currentTick = svcGetSystemTick(); - diff = currentTick - lastTick; - if(diff > CTR_CPU_TICKS_PER_SECOND) + /* Internal counters/statistics + * > This is only required if the bottom screen is enabled */ + if (ctr_bottom_screen_enabled) { - fps = (float)frames * ((float) CTR_CPU_TICKS_PER_SECOND / (float) diff); - lastTick = currentTick; - frames = 0; - } + frames++; + currentTick = svcGetSystemTick(); + diff = currentTick - lastTick; + if(diff > CTR_CPU_TICKS_PER_SECOND) + { + fps = (float)frames * ((float) CTR_CPU_TICKS_PER_SECOND / (float) diff); + lastTick = currentTick; + frames = 0; + } #ifdef CTR_INSPECT_MEMORY_USAGE - uint32_t ctr_get_stack_usage(void); - void ctr_linear_get_stats(void); - extern u32 __linear_heap_size; - extern u32 __heap_size; + uint32_t ctr_get_stack_usage(void); + void ctr_linear_get_stats(void); + extern u32 __linear_heap_size; + extern u32 __heap_size; - MemInfo mem_info; - PageInfo page_info; - u32 query_addr = 0x08000000; - printf(PRINTFPOS(0,0)); - while (query_addr < 0x40000000) - { - svcQueryMemory(&mem_info, &page_info, query_addr); - printf("0x%08X --> 0x%08X (0x%08X) \n", mem_info.base_addr, mem_info.base_addr + mem_info.size, mem_info.size); - query_addr = mem_info.base_addr + mem_info.size; - if(query_addr == 0x1F000000) - query_addr = 0x30000000; - } + MemInfo mem_info; + PageInfo page_info; + u32 query_addr = 0x08000000; + printf(PRINTFPOS(0,0)); + while (query_addr < 0x40000000) + { + svcQueryMemory(&mem_info, &page_info, query_addr); + printf("0x%08X --> 0x%08X (0x%08X) \n", mem_info.base_addr, mem_info.base_addr + mem_info.size, mem_info.size); + query_addr = mem_info.base_addr + mem_info.size; + if(query_addr == 0x1F000000) + query_addr = 0x30000000; + } #if 0 - static u32* dummy_pointer; - if(total_frames == 500) - dummy_pointer = malloc(0x2000000); - if(total_frames == 1000) - free(dummy_pointer); + static u32* dummy_pointer; + if(total_frames == 500) + dummy_pointer = malloc(0x2000000); + if(total_frames == 1000) + free(dummy_pointer); #endif - printf("========================================"); - printf("0x%08X 0x%08X 0x%08X\n", __heap_size, gpuCmdBufOffset, (__linear_heap_size - linearSpaceFree())); - printf("fps: %8.4f frames: %i (%X)\n", fps, total_frames++, (__linear_heap_size - linearSpaceFree())); - printf("========================================"); - u32 app_memory = *((u32*)0x1FF80040); - u64 mem_used; - svcGetSystemInfo(&mem_used, 0, 1); - printf("total mem : 0x%08X \n", app_memory); - printf("used: 0x%08X free: 0x%08X \n", (u32)mem_used, app_memory - (u32)mem_used); - static u32 stack_usage = 0; - extern u32 __stack_bottom; - if(!(total_frames & 0x3F)) - stack_usage = ctr_get_stack_usage(); - printf("stack total:0x%08X used: 0x%08X\n", 0x10000000 - __stack_bottom, stack_usage); + printf("========================================"); + printf("0x%08X 0x%08X 0x%08X\n", __heap_size, gpuCmdBufOffset, (__linear_heap_size - linearSpaceFree())); + printf("fps: %8.4f frames: %i (%X)\n", fps, total_frames++, (__linear_heap_size - linearSpaceFree())); + printf("========================================"); + u32 app_memory = *((u32*)0x1FF80040); + u64 mem_used; + svcGetSystemInfo(&mem_used, 0, 1); + printf("total mem : 0x%08X \n", app_memory); + printf("used: 0x%08X free: 0x%08X \n", (u32)mem_used, app_memory - (u32)mem_used); + static u32 stack_usage = 0; + extern u32 __stack_bottom; + if(!(total_frames & 0x3F)) + stack_usage = ctr_get_stack_usage(); + printf("stack total:0x%08X used: 0x%08X\n", 0x10000000 - __stack_bottom, stack_usage); - printf("========================================"); - ctr_linear_get_stats(); - printf("========================================"); + printf("========================================"); + ctr_linear_get_stats(); + printf("========================================"); #else - printf(PRINTFPOS(29,0)"fps: %8.4f frames: %i\r", fps, total_frames++); + printf(PRINTFPOS(29,0)"fps: %8.4f frames: %i\r", fps, total_frames++); #endif - fflush(stdout); + fflush(stdout); + } if (ctr->should_resize) - ctr_update_viewport(ctr, video_info); + ctr_update_viewport(ctr, settings, video_info); ctrGuSetMemoryFill(true, (u32*)ctr->drawbuffers.top.left, 0x00000000, (u32*)ctr->drawbuffers.top.left + 2 * CTR_TOP_FRAMEBUFFER_WIDTH * CTR_TOP_FRAMEBUFFER_HEIGHT, @@ -658,7 +725,7 @@ static bool ctr_frame(void* data, const void* frame, else { int i; - uint8_t *dst = (uint8_t*)ctr->texture_linear; + uint8_t *dst = (uint8_t*)ctr->texture_linear; const uint8_t *src = frame; for (i = 0; i < height; i++) @@ -689,7 +756,7 @@ static bool ctr_frame(void* data, const void* frame, GPU_TEXTURE_WRAP_S(GPU_CLAMP_TO_EDGE) | GPU_TEXTURE_WRAP_T(GPU_CLAMP_TO_EDGE), ctr->rgb32 ? GPU_RGBA8: GPU_RGB565); - ctr_check_3D_slider(ctr); + ctr_check_3D_slider(ctr, (ctr_video_mode_enum)settings->uints.video_3ds_display_mode); /* ARGB --> RGBA */ if (ctr->rgb32) @@ -720,7 +787,7 @@ static bool ctr_frame(void* data, const void* frame, GPU_SetViewport(NULL, VIRT_TO_PHYS(ctr->drawbuffers.top.left), 0, 0, CTR_TOP_FRAMEBUFFER_HEIGHT, - ctr->video_mode == CTR_VIDEO_MODE_800x240 ? CTR_TOP_FRAMEBUFFER_WIDTH * 2 : CTR_TOP_FRAMEBUFFER_WIDTH); + ctr->video_mode == CTR_VIDEO_MODE_2D_800x240 ? CTR_TOP_FRAMEBUFFER_WIDTH * 2 : CTR_TOP_FRAMEBUFFER_WIDTH); if (ctr->video_mode == CTR_VIDEO_MODE_3D) { @@ -769,7 +836,7 @@ static bool ctr_frame(void* data, const void* frame, GPU_SetViewport(NULL, VIRT_TO_PHYS(ctr->drawbuffers.top.left), 0, 0, CTR_TOP_FRAMEBUFFER_HEIGHT, - ctr->video_mode == CTR_VIDEO_MODE_800x240 ? CTR_TOP_FRAMEBUFFER_WIDTH * 2 : CTR_TOP_FRAMEBUFFER_WIDTH); + ctr->video_mode == CTR_VIDEO_MODE_2D_800x240 ? CTR_TOP_FRAMEBUFFER_WIDTH * 2 : CTR_TOP_FRAMEBUFFER_WIDTH); GPU_DrawArray(GPU_GEOMETRY_PRIM, 0, 1); if (ctr->video_mode == CTR_VIDEO_MODE_3D) @@ -813,16 +880,16 @@ static bool ctr_frame(void* data, const void* frame, ctrGuDisplayTransfer(true, ctr->drawbuffers.top.left, 240, - ctr->video_mode == CTR_VIDEO_MODE_800x240 ? 800 : 400, + ctr->video_mode == CTR_VIDEO_MODE_2D_800x240 ? 800 : 400, CTRGU_RGBA8, - gfxTopLeftFramebuffers[ctr->current_buffer_top], 240,CTRGU_RGB8, CTRGU_MULTISAMPLE_NONE); + gfxTopLeftFramebuffers[ctr->current_buffer_top], 240, CTRGU_RGB8, CTRGU_MULTISAMPLE_NONE); - if ((ctr->video_mode == CTR_VIDEO_MODE_400x240) || (ctr->video_mode == CTR_VIDEO_MODE_3D)) + if ((ctr->video_mode == CTR_VIDEO_MODE_2D_400x240) || (ctr->video_mode == CTR_VIDEO_MODE_3D)) ctrGuDisplayTransfer(true, ctr->drawbuffers.top.right, 240, 400, CTRGU_RGBA8, - gfxTopRightFramebuffers[ctr->current_buffer_top], 240,CTRGU_RGB8, CTRGU_MULTISAMPLE_NONE); + gfxTopRightFramebuffers[ctr->current_buffer_top], 240, CTRGU_RGB8, CTRGU_MULTISAMPLE_NONE); /* Swap buffers : */ @@ -831,7 +898,7 @@ static bool ctr_frame(void* data, const void* frame, topFramebufferInfo. framebuf0_vaddr = (u32*)gfxTopLeftFramebuffers[ctr->current_buffer_top]; - if(ctr->video_mode == CTR_VIDEO_MODE_800x240) + if(ctr->video_mode == CTR_VIDEO_MODE_2D_800x240) { topFramebufferInfo. framebuf1_vaddr = (u32*)(gfxTopLeftFramebuffers[ctr->current_buffer_top] + 240 * 3); @@ -840,13 +907,19 @@ static bool ctr_frame(void* data, const void* frame, } else { - topFramebufferInfo. - framebuf1_vaddr = (u32*)gfxTopRightFramebuffers[ctr->current_buffer_top]; + if (ctr->enable_3d) + topFramebufferInfo. + framebuf1_vaddr = (u32*)gfxTopRightFramebuffers[ctr->current_buffer_top]; + else + topFramebufferInfo. + framebuf1_vaddr = topFramebufferInfo.framebuf0_vaddr; + topFramebufferInfo. framebuf_widthbytesize = 240 * 3; } - topFramebufferInfo.format = (1<<8)|(1<<5)|GSP_BGR8_OES; + u8 bit5 = (ctr->enable_3d != 0); + topFramebufferInfo.format = (1<<8)|((1^bit5)<<6)|((bit5)<<5)|GSP_BGR8_OES; topFramebufferInfo. framebuf_dispselect = ctr->current_buffer_top; topFramebufferInfo.unk = 0x00000000; @@ -1144,8 +1217,6 @@ static void ctr_set_osd_msg(void *data, static const video_poke_interface_t ctr_poke_interface = { NULL, /* get_flags */ - NULL, /* set_coords */ - NULL, /* set_mvp */ ctr_load_texture, ctr_unload_texture, NULL, diff --git a/gfx/drivers/d3d10.c b/gfx/drivers/d3d10.c index e518204464..065d0be67c 100644 --- a/gfx/drivers/d3d10.c +++ b/gfx/drivers/d3d10.c @@ -76,11 +76,11 @@ d3d10_overlay_vertex_geom(void* data, unsigned index, float x, float y, float w, static void d3d10_clear_scissor(d3d10_video_t *d3d10, video_frame_info_t *video_info) { - D3D10_RECT scissor_rect = {0}; + D3D10_RECT scissor_rect; - scissor_rect.left = 0; - scissor_rect.top = 0; - scissor_rect.right = video_info->width; + scissor_rect.left = 0; + scissor_rect.top = 0; + scissor_rect.right = video_info->width; scissor_rect.bottom = video_info->height; D3D10SetScissorRects(d3d10->device, 1, &scissor_rect); @@ -997,7 +997,8 @@ d3d10_gfx_init(const video_info_t* video, IDXGIAdapter_GetDesc(d3d10->adapter, &desc); - utf16_to_char_string(desc.Description, str, sizeof(str)); + utf16_to_char_string((const uint16_t*) + desc.Description, str, sizeof(str)); RARCH_LOG("[D3D10]: Using GPU: %s\n", str); @@ -1402,12 +1403,18 @@ static bool d3d10_gfx_frame( d3d10->sprites.enabled = true; #ifdef HAVE_MENU +#ifndef HAVE_MENU_WIDGETS if (d3d10->menu.enabled) +#endif { D3D10SetViewports(context, 1, &d3d10->viewport); D3D10SetVertexBuffer(context, 0, d3d10->sprites.vbo, sizeof(d3d10_sprite_t), 0); - menu_driver_frame(video_info); } +#endif + +#ifdef HAVE_MENU + if (d3d10->menu.enabled) + menu_driver_frame(video_info); else #endif if (video_info->statistics_show) @@ -1683,8 +1690,6 @@ static uint32_t d3d10_get_flags(void *data) static const video_poke_interface_t d3d10_poke_interface = { d3d10_get_flags, - NULL, /* set_coords */ - NULL, /* set_mvp */ d3d10_gfx_load_texture, d3d10_gfx_unload_texture, NULL, /* set_video_mode */ diff --git a/gfx/drivers/d3d11.c b/gfx/drivers/d3d11.c index 1b92a226d5..924e80b011 100644 --- a/gfx/drivers/d3d11.c +++ b/gfx/drivers/d3d11.c @@ -93,11 +93,11 @@ d3d11_overlay_vertex_geom(void* data, unsigned index, float x, float y, float w, static void d3d11_clear_scissor(d3d11_video_t *d3d11, video_frame_info_t *video_info) { - D3D11_RECT scissor_rect = {0}; + D3D11_RECT scissor_rect; - scissor_rect.left = 0; - scissor_rect.top = 0; - scissor_rect.right = video_info->width; + scissor_rect.left = 0; + scissor_rect.top = 0; + scissor_rect.right = video_info->width; scissor_rect.bottom = video_info->height; D3D11SetScissorRects(d3d11->context, 1, &scissor_rect); @@ -1069,7 +1069,8 @@ d3d11_gfx_init(const video_info_t* video, const input_driver_t** input, void** i IDXGIAdapter_GetDesc(d3d11->adapter, &desc); - utf16_to_char_string(desc.Description, str, sizeof(str)); + utf16_to_char_string((const uint16_t*) + desc.Description, str, sizeof(str)); RARCH_LOG("[D3D11]: Using GPU: %s\n", str); @@ -1467,12 +1468,19 @@ static bool d3d11_gfx_frame( d3d11->sprites.enabled = true; #ifdef HAVE_MENU +#ifndef HAVE_MENU_WIDGETS if (d3d11->menu.enabled) +#endif { D3D11SetViewports(context, 1, &d3d11->viewport); - D3D11SetVertexBuffer(context, 0, d3d11->sprites.vbo, sizeof(d3d11_sprite_t), 0); - menu_driver_frame(video_info); + D3D11SetVertexBuffer(context, 0, + d3d11->sprites.vbo, sizeof(d3d11_sprite_t), 0); } +#endif + +#ifdef HAVE_MENU + if (d3d11->menu.enabled) + menu_driver_frame(video_info); else #endif if (video_info->statistics_show) @@ -1527,8 +1535,6 @@ static bool d3d11_gfx_frame( } d3d11->sprites.enabled = false; - - #if 0 PERF_STOP(); #endif @@ -1750,8 +1756,6 @@ static uint32_t d3d11_get_flags(void *data) static const video_poke_interface_t d3d11_poke_interface = { d3d11_get_flags, - NULL, /* set_coords */ - NULL, /* set_mvp */ d3d11_gfx_load_texture, d3d11_gfx_unload_texture, NULL, /* set_video_mode */ diff --git a/gfx/drivers/d3d12.c b/gfx/drivers/d3d12.c index 354007c7a9..257abcf389 100644 --- a/gfx/drivers/d3d12.c +++ b/gfx/drivers/d3d12.c @@ -1477,13 +1477,19 @@ static bool d3d12_gfx_frame( d3d12->sprites.enabled = true; #ifdef HAVE_MENU +#ifndef HAVE_MENU_WIDGETS if (d3d12->menu.enabled) +#endif { D3D12RSSetViewports(d3d12->queue.cmd, 1, &d3d12->chain.viewport); D3D12RSSetScissorRects(d3d12->queue.cmd, 1, &d3d12->chain.scissorRect); D3D12IASetVertexBuffers(d3d12->queue.cmd, 0, 1, &d3d12->sprites.vbo_view); - menu_driver_frame(video_info); } +#endif + +#ifdef HAVE_MENU + if (d3d12->menu.enabled) + menu_driver_frame(video_info); else #endif if (video_info->statistics_show) @@ -1797,8 +1803,6 @@ static uint32_t d3d12_get_flags(void *data) static const video_poke_interface_t d3d12_poke_interface = { d3d12_get_flags, - NULL, /* set_coords */ - NULL, /* set_mvp */ d3d12_gfx_load_texture, d3d12_gfx_unload_texture, NULL, /* set_video_mode */ diff --git a/gfx/drivers/d3d8.c b/gfx/drivers/d3d8.c index b6f58d3c10..f5aa6bf2c0 100644 --- a/gfx/drivers/d3d8.c +++ b/gfx/drivers/d3d8.c @@ -86,23 +86,20 @@ typedef struct d3d8_renderchain uint64_t frame_count; } d3d8_renderchain_t; -static void d3d8_renderchain_set_mvp( - d3d8_video_t *d3d, - void *chain_data, - void *shader_data, - const void *mat_data) +void d3d8_set_mvp(void *data, const void *mat_data) { struct d3d_matrix matrix; + LPDIRECT3DDEVICE8 d3dr = (LPDIRECT3DDEVICE8)data; d3d_matrix_identity(&matrix); - d3d8_set_transform(d3d->dev, D3DTS_PROJECTION, (D3DMATRIX*)&matrix); - d3d8_set_transform(d3d->dev, D3DTS_VIEW, (D3DMATRIX*)&matrix); + d3d8_set_transform(d3dr, D3DTS_PROJECTION, (D3DMATRIX*)&matrix); + d3d8_set_transform(d3dr, D3DTS_VIEW, (D3DMATRIX*)&matrix); if (mat_data) d3d_matrix_transpose(&matrix, mat_data); - d3d8_set_transform(d3d->dev, D3DTS_WORLD, (D3DMATRIX*)&matrix); + d3d8_set_transform(d3dr, D3DTS_WORLD, (D3DMATRIX*)&matrix); } static bool d3d8_renderchain_create_first_pass( @@ -288,7 +285,7 @@ static void d3d8_renderchain_render_pass( D3DFVF_XYZ | D3DFVF_TEX1 | D3DFVF_DIFFUSE, NULL); d3d8_set_stream_source(d3dr, 0, chain->vertex_buf, 0, sizeof(Vertex)); - d3d8_renderchain_set_mvp(d3d, chain, NULL, &d3d->mvp_rotate); + d3d8_set_mvp(d3d->dev, &d3d->mvp_rotate); d3d8_draw_primitive(d3dr, D3DPT_TRIANGLESTRIP, 0, 2); } @@ -427,15 +424,6 @@ static void d3d8_viewport_info(void *data, struct video_viewport *vp) d3d8_renderchain_viewport_info(d3d, vp); } -static void d3d8_set_mvp(void *data, - void *shader_data, - const void *mat_data) -{ - d3d8_video_t *d3d = (d3d8_video_t*)data; - if (d3d) - d3d8_renderchain_set_mvp(d3d, d3d->renderchain_data, shader_data, mat_data); -} - static void d3d8_overlay_render(d3d8_video_t *d3d, video_frame_info_t *video_info, overlay_t *overlay, bool force_linear) @@ -1598,7 +1586,7 @@ static bool d3d8_frame(void *data, const void *frame, #ifdef HAVE_MENU if (d3d->menu && d3d->menu->enabled) { - d3d8_set_mvp(d3d, NULL, &d3d->mvp); + d3d8_set_mvp(d3d->dev, &d3d->mvp); d3d8_overlay_render(d3d, video_info, d3d->menu, false); d3d->menu_display.offset = 0; @@ -1623,7 +1611,7 @@ static bool d3d8_frame(void *data, const void *frame, #ifdef HAVE_OVERLAY if (d3d->overlays_enabled) { - d3d8_set_mvp(d3d, NULL, &d3d->mvp); + d3d8_set_mvp(d3d->dev, &d3d->mvp); for (i = 0; i < d3d->overlays_size; i++) d3d8_overlay_render(d3d, video_info, &d3d->overlays[i], true); } @@ -1854,8 +1842,6 @@ static uint32_t d3d8_get_flags(void *data) static const video_poke_interface_t d3d_poke_interface = { d3d8_get_flags, - NULL, /* set_coords */ - d3d8_set_mvp, d3d8_load_texture, d3d8_unload_texture, d3d8_set_video_mode, diff --git a/gfx/drivers/d3d9.c b/gfx/drivers/d3d9.c index 9a3ea1703f..e8797b092f 100644 --- a/gfx/drivers/d3d9.c +++ b/gfx/drivers/d3d9.c @@ -456,12 +456,10 @@ static void d3d9_viewport_info(void *data, struct video_viewport *vp) vp->full_height = height; } -static void d3d9_set_mvp(void *data, - void *shader_data, - const void *mat_data) +void d3d9_set_mvp(void *data, const void *mat_data) { - d3d9_video_t *d3d = (d3d9_video_t*)data; - d3d9_set_vertex_shader_constantf(d3d->dev, 0, (const float*)mat_data, 4); + LPDIRECT3DDEVICE9 dev = (LPDIRECT3DDEVICE9)data; + d3d9_set_vertex_shader_constantf(dev, 0, (const float*)mat_data, 4); } static void d3d9_overlay_render(d3d9_video_t *d3d, @@ -1696,7 +1694,7 @@ static bool d3d9_frame(void *data, const void *frame, #ifdef HAVE_MENU if (d3d->menu && d3d->menu->enabled) { - d3d9_set_mvp(d3d, NULL, &d3d->mvp); + d3d9_set_mvp(d3d->dev, &d3d->mvp); d3d9_overlay_render(d3d, video_info, d3d->menu, false); d3d->menu_display.offset = 0; @@ -1725,7 +1723,7 @@ static bool d3d9_frame(void *data, const void *frame, #ifdef HAVE_OVERLAY if (d3d->overlays_enabled) { - d3d9_set_mvp(d3d, NULL, &d3d->mvp); + d3d9_set_mvp(d3d->dev, &d3d->mvp); for (i = 0; i < d3d->overlays_size; i++) d3d9_overlay_render(d3d, video_info, &d3d->overlays[i], true); } @@ -2053,8 +2051,6 @@ static uint32_t d3d9_get_flags(void *data) static const video_poke_interface_t d3d9_poke_interface = { d3d9_get_flags, - NULL, /* set_coords */ - d3d9_set_mvp, d3d9_load_texture, d3d9_unload_texture, d3d9_set_video_mode, diff --git a/gfx/drivers/dispmanx_gfx.c b/gfx/drivers/dispmanx_gfx.c index 386d2bcc38..74b6504c13 100644 --- a/gfx/drivers/dispmanx_gfx.c +++ b/gfx/drivers/dispmanx_gfx.c @@ -632,8 +632,6 @@ static void dispmanx_set_aspect_ratio (void *data, unsigned aspect_ratio_idx) static const video_poke_interface_t dispmanx_poke_interface = { NULL, /* get_flags */ - NULL, /* set_coords */ - NULL, /* set_mvp */ NULL, NULL, NULL, /* set_video_mode */ diff --git a/gfx/drivers/drm_gfx.c b/gfx/drivers/drm_gfx.c index 4f071167c2..41a99df738 100644 --- a/gfx/drivers/drm_gfx.c +++ b/gfx/drivers/drm_gfx.c @@ -966,8 +966,6 @@ static void drm_set_aspect_ratio (void *data, unsigned aspect_ratio_idx) static const video_poke_interface_t drm_poke_interface = { NULL, /* get_flags */ - NULL, /* set_coords */ - NULL, /* set_mvp */ NULL, NULL, NULL, /* set_video_mode */ diff --git a/gfx/drivers/exynos_gfx.c b/gfx/drivers/exynos_gfx.c index ce2256a84e..6e919ccf98 100644 --- a/gfx/drivers/exynos_gfx.c +++ b/gfx/drivers/exynos_gfx.c @@ -1489,8 +1489,6 @@ static void exynos_show_mouse(void *data, bool state) static const video_poke_interface_t exynos_poke_interface = { NULL, /* get_flags */ - NULL, /* set_coords */ - NULL, /* set_mvp */ NULL, NULL, NULL, /* set_video_mode */ diff --git a/gfx/drivers/gdi_gfx.c b/gfx/drivers/gdi_gfx.c index c30cefd736..68d5cdca55 100644 --- a/gfx/drivers/gdi_gfx.c +++ b/gfx/drivers/gdi_gfx.c @@ -631,8 +631,6 @@ static void gdi_unload_texture(void *data, uintptr_t handle) static const video_poke_interface_t gdi_poke_interface = { NULL, /* get_flags */ - NULL, /* set_coords */ - NULL, /* set_mvp */ gdi_load_texture, gdi_unload_texture, gdi_set_video_mode, diff --git a/gfx/drivers/gl.c b/gfx/drivers/gl.c index 8ee8560010..e1484a7e0e 100644 --- a/gfx/drivers/gl.c +++ b/gfx/drivers/gl.c @@ -15,6 +15,12 @@ * If not, see . */ +/* Middle of the road OpenGL driver. + * + * Minimum version (desktop): OpenGL 2.0+ + * Minimum version (mobile) : OpenGLES 2.0+ + */ + #ifdef _MSC_VER #pragma comment(lib, "opengl32") #endif @@ -267,13 +273,6 @@ static bool gl2_shader_scale(gl_t *gl, return true; } -static const char *gl2_shader_get_ident(gl_t *gl) -{ - if (!gl || !gl->shader) - return "N/A"; - return gl->shader->ident; -} - static void gl2_renderchain_convert_geometry( struct video_fbo_rect *fbo_rect, struct gfx_fbo_scale *fbo_scale, @@ -352,18 +351,20 @@ static void gl2_load_texture_image(GLenum target, { #if !defined(HAVE_PSGL) && !defined(ORBIS) #ifdef HAVE_OPENGLES2 - if (gl_check_capability(GL_CAPS_TEX_STORAGE_EXT) && internalFormat != GL_BGRA_EXT) - { - gl2_size_format(&internalFormat); - glTexStorage2DEXT(target, 1, internalFormat, width, height); - } + unsigned cap = GL_CAPS_TEX_STORAGE_EXT; #else - if (gl_check_capability(GL_CAPS_TEX_STORAGE) && internalFormat != GL_BGRA_EXT) + unsigned cap = GL_CAPS_TEX_STORAGE; +#endif + + if (gl_check_capability(cap) && internalFormat != GL_BGRA_EXT) { gl2_size_format(&internalFormat); - glTexStorage2D(target, 1, internalFormat, width, height); - } +#ifdef HAVE_OPENGLES2 + glTexStorage2DEXT(target, 1, internalFormat, width, height); +#else + glTexStorage2D (target, 1, internalFormat, width, height); #endif + } else #endif { @@ -658,11 +659,8 @@ static void gl2_renderchain_render( gl->coords.vertices = 4; - gl->shader->set_coords(gl, - gl->shader_data, &gl->coords); - - gl->shader->set_mvp(gl, gl->shader_data, - &gl->mvp); + gl->shader->set_coords(gl->shader_data, &gl->coords); + gl->shader->set_mvp(gl->shader_data, &gl->mvp); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } @@ -729,11 +727,8 @@ static void gl2_renderchain_render( gl->coords.vertices = 4; - gl->shader->set_coords(gl, - gl->shader_data, &gl->coords); - - gl->shader->set_mvp(gl, gl->shader_data, - &gl->mvp); + gl->shader->set_coords(gl->shader_data, &gl->coords); + gl->shader->set_mvp(gl->shader_data, &gl->mvp); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); @@ -1616,28 +1611,15 @@ static void gl2_renderchain_copy_frame( #endif } -static void gl2_renderchain_bind_pbo(unsigned idx) -{ #if !defined(HAVE_OPENGLES2) && !defined(HAVE_PSGL) - glBindBuffer(GL_PIXEL_PACK_BUFFER, (GLuint)idx); +#define gl2_renderchain_bind_pbo(idx) glBindBuffer(GL_PIXEL_PACK_BUFFER, (GLuint)idx) +#define gl2_renderchain_unbind_pbo() glBindBuffer(GL_PIXEL_PACK_BUFFER, 0) +#define gl2_renderchain_init_pbo(size, data) glBufferData(GL_PIXEL_PACK_BUFFER, size, (const GLvoid*)data, GL_STREAM_READ) +#else +#define gl2_renderchain_bind_pbo(idx) +#define gl2_renderchain_unbind_pbo() +#define gl2_renderchain_init_pbo(size, data) #endif -} - -static void gl2_renderchain_unbind_pbo(void) -{ -#if !defined(HAVE_OPENGLES2) && !defined(HAVE_PSGL) - glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); -#endif -} - -static void gl2_renderchain_init_pbo(unsigned size, - const void *data) -{ -#if !defined(HAVE_OPENGLES2) && !defined(HAVE_PSGL) - glBufferData(GL_PIXEL_PACK_BUFFER, size, - (const GLvoid*)data, GL_STREAM_READ); -#endif -} static void gl2_renderchain_readback( gl_t *gl, @@ -1977,20 +1959,16 @@ static void gl2_render_overlay(gl_t *gl, video_frame_info_t *video_info) glViewport(0, 0, width, height); /* Ensure that we reset the attrib array. */ - if (video_info->shader_driver && video_info->shader_driver->use) - video_info->shader_driver->use(gl, - video_info->shader_data, VIDEO_SHADER_STOCK_BLEND, true); + gl->shader->use(gl, gl->shader_data, + VIDEO_SHADER_STOCK_BLEND, true); gl->coords.vertex = gl->overlay_vertex_coord; gl->coords.tex_coord = gl->overlay_tex_coord; gl->coords.color = gl->overlay_color_coord; gl->coords.vertices = 4 * gl->overlays; - gl->shader->set_coords(gl, - gl->shader_data, &gl->coords); - - gl->shader->set_mvp(gl, gl->shader_data, - &gl->mvp_no_rot); + gl->shader->set_coords(gl->shader_data, &gl->coords); + gl->shader->set_mvp(gl->shader_data, &gl->mvp_no_rot); for (i = 0; i < gl->overlays; i++) { @@ -2021,6 +1999,76 @@ static void gl2_set_viewport_wrapper(void *data, unsigned viewport_width, } /* Shaders */ +static const shader_backend_t *gl_shader_driver_set_backend( + enum rarch_shader_type type) +{ + switch (type) + { + case RARCH_SHADER_CG: + { +#ifdef HAVE_CG + gfx_ctx_flags_t flags; + flags.flags = 0; + video_context_driver_get_flags(&flags); + + if (BIT32_GET(flags.flags, GFX_CTX_FLAGS_GL_CORE_CONTEXT)) + { + RARCH_ERR("[Shader driver]: Cg cannot be used with core" + " GL context. Trying to fall back to GLSL...\n"); + return gl_shader_driver_set_backend(RARCH_SHADER_GLSL); + } + + RARCH_LOG("[Shader driver]: Using Cg shader backend.\n"); + return &gl_cg_backend; +#else + break; +#endif + } + case RARCH_SHADER_GLSL: +#ifdef HAVE_GLSL + RARCH_LOG("[Shader driver]: Using GLSL shader backend.\n"); + return &gl_glsl_backend; +#else + break; +#endif + case RARCH_SHADER_HLSL: + case RARCH_SHADER_NONE: + default: + break; + } + + return NULL; +} + +static bool gl_shader_driver_init(video_shader_ctx_init_t *init) +{ + void *tmp = NULL; + settings_t *settings = config_get_ptr(); + + if (!init->shader || !init->shader->init) + { + init->shader = gl_shader_driver_set_backend(init->shader_type); + + if (!init->shader) + return false; + } + + tmp = init->shader->init(init->data, init->path); + + if (!tmp) + return false; + + if (string_is_equal(settings->arrays.menu_driver, "xmb") + && init->shader->init_menu_shaders) + { + RARCH_LOG("Setting up menu pipeline shaders for XMB ... \n"); + init->shader->init_menu_shaders(tmp); + } + + init->shader_data = tmp; + + return true; +} static bool gl2_shader_init(gl_t *gl, const gfx_ctx_driver_t *ctx_driver, struct retro_hw_render_callback *hwr @@ -2066,7 +2114,7 @@ static bool gl2_shader_init(gl_t *gl, const gfx_ctx_driver_t *ctx_driver, init_data.data = gl; init_data.path = shader_path; - if (video_shader_driver_init(&init_data)) + if (gl_shader_driver_init(&init_data)) { gl->shader = init_data.shader; gl->shader_data = init_data.shader_data; @@ -2078,7 +2126,7 @@ static bool gl2_shader_init(gl_t *gl, const gfx_ctx_driver_t *ctx_driver, init_data.shader = NULL; init_data.path = NULL; - ret = video_shader_driver_init(&init_data); + ret = gl_shader_driver_init(&init_data); gl->shader = init_data.shader; gl->shader_data = init_data.shader_data; @@ -2246,10 +2294,7 @@ static INLINE void gl2_set_shader_viewports(gl_t *gl) for (i = 0; i < 2; i++) { - if (video_info.shader_driver && video_info.shader_driver->use) - video_info.shader_driver->use(gl, - video_info.shader_data, i, true); - + gl->shader->use(gl, gl->shader_data, i, true); gl2_set_viewport(gl, &video_info, width, height, false, true); } @@ -2360,19 +2405,16 @@ static void gl2_render_osd_background( video_driver_set_viewport(video_info->width, video_info->height, true, false); - if (video_info->shader_driver && video_info->shader_driver->use) - video_info->shader_driver->use(gl, - video_info->shader_data, VIDEO_SHADER_STOCK_BLEND, true); + gl->shader->use(gl, gl->shader_data, + VIDEO_SHADER_STOCK_BLEND, true); - gl->shader->set_coords(gl, gl->shader_data, - &coords); + gl->shader->set_coords(gl->shader_data, &coords); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendEquation(GL_FUNC_ADD); - gl->shader->set_mvp(gl, gl->shader_data, - &gl->mvp_no_rot); + gl->shader->set_mvp(gl->shader_data, &gl->mvp_no_rot); uniform_param.type = UNIFORM_4F; uniform_param.enabled = true; @@ -2464,17 +2506,13 @@ static INLINE void gl2_draw_texture(gl_t *gl, video_frame_info_t *video_info) glBindTexture(GL_TEXTURE_2D, gl->menu_texture); - if (video_info->shader_driver && video_info->shader_driver->use) - video_info->shader_driver->use(gl, - video_info->shader_data, VIDEO_SHADER_STOCK_BLEND, true); + gl->shader->use(gl, + gl->shader_data, VIDEO_SHADER_STOCK_BLEND, true); gl->coords.vertices = 4; - gl->shader->set_coords(gl, - gl->shader_data, &gl->coords); - - gl->shader->set_mvp(gl, gl->shader_data, - &gl->mvp_no_rot); + gl->shader->set_coords(gl->shader_data, &gl->coords); + gl->shader->set_mvp(gl->shader_data, &gl->mvp_no_rot); glEnable(GL_BLEND); @@ -2539,9 +2577,7 @@ static bool gl2_frame(void *data, const void *frame, if (gl->core_context_in_use) gl2_renderchain_bind_vao(chain); - if (video_info->shader_driver && video_info->shader_driver->use) - video_info->shader_driver->use(gl, - video_info->shader_data, 1, true); + gl->shader->use(gl, gl->shader_data, 1, true); #ifdef IOS /* Apparently the viewport is lost each frame, thanks Apple. */ @@ -2669,11 +2705,8 @@ static bool gl2_frame(void *data, const void *frame, gl->coords.vertices = 4; - gl->shader->set_coords(gl, - gl->shader_data, &gl->coords); - - gl->shader->set_mvp(gl, gl->shader_data, - &gl->mvp); + gl->shader->set_coords(gl->shader_data, &gl->coords); + gl->shader->set_mvp(gl->shader_data, &gl->mvp); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); @@ -2737,10 +2770,7 @@ static bool gl2_frame(void *data, const void *frame, /* Reset state which could easily mess up libretro core. */ if (gl->hw_render_fbo_init) { - if (video_info->shader_driver && video_info->shader_driver->use) - video_info->shader_driver->use(gl, - video_info->shader_data, 0, true); - + gl->shader->use(gl, gl->shader_data, 0, true); glBindTexture(GL_TEXTURE_2D, 0); } @@ -2838,7 +2868,6 @@ static void gl2_free(void *data) font_driver_free_osd(); gl->shader->deinit(gl->shader_data); - video_shader_driver_deinit(); glDeleteTextures(gl->textures, gl->texture); @@ -3447,15 +3476,13 @@ static void *gl2_init(const video_info_t *video, gl->shader = (shader_backend_t*)gl2_shader_ctx_drivers[0]; - if (!video_shader_driver_init_first(gl->shader)) + if (!gl->shader) { RARCH_ERR("[GL:]: Shader driver initialization failed.\n"); goto error; } - gl2_shader_get_ident(gl); - - RARCH_LOG("[GL]: Default shader backend found: %s.\n", gl2_shader_get_ident(gl)); + RARCH_LOG("[GL]: Default shader backend found: %s.\n", gl->shader->ident); if (!gl2_shader_init(gl, ctx_driver, hwr)) { @@ -3682,8 +3709,6 @@ static bool gl2_set_shader(void *data, gl->shader->deinit(gl->shader_data); gl->shader_data = NULL; - video_shader_driver_deinit(); - switch (type) { #ifdef HAVE_GLSL @@ -3714,11 +3739,11 @@ static bool gl2_set_shader(void *data, init_data.data = gl; init_data.path = path; - if (!video_shader_driver_init(&init_data)) + if (!gl_shader_driver_init(&init_data)) { init_data.path = NULL; - video_shader_driver_init(&init_data); + gl_shader_driver_init(&init_data); gl->shader = init_data.shader; gl->shader_data = init_data.shader_data; @@ -4142,8 +4167,6 @@ static uint32_t gl2_get_flags(void *data) static const video_poke_interface_t gl2_poke_interface = { gl2_get_flags, - NULL, /* set_coords */ - NULL, /* set_mvp */ gl2_load_texture, gl2_unload_texture, gl2_set_video_mode, diff --git a/gfx/drivers/gl1.c b/gfx/drivers/gl1.c index 309afab44b..2f754bd180 100644 --- a/gfx/drivers/gl1.c +++ b/gfx/drivers/gl1.c @@ -15,7 +15,9 @@ * If not, see . */ -/* We are targeting a minimum of OpenGL 1.1 and the Microsoft "GDI Generic" software GL implementation. +/* OpenGL driver. + * + * We are targeting a minimum of OpenGL 1.1 and the Microsoft "GDI Generic" software GL implementation. * Any additional features added for later 1.x versions should only be enabled if they are detected at runtime. */ #include @@ -32,6 +34,9 @@ #ifdef HAVE_MENU #include "../../menu/menu_driver.h" +#ifdef HAVE_MENU_WIDGETS +#include "../../menu/widgets/menu_widgets.h" +#endif #endif #include "../font_driver.h" @@ -103,6 +108,17 @@ static const GLfloat gl1_white_color[] = { if (gl1_shared_context_use) \ gl1->ctx_driver->bind_hw_render(gl1->ctx_data, enable) +static void gl1_render_overlay(gl1_t *gl, video_frame_info_t *video_info); +static void gl1_free_overlay(gl1_t *gl); +static void gl1_overlay_vertex_geom(void *data, + unsigned image, + float x, float y, + float w, float h); +static void gl1_overlay_tex_geom(void *data, + unsigned image, + GLfloat x, GLfloat y, + GLfloat w, GLfloat h); + static bool is_pot(unsigned x) { return (x & (x - 1)) == 0; @@ -113,10 +129,6 @@ static unsigned get_pot(unsigned x) return (is_pot(x) ? x : next_pow2(x)); } -static void gl1_gfx_create(void) -{ -} - static void *gl1_gfx_init(const video_info_t *video, const input_driver_t **input, void **input_data) { @@ -153,8 +165,6 @@ static void *gl1_gfx_init(const video_info_t *video, else gl1_video_pitch = video->width * 2; - gl1_gfx_create(); - ctx_driver = video_context_driver_init_first(gl1, settings->arrays.video_context_driver, GFX_CTX_OPENGL_API, 1, 1, false, &ctx_data); @@ -206,6 +216,8 @@ static void *gl1_gfx_init(const video_info_t *video, if (!video_context_driver_set_video_mode(&mode)) goto error; + gl1->fullscreen = video->fullscreen; + mode.width = 0; mode.height = 0; @@ -468,7 +480,6 @@ static void draw_tex(gl1_t *gl1, int pot_width, int pot_height, int width, int h glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); - /*glLoadMatrixf(gl1->mvp.data);*/ glMatrixMode(GL_MODELVIEW); glPushMatrix(); @@ -708,6 +719,32 @@ static bool gl1_gfx_frame(void *data, const void *frame, #ifdef HAVE_MENU if (gl1->menu_texture_enable) menu_driver_frame(video_info); + else if (video_info->statistics_show) + { + struct font_params *osd_params = (struct font_params*) + &video_info->osd_stat_params; + + if (osd_params) + { + font_driver_render_msg(video_info, NULL, video_info->stat_text, + (const struct font_params*)&video_info->osd_stat_params); +#if 0 + osd_params->y = 0.350f; + osd_params->scale = 0.75f; + font_driver_render_msg(video_info, NULL, video_info->chat_text, + (const struct font_params*)&video_info->osd_stat_params); +#endif + } + } + +#ifdef HAVE_MENU_WIDGETS + menu_widgets_frame(video_info); +#endif +#endif + +#ifdef HAVE_OVERLAY + if (gl1->overlay_enable) + gl1_render_overlay(gl1, video_info); #endif if (msg) @@ -740,13 +777,12 @@ static bool gl1_gfx_frame(void *data, const void *frame, video_info->cb_swap_buffers(video_info->context_data, video_info); /* check if we are fast forwarding or in menu, if we are ignore hard sync */ - if (gl1->have_sync - && video_info->hard_sync + if (video_info->hard_sync && !video_info->input_driver_nonblock_state && !gl1->menu_texture_enable) { glClear(GL_COLOR_BUFFER_BIT); - /* hard sync would go here if possible */ + glFinish(); } gl1_context_bind_hw_render(gl1, true); @@ -859,6 +895,10 @@ static void gl1_gfx_free(void *data) gl1->menu_tex = 0; } +#ifdef HAVE_OVERLAY + gl1_free_overlay(gl1); +#endif + if (gl1->extensions) { string_list_free(gl1->extensions); @@ -1067,33 +1107,15 @@ static void gl1_load_texture_data( bool rgb32 = (base_size == (sizeof(uint32_t))); GLenum wrap = gl1_wrap_type_to_enum(wrap_type); - /* Assume no mipmapping support. */ + /* GL1.x does not have mipmapping support. */ switch (filter_type) { - case TEXTURE_FILTER_MIPMAP_LINEAR: - filter_type = TEXTURE_FILTER_LINEAR; - break; case TEXTURE_FILTER_MIPMAP_NEAREST: - filter_type = TEXTURE_FILTER_NEAREST; - break; - default: - break; - } - - switch (filter_type) - { - case TEXTURE_FILTER_MIPMAP_LINEAR: - min_filter = GL_LINEAR_MIPMAP_NEAREST; - mag_filter = GL_LINEAR; - break; - case TEXTURE_FILTER_MIPMAP_NEAREST: - min_filter = GL_NEAREST_MIPMAP_NEAREST; - mag_filter = GL_NEAREST; - break; case TEXTURE_FILTER_NEAREST: min_filter = GL_NEAREST; mag_filter = GL_NEAREST; break; + case TEXTURE_FILTER_MIPMAP_LINEAR: case TEXTURE_FILTER_LINEAR: default: min_filter = GL_LINEAR; @@ -1128,17 +1150,6 @@ static void video_texture_load_gl1( } #ifdef HAVE_THREADS -static int video_texture_load_wrap_gl1_mipmap(void *data) -{ - uintptr_t id = 0; - - if (!data) - return 0; - video_texture_load_gl1((struct texture_image*)data, - TEXTURE_FILTER_MIPMAP_LINEAR, &id); - return (int)id; -} - static int video_texture_load_wrap_gl1(void *data) { uintptr_t id = 0; @@ -1146,7 +1157,7 @@ static int video_texture_load_wrap_gl1(void *data) if (!data) return 0; video_texture_load_gl1((struct texture_image*)data, - TEXTURE_FILTER_LINEAR, &id); + TEXTURE_FILTER_NEAREST, &id); return (int)id; } #endif @@ -1160,16 +1171,6 @@ static uintptr_t gl1_load_texture(void *video_data, void *data, if (threaded) { custom_command_method_t func = video_texture_load_wrap_gl1; - - switch (filter_type) - { - case TEXTURE_FILTER_MIPMAP_LINEAR: - case TEXTURE_FILTER_MIPMAP_NEAREST: - func = video_texture_load_wrap_gl1_mipmap; - break; - default: - break; - } return video_thread_texture_load(data, func); } #endif @@ -1243,43 +1244,15 @@ static uint32_t gl1_get_flags(void *data) { uint32_t flags = 0; + BIT32_SET(flags, GFX_CTX_FLAGS_HARD_SYNC); BIT32_SET(flags, GFX_CTX_FLAGS_BLACK_FRAME_INSERTION); BIT32_SET(flags, GFX_CTX_FLAGS_MENU_FRAME_FILTERING); return flags; } -static void gl1_set_mvp(void *data, void *shader_data, const void *mat_data) -{ - const math_matrix_4x4 *mat = (const math_matrix_4x4*)mat_data; - - (void)data; - (void)shader_data; - - if (!mat) - return; - - glLoadMatrixf(mat->data); -} - -static void gl1_set_coords(void *handle_data, void *shader_data, - const struct video_coords *coords) -{ - gl1_t *gl1 = (gl1_t*)handle_data; - - if (!gl1) - return; - - gl1->coords.vertex = coords->vertex; - gl1->coords.color = coords->color; - gl1->coords.tex_coord = coords->tex_coord; - gl1->coords.lut_tex_coord = coords->lut_tex_coord; -} - static const video_poke_interface_t gl1_poke_interface = { gl1_get_flags, - gl1_set_coords, - gl1_set_mvp, gl1_load_texture, gl1_unload_texture, gl1_set_video_mode, @@ -1309,6 +1282,14 @@ static void gl1_gfx_get_poke_interface(void *data, *iface = &gl1_poke_interface; } +#if defined(HAVE_MENU) && defined(HAVE_MENU_WIDGETS) +static bool gl1_menu_widgets_enabled(void *data) +{ + (void)data; + return true; +} +#endif + static void gl1_gfx_set_viewport_wrapper(void *data, unsigned viewport_width, unsigned viewport_height, bool force_full, bool allow_rotate) { @@ -1326,6 +1307,230 @@ bool gl1_has_menu_frame(void) return (gl1_menu_frame != NULL); } +#ifdef HAVE_OVERLAY +static bool gl1_overlay_load(void *data, + const void *image_data, unsigned num_images) +{ + unsigned i, j; + gl1_t *gl = (gl1_t*)data; + const struct texture_image *images = + (const struct texture_image*)image_data; + + if (!gl) + return false; + + gl1_context_bind_hw_render(gl, false); + + gl1_free_overlay(gl); + gl->overlay_tex = (GLuint*) + calloc(num_images, sizeof(*gl->overlay_tex)); + + if (!gl->overlay_tex) + { + gl1_context_bind_hw_render(gl, true); + return false; + } + + gl->overlay_vertex_coord = (GLfloat*) + calloc(2 * 4 * num_images, sizeof(GLfloat)); + gl->overlay_tex_coord = (GLfloat*) + calloc(2 * 4 * num_images, sizeof(GLfloat)); + gl->overlay_color_coord = (GLfloat*) + calloc(4 * 4 * num_images, sizeof(GLfloat)); + + if ( !gl->overlay_vertex_coord + || !gl->overlay_tex_coord + || !gl->overlay_color_coord) + return false; + + gl->overlays = num_images; + glGenTextures(num_images, gl->overlay_tex); + + for (i = 0; i < num_images; i++) + { + unsigned alignment = video_pixel_get_alignment(images[i].width + * sizeof(uint32_t)); + + gl1_load_texture_data(gl->overlay_tex[i], + RARCH_WRAP_EDGE, TEXTURE_FILTER_LINEAR, + alignment, + images[i].width, images[i].height, images[i].pixels, + sizeof(uint32_t)); + + /* Default. Stretch to whole screen. */ + gl1_overlay_tex_geom(gl, i, 0, 0, 1, 1); + gl1_overlay_vertex_geom(gl, i, 0, 0, 1, 1); + + for (j = 0; j < 16; j++) + gl->overlay_color_coord[16 * i + j] = 1.0f; + } + + gl1_context_bind_hw_render(gl, true); + return true; +} + +static void gl1_overlay_enable(void *data, bool state) +{ + gl1_t *gl = (gl1_t*)data; + + if (!gl) + return; + + gl->overlay_enable = state; + + if (gl->fullscreen) + video_context_driver_show_mouse(&state); +} + +static void gl1_overlay_full_screen(void *data, bool enable) +{ + gl1_t *gl = (gl1_t*)data; + + if (gl) + gl->overlay_full_screen = enable; +} + +static void gl1_overlay_set_alpha(void *data, unsigned image, float mod) +{ + GLfloat *color = NULL; + gl1_t *gl = (gl1_t*)data; + if (!gl) + return; + + color = (GLfloat*)&gl->overlay_color_coord[image * 16]; + + color[ 0 + 3] = mod; + color[ 4 + 3] = mod; + color[ 8 + 3] = mod; + color[12 + 3] = mod; +} + +static const video_overlay_interface_t gl1_overlay_interface = { + gl1_overlay_enable, + gl1_overlay_load, + gl1_overlay_tex_geom, + gl1_overlay_vertex_geom, + gl1_overlay_full_screen, + gl1_overlay_set_alpha, +}; + +static void gl1_get_overlay_interface(void *data, + const video_overlay_interface_t **iface) +{ + (void)data; + *iface = &gl1_overlay_interface; +} + +static void gl1_free_overlay(gl1_t *gl) +{ + glDeleteTextures(gl->overlays, gl->overlay_tex); + + free(gl->overlay_tex); + free(gl->overlay_vertex_coord); + free(gl->overlay_tex_coord); + free(gl->overlay_color_coord); + gl->overlay_tex = NULL; + gl->overlay_vertex_coord = NULL; + gl->overlay_tex_coord = NULL; + gl->overlay_color_coord = NULL; + gl->overlays = 0; +} + +static void gl1_overlay_vertex_geom(void *data, + unsigned image, + float x, float y, + float w, float h) +{ + GLfloat *vertex = NULL; + gl1_t *gl = (gl1_t*)data; + + if (!gl) + return; + + if (image > gl->overlays) + { + RARCH_ERR("[GL]: Invalid overlay id: %u\n", image); + return; + } + + vertex = (GLfloat*)&gl->overlay_vertex_coord[image * 8]; + + /* Flipped, so we preserve top-down semantics. */ + y = 1.0f - y; + h = -h; + + vertex[0] = x; + vertex[1] = y; + vertex[2] = x + w; + vertex[3] = y; + vertex[4] = x; + vertex[5] = y + h; + vertex[6] = x + w; + vertex[7] = y + h; +} + +static void gl1_overlay_tex_geom(void *data, + unsigned image, + GLfloat x, GLfloat y, + GLfloat w, GLfloat h) +{ + GLfloat *tex = NULL; + gl1_t *gl = (gl1_t*)data; + + if (!gl) + return; + + tex = (GLfloat*)&gl->overlay_tex_coord[image * 8]; + + tex[0] = x; + tex[1] = y; + tex[2] = x + w; + tex[3] = y; + tex[4] = x; + tex[5] = y + h; + tex[6] = x + w; + tex[7] = y + h; +} + +static void gl1_render_overlay(gl1_t *gl, video_frame_info_t *video_info) +{ + unsigned i; + unsigned width = video_info->width; + unsigned height = video_info->height; + + glEnable(GL_BLEND); + + if (gl->overlay_full_screen) + glViewport(0, 0, width, height); + + gl->coords.vertex = gl->overlay_vertex_coord; + gl->coords.tex_coord = gl->overlay_tex_coord; + gl->coords.color = gl->overlay_color_coord; + gl->coords.vertices = 4 * gl->overlays; + + /*gl->shader->set_coords(gl->shader_data, &gl->coords); + gl->shader->set_mvp(gl->shader_data, &gl->mvp_no_rot);*/ + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + + for (i = 0; i < gl->overlays; i++) + { + glBindTexture(GL_TEXTURE_2D, gl->overlay_tex[i]); + glDrawArrays(GL_TRIANGLE_STRIP, 4 * i, 4); + } + + glDisable(GL_BLEND); + gl->coords.vertex = gl->vertex_ptr; + gl->coords.tex_coord = gl->tex_info.coord; + gl->coords.color = gl->white_color_ptr; + gl->coords.vertices = 4; + if (gl->overlay_full_screen) + glViewport(gl->vp.x, gl->vp.y, gl->vp.width, gl->vp.height); +} +#endif + video_driver_t video_gl1 = { gl1_gfx_init, gl1_gfx_frame, @@ -1344,11 +1549,11 @@ video_driver_t video_gl1 = { NULL, /* read_frame_raw */ #ifdef HAVE_OVERLAY - NULL, /* overlay_interface */ + gl1_get_overlay_interface, #endif gl1_gfx_get_poke_interface, gl1_wrap_type_to_enum, #if defined(HAVE_MENU) && defined(HAVE_MENU_WIDGETS) - NULL + gl1_menu_widgets_enabled #endif }; diff --git a/gfx/drivers/gl_core.c b/gfx/drivers/gl_core.c index 2a7e3d8a63..5efe7b3b22 100644 --- a/gfx/drivers/gl_core.c +++ b/gfx/drivers/gl_core.c @@ -13,6 +13,12 @@ * If not, see . */ +/* Modern OpenGL driver. + * + * Minimum version (desktop): OpenGL 3.2+ + * Minimum version (mobile) : OpenGLES 3.0+ + */ + #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -394,13 +400,13 @@ static bool gl_core_init_hw_render(gl_core_t *gl, unsigned width, unsigned heigh RARCH_LOG("[GLCore]: Max texture size: %d px, renderbuffer size: %d px.\n", max_fbo_size, max_rb_size); - if (width > max_fbo_size) + if (width > (unsigned)max_fbo_size) width = max_fbo_size; - if (width > max_rb_size) + if (width > (unsigned)max_rb_size) width = max_rb_size; - if (height > max_fbo_size) + if (height > (unsigned)max_fbo_size) height = max_fbo_size; - if (height > max_rb_size) + if (height > (unsigned)max_rb_size) height = max_rb_size; glGenFramebuffers(1, &gl->hw_render_fbo); @@ -497,7 +503,8 @@ static const gfx_ctx_driver_t *gl_core_get_context(gl_core_t *gl) #endif /* Force shared context. */ - gl->use_shared_context = hwr->context_type != RETRO_HW_CONTEXT_NONE; + if (hwr) + gl->use_shared_context = hwr->context_type != RETRO_HW_CONTEXT_NONE; gfx_ctx = video_context_driver_init_first(gl, settings->arrays.video_context_driver, @@ -1624,6 +1631,7 @@ static bool gl_core_frame(void *data, const void *frame, texture.padded_width = streamed->width; texture.padded_height = streamed->height; } + gl_core_filter_chain_set_frame_count(gl->filter_chain, frame_count); gl_core_filter_chain_set_input_texture(gl->filter_chain, &texture); gl_core_filter_chain_build_offscreen_passes(gl->filter_chain, &gl->filter_chain_vp); @@ -1959,8 +1967,6 @@ static retro_proc_address_t gl_core_get_proc_address(void *data, const char *sym static const video_poke_interface_t gl_core_poke_interface = { gl_core_get_flags, - NULL, /* set_coords */ - NULL, /* set_mvp */ gl_core_load_texture, gl_core_unload_texture, gl_core_set_video_mode, @@ -1998,6 +2004,31 @@ static bool gl_core_menu_widgets_enabled(void *data) } #endif +static unsigned gl_core_wrap_type_to_enum(enum gfx_wrap_type type) +{ + switch (type) + { + case RARCH_WRAP_BORDER: +#ifdef HAVE_OPENGLES3 + /* GLES does not support CLAMP_TO_BORDER until GLES 3.2. + * It is a deprecated feature in general. */ + return GL_CLAMP_TO_EDGE; +#else + return GL_CLAMP_TO_BORDER; +#endif + case RARCH_WRAP_EDGE: + return GL_CLAMP_TO_EDGE; + case RARCH_WRAP_REPEAT: + return GL_REPEAT; + case RARCH_WRAP_MIRRORED_REPEAT: + return GL_MIRRORED_REPEAT; + default: + break; + } + + return 0; +} + video_driver_t video_gl_core = { gl_core_init, gl_core_frame, @@ -2028,7 +2059,7 @@ video_driver_t video_gl_core = { gl_core_get_overlay_interface, #endif gl_core_get_poke_interface, - /*gl_core_wrap_type_to_enum,*/NULL, + gl_core_wrap_type_to_enum, #if defined(HAVE_MENU) && defined(HAVE_MENU_WIDGETS) gl_core_menu_widgets_enabled #endif diff --git a/gfx/drivers/gx2_gfx.c b/gfx/drivers/gx2_gfx.c index eb90ff3aa0..544354f105 100644 --- a/gfx/drivers/gx2_gfx.c +++ b/gfx/drivers/gx2_gfx.c @@ -1717,8 +1717,6 @@ static uint32_t wiiu_gfx_get_flags(void *data) static const video_poke_interface_t wiiu_poke_interface = { wiiu_gfx_get_flags, - NULL, /* set_coords */ - NULL, /* set_mvp */ wiiu_gfx_load_texture, wiiu_gfx_unload_texture, NULL, /* set_video_mode */ diff --git a/gfx/drivers/gx_gfx.c b/gfx/drivers/gx_gfx.c index 25c615e246..723f481419 100644 --- a/gfx/drivers/gx_gfx.c +++ b/gfx/drivers/gx_gfx.c @@ -1265,8 +1265,6 @@ static void gx_get_video_output_next(void *data) static const video_poke_interface_t gx_poke_interface = { NULL, /* get_flags */ - NULL, /* set_coords */ - NULL, /* set_mvp */ NULL, NULL, gx_set_video_mode, diff --git a/gfx/drivers/omap_gfx.c b/gfx/drivers/omap_gfx.c index 992472eaa2..c202f16ae3 100644 --- a/gfx/drivers/omap_gfx.c +++ b/gfx/drivers/omap_gfx.c @@ -1138,8 +1138,6 @@ static float omap_get_refresh_rate(void *data) static const video_poke_interface_t omap_gfx_poke_interface = { NULL, /* get_flags */ - NULL, /* set_coords */ - NULL, /* set_mvp */ NULL, NULL, NULL, diff --git a/gfx/drivers/ps2_gfx.c b/gfx/drivers/ps2_gfx.c index 40a197ec3f..ff6db846e0 100644 --- a/gfx/drivers/ps2_gfx.c +++ b/gfx/drivers/ps2_gfx.c @@ -172,7 +172,7 @@ static void prim_texture(GSGLOBAL *gsGlobal, GSTEXTURE *texture, int zPosition, GS_TEXT); } -static void clearVRAMIfNeeded(ps2_video_t *ps2, void *frame, int width, int height) +static void clearVRAMIfNeeded(ps2_video_t *ps2, const void *frame, int width, int height) { if (!ps2->clearVRAM) { if(frame && frame != RETRO_HW_FRAME_BUFFER_VALID) { @@ -470,8 +470,6 @@ static bool ps2_get_hw_render_interface(void* data, static const video_poke_interface_t ps2_poke_interface = { NULL, /* get_flags */ - NULL, /* set_coords */ - NULL, /* set_mvp */ NULL, NULL, NULL, diff --git a/gfx/drivers/psp1_gfx.c b/gfx/drivers/psp1_gfx.c index 773fe26b7c..497b866319 100644 --- a/gfx/drivers/psp1_gfx.c +++ b/gfx/drivers/psp1_gfx.c @@ -832,8 +832,6 @@ static void psp_viewport_info(void *data, struct video_viewport *vp) static const video_poke_interface_t psp_poke_interface = { NULL, /* get_flags */ - NULL, /* set_coords */ - NULL, /* set_mvp */ NULL, NULL, NULL, diff --git a/gfx/drivers/sdl2_gfx.c b/gfx/drivers/sdl2_gfx.c index eb13938958..dbd7a2467a 100644 --- a/gfx/drivers/sdl2_gfx.c +++ b/gfx/drivers/sdl2_gfx.c @@ -726,8 +726,6 @@ static void sdl2_grab_mouse_toggle(void *data) static video_poke_interface_t sdl2_video_poke_interface = { NULL, /* get_flags */ - NULL, /* set_coords */ - NULL, /* set_mvp */ NULL, NULL, NULL, diff --git a/gfx/drivers/sdl_gfx.c b/gfx/drivers/sdl_gfx.c index 18a54cdac5..d2d7cbe932 100644 --- a/gfx/drivers/sdl_gfx.c +++ b/gfx/drivers/sdl_gfx.c @@ -518,8 +518,6 @@ static void sdl_grab_mouse_toggle(void *data) static const video_poke_interface_t sdl_poke_interface = { NULL, /* get_flags */ - NULL, /* set_coords */ - NULL, /* set_mvp */ NULL, NULL, NULL, diff --git a/gfx/drivers/sixel_gfx.c b/gfx/drivers/sixel_gfx.c index bf288c7f80..e2c6724e4e 100644 --- a/gfx/drivers/sixel_gfx.c +++ b/gfx/drivers/sixel_gfx.c @@ -599,8 +599,6 @@ static void sixel_set_video_mode(void *data, unsigned width, unsigned height, } static const video_poke_interface_t sixel_poke_interface = { - NULL, - NULL, NULL, NULL, NULL, diff --git a/gfx/drivers/sunxi_gfx.c b/gfx/drivers/sunxi_gfx.c index baf909520a..3f72e4158c 100644 --- a/gfx/drivers/sunxi_gfx.c +++ b/gfx/drivers/sunxi_gfx.c @@ -944,8 +944,6 @@ static float sunxi_get_refresh_rate (void *data) static const video_poke_interface_t sunxi_poke_interface = { NULL, /* get_flags */ - NULL, /* set_coords */ - NULL, /* set_mvp */ NULL, NULL, NULL, /* set_video_mode */ diff --git a/gfx/drivers/switch_gfx.c b/gfx/drivers/switch_gfx.c index 954938ef3f..cedad20ed9 100644 --- a/gfx/drivers/switch_gfx.c +++ b/gfx/drivers/switch_gfx.c @@ -406,8 +406,6 @@ static void switch_set_texture_enable(void *data, bool enable, bool full_screen) static const video_poke_interface_t switch_poke_interface = { NULL, /* get_flags */ - NULL, /* set_coords */ - NULL, /* set_mvp */ NULL, /* load_texture */ NULL, /* unload_texture */ NULL, /* set_video_mode */ diff --git a/gfx/drivers/switch_nx_gfx.c b/gfx/drivers/switch_nx_gfx.c index b54701e720..44cc61cfa8 100644 --- a/gfx/drivers/switch_nx_gfx.c +++ b/gfx/drivers/switch_nx_gfx.c @@ -755,8 +755,6 @@ void switch_overlay_interface(void *data, const video_overlay_interface_t **ifac static const video_poke_interface_t switch_poke_interface = { NULL, /* get_flags */ - NULL, /* set_coords */ - NULL, /* set_mvp */ NULL, /* load_texture */ NULL, /* unload_texture */ NULL, /* set_video_mode */ diff --git a/gfx/drivers/vga_gfx.c b/gfx/drivers/vga_gfx.c index 22182a6229..4c1a96bb06 100644 --- a/gfx/drivers/vga_gfx.c +++ b/gfx/drivers/vga_gfx.c @@ -391,8 +391,6 @@ static void vga_set_osd_msg(void *data, static const video_poke_interface_t vga_poke_interface = { NULL, /* get_flags */ - NULL, /* set_coords */ - NULL, /* set_mvp */ NULL, NULL, NULL, diff --git a/gfx/drivers/vita2d_gfx.c b/gfx/drivers/vita2d_gfx.c index 3e253ee8d4..b0436bc31a 100644 --- a/gfx/drivers/vita2d_gfx.c +++ b/gfx/drivers/vita2d_gfx.c @@ -790,8 +790,6 @@ static bool vita_get_current_sw_framebuffer(void *data, static const video_poke_interface_t vita_poke_interface = { NULL, /* get_flags */ - NULL, /* set_coords */ - NULL, /* set_mvp */ vita_load_texture, vita_unload_texture, NULL, diff --git a/gfx/drivers/vulkan.c b/gfx/drivers/vulkan.c index 297170de5e..dd151870a7 100644 --- a/gfx/drivers/vulkan.c +++ b/gfx/drivers/vulkan.c @@ -2366,7 +2366,7 @@ static void vulkan_unload_texture(void *data, uintptr_t handle) { vk_t *vk = (vk_t*)data; struct vk_texture *texture = (struct vk_texture*)handle; - if (!texture) + if (!texture || !vk) return; /* TODO: We really want to defer this deletion instead, @@ -2407,8 +2407,6 @@ static uint32_t vulkan_get_flags(void *data) static const video_poke_interface_t vulkan_poke_interface = { vulkan_get_flags, - NULL, /* set_coords */ - NULL, /* set_mvp */ vulkan_load_texture, vulkan_unload_texture, vulkan_set_video_mode, diff --git a/gfx/drivers/xshm_gfx.c b/gfx/drivers/xshm_gfx.c index ea728793cc..ed6033fae7 100644 --- a/gfx/drivers/xshm_gfx.c +++ b/gfx/drivers/xshm_gfx.c @@ -205,8 +205,6 @@ static void xshm_grab_mouse_toggle(void *data) static video_poke_interface_t xshm_video_poke_interface = { NULL, /* get_flags */ - NULL, /* set_coords */ - NULL, /* set_mvp */ NULL, NULL, NULL, diff --git a/gfx/drivers/xvideo.c b/gfx/drivers/xvideo.c index 619cbaa712..e1016129fc 100644 --- a/gfx/drivers/xvideo.c +++ b/gfx/drivers/xvideo.c @@ -939,8 +939,6 @@ static video_poke_interface_t xv_video_poke_interface = { NULL, NULL, NULL, - NULL, - NULL, x11_get_refresh_rate, NULL, NULL, diff --git a/gfx/drivers_font/ctr_font.c b/gfx/drivers_font/ctr_font.c index 0443204ac5..fda8f70d21 100644 --- a/gfx/drivers_font/ctr_font.c +++ b/gfx/drivers_font/ctr_font.c @@ -215,8 +215,8 @@ static void ctr_font_render_line( width = glyph->width; height = glyph->height; - v->x0 = x + off_x + delta_x * scale; - v->y0 = y + off_y + delta_y * scale; + v->x0 = x + (off_x + delta_x) * scale; + v->y0 = y + (off_y + delta_y) * scale; v->u0 = tex_x; v->v0 = tex_y; v->x1 = v->x0 + width * scale; @@ -265,7 +265,7 @@ static void ctr_font_render_line( GPU_SetViewport(NULL, VIRT_TO_PHYS(ctr->drawbuffers.top.left), 0, 0, CTR_TOP_FRAMEBUFFER_HEIGHT, - ctr->video_mode == CTR_VIDEO_MODE_800x240 + ctr->video_mode == CTR_VIDEO_MODE_2D_800x240 ? CTR_TOP_FRAMEBUFFER_WIDTH * 2 : CTR_TOP_FRAMEBUFFER_WIDTH); GPU_DrawArray(GPU_GEOMETRY_PRIM, 0, v - ctr->vertex_cache.current); diff --git a/gfx/drivers_font/d3d10_font.c b/gfx/drivers_font/d3d10_font.c index 363008c6c3..0efe989ab9 100644 --- a/gfx/drivers_font/d3d10_font.c +++ b/gfx/drivers_font/d3d10_font.c @@ -178,8 +178,8 @@ static void d3d10_font_render_line( if (!glyph) continue; - v->pos.x = (x + glyph->draw_offset_x) * scale / (float)d3d10->viewport.Width; - v->pos.y = (y + glyph->draw_offset_y) * scale / (float)d3d10->viewport.Height; + v->pos.x = (x + (glyph->draw_offset_x * scale)) / (float)d3d10->viewport.Width; + v->pos.y = (y + (glyph->draw_offset_y * scale)) / (float)d3d10->viewport.Height; v->pos.w = glyph->width * scale / (float)d3d10->viewport.Width; v->pos.h = glyph->height * scale / (float)d3d10->viewport.Height; diff --git a/gfx/drivers_font/d3d11_font.c b/gfx/drivers_font/d3d11_font.c index 5ef55b956f..15f370e772 100644 --- a/gfx/drivers_font/d3d11_font.c +++ b/gfx/drivers_font/d3d11_font.c @@ -176,8 +176,8 @@ static void d3d11_font_render_line( if (!glyph) continue; - v->pos.x = (x + glyph->draw_offset_x) * scale / (float)d3d11->viewport.Width; - v->pos.y = (y + glyph->draw_offset_y) * scale / (float)d3d11->viewport.Height; + v->pos.x = (x + (glyph->draw_offset_x * scale)) / (float)d3d11->viewport.Width; + v->pos.y = (y + (glyph->draw_offset_y * scale)) / (float)d3d11->viewport.Height; v->pos.w = glyph->width * scale / (float)d3d11->viewport.Width; v->pos.h = glyph->height * scale / (float)d3d11->viewport.Height; diff --git a/gfx/drivers_font/d3d12_font.c b/gfx/drivers_font/d3d12_font.c index c37b56b374..741ea953b0 100644 --- a/gfx/drivers_font/d3d12_font.c +++ b/gfx/drivers_font/d3d12_font.c @@ -184,8 +184,8 @@ static void d3d12_font_render_line( if (!glyph) continue; - v->pos.x = (x + glyph->draw_offset_x) * scale / (float)d3d12->chain.viewport.Width; - v->pos.y = (y + glyph->draw_offset_y) * scale / (float)d3d12->chain.viewport.Height; + v->pos.x = (x + (glyph->draw_offset_x * scale)) / (float)d3d12->chain.viewport.Width; + v->pos.y = (y + (glyph->draw_offset_y * scale)) / (float)d3d12->chain.viewport.Height; v->pos.w = glyph->width * scale / (float)d3d12->chain.viewport.Width; v->pos.h = glyph->height * scale / (float)d3d12->chain.viewport.Height; diff --git a/gfx/drivers_font/gl1_raster_font.c b/gfx/drivers_font/gl1_raster_font.c index fcd14c8476..658c4f9b49 100644 --- a/gfx/drivers_font/gl1_raster_font.c +++ b/gfx/drivers_font/gl1_raster_font.c @@ -237,22 +237,12 @@ static void gl1_raster_font_draw_vertices(gl1_raster_t *font, const video_coords_t *coords, video_frame_info_t *video_info) { - video_shader_ctx_coords_t coords_data; - if (font->atlas->dirty) { gl1_raster_font_upload_atlas(font); font->atlas->dirty = false; } - coords_data.handle_data = NULL; - coords_data.data = coords; - - video_driver_set_coords(&coords_data); - - /*video_info->cb_set_mvp(font->gl, - video_info->shader_data, &font->gl->mvp_no_rot);*/ - glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadMatrixf(font->gl->mvp.data); @@ -560,7 +550,6 @@ static void gl1_raster_font_bind_block(void *data, void *userdata) font->block = block; } - static int gl1_get_line_height(void *data) { gl1_raster_t *font = (gl1_raster_t*)data; diff --git a/gfx/drivers_font/gl_raster_font.c b/gfx/drivers_font/gl_raster_font.c index c1150ec86b..3f1fb18b51 100644 --- a/gfx/drivers_font/gl_raster_font.c +++ b/gfx/drivers_font/gl_raster_font.c @@ -249,21 +249,15 @@ static void gl_raster_font_draw_vertices(gl_raster_t *font, const video_coords_t *coords, video_frame_info_t *video_info) { - video_shader_ctx_coords_t coords_data; - if (font->atlas->dirty) { gl_raster_font_upload_atlas(font); font->atlas->dirty = false; } - coords_data.handle_data = NULL; - coords_data.data = coords; - - video_driver_set_coords(&coords_data); - - video_info->cb_set_mvp(font->gl, - video_info->shader_data, &font->gl->mvp_no_rot); + font->gl->shader->set_coords(font->gl->shader_data, coords); + font->gl->shader->set_mvp(font->gl->shader_data, + &font->gl->mvp_no_rot); glDrawArrays(GL_TRIANGLES, 0, coords->vertices); } diff --git a/gfx/drivers_font/metal_raster_font.m b/gfx/drivers_font/metal_raster_font.m index 734034c643..49641d9b91 100644 --- a/gfx/drivers_font/metal_raster_font.m +++ b/gfx/drivers_font/metal_raster_font.m @@ -298,8 +298,8 @@ static INLINE void write_quad6(SpriteVertex *pv, height = glyph->height; write_quad6(v, - (x + off_x + delta_x * scale) * inv_win_width, - (y + off_y + delta_y * scale) * inv_win_height, + (x + (off_x + delta_x) * scale) * inv_win_width, + (y + (off_y + delta_y) * scale) * inv_win_height, width * scale * inv_win_width, height * scale * inv_win_height, tex_x * inv_tex_size_x, diff --git a/gfx/drivers_font/vita2d_font.c b/gfx/drivers_font/vita2d_font.c index b333c6ff51..7f5ef08485 100644 --- a/gfx/drivers_font/vita2d_font.c +++ b/gfx/drivers_font/vita2d_font.c @@ -209,8 +209,8 @@ static void vita2d_font_render_line( } vita2d_draw_texture_tint_part_scale(font->texture, - x + off_x + delta_x * scale, - y + off_y + delta_y * scale, + x + (off_x + delta_x) * scale, + y + (off_y + delta_y) * scale, tex_x, tex_y, width, height, scale, scale, diff --git a/gfx/drivers_font/vulkan_raster_font.c b/gfx/drivers_font/vulkan_raster_font.c index aae54e604a..553499aecf 100644 --- a/gfx/drivers_font/vulkan_raster_font.c +++ b/gfx/drivers_font/vulkan_raster_font.c @@ -203,8 +203,8 @@ static void vulkan_raster_font_render_line( height = glyph->height; vulkan_write_quad_vbo(font->pv + font->vertices, - (x + off_x + delta_x * scale) * inv_win_width, - (y + off_y + delta_y * scale) * inv_win_height, + (x + (off_x + delta_x) * scale) * inv_win_width, + (y + (off_y + delta_y) * scale) * inv_win_height, width * scale * inv_win_width, height * scale * inv_win_height, tex_x * inv_tex_size_x, diff --git a/gfx/drivers_font_renderer/stb_unicode.c b/gfx/drivers_font_renderer/stb_unicode.c index 72c925b14a..7f31afc6bb 100644 --- a/gfx/drivers_font_renderer/stb_unicode.c +++ b/gfx/drivers_font_renderer/stb_unicode.c @@ -66,6 +66,13 @@ typedef struct unsigned usage_counter; } stb_unicode_font_renderer_t; +/* Ugly little thing... */ +static int INLINE round_away_from_zero(float f) +{ + double round = (f < 0.0) ? floor((double)f) : ceil((double)f); + return (int)round; +} + static struct font_atlas *font_renderer_stb_unicode_get_atlas(void *data) { stb_unicode_font_renderer_t *self = (stb_unicode_font_renderer_t*)data; @@ -145,18 +152,29 @@ static const struct font_glyph *font_renderer_stb_unicode_get_glyph( dst = (uint8_t*)self->atlas.buffer + atlas_slot->glyph.atlas_offset_x + atlas_slot->glyph.atlas_offset_y * self->atlas.width; - stbtt_MakeGlyphBitmap(&self->info, dst, self->max_glyph_width, self->max_glyph_height, - self->atlas.width, self->scale_factor, self->scale_factor, glyph_index); - stbtt_GetGlyphHMetrics(&self->info, glyph_index, &advance_width, &left_side_bearing); - stbtt_GetGlyphBox(&self->info, glyph_index, &x0, NULL, NULL, &y1); + if (stbtt_GetGlyphBox(&self->info, glyph_index, &x0, NULL, NULL, &y1)) + { + stbtt_MakeGlyphBitmap(&self->info, dst, self->max_glyph_width, self->max_glyph_height, + self->atlas.width, self->scale_factor, self->scale_factor, glyph_index); + } + else + { + /* This means the glyph is empty. In this case, stbtt_MakeGlyphBitmap() + * fills the corresponding region of the atlas buffer with garbage, + * so just zero it */ + int x, y; + for (x = 0; x < self->max_glyph_width; x++) + for (y = 0; y < self->max_glyph_height; y++) + dst[x + (y * self->atlas.width)] = 0; + } atlas_slot->glyph.width = self->max_glyph_width; atlas_slot->glyph.height = self->max_glyph_height; - atlas_slot->glyph.advance_x = advance_width * self->scale_factor; - /* atlas_slot->glyph.advance_y = 0 ; */ - atlas_slot->glyph.draw_offset_x = x0 * self->scale_factor; - atlas_slot->glyph.draw_offset_y = -y1 * self->scale_factor; + atlas_slot->glyph.advance_x = round_away_from_zero((float)advance_width * self->scale_factor); + atlas_slot->glyph.advance_y = 0; + atlas_slot->glyph.draw_offset_x = round_away_from_zero((float)x0 * self->scale_factor); + atlas_slot->glyph.draw_offset_y = round_away_from_zero((float)(-y1) * self->scale_factor); self->atlas.dirty = true; atlas_slot->last_used = self->usage_counter++; @@ -177,7 +195,7 @@ static bool font_renderer_stb_unicode_create_atlas( self->atlas.height = self->max_glyph_height * STB_UNICODE_ATLAS_ROWS; self->atlas.buffer = (uint8_t*) - calloc(self->atlas.width * self->atlas.height, 1); + calloc(self->atlas.width * self->atlas.height, sizeof(uint8_t)); if (!self->atlas.buffer) return false; diff --git a/gfx/drivers_shader/shader_gl_cg.c b/gfx/drivers_shader/shader_gl_cg.c index 250d2a6716..71e805b76e 100644 --- a/gfx/drivers_shader/shader_gl_cg.c +++ b/gfx/drivers_shader/shader_gl_cg.c @@ -244,7 +244,7 @@ static void gl_cg_reset_attrib(void *data) cg->attribs_index = 0; } -static bool gl_cg_set_mvp(void *data, void *shader_data, +static bool gl_cg_set_mvp(void *shader_data, const void *mat_data) { cg_shader_data_t *cg = (cg_shader_data_t*)shader_data; @@ -258,7 +258,8 @@ static bool gl_cg_set_mvp(void *data, void *shader_data, return false; } -static bool gl_cg_set_coords(void *handle_data, void *shader_data, const struct video_coords *coords) +static bool gl_cg_set_coords(void *shader_data, + const struct video_coords *coords) { cg_shader_data_t *cg = (cg_shader_data_t*)shader_data; diff --git a/gfx/drivers_shader/shader_glsl.c b/gfx/drivers_shader/shader_glsl.c index 7ea03027ac..3550074eae 100644 --- a/gfx/drivers_shader/shader_glsl.c +++ b/gfx/drivers_shader/shader_glsl.c @@ -1410,13 +1410,11 @@ static void gl_glsl_set_params(void *dat, void *shader_data) } } -static bool gl_glsl_set_mvp(void *data, void *shader_data, const void *mat_data) +static bool gl_glsl_set_mvp(void *shader_data, const void *mat_data) { int loc; glsl_shader_data_t *glsl = (glsl_shader_data_t*)shader_data; - (void)data; - if (!glsl || !glsl->shader->modern) return false; @@ -1448,7 +1446,7 @@ static bool gl_glsl_set_mvp(void *data, void *shader_data, const void *mat_data) buffer[y + size] = coord2[y]; \ size += multiplier * coords->vertices; \ -static bool gl_glsl_set_coords(void *handle_data, void *shader_data, +static bool gl_glsl_set_coords(void *shader_data, const struct video_coords *coords) { GLfloat short_buffer[4 * (2 + 2 + 4 + 2)]; diff --git a/gfx/drivers_shader/shader_vulkan.cpp b/gfx/drivers_shader/shader_vulkan.cpp index 0578522351..ec3be3d1bd 100644 --- a/gfx/drivers_shader/shader_vulkan.cpp +++ b/gfx/drivers_shader/shader_vulkan.cpp @@ -1369,7 +1369,7 @@ bool Pass::init_pipeline_layout() if (reflection.push_constant_stage_mask & SLANG_STAGE_FRAGMENT_MASK) push_range.stageFlags |= VK_SHADER_STAGE_FRAGMENT_BIT; - RARCH_LOG("[Vulkan]: Push Constant Block: %u bytes.\n", reflection.push_constant_size); + RARCH_LOG("[Vulkan]: Push Constant Block: %u bytes.\n", (unsigned int)reflection.push_constant_size); layout_info.pushConstantRangeCount = 1; layout_info.pPushConstantRanges = &push_range; diff --git a/gfx/drivers_shader/slang_reflection.cpp b/gfx/drivers_shader/slang_reflection.cpp index e9ef89ce23..1726840da6 100644 --- a/gfx/drivers_shader/slang_reflection.cpp +++ b/gfx/drivers_shader/slang_reflection.cpp @@ -643,9 +643,9 @@ bool slang_reflect(const Compiler &vertex_compiler, const Compiler &fragment_com for (auto ¶m : reflection->semantic_float_parameters) { if (param.uniform) - RARCH_LOG("[slang]: #%u (Offset: %u)\n", i, param.ubo_offset); + RARCH_LOG("[slang]: #%u (Offset: %u)\n", i, (unsigned int)param.ubo_offset); if (param.push_constant) - RARCH_LOG("[slang]: #%u (PushOffset: %u)\n", i, param.push_constant_offset); + RARCH_LOG("[slang]: #%u (PushOffset: %u)\n", i, (unsigned int)param.push_constant_offset); i++; } diff --git a/gfx/font_driver.c b/gfx/font_driver.c index 3f433e2a4e..936872675a 100644 --- a/gfx/font_driver.c +++ b/gfx/font_driver.c @@ -34,7 +34,7 @@ static const font_renderer_driver_t *font_backends[] = { &coretext_font_renderer, #endif #ifdef HAVE_STB_FONT -#if defined(VITA) || defined(WIIU) || defined(ANDROID) || defined(_WIN32) && !defined(_XBOX) && !defined(_MSC_VER) || (defined(_WIN32) && !defined(_XBOX) && defined(_MSC_VER) && _MSC_VER > 1400) || defined(__CELLOS_LV2__) || defined(HAVE_LIBNX) || defined (HAVE_EMSCRIPTEN) +#if defined(VITA) || defined(WIIU) || defined(ANDROID) || defined(_WIN32) && !defined(_XBOX) && !defined(_MSC_VER) || (defined(_WIN32) && !defined(_XBOX) && defined(_MSC_VER) && _MSC_VER > 1400) || defined(__CELLOS_LV2__) || defined(HAVE_LIBNX) || defined(__linux__) || defined (HAVE_EMSCRIPTEN) &stb_unicode_font_renderer, #else &stb_font_renderer, @@ -1074,6 +1074,8 @@ int font_driver_get_message_width(void *font_data, const char *msg, unsigned len, float scale) { font_data_t *font = (font_data_t*)(font_data ? font_data : video_font_driver); + if (len == 0 && msg) + len = (unsigned)strlen(msg); if (font && font->renderer && font->renderer->get_message_width) return font->renderer->get_message_width(font->renderer_data, msg, len, scale); return -1; diff --git a/gfx/video_driver.c b/gfx/video_driver.c index 6150b329af..5e0c098a09 100644 --- a/gfx/video_driver.c +++ b/gfx/video_driver.c @@ -47,6 +47,9 @@ #ifdef HAVE_MENU #include "../menu/menu_driver.h" #include "../menu/menu_setting.h" +#ifdef HAVE_MENU_WIDGETS +#include "../menu/widgets/menu_widgets.h" +#endif #endif #include "video_thread_wrapper.h" @@ -125,8 +128,6 @@ typedef struct video_pixel_scaler void *scaler_out; } video_pixel_scaler_t; -static bool (*video_driver_cb_shader_set_mvp)(void *data, - void *shader_data, const void *mat_data); bool (*video_driver_cb_has_focus)(void); /* Opaque handles to currently running window. @@ -227,9 +228,6 @@ 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; - static char video_driver_gpu_device_string[128] = {0}; static char video_driver_gpu_api_version_string[128] = {0}; @@ -2372,14 +2370,10 @@ void video_driver_frame(const void *data, unsigned width, unsigned height, size_t pitch) { static char video_driver_msg[256]; - static char title[256]; video_frame_info_t video_info; static retro_time_t curr_time; static retro_time_t fps_time; static float last_fps, frame_time; - unsigned output_width = 0; - unsigned output_height = 0; - unsigned output_pitch = 0; const char *msg = NULL; retro_time_t new_time = cpu_features_get_time_usec(); @@ -2412,6 +2406,7 @@ void video_driver_frame(const void *data, unsigned width, /* Get the amount of frames per seconds. */ if (video_driver_frame_count) { + static char title[256]; unsigned write_index = video_driver_frame_time_count++ & (MEASURE_FRAME_TIME_SAMPLES_COUNT - 1); @@ -2422,83 +2417,46 @@ void video_driver_frame(const void *data, unsigned width, if (video_driver_frame_count == 1) strlcpy(title, video_driver_window_title, sizeof(title)); - if ((video_driver_frame_count % FPS_UPDATE_INTERVAL) == 0) - { - char frames_text[64]; - last_fps = TIME_TO_FPS(curr_time, new_time, FPS_UPDATE_INTERVAL); - - if (video_info.fps_show || video_info.framecount_show) - { - if (video_info.fps_show) - { - snprintf(video_info.fps_text, sizeof(video_info.fps_text), - " || FPS: %6.1f ", last_fps); - } - if (video_info.framecount_show) - { - snprintf(frames_text, - sizeof(frames_text), - " || Frames: %" PRIu64, - (uint64_t)video_driver_frame_count); - } - snprintf(video_driver_window_title, sizeof(video_driver_window_title), - "%s%s%s", title, - video_info.fps_show ? video_info.fps_text : "", - video_info.framecount_show ? frames_text : ""); - } - else - { - if (!string_is_equal(video_driver_window_title, title)) - strlcpy(video_driver_window_title, title, sizeof(video_driver_window_title)); - } - - curr_time = new_time; - video_driver_window_title_update = true; - } - if (video_info.fps_show) { + snprintf(video_info.fps_text, sizeof(video_info.fps_text), + "FPS: %6.1f", last_fps); if (video_info.framecount_show) - snprintf( - video_info.fps_text, - sizeof(video_info.fps_text), - "FPS: %6.1f || %s: %" PRIu64, - last_fps, - msg_hash_to_str(MSG_FRAMES), - (uint64_t)video_driver_frame_count); - else - snprintf( - video_info.fps_text, - sizeof(video_info.fps_text), - "FPS: %6.1f", - last_fps); + strlcat(video_info.fps_text, + " || ", sizeof(video_info.fps_text)); } - if (video_info.fps_show && video_info.framecount_show) - snprintf( - video_info.fps_text, - sizeof(video_info.fps_text), - "FPS: %6.1f || %s: %" PRIu64, - last_fps, - msg_hash_to_str(MSG_FRAMES), + if (video_info.framecount_show) + { + char frames_text[64]; + snprintf(frames_text, + sizeof(frames_text), + "%s: %" PRIu64, msg_hash_to_str(MSG_FRAMES), (uint64_t)video_driver_frame_count); - else if (video_info.framecount_show) - snprintf( - video_info.fps_text, - sizeof(video_info.fps_text), - "%s: %" PRIu64, - msg_hash_to_str(MSG_FRAMES), - (uint64_t)video_driver_frame_count); - else if (video_info.fps_show) - snprintf( - video_info.fps_text, - sizeof(video_info.fps_text), - "FPS: %6.1f", - last_fps); + strlcat(video_info.fps_text, + frames_text, sizeof(video_info.fps_text)); + } + + if ((video_driver_frame_count % FPS_UPDATE_INTERVAL) == 0) + { + last_fps = TIME_TO_FPS(curr_time, new_time, FPS_UPDATE_INTERVAL); + + strlcpy(video_driver_window_title, title, sizeof(video_driver_window_title)); + + if (!string_is_empty(video_info.fps_text)) + { + strlcat(video_driver_window_title, + "|| ", sizeof(video_driver_window_title)); + strlcat(video_driver_window_title, + video_info.fps_text, sizeof(video_driver_window_title)); + } + + curr_time = new_time; + video_driver_window_title_update = true; + } } else { - curr_time = fps_time = new_time; strlcpy(video_driver_window_title, @@ -2513,8 +2471,8 @@ void video_driver_frame(const void *data, unsigned width, video_driver_window_title_update = true; } - video_info.frame_rate = last_fps; - video_info.frame_time = frame_time / 1000.0f; + video_info.frame_rate = last_fps; + video_info.frame_time = frame_time / 1000.0f; video_info.frame_count = (uint64_t) video_driver_frame_count; /* Slightly messy code, @@ -2534,6 +2492,10 @@ void video_driver_frame(const void *data, unsigned width, if (data && video_driver_state_filter) { + unsigned output_width = 0; + unsigned output_height = 0; + unsigned output_pitch = 0; + rarch_softfilter_get_output_size(video_driver_state_filter, &output_width, &output_height, width, height); @@ -2637,7 +2599,10 @@ void video_driver_frame(const void *data, unsigned width, /* Display the FPS, with a higher priority. */ if (video_info.fps_show || video_info.framecount_show) - runloop_msg_queue_push(video_info.fps_text, 2, 1, true, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); +#if defined(HAVE_MENU) && defined(HAVE_MENU_WIDGETS) + if (!video_driver_has_widgets() || !menu_widgets_set_fps_text(video_info.fps_text)) +#endif + runloop_msg_queue_push(video_info.fps_text, 2, 1, true, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); /* trigger set resolution*/ if (video_info.crt_switch_resolution) @@ -2703,9 +2668,17 @@ bool video_driver_texture_load(void *data, enum texture_filter_type filter_type, uintptr_t *id) { +#ifdef HAVE_THREADS + bool is_threaded = video_driver_is_threaded_internal(); +#endif if (!id || !video_driver_poke || !video_driver_poke->load_texture) return false; +#ifdef HAVE_THREADS + if (is_threaded) + video_context_driver_make_current(false); +#endif + *id = video_driver_poke->load_texture(video_driver_data, data, video_driver_is_threaded_internal(), filter_type); @@ -2715,9 +2688,17 @@ bool video_driver_texture_load(void *data, bool video_driver_texture_unload(uintptr_t *id) { +#ifdef HAVE_THREADS + bool is_threaded = video_driver_is_threaded_internal(); +#endif if (!video_driver_poke || !video_driver_poke->unload_texture) return false; +#ifdef HAVE_THREADS + if (is_threaded) + video_context_driver_make_current(false); +#endif + video_driver_poke->unload_texture(video_driver_data, *id); *id = 0; return true; @@ -2828,16 +2809,12 @@ void video_driver_build_info(video_frame_info_t *video_info) video_info->input_driver_nonblock_state = input_driver_is_nonblock_state(); video_info->context_data = video_context_data; - video_info->shader_driver = current_shader; - video_info->shader_data = current_shader_data; video_info->cb_update_window_title = current_video_context.update_window_title; video_info->cb_swap_buffers = current_video_context.swap_buffers; video_info->cb_get_metrics = current_video_context.get_metrics; video_info->cb_set_resize = current_video_context.set_resize; - video_info->cb_set_mvp = video_driver_cb_shader_set_mvp; - video_info->userdata = video_driver_get_ptr(false); #ifdef HAVE_THREADS @@ -3284,7 +3261,7 @@ bool video_context_driver_show_mouse(bool *bool_data) return true; } -static bool video_context_driver_get_flags(gfx_ctx_flags_t *flags) +bool video_context_driver_get_flags(gfx_ctx_flags_t *flags) { if (!current_video_context.get_flags) return false; @@ -3363,6 +3340,10 @@ enum gfx_ctx_api video_context_driver_get_api(void) return GFX_CTX_GX_API; else if (string_is_equal(video_driver, "gl")) return GFX_CTX_OPENGL_API; + else if (string_is_equal(video_driver, "gl1")) + return GFX_CTX_OPENGL_API; + else if (string_is_equal(video_driver, "glcore")) + return GFX_CTX_OPENGL_API; else if (string_is_equal(video_driver, "vulkan")) return GFX_CTX_VULKAN_API; else if (string_is_equal(video_driver, "metal")) @@ -3392,46 +3373,6 @@ bool video_driver_cached_frame_has_valid_framebuffer(void) return false; } -static const shader_backend_t *video_shader_set_backend( - enum rarch_shader_type type) -{ - switch (type) - { - case RARCH_SHADER_CG: - { -#ifdef HAVE_CG - gfx_ctx_flags_t flags; - flags.flags = 0; - video_context_driver_get_flags(&flags); - - if (BIT32_GET(flags.flags, GFX_CTX_FLAGS_GL_CORE_CONTEXT)) - { - RARCH_ERR("[Shader driver]: Cg cannot be used with core" - " GL context. Trying to fall back to GLSL...\n"); - return video_shader_set_backend(RARCH_SHADER_GLSL); - } - - RARCH_LOG("[Shader driver]: Using Cg shader backend.\n"); - return &gl_cg_backend; -#else - break; -#endif - } - case RARCH_SHADER_GLSL: -#ifdef HAVE_GLSL - RARCH_LOG("[Shader driver]: Using GLSL shader backend.\n"); - return &gl_glsl_backend; -#else - break; -#endif - case RARCH_SHADER_HLSL: - case RARCH_SHADER_NONE: - default: - break; - } - - return NULL; -} bool video_shader_driver_get_current_shader(video_shader_ctx_t *shader) { @@ -3445,116 +3386,6 @@ bool video_shader_driver_get_current_shader(video_shader_ctx_t *shader) return true; } -bool video_shader_driver_deinit(void) -{ - current_shader_data = NULL; - current_shader = NULL; - return true; -} - -static bool video_driver_cb_set_mvp(void *data, - void *shader_data, const void *mat_data) -{ - video_shader_ctx_mvp_t mvp; - mvp.data = data; - mvp.matrix = mat_data; - - video_driver_set_mvp(&mvp); - return true; -} - -static void video_shader_driver_reset_to_defaults(void) -{ - if (!current_shader) - return; - - if (current_shader->set_mvp) - video_driver_cb_shader_set_mvp = current_shader->set_mvp; - else - { - current_shader->set_mvp = video_driver_cb_set_mvp; - video_driver_cb_shader_set_mvp = video_driver_cb_set_mvp; - } -} - -/* Finds first suitable shader context driver. */ -bool video_shader_driver_init_first(const void *data) -{ - shader_backend_t *ptr = (shader_backend_t*)data; - if (!ptr) - return false; - current_shader = ptr; - video_shader_driver_reset_to_defaults(); - return true; -} - -bool video_shader_driver_init(video_shader_ctx_init_t *init) -{ - void *tmp = NULL; - settings_t *settings = config_get_ptr(); - - if (!init->shader || !init->shader->init) - { - init->shader = video_shader_set_backend(init->shader_type); - - if (!init->shader) - return false; - } - - tmp = init->shader->init(init->data, init->path); - - if (!tmp) - return false; - - if (string_is_equal(settings->arrays.menu_driver, "xmb") - && init->shader->init_menu_shaders) - { - RARCH_LOG("Setting up menu pipeline shaders for XMB ... \n"); - init->shader->init_menu_shaders(tmp); - } - - init->shader_data = tmp; - current_shader_data = tmp; - - RARCH_LOG("Resetting shader to defaults ... \n"); - - current_shader = (shader_backend_t*)init->shader; - video_shader_driver_reset_to_defaults(); - - return true; -} - -void video_driver_set_coords(video_shader_ctx_coords_t *coords) -{ - if (current_shader && current_shader->set_coords) - current_shader->set_coords(coords->handle_data, - current_shader_data, - (const struct video_coords*)coords->data); - else - { - if (video_driver_poke && video_driver_poke->set_coords) - video_driver_poke->set_coords(coords->handle_data, - current_shader_data, - (const struct video_coords*)coords->data); - } -} - -void video_driver_set_mvp(video_shader_ctx_mvp_t *mvp) -{ - if (!mvp || !mvp->matrix) - return; - - if (current_shader && current_shader->set_mvp) - current_shader->set_mvp(mvp->data, - current_shader_data, mvp->matrix); - else - { - if (video_driver_poke && video_driver_poke->set_mvp) - video_driver_poke->set_mvp(mvp->data, - current_shader_data, mvp->matrix); - } -} - float video_driver_get_refresh_rate(void) { if (video_driver_poke && video_driver_poke->get_refresh_rate) diff --git a/gfx/video_driver.h b/gfx/video_driver.h index 4d2d8597dc..a005e3dc87 100644 --- a/gfx/video_driver.h +++ b/gfx/video_driver.h @@ -234,10 +234,8 @@ typedef struct shader_backend enum gfx_wrap_type (*wrap_type)(void *data, unsigned index); void (*shader_scale)(void *data, unsigned index, struct gfx_fbo_scale *scale); - bool (*set_coords)(void *handle_data, - void *shader_data, const struct video_coords *coords); - bool (*set_mvp)(void *data, void *shader_data, - const void *mat_data); + bool (*set_coords)(void *shader_data, const struct video_coords *coords); + bool (*set_mvp)(void *shader_data, const void *mat_data); unsigned (*get_prev_textures)(void *data); bool (*get_feedback_pass)(void *data, unsigned *pass); bool (*mipmap_input)(void *data, unsigned index); @@ -492,13 +490,8 @@ typedef struct video_frame_info float *value); bool (*cb_set_resize)(void*, unsigned, unsigned); - bool (*cb_set_mvp)(void *data, void *shader_data, - const void *mat_data); - void *context_data; - void *shader_data; void *userdata; - const shader_backend_t *shader_driver; } video_frame_info_t; typedef void (*update_window_title_cb)(void*, void*); @@ -691,10 +684,6 @@ struct aspect_ratio_elem typedef struct video_poke_interface { uint32_t (*get_flags)(void *data); - void (*set_coords)(void *handle_data, void *shader_data, - const struct video_coords *coords); - void (*set_mvp)(void *data, void *shader_data, - const void *mat_data); uintptr_t (*load_texture)(void *video_data, void *data, bool threaded, enum texture_filter_type filter_type); void (*unload_texture)(void *data, uintptr_t id); @@ -1192,16 +1181,6 @@ void video_context_driver_free(void); bool video_shader_driver_get_current_shader(video_shader_ctx_t *shader); -bool video_shader_driver_deinit(void); - -bool video_shader_driver_init_first(const void *data); - -bool video_shader_driver_init(video_shader_ctx_init_t *init); - -void video_driver_set_coords(video_shader_ctx_coords_t *coords); - -void video_driver_set_mvp(video_shader_ctx_mvp_t *mvp); - float video_driver_get_refresh_rate(void); extern bool (*video_driver_cb_has_focus)(void); @@ -1210,6 +1189,8 @@ bool video_driver_started_fullscreen(void); bool video_driver_is_threaded(void); +bool video_context_driver_get_flags(gfx_ctx_flags_t *flags); + bool video_driver_get_all_flags(gfx_ctx_flags_t *flags, enum display_flags flag); diff --git a/gfx/video_filters/blargg_ntsc_snes.c b/gfx/video_filters/blargg_ntsc_snes.c index 131ea3161d..a75a7986da 100644 --- a/gfx/video_filters/blargg_ntsc_snes.c +++ b/gfx/video_filters/blargg_ntsc_snes.c @@ -84,35 +84,35 @@ static void blargg_ntsc_snes_initialize(void *data, { if (memcmp(tvtype, "composite", 9) == 0) { - setup = snes_ntsc_composite; + setup = retroarch_snes_ntsc_composite; setup.merge_fields = 1; } else if (memcmp(tvtype, "rf", 2) == 0) { - setup = snes_ntsc_composite; + setup = retroarch_snes_ntsc_composite; setup.merge_fields = 0; } else if (memcmp(tvtype, "rgb", 3) == 0) { - setup = snes_ntsc_rgb; + setup = retroarch_snes_ntsc_rgb; setup.merge_fields = 1; } else if (memcmp(tvtype, "svideo", 6) == 0) { - setup = snes_ntsc_svideo; + setup = retroarch_snes_ntsc_svideo; setup.merge_fields = 1; } } else { - setup = snes_ntsc_composite; + setup = retroarch_snes_ntsc_composite; setup.merge_fields = 1; } config->free(tvtype); tvtype = NULL; - snes_ntsc_init(filt->ntsc, &setup); + retroarch_snes_ntsc_init(filt->ntsc, &setup); filt->burst = 0; filt->burst_toggle = (setup.merge_fields ? 0 : 1); @@ -170,10 +170,10 @@ static void blargg_ntsc_snes_render_rgb565(void *data, int width, int height, { struct filter_data *filt = (struct filter_data*)data; if(width <= 256) - snes_ntsc_blit(filt->ntsc, input, pitch, filt->burst, + retroarch_snes_ntsc_blit(filt->ntsc, input, pitch, filt->burst, width, height, output, outpitch * 2, first, last); else - snes_ntsc_blit_hires(filt->ntsc, input, pitch, filt->burst, + retroarch_snes_ntsc_blit_hires(filt->ntsc, input, pitch, filt->burst, width, height, output, outpitch * 2, first, last); filt->burst ^= filt->burst_toggle; diff --git a/gfx/video_filters/snes_ntsc/snes_ntsc.c b/gfx/video_filters/snes_ntsc/snes_ntsc.c index bb33031389..97cbc7d6d9 100644 --- a/gfx/video_filters/snes_ntsc/snes_ntsc.c +++ b/gfx/video_filters/snes_ntsc/snes_ntsc.c @@ -15,10 +15,10 @@ details. You should have received a copy of the GNU Lesser General Public License along with this module; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -snes_ntsc_setup_t const snes_ntsc_monochrome = { 0,-1, 0, 0,.2, 0,.2,-.2,-.2,-1, 1, 0, 0 }; -snes_ntsc_setup_t const snes_ntsc_composite = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }; -snes_ntsc_setup_t const snes_ntsc_svideo = { 0, 0, 0, 0,.2, 0,.2, -1, -1, 0, 1, 0, 0 }; -snes_ntsc_setup_t const snes_ntsc_rgb = { 0, 0, 0, 0,.2, 0,.7, -1, -1,-1, 1, 0, 0 }; +snes_ntsc_setup_t const retroarch_snes_ntsc_monochrome = { 0,-1, 0, 0,.2, 0,.2,-.2,-.2,-1, 1, 0, 0 }; +snes_ntsc_setup_t const retroarch_snes_ntsc_composite = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }; +snes_ntsc_setup_t const retroarch_snes_ntsc_svideo = { 0, 0, 0, 0,.2, 0,.2, -1, -1, 0, 1, 0, 0 }; +snes_ntsc_setup_t const retroarch_snes_ntsc_rgb = { 0, 0, 0, 0,.2, 0,.7, -1, -1,-1, 1, 0, 0 }; #define alignment_count 3 #define burst_count 3 @@ -35,7 +35,7 @@ snes_ntsc_setup_t const snes_ntsc_rgb = { 0, 0, 0, 0,.2, 0,.7, -1, -1,-1 #include "snes_ntsc_impl.h" /* 3 input pixels -> 8 composite samples */ -pixel_info_t const snes_ntsc_pixels [alignment_count] = { +pixel_info_t const retroarch_snes_ntsc_pixels [alignment_count] = { { PIXEL_OFFSET( -4, -9 ), { 1, 1, .6667f, 0 } }, { PIXEL_OFFSET( -2, -7 ), { .3333f, 1, 1, .3333f } }, { PIXEL_OFFSET( 0, -5 ), { 0, .6667f, 1, 1 } }, @@ -77,13 +77,13 @@ static void correct_errors( snes_ntsc_rgb_t color, snes_ntsc_rgb_t* out ) } } -void snes_ntsc_init( snes_ntsc_t* ntsc, snes_ntsc_setup_t const* setup ) +void retroarch_snes_ntsc_init( snes_ntsc_t* ntsc, snes_ntsc_setup_t const* setup ) { int merge_fields; int entry; init_t impl; if ( !setup ) - setup = &snes_ntsc_composite; + setup = &retroarch_snes_ntsc_composite; init( &impl, setup ); merge_fields = setup->merge_fields; @@ -118,7 +118,7 @@ void snes_ntsc_init( snes_ntsc_t* ntsc, snes_ntsc_setup_t const* setup ) #ifndef SNES_NTSC_NO_BLITTERS -void snes_ntsc_blit( snes_ntsc_t const* ntsc, SNES_NTSC_IN_T const* input, long in_row_width, +void retroarch_snes_ntsc_blit( snes_ntsc_t const* ntsc, SNES_NTSC_IN_T const* input, long in_row_width, int burst_phase, int in_width, int in_height, void* rgb_out, long out_pitch, int first, int last ) { int chunk_count = (in_width - 1) / snes_ntsc_in_chunk; @@ -171,7 +171,7 @@ void snes_ntsc_blit( snes_ntsc_t const* ntsc, SNES_NTSC_IN_T const* input, long } } -void snes_ntsc_blit_hires( snes_ntsc_t const* ntsc, SNES_NTSC_IN_T const* input, long in_row_width, +void retroarch_snes_ntsc_blit_hires( snes_ntsc_t const* ntsc, SNES_NTSC_IN_T const* input, long in_row_width, int burst_phase, int in_width, int in_height, void* rgb_out, long out_pitch, int first, int last ) { int chunk_count = (in_width - 2) / (snes_ntsc_in_chunk * 2); diff --git a/gfx/video_filters/snes_ntsc/snes_ntsc.h b/gfx/video_filters/snes_ntsc/snes_ntsc.h index a8e728a237..df8d1c4c5d 100644 --- a/gfx/video_filters/snes_ntsc/snes_ntsc.h +++ b/gfx/video_filters/snes_ntsc/snes_ntsc.h @@ -34,25 +34,25 @@ typedef struct snes_ntsc_setup_t } snes_ntsc_setup_t; /* Video format presets */ -extern snes_ntsc_setup_t const snes_ntsc_composite; /* color bleeding + artifacts */ -extern snes_ntsc_setup_t const snes_ntsc_svideo; /* color bleeding only */ -extern snes_ntsc_setup_t const snes_ntsc_rgb; /* crisp image */ -extern snes_ntsc_setup_t const snes_ntsc_monochrome;/* desaturated + artifacts */ +extern snes_ntsc_setup_t const retroarch_snes_ntsc_composite; /* color bleeding + artifacts */ +extern snes_ntsc_setup_t const retroarch_snes_ntsc_svideo; /* color bleeding only */ +extern snes_ntsc_setup_t const retroarch_snes_ntsc_rgb; /* crisp image */ +extern snes_ntsc_setup_t const retroarch_snes_ntsc_monochrome;/* desaturated + artifacts */ /* Initializes and adjusts parameters. Can be called multiple times on the same snes_ntsc_t object. Can pass NULL for either parameter. */ typedef struct snes_ntsc_t snes_ntsc_t; -void snes_ntsc_init( snes_ntsc_t* ntsc, snes_ntsc_setup_t const* setup ); +void retroarch_snes_ntsc_init( snes_ntsc_t* ntsc, snes_ntsc_setup_t const* setup ); /* Filters one or more rows of pixels. Input pixel format is set by SNES_NTSC_IN_FORMAT and output RGB depth is set by SNES_NTSC_OUT_DEPTH. Both default to 16-bit RGB. In_row_width is the number of pixels to get to the next input row. Out_pitch is the number of *bytes* to get to the next output row. */ -void snes_ntsc_blit( snes_ntsc_t const* ntsc, SNES_NTSC_IN_T const* input, +void retroarch_snes_ntsc_blit( snes_ntsc_t const* ntsc, SNES_NTSC_IN_T const* input, long in_row_width, int burst_phase, int in_width, int in_height, void* rgb_out, long out_pitch, int first, int last); -void snes_ntsc_blit_hires( snes_ntsc_t const* ntsc, SNES_NTSC_IN_T const* input, +void retroarch_snes_ntsc_blit_hires( snes_ntsc_t const* ntsc, SNES_NTSC_IN_T const* input, long in_row_width, int burst_phase, int in_width, int in_height, void* rgb_out, long out_pitch, int first, int last); diff --git a/gfx/video_filters/snes_ntsc/snes_ntsc_impl.h b/gfx/video_filters/snes_ntsc/snes_ntsc_impl.h index 36d767d697..6507ae63b1 100644 --- a/gfx/video_filters/snes_ntsc/snes_ntsc_impl.h +++ b/gfx/video_filters/snes_ntsc/snes_ntsc_impl.h @@ -311,7 +311,7 @@ typedef struct pixel_info_t (1.0f - (((ntsc) + 100) & 2)) #endif -extern pixel_info_t const snes_ntsc_pixels [alignment_count]; +extern pixel_info_t const retroarch_snes_ntsc_pixels [alignment_count]; /* Generate pixel at all burst phases and column alignments */ static void gen_kernel( init_t* impl, float y, float i, float q, snes_ntsc_rgb_t* out ) @@ -326,7 +326,7 @@ static void gen_kernel( init_t* impl, float y, float i, float q, snes_ntsc_rgb_t Convolve these with kernels which: filter respective components, apply sharpening, and rescale horizontally. Convert resulting yiq to rgb and pack into integer. Based on algorithm by NewRisingSun. */ - pixel_info_t const* pixel = snes_ntsc_pixels; + pixel_info_t const* pixel = retroarch_snes_ntsc_pixels; int alignment_remain = alignment_count; do { diff --git a/gfx/video_shader_parse.c b/gfx/video_shader_parse.c index f91402a272..961a5695aa 100644 --- a/gfx/video_shader_parse.c +++ b/gfx/video_shader_parse.c @@ -1122,7 +1122,7 @@ void video_shader_write_conf_cgp(config_file_t *conf, bool video_shader_is_supported(enum rarch_shader_type type) { gfx_ctx_flags_t flags; - unsigned flag; + enum display_flags flag = GFX_CTX_FLAGS_NONE; switch (type) { diff --git a/gfx/video_thread_wrapper.c b/gfx/video_thread_wrapper.c index c04a8b7d57..a7cf29b2d6 100644 --- a/gfx/video_thread_wrapper.c +++ b/gfx/video_thread_wrapper.c @@ -1241,8 +1241,6 @@ static uint32_t thread_get_flags(void *data) static const video_poke_interface_t thread_poke = { thread_get_flags, - NULL, /* set_coords */ - NULL, /* set_mvp */ thread_load_texture, thread_unload_texture, thread_set_video_mode, diff --git a/griffin/griffin.c b/griffin/griffin.c index 8ac7a65d59..627b86b292 100644 --- a/griffin/griffin.c +++ b/griffin/griffin.c @@ -1078,6 +1078,7 @@ RETROARCH #include "../intl/msg_hash_cht.c" #include "../intl/msg_hash_ar.c" #include "../intl/msg_hash_el.c" +#include "../intl/msg_hash_tr.c" #endif #include "../intl/msg_hash_us.c" @@ -1134,6 +1135,7 @@ THREAD #endif #include "../libretro-common/rthreads/rthreads.c" +#include "../libretro-common/rthreads/rsemaphore.c" #include "../gfx/video_thread_wrapper.c" #include "../audio/audio_thread_wrapper.c" #endif @@ -1198,6 +1200,8 @@ PLAYLISTS /*============================================================ MENU ============================================================ */ +#include "../menu/menu_shader.c" + #ifdef HAVE_MENU #include "../menu/menu_driver.c" #include "../menu/menu_input.c" @@ -1234,7 +1238,6 @@ MENU #include "../menu/cbs/menu_cbs_up.c" #include "../menu/cbs/menu_cbs_down.c" #include "../menu/cbs/menu_cbs_contentlist_switch.c" -#include "../menu/menu_shader.c" #include "../menu/menu_displaylist.c" #include "../menu/menu_animation.c" #include "../menu/menu_thumbnail_path.c" @@ -1438,12 +1441,7 @@ DEPENDENCIES /*============================================================ XML ============================================================ */ -#if 0 -#ifndef HAVE_LIBXML2 -#define RXML_LIBXML2_COMPAT 1 #include "../libretro-common/formats/xml/rxml.c" -#endif -#endif /*============================================================ AUDIO UTILS diff --git a/griffin/griffin_cpp.cpp b/griffin/griffin_cpp.cpp index 6b90c1b80f..06fb0f002d 100644 --- a/griffin/griffin_cpp.cpp +++ b/griffin/griffin_cpp.cpp @@ -58,6 +58,29 @@ UI #include "../ui/drivers/qt/thumbnaildownload.cpp" #include "../ui/drivers/qt/thumbnailpackdownload.cpp" #include "../ui/drivers/qt/playlistthumbnaildownload.cpp" +#ifdef HAVE_MENU +#include "../ui/drivers/qt/settingswidgets.cpp" +#include "../ui/drivers/qt/options/drivers.cpp" +#include "../ui/drivers/qt/options/video.cpp" +#include "../ui/drivers/qt/options/audio.cpp" +#include "../ui/drivers/qt/options/saving.cpp" +#include "../ui/drivers/qt/options/throttle.cpp" +#include "../ui/drivers/qt/options/osd.cpp" +#include "../ui/drivers/qt/options/input.cpp" +#include "../ui/drivers/qt/options/directory.cpp" +#include "../ui/drivers/qt/options/logging.cpp" +#include "../ui/drivers/qt/options/core.cpp" +#include "../ui/drivers/qt/options/configuration.cpp" +#include "../ui/drivers/qt/options/latency.cpp" +#include "../ui/drivers/qt/options/playlists.cpp" +#include "../ui/drivers/qt/options/user.cpp" +#include "../ui/drivers/qt/options/recording.cpp" +#include "../ui/drivers/qt/options/ui.cpp" +#include "../ui/drivers/qt/options/achievements.cpp" +#include "../ui/drivers/qt/options/network.cpp" +#include "../ui/drivers/qt/moc_settingswidgets.cpp" +#include "../ui/drivers/qt/options/moc_options.cpp" +#endif #include "../ui/drivers/moc_ui_qt.cpp" #include "../ui/drivers/qt/moc_coreinfodialog.cpp" #include "../ui/drivers/qt/moc_coreoptionsdialog.cpp" diff --git a/input/drivers/android_input.c b/input/drivers/android_input.c index 31be4be737..599a11e7ef 100644 --- a/input/drivers/android_input.c +++ b/input/drivers/android_input.c @@ -56,6 +56,8 @@ enum { AMOTION_EVENT_BUTTON_BACK = 1 << 3, AMOTION_EVENT_BUTTON_FORWARD = 1 << 4, AMOTION_EVENT_AXIS_VSCROLL = 9, + AMOTION_EVENT_ACTION_HOVER_MOVE = 7, + AINPUT_SOURCE_STYLUS = 0x00004000 }; #endif @@ -561,7 +563,7 @@ static int android_check_quick_tap(android_input_t *android) * and then not touched again for 200ms * If so then return true and deactivate quick tap timer */ retro_time_t now = cpu_features_get_time_usec(); - if(android->quick_tap_time && (now/1000 - android->quick_tap_time/1000000) >= 200) + if (android->quick_tap_time && (now/1000 - android->quick_tap_time/1000000) >= 200) { android->quick_tap_time = 0; return 1; @@ -648,7 +650,7 @@ static INLINE void android_mouse_calculate_deltas(android_input_t *android, float y_scale = 1; struct retro_system_av_info *av_info = video_viewport_get_system_av_info(); - if(av_info) + if (av_info) { video_viewport_t *custom_vp = video_viewport_get_custom(); const struct retro_game_geometry *geom = (const struct retro_game_geometry*)&av_info->geometry; @@ -687,7 +689,7 @@ static INLINE int android_input_poll_event_type_motion( int btn; /* Only handle events from a touchscreen or mouse */ - if (!(source & (AINPUT_SOURCE_TOUCHSCREEN | AINPUT_SOURCE_MOUSE))) + if (!(source & (AINPUT_SOURCE_TOUCHSCREEN | AINPUT_SOURCE_STYLUS | AINPUT_SOURCE_MOUSE))) return 1; getaction = AMotionEvent_getAction(event); @@ -737,11 +739,11 @@ static INLINE int android_input_poll_event_type_motion( if (keyup && motion_ptr < MAX_TOUCH) { - if(action == AMOTION_EVENT_ACTION_UP && ENABLE_TOUCH_SCREEN_MOUSE) + if (action == AMOTION_EVENT_ACTION_UP && ENABLE_TOUCH_SCREEN_MOUSE) { /* If touchscreen was pressed for less than 200ms * then register time stamp of a quick tap */ - if((AMotionEvent_getEventTime(event)-AMotionEvent_getDownTime(event))/1000000 < 200) + if ((AMotionEvent_getEventTime(event)-AMotionEvent_getDownTime(event))/1000000 < 200) android->quick_tap_time = AMotionEvent_getEventTime(event); android->mouse_l = 0; } @@ -760,7 +762,7 @@ static INLINE int android_input_poll_event_type_motion( if (settings && settings->bools.vibrate_on_keypress && action != AMOTION_EVENT_ACTION_MOVE) android_app_write_cmd(g_android, APP_CMD_VIBRATE_KEYPRESS); - if(action == AMOTION_EVENT_ACTION_DOWN && ENABLE_TOUCH_SCREEN_MOUSE) + if (action == AMOTION_EVENT_ACTION_DOWN && ENABLE_TOUCH_SCREEN_MOUSE) { /* When touch screen is pressed, set mouse * previous position to current position @@ -771,14 +773,14 @@ static INLINE int android_input_poll_event_type_motion( /* If another touch happened within 200ms after a quick tap * then cancel the quick tap and register left mouse button * as being held down */ - if((AMotionEvent_getEventTime(event) - android->quick_tap_time)/1000000 < 200) + if ((AMotionEvent_getEventTime(event) - android->quick_tap_time)/1000000 < 200) { android->quick_tap_time = 0; android->mouse_l = 1; } } - if(action == AMOTION_EVENT_ACTION_MOVE && ENABLE_TOUCH_SCREEN_MOUSE) + if ((action == AMOTION_EVENT_ACTION_MOVE || action == AMOTION_EVENT_ACTION_HOVER_MOVE) && ENABLE_TOUCH_SCREEN_MOUSE) android_mouse_calculate_deltas(android,event,motion_ptr); for (motion_ptr = 0; motion_ptr < pointer_max; motion_ptr++) @@ -964,7 +966,7 @@ static void handle_hotplug(android_input_t *android, * and be grouped with the NVIDIA button of the virtual device. * */ - if(strstr(device_model, "SHIELD Android TV") && ( + if (strstr(device_model, "SHIELD Android TV") && ( strstr(device_name, "Virtual") || strstr(device_name, "NVIDIA Corporation NVIDIA Controller v01.0"))) { @@ -1007,7 +1009,7 @@ static void handle_hotplug(android_input_t *android, } } - else if(strstr(device_model, "SHIELD") && ( + else if (strstr(device_model, "SHIELD") && ( strstr(device_name, "Virtual") || strstr(device_name, "gpio") || strstr(device_name, "NVIDIA Corporation NVIDIA Controller v01.01") || strstr(device_name, "NVIDIA Corporation NVIDIA Controller v01.02"))) @@ -1026,7 +1028,7 @@ static void handle_hotplug(android_input_t *android, } } - else if(strstr(device_model, "SHIELD") && ( + else if (strstr(device_model, "SHIELD") && ( strstr(device_name, "Virtual") || strstr(device_name, "gpio") || strstr(device_name, "NVIDIA Corporation NVIDIA Controller v01.03"))) { @@ -1057,7 +1059,7 @@ static void handle_hotplug(android_input_t *android, * This is a simple hack, basically groups the "back" * button with the rest of the gamepad */ - else if(strstr(device_model, "XD") && ( + else if (strstr(device_model, "XD") && ( strstr(device_name, "Virtual") || strstr(device_name, "rk29-keypad") || strstr(device_name,"Playstation3") || strstr(device_name,"XBOX"))) { @@ -1118,7 +1120,7 @@ static void handle_hotplug(android_input_t *android, * This device is composed of two hid devices * We make it look like one device */ - else if(strstr(device_model, "ARCHOS GAMEPAD") && ( + else if (strstr(device_model, "ARCHOS GAMEPAD") && ( strstr(device_name, "joy_key") || strstr(device_name, "joystick"))) { /* only use the hack if the device is one of the built-in devices */ @@ -1138,7 +1140,7 @@ static void handle_hotplug(android_input_t *android, } /* Amazon Fire TV & Fire stick */ - else if(strstr(device_model, "AFTB") || strstr(device_model, "AFTT") || + else if (strstr(device_model, "AFTB") || strstr(device_model, "AFTT") || strstr(device_model, "AFTS") || strstr(device_model, "AFTM") || strstr(device_model, "AFTRS")) { @@ -1152,7 +1154,7 @@ static void handle_hotplug(android_input_t *android, strlcpy(name_buf, device_name, sizeof(name_buf)); } /* remove the remote when a gamepad enters */ - else if(strstr(android->pad_states[0].name,"Amazon Fire TV Remote")) + else if (strstr(android->pad_states[0].name,"Amazon Fire TV Remote")) { android->pads_connected = 0; *port = 0; @@ -1192,7 +1194,7 @@ static void handle_hotplug(android_input_t *android, /* If device is keyboard only and didn't match any of the devices above * then assume it is a keyboard, register the id, and return unless the * maximum number of keyboards are already registered. */ - else if(source == AINPUT_SOURCE_KEYBOARD && kbd_num < MAX_NUM_KEYBOARDS) + else if (source == AINPUT_SOURCE_KEYBOARD && kbd_num < MAX_NUM_KEYBOARDS) { kbd_id[kbd_num] = id; kbd_num++; diff --git a/input/drivers/psp_input.c b/input/drivers/psp_input.c index 6ee849ec17..0116718805 100644 --- a/input/drivers/psp_input.c +++ b/input/drivers/psp_input.c @@ -27,6 +27,13 @@ #include #elif defined(VITA) #include +#include +#include +#define VITA_NUM_SCANCODES 115 /* size of rarch_key_map_vita */ +#define VITA_MAX_SCANCODE 0xE7 +#define VITA_NUM_MODIFIERS 11 /* number of modifiers reported */ +#define MOUSE_MAX_X 960 +#define MOUSE_MAX_Y 544 #elif defined(PSP) #include #endif @@ -42,6 +49,23 @@ #include "../../defines/psp_defines.h" #include "../input_driver.h" +#ifdef VITA +#include "../input_keymaps.h" +uint8_t modifier_lut[VITA_NUM_MODIFIERS][2] = +{ + { 0xE0, 0x01 }, /* LCTRL */ + { 0xE4, 0x10 }, /* RCTRL */ + { 0xE1, 0x02 }, /* LSHIFT */ + { 0xE5, 0x20 }, /* RSHIFT */ + { 0xE2, 0x04 }, /* LALT */ + { 0xE6, 0x40 }, /* RALT */ + { 0xE3, 0x08 }, /* LGUI */ + { 0xE7, 0x80 }, /* RGUI */ + { 0x53, 0x01 }, /* NUMLOCK */ + { 0x39, 0x02 }, /* CAPSLOCK */ + { 0x47, 0x04 } /* SCROLLOCK */ +}; +#endif /* TODO/FIXME - * fix game focus toggle */ @@ -50,6 +74,20 @@ typedef struct psp_input { bool blocked; const input_device_driver_t *joypad; +#ifdef VITA + int keyboard_hid_handle; + uint8_t prev_keys[6]; + bool keyboard_state[VITA_MAX_SCANCODE + 1]; + + int mouse_hid_handle; + int32_t mouse_x; + int32_t mouse_y; + int32_t mouse_x_delta; + int32_t mouse_y_delta; + bool mouse_button_left; + bool mouse_button_right; + bool mouse_button_middle; +#endif } psp_input_t; static void psp_input_poll(void *data) @@ -58,8 +96,206 @@ static void psp_input_poll(void *data) if (psp && psp->joypad) psp->joypad->poll(); + +#ifdef VITA + unsigned int i = 0; + int key_sym = 0; + unsigned key_code = 0; + uint8_t mod_code = 0; + uint16_t mod = 0; + uint8_t modifiers[2] = { 0, 0 }; + bool key_held = false; + int numReports = 0; + int mouse_velocity_x = 0; + int mouse_velocity_y = 0; + SceHidKeyboardReport k_reports[SCE_HID_MAX_REPORT]; + SceHidMouseReport m_reports[SCE_HID_MAX_REPORT]; + + if (psp->keyboard_hid_handle > 0) + { + numReports = sceHidKeyboardRead(psp->keyboard_hid_handle, (SceHidKeyboardReport**)&k_reports, SCE_HID_MAX_REPORT); + + if (numReports < 0) { + psp->keyboard_hid_handle = 0; + } + else if (numReports) { + modifiers[0] = k_reports[numReports - 1].modifiers[0]; + modifiers[1] = k_reports[numReports - 1].modifiers[1]; + mod = 0; + if (modifiers[0] & 0x11) + mod |= RETROKMOD_CTRL; + if (modifiers[0] & 0x22) + mod |= RETROKMOD_SHIFT; + if (modifiers[0] & 0x44) + mod |= RETROKMOD_ALT; + if (modifiers[0] & 0x88) + mod |= RETROKMOD_META; + if (modifiers[1] & 0x01) + mod |= RETROKMOD_NUMLOCK; + if (modifiers[1] & 0x02) + mod |= RETROKMOD_CAPSLOCK; + if (modifiers[1] & 0x04) + mod |= RETROKMOD_SCROLLOCK; + + for (i = 0; i < VITA_NUM_MODIFIERS; i++) + { + key_sym = (int) modifier_lut[i][0]; + mod_code = modifier_lut[i][1]; + key_code = input_keymaps_translate_keysym_to_rk(key_sym); + if (i < 8) + { + key_held = (modifiers[0] & mod_code); + } + else + { + key_held = (modifiers[1] & mod_code); + } + + if (key_held && !(psp->keyboard_state[key_sym])) + { + psp->keyboard_state[key_sym] = true; + input_keyboard_event(true, key_code, 0, mod, RETRO_DEVICE_KEYBOARD); + } + else if (!key_held && (psp->keyboard_state[key_sym])) + { + psp->keyboard_state[key_sym] = false; + input_keyboard_event(false, key_code, 0, mod, RETRO_DEVICE_KEYBOARD); + } + } + + for (i = 0; i < 6; i++) + { + key_sym = k_reports[numReports - 1].keycodes[i]; + + if (key_sym != psp->prev_keys[i]) + { + if (psp->prev_keys[i]) + { + psp->keyboard_state[psp->prev_keys[i]] = false; + key_code = input_keymaps_translate_keysym_to_rk(psp->prev_keys[i]); + input_keyboard_event(false, key_code, 0, mod, RETRO_DEVICE_KEYBOARD); + } + if (key_sym) + { + psp->keyboard_state[key_sym] = true; + key_code = input_keymaps_translate_keysym_to_rk(key_sym); + input_keyboard_event(true, key_code, 0, mod, RETRO_DEVICE_KEYBOARD); + } + psp->prev_keys[i] = key_sym; + } + } + } + } + + if (psp->mouse_hid_handle > 0) + { + numReports = sceHidMouseRead(psp->mouse_hid_handle, (SceHidMouseReport**)&m_reports, SCE_HID_MAX_REPORT); + if (numReports > 0) + { + for (i = 0; i <= numReports - 1; i++) + { + uint8_t buttons = m_reports[i].buttons; + + if (buttons & 0x1) + { + psp->mouse_button_left = true; + } + else + { + psp->mouse_button_left = false; + } + + if (buttons & 0x2) + { + psp->mouse_button_right = true; + } + else + { + psp->mouse_button_right = false; + } + + if (buttons & 0x4) + { + psp->mouse_button_middle = true; + } + else + { + psp->mouse_button_middle = false; + } + + mouse_velocity_x += m_reports[i].rel_x; + mouse_velocity_y += m_reports[i].rel_y; + } + } + } + psp->mouse_x_delta = mouse_velocity_x; + psp->mouse_y_delta = mouse_velocity_y; + psp->mouse_x += mouse_velocity_x; + psp->mouse_y += mouse_velocity_y; + if (psp->mouse_x < 0) + { + psp->mouse_x = 0; + } + else if (psp->mouse_x > MOUSE_MAX_X) + { + psp->mouse_x = MOUSE_MAX_X; + } + + if (psp->mouse_y < 0) + { + psp->mouse_y = 0; + } + else if (psp->mouse_y > MOUSE_MAX_Y) + { + psp->mouse_y = MOUSE_MAX_Y; + } +#endif } +#ifdef VITA +static int16_t psp_input_mouse_state(psp_input_t *psp, unsigned id, bool screen) +{ + int val = 0; + switch (id) + { + case RETRO_DEVICE_ID_MOUSE_LEFT: + val = psp->mouse_button_left; + break; + case RETRO_DEVICE_ID_MOUSE_RIGHT: + val = psp->mouse_button_right; + break; + case RETRO_DEVICE_ID_MOUSE_MIDDLE: + val = psp->mouse_button_middle; + break; + case RETRO_DEVICE_ID_MOUSE_X: + if (screen) + { + val = psp->mouse_x; + } + else + { + val = psp->mouse_x_delta; + psp->mouse_x_delta = 0; /* flush delta after it has been read */ + } + break; + case RETRO_DEVICE_ID_MOUSE_Y: + if (screen) + { + val = psp->mouse_y; + } + else + { + val = psp->mouse_y_delta; + psp->mouse_y_delta = 0; /* flush delta after it has been read */ + } + break; + } + + return val; +} +#endif + + static int16_t psp_input_state(void *data, rarch_joypad_info_t joypad_info, const struct retro_keybind **binds, @@ -81,6 +317,17 @@ static int16_t psp_input_state(void *data, if (binds[port]) return input_joypad_analog(psp->joypad, joypad_info, port, idx, id, binds[port]); break; +#ifdef VITA + case RETRO_DEVICE_KEYBOARD: + return ((id < RETROK_LAST) && psp->keyboard_state[rarch_keysym_lut[(enum retro_key)id]]); + break; + case RETRO_DEVICE_MOUSE: + return psp_input_mouse_state(psp, id, false); + break; + case RARCH_DEVICE_MOUSE_SCREEN: + return psp_input_mouse_state(psp, id, true); + break; +#endif } return 0; @@ -104,6 +351,21 @@ static void* psp_input_initialize(const char *joypad_driver) psp->joypad = input_joypad_init_driver(joypad_driver, psp); +#ifdef VITA + sceHidKeyboardEnumerate(&(psp->keyboard_hid_handle), 1); + sceHidMouseEnumerate(&(psp->mouse_hid_handle), 1); + + input_keymaps_init_keyboard_lut(rarch_key_map_vita); + unsigned int i; + for (i = 0; i <= VITA_MAX_SCANCODE; i++) { + psp->keyboard_state[i] = false; + } + for (i = 0; i < 6; i++) { + psp->prev_keys[i] = 0; + } + psp->mouse_x = 0; + psp->mouse_y = 0; +#endif return psp; } @@ -111,7 +373,13 @@ static uint64_t psp_input_get_capabilities(void *data) { (void)data; - return (1 << RETRO_DEVICE_JOYPAD) | (1 << RETRO_DEVICE_ANALOG); + uint64_t caps = (1 << RETRO_DEVICE_JOYPAD) | (1 << RETRO_DEVICE_ANALOG); + +#ifdef VITA + caps |= (1 << RETRO_DEVICE_KEYBOARD) | (1 << RETRO_DEVICE_MOUSE); +#endif + + return caps; } static const input_device_driver_t *psp_input_get_joypad_driver(void *data) diff --git a/input/drivers/switch_input.c b/input/drivers/switch_input.c index 699bbf6e15..a21ed5d74e 100644 --- a/input/drivers/switch_input.c +++ b/input/drivers/switch_input.c @@ -14,9 +14,14 @@ #define MULTITOUCH_LIMIT 4 /* supports up to this many fingers at once */ #define TOUCH_AXIS_MAX 0x7fff /* abstraction of pointer coords */ +#define SWITCH_NUM_SCANCODES 114 /* size of rarch_key_map_switch */ +#define SWITCH_MAX_SCANCODE 0xfb /* see https://switchbrew.github.io/libnx/hid_8h.html */ +#define MOUSE_MAX_X 1920 +#define MOUSE_MAX_Y 1080 #endif #include "../input_driver.h" +#include "../input_keymaps.h" #define MAX_PADS 10 @@ -38,6 +43,16 @@ typedef struct switch_input bool touch_state[MULTITOUCH_LIMIT]; uint32_t touch_x[MULTITOUCH_LIMIT]; uint32_t touch_y[MULTITOUCH_LIMIT]; + bool keyboard_state[SWITCH_MAX_SCANCODE + 1]; + + int32_t mouse_x; + int32_t mouse_y; + int32_t mouse_x_delta; + int32_t mouse_y_delta; + int32_t mouse_wheel; + bool mouse_button_left; + bool mouse_button_right; + bool mouse_button_middle; #endif } switch_input_t; @@ -50,8 +65,13 @@ static void switch_input_poll(void *data) #ifdef HAVE_LIBNX uint32_t touch_count = hidTouchCount(); + unsigned int i = 0; + int keySym = 0; + unsigned keyCode = 0; + uint16_t mod = 0; + MousePosition mouse_pos; - for (int i = 0; i < MULTITOUCH_LIMIT; i++) + for (i = 0; i < MULTITOUCH_LIMIT; i++) { sw->touch_state[i] = touch_count > i; @@ -64,6 +84,85 @@ static void switch_input_poll(void *data) sw->touch_y[i] = touch_position.py; } } + + mod = 0; + if (hidKeyboardHeld(KBD_LEFTALT) || hidKeyboardHeld(KBD_RIGHTALT)) + mod |= RETROKMOD_ALT; + if (hidKeyboardHeld(KBD_LEFTCTRL) || hidKeyboardHeld(KBD_RIGHTCTRL)) + mod |= RETROKMOD_CTRL; + if (hidKeyboardHeld(KBD_LEFTSHIFT) || hidKeyboardHeld(KBD_RIGHTSHIFT)) + mod |= RETROKMOD_SHIFT; + + for (i = 0; i < SWITCH_NUM_SCANCODES; i++) + { + keySym = rarch_key_map_switch[i].sym; + keyCode = input_keymaps_translate_keysym_to_rk(keySym); + + if (hidKeyboardHeld(keySym) && !(sw->keyboard_state[keySym])) + { + sw->keyboard_state[keySym] = true; + input_keyboard_event(true, keyCode, 0, mod, RETRO_DEVICE_KEYBOARD); + } + else if (!hidKeyboardHeld(keySym) && sw->keyboard_state[keySym]) + { + sw->keyboard_state[keySym] = false; + input_keyboard_event(false, keyCode, 0, mod, RETRO_DEVICE_KEYBOARD); + } + } + + if (hidMouseButtonsHeld() & MOUSE_LEFT) + { + sw->mouse_button_left = true; + } + else + { + sw->mouse_button_left = false; + } + + if (hidMouseButtonsHeld() & MOUSE_RIGHT) + { + sw->mouse_button_right = true; + } + else + { + sw->mouse_button_right = false; + } + + if (hidMouseButtonsHeld() & MOUSE_MIDDLE) + { + sw->mouse_button_middle = true; + } + else + { + sw->mouse_button_middle = false; + } + + hidMouseRead(&mouse_pos); + + sw->mouse_x_delta = mouse_pos.velocityX; + sw->mouse_y_delta = mouse_pos.velocityY; + + sw->mouse_x += mouse_pos.velocityX; + sw->mouse_y += mouse_pos.velocityY; + if (sw->mouse_x < 0) + { + sw->mouse_x = 0; + } + else if (sw->mouse_x > MOUSE_MAX_X) + { + sw->mouse_x = MOUSE_MAX_X; + } + + if (sw->mouse_y < 0) + { + sw->mouse_y = 0; + } + else if (sw->mouse_y > MOUSE_MAX_Y) + { + sw->mouse_y = MOUSE_MAX_Y; + } + + sw->mouse_wheel = mouse_pos.scrollVelocityY; #endif } @@ -95,6 +194,61 @@ static int16_t switch_pointer_device_state(switch_input_t *sw, return 0; } + +static int16_t switch_input_mouse_state(switch_input_t *sw, unsigned id, bool screen) +{ + int val = 0; + switch (id) + { + case RETRO_DEVICE_ID_MOUSE_LEFT: + val = sw->mouse_button_left; + break; + case RETRO_DEVICE_ID_MOUSE_RIGHT: + val = sw->mouse_button_right; + break; + case RETRO_DEVICE_ID_MOUSE_MIDDLE: + val = sw->mouse_button_middle; + break; + case RETRO_DEVICE_ID_MOUSE_X: + if (screen) + { + val = sw->mouse_x; + } + else + { + val = sw->mouse_x_delta; + sw->mouse_x_delta = 0; /* flush delta after it has been read */ + } + break; + case RETRO_DEVICE_ID_MOUSE_Y: + if (screen) + { + val = sw->mouse_y; + } + else + { + val = sw->mouse_y_delta; + sw->mouse_y_delta = 0; /* flush delta after it has been read */ + } + break; + case RETRO_DEVICE_ID_MOUSE_WHEELUP: + if (sw->mouse_wheel > 0) + { + val = sw->mouse_wheel; + sw->mouse_wheel = 0; + } + break; + case RETRO_DEVICE_ID_MOUSE_WHEELDOWN: + if (sw->mouse_wheel < 0) + { + val = sw->mouse_wheel; + sw->mouse_wheel = 0; + } + break; + } + + return val; +} #endif static int16_t switch_input_state(void *data, @@ -120,6 +274,15 @@ static int16_t switch_input_state(void *data, joypad_info, port, idx, id, binds[port]); break; #ifdef HAVE_LIBNX + case RETRO_DEVICE_KEYBOARD: + return ((id < RETROK_LAST) && sw->keyboard_state[rarch_keysym_lut[(enum retro_key)id]]); + break; + case RETRO_DEVICE_MOUSE: + return switch_input_mouse_state(sw, id, false); + break; + case RARCH_DEVICE_MOUSE_SCREEN: + return switch_input_mouse_state(sw, id, true); + break; case RETRO_DEVICE_POINTER: case RARCH_DEVICE_POINTER_SCREEN: return switch_pointer_device_state(sw, id, idx); @@ -162,6 +325,14 @@ static void* switch_input_init(const char *joypad_driver) */ calc_touch_scaling(sw, 1280, 720, TOUCH_AXIS_MAX); + + input_keymaps_init_keyboard_lut(rarch_key_map_switch); + unsigned int i; + for (i = 0; i <= SWITCH_MAX_SCANCODE; i++) { + sw->keyboard_state[i] = false; + } + sw->mouse_x = 0; + sw->mouse_y = 0; #endif return sw; @@ -174,7 +345,7 @@ static uint64_t switch_input_get_capabilities(void *data) uint64_t caps = (1 << RETRO_DEVICE_JOYPAD) | (1 << RETRO_DEVICE_ANALOG); #ifdef HAVE_LIBNX - caps |= (1 << RETRO_DEVICE_POINTER); + caps |= (1 << RETRO_DEVICE_POINTER) | (1 << RETRO_DEVICE_KEYBOARD) | (1 << RETRO_DEVICE_MOUSE); #endif return caps; diff --git a/input/input_driver.c b/input/input_driver.c index 9e8e1b913e..0b47f9f850 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -1,6 +1,7 @@ /* RetroArch - A frontend for libretro. * Copyright (C) 2010-2014 - Hans-Kristian Arntzen * Copyright (C) 2011-2017 - Daniel De Matteis + * Copyright (C) 2016-2019 - 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- @@ -17,12 +18,14 @@ #include #include #include +#include #include #include #include #include #include +#include #include @@ -876,6 +879,81 @@ static INLINE bool input_keys_pressed_iterate(unsigned i, return false; } +static int16_t input_joypad_axis(const input_device_driver_t *drv, unsigned port, uint32_t joyaxis, bool button) +{ + int16_t val = 0; + settings_t *settings = config_get_ptr(); + bool left = true; + + if (!drv || !drv->axis) + return 0; + + val = drv->axis(port, joyaxis); + + /* no deadzone/sensitivity correction for analog buttons currently */ + if (button) + return val; + + if (AXIS_POS_GET(joyaxis) == AXIS_DIR_NONE) + { + /* current axis is negative */ + if (AXIS_NEG_GET(joyaxis) < 2) + { + /* current stick is the left */ + left = true; + } + else + left = false; + } + else + { + /* current axis is positive */ + if (AXIS_POS_GET(joyaxis) < 2) + { + /* current stick is the left */ + left = true; + } + else + left = false; + } + + if (settings->floats.input_analog_deadzone) + { + /* 0/1 are the left analog X/Y axes, 2/3 are the right analog X/Y axes */ + int16_t x = input_joypad_axis_raw(drv, port, left ? 0 : 2); + int16_t y = input_joypad_axis_raw(drv, port, left ? 1 : 3); + int mag = sqrt(x * x + y * y); + float normalized; + float normal_mag = (1.0f / 0x7fff) * mag; + + /* if analog value is below the deadzone, ignore it */ + val = normal_mag <= settings->floats.input_analog_deadzone ? 0 : val; + + if (val == 0) + return 0; + + normalized = (1.0f / 0x7fff) * val; + + /* now scale the "good" analog range appropriately, so we don't start out way above 0 */ + val = 0x7fff * normalized * MIN(1.0f, ((normal_mag - settings->floats.input_analog_deadzone) / (1.0f - settings->floats.input_analog_deadzone))); + } + + if (settings->floats.input_analog_sensitivity != 1.0f) + { + float normalized = (1.0f / 0x7fff) * val; + int new_val = 0x7fff * normalized * settings->floats.input_analog_sensitivity; + + if (new_val > 0x7fff) + new_val = 0x7fff; + else if (new_val < -0x7fff) + new_val = -0x7fff; + + val = new_val; + } + + return val; +} + #ifdef HAVE_MENU /** @@ -979,7 +1057,7 @@ void input_menu_keys_pressed(void *data, input_bits_t *p_new_state) { if (joykey == NO_BTN || !sec->button(joypad_info.joy_idx, joykey)) { - int16_t axis = sec->axis(joypad_info.joy_idx, joyaxis); + int16_t axis = input_joypad_axis(sec, joypad_info.joy_idx, joyaxis, false); float scaled_axis = (float)abs(axis) / 0x8000; bit_pressed = scaled_axis > joypad_info.axis_threshold; } @@ -991,7 +1069,7 @@ void input_menu_keys_pressed(void *data, input_bits_t *p_new_state) { if (joykey == NO_BTN || !first->button(joypad_info.joy_idx, joykey)) { - int16_t axis = first->axis(joypad_info.joy_idx, joyaxis); + int16_t axis = input_joypad_axis(first, joypad_info.joy_idx, joyaxis, false); float scaled_axis = (float)abs(axis) / 0x8000; bit_pressed = scaled_axis > joypad_info.axis_threshold; } @@ -1682,34 +1760,36 @@ int16_t input_joypad_analog(const input_device_driver_t *drv, { int16_t res; - if ( idx == RETRO_DEVICE_INDEX_ANALOG_BUTTON ) + if (idx == RETRO_DEVICE_INDEX_ANALOG_BUTTON) { /* A RETRO_DEVICE_JOYPAD button? */ - if ( ident < RARCH_FIRST_CUSTOM_BIND ) + if (ident < RARCH_FIRST_CUSTOM_BIND) { uint32_t axis = 0; const struct retro_keybind *bind = NULL; bind = &binds[ ident ]; + if (!bind->valid) return 0; axis = bind->joyaxis; - if ( axis == AXIS_NONE ) - axis = joypad_info.auto_binds[ ident ].joyaxis; + + if (axis == AXIS_NONE) + axis = joypad_info.auto_binds[ident].joyaxis; /* Analog button. */ - res = abs( drv->axis( joypad_info.joy_idx, axis ) ); + res = abs(input_joypad_axis(drv, joypad_info.joy_idx, axis, true)); /* If the result is zero, it's got a digital button attached to it */ - if ( res == 0 ) + if (res == 0) { uint16_t key = bind->joykey; - if ( key == NO_BTN ) - key = joypad_info.auto_binds[ ident ].joykey; + if (key == NO_BTN) + key = joypad_info.auto_binds[ident].joykey; - if ( drv->button(joypad_info.joy_idx, key)) + if (drv->button(joypad_info.joy_idx, key)) res = 0x7fff; } } @@ -1747,8 +1827,8 @@ int16_t input_joypad_analog(const input_device_driver_t *drv, if (axis_plus == AXIS_NONE) axis_plus = joypad_info.auto_binds[ident_plus].joyaxis; - pressed_minus = abs(drv->axis(joypad_info.joy_idx, axis_minus)); - pressed_plus = abs(drv->axis(joypad_info.joy_idx, axis_plus)); + pressed_minus = abs(input_joypad_axis(drv, joypad_info.joy_idx, axis_minus, false)); + pressed_plus = abs(input_joypad_axis(drv, joypad_info.joy_idx, axis_plus, false)); res = pressed_plus - pressed_minus; if (res == 0) diff --git a/input/input_keymaps.c b/input/input_keymaps.c index 0d28f24cbe..b0ec268640 100644 --- a/input/input_keymaps.c +++ b/input/input_keymaps.c @@ -292,6 +292,266 @@ const struct input_key_map input_config_key_map[] = { { NULL, RETROK_UNKNOWN }, }; +#ifdef HAVE_LIBNX +const struct rarch_key_map rarch_key_map_switch[] = { + { KBD_A, RETROK_a }, + { KBD_B, RETROK_b }, + { KBD_C, RETROK_c }, + { KBD_D, RETROK_d }, + { KBD_E, RETROK_e }, + { KBD_F, RETROK_f }, + { KBD_G, RETROK_g }, + { KBD_H, RETROK_h }, + { KBD_I, RETROK_i }, + { KBD_J, RETROK_j }, + { KBD_K, RETROK_k }, + { KBD_L, RETROK_l }, + { KBD_M, RETROK_m }, + { KBD_N, RETROK_n }, + { KBD_O, RETROK_o }, + { KBD_P, RETROK_p }, + { KBD_Q, RETROK_q }, + { KBD_R, RETROK_r }, + { KBD_S, RETROK_s }, + { KBD_T, RETROK_t }, + { KBD_U, RETROK_u }, + { KBD_V, RETROK_v }, + { KBD_W, RETROK_w }, + { KBD_X, RETROK_x }, + { KBD_Y, RETROK_y }, + { KBD_Z, RETROK_z }, + { KBD_BACKSPACE, RETROK_BACKSPACE }, + { KBD_TAB, RETROK_TAB }, + { KBD_ENTER, RETROK_RETURN }, + { KBD_PAUSE, RETROK_PAUSE }, + { KBD_ESC, RETROK_ESCAPE }, + { KBD_SPACE, RETROK_SPACE }, + { KBD_HASHTILDE, RETROK_HASH }, + { KBD_APOSTROPHE, RETROK_QUOTE }, + { KBD_KPLEFTPAREN, RETROK_LEFTPAREN }, + { KBD_KPRIGHTPAREN, RETROK_RIGHTPAREN }, + { KBD_COMMA, RETROK_COMMA }, + { KBD_MINUS, RETROK_MINUS }, + { KBD_DOT, RETROK_PERIOD }, + { KBD_SLASH, RETROK_SLASH }, + { KBD_0, RETROK_0 }, + { KBD_1, RETROK_1 }, + { KBD_2, RETROK_2 }, + { KBD_3, RETROK_3 }, + { KBD_4, RETROK_4 }, + { KBD_5, RETROK_5 }, + { KBD_6, RETROK_6 }, + { KBD_7, RETROK_7 }, + { KBD_8, RETROK_8 }, + { KBD_9, RETROK_9 }, + { KBD_SEMICOLON, RETROK_SEMICOLON }, + { KBD_EQUAL, RETROK_EQUALS }, + { KBD_LEFTBRACE, RETROK_LEFTBRACKET }, + { KBD_BACKSLASH, RETROK_BACKSLASH }, + { KBD_RIGHTBRACE, RETROK_RIGHTBRACKET }, + { KBD_DELETE, RETROK_DELETE }, + { KBD_KP0, RETROK_KP0 }, + { KBD_KP1, RETROK_KP1 }, + { KBD_KP2, RETROK_KP2 }, + { KBD_KP3, RETROK_KP3 }, + { KBD_KP4, RETROK_KP4 }, + { KBD_KP5, RETROK_KP5 }, + { KBD_KP6, RETROK_KP6 }, + { KBD_KP7, RETROK_KP7 }, + { KBD_KP8, RETROK_KP8 }, + { KBD_KP9, RETROK_KP9 }, + { KBD_KPDOT, RETROK_KP_PERIOD }, + { KBD_KPSLASH, RETROK_KP_DIVIDE }, + { KBD_KPASTERISK, RETROK_KP_MULTIPLY }, + { KBD_KPMINUS, RETROK_KP_MINUS }, + { KBD_KPPLUS, RETROK_KP_PLUS }, + { KBD_KPENTER, RETROK_KP_ENTER }, + { KBD_KPEQUAL, RETROK_KP_EQUALS }, + { KBD_UP, RETROK_UP }, + { KBD_DOWN, RETROK_DOWN }, + { KBD_RIGHT, RETROK_RIGHT }, + { KBD_LEFT, RETROK_LEFT }, + { KBD_INSERT, RETROK_INSERT }, + { KBD_HOME, RETROK_HOME }, + { KBD_END, RETROK_END }, + { KBD_PAGEUP, RETROK_PAGEUP }, + { KBD_PAGEDOWN, RETROK_PAGEDOWN }, + { KBD_F1, RETROK_F1 }, + { KBD_F2, RETROK_F2 }, + { KBD_F3, RETROK_F3 }, + { KBD_F4, RETROK_F4 }, + { KBD_F5, RETROK_F5 }, + { KBD_F6, RETROK_F6 }, + { KBD_F7, RETROK_F7 }, + { KBD_F8, RETROK_F8 }, + { KBD_F9, RETROK_F9 }, + { KBD_F10, RETROK_F10 }, + { KBD_F11, RETROK_F11 }, + { KBD_F12, RETROK_F12 }, + { KBD_F13, RETROK_F13 }, + { KBD_F14, RETROK_F14 }, + { KBD_F15, RETROK_F15 }, + { KBD_NUMLOCK, RETROK_NUMLOCK }, + { KBD_CAPSLOCK, RETROK_CAPSLOCK }, + { KBD_SCROLLLOCK, RETROK_SCROLLOCK }, + { KBD_RIGHTSHIFT, RETROK_RSHIFT }, + { KBD_LEFTSHIFT, RETROK_LSHIFT }, + { KBD_RIGHTCTRL, RETROK_RCTRL }, + { KBD_LEFTCTRL, RETROK_LCTRL }, + { KBD_RIGHTALT, RETROK_RALT }, + { KBD_LEFTALT, RETROK_LALT }, + { KBD_LEFTMETA, RETROK_LMETA }, + { KBD_RIGHTMETA, RETROK_RMETA }, + { KBD_COMPOSE, RETROK_COMPOSE }, + { KBD_HELP, RETROK_HELP }, + { KBD_PAUSE, RETROK_BREAK }, + { KBD_POWER, RETROK_POWER }, + { KBD_UNDO, RETROK_UNDO }, + { 0, RETROK_UNKNOWN } +}; +#endif + +#ifdef VITA +// Vita scancodes are identical to USB 2.0 standard, e.g. SDL2 +const struct rarch_key_map rarch_key_map_vita[] = { + { 0x02A, RETROK_BACKSPACE }, + { 0x02B, RETROK_TAB }, + { 0x09C, RETROK_CLEAR }, + { 0x028, RETROK_RETURN }, + { 0x048, RETROK_PAUSE }, + { 0x029, RETROK_ESCAPE }, + { 0x02C, RETROK_SPACE }, + /*{ ?, RETROK_EXCLAIM },*/ + /*{ ?, RETROK_QUOTEDBL },*/ + /*{ ?, RETROK_HASH },*/ + /*{ ?, RETROK_DOLLAR },*/ + /*{ ?, RETROK_AMPERSAND },*/ + { 0x034, RETROK_QUOTE }, + /*{ ?, RETROK_LEFTPAREN },*/ + /*{ ?, RETROK_RIGHTPAREN },*/ + /*{ ?, RETROK_ASTERISK },*/ + /*{ ?, RETROK_PLUS },*/ + { 0x036, RETROK_COMMA }, + { 0x02D, RETROK_MINUS }, + { 0x037, RETROK_PERIOD }, + { 0x038, RETROK_SLASH }, + { 0x027, RETROK_0 }, + { 0x01E, RETROK_1 }, + { 0x01F, RETROK_2 }, + { 0x020, RETROK_3 }, + { 0x021, RETROK_4 }, + { 0x022, RETROK_5 }, + { 0x023, RETROK_6 }, + { 0x024, RETROK_7 }, + { 0x025, RETROK_8 }, + { 0x026, RETROK_9 }, + /*{ ?, RETROK_COLON },*/ + { 0x033, RETROK_SEMICOLON }, + /*{ ?, RETROK_OEM_102 },*/ + { 0x02E, RETROK_EQUALS }, + /*{ ?, RETROK_GREATER },*/ + /*{ ?, RETROK_QUESTION },*/ + /*{ ?, RETROK_AT },*/ + { 0x02F, RETROK_LEFTBRACKET }, + { 0x031, RETROK_BACKSLASH }, + { 0x030, RETROK_RIGHTBRACKET }, + /*{ ?, RETROK_CARET },*/ + /*{ ?, RETROK_UNDERSCORE },*/ + { 0x035, RETROK_BACKQUOTE }, + { 0x004, RETROK_a }, + { 0x005, RETROK_b }, + { 0x006, RETROK_c }, + { 0x007, RETROK_d }, + { 0x008, RETROK_e }, + { 0x009, RETROK_f }, + { 0x00A, RETROK_g }, + { 0x00B, RETROK_h }, + { 0x00C, RETROK_i }, + { 0x00D, RETROK_j }, + { 0x00E, RETROK_k }, + { 0x00F, RETROK_l }, + { 0x010, RETROK_m }, + { 0x011, RETROK_n }, + { 0x012, RETROK_o }, + { 0x013, RETROK_p }, + { 0x014, RETROK_q }, + { 0x015, RETROK_r }, + { 0x016, RETROK_s }, + { 0x017, RETROK_t }, + { 0x018, RETROK_u }, + { 0x019, RETROK_v }, + { 0x01A, RETROK_w }, + { 0x01B, RETROK_x }, + { 0x01C, RETROK_y }, + { 0x01D, RETROK_z }, + { 0x04C, RETROK_DELETE }, + { 0x062, RETROK_KP0 }, + { 0x059, RETROK_KP1 }, + { 0x05A, RETROK_KP2 }, + { 0x05B, RETROK_KP3 }, + { 0x05C, RETROK_KP4 }, + { 0x05D, RETROK_KP5 }, + { 0x05E, RETROK_KP6 }, + { 0x05F, RETROK_KP7 }, + { 0x060, RETROK_KP8 }, + { 0x061, RETROK_KP9 }, + { 0x063, RETROK_KP_PERIOD }, + { 0x054, RETROK_KP_DIVIDE }, + { 0x055, RETROK_KP_MULTIPLY }, + { 0x056, RETROK_KP_MINUS }, + { 0x057, RETROK_KP_PLUS }, + { 0x058, RETROK_KP_ENTER }, + { 0x067, RETROK_KP_EQUALS }, + { 0x052, RETROK_UP }, + { 0x051, RETROK_DOWN }, + { 0x04F, RETROK_RIGHT }, + { 0x050, RETROK_LEFT }, + { 0x049, RETROK_INSERT }, + { 0x04A, RETROK_HOME }, + { 0x04D, RETROK_END }, + { 0x04B, RETROK_PAGEUP }, + { 0x04E, RETROK_PAGEDOWN }, + { 0x03A, RETROK_F1 }, + { 0x03B, RETROK_F2 }, + { 0x03C, RETROK_F3 }, + { 0x03D, RETROK_F4 }, + { 0x03E, RETROK_F5 }, + { 0x03F, RETROK_F6 }, + { 0x040, RETROK_F7 }, + { 0x041, RETROK_F8 }, + { 0x042, RETROK_F9 }, + { 0x043, RETROK_F10 }, + { 0x044, RETROK_F11 }, + { 0x045, RETROK_F12 }, + { 0x068, RETROK_F13 }, + { 0x069, RETROK_F14 }, + { 0x06A, RETROK_F15 }, + { 0x053, RETROK_NUMLOCK }, + { 0x039, RETROK_CAPSLOCK }, + { 0x047, RETROK_SCROLLOCK }, + { 0x0E5, RETROK_RSHIFT }, + { 0x0E1, RETROK_LSHIFT }, + { 0x0E4, RETROK_RCTRL }, + { 0x0E0, RETROK_LCTRL }, + { 0x0E6, RETROK_RALT }, + { 0x0E2, RETROK_LALT }, + /* { ?, RETROK_RMETA }, */ + /* { ?, RETROK_LMETA }, */ + { 0x0E3, RETROK_LSUPER }, + { 0x0E7, RETROK_RSUPER }, + /* { ?, RETROK_MODE },*/ + { 0x075, RETROK_HELP }, + { 0x046, RETROK_PRINT }, + { 0x09A, RETROK_SYSREQ }, + { 0x048, RETROK_BREAK }, + { 0x076, RETROK_MENU }, + { 0x066, RETROK_POWER }, + /*{ ?, RETROK_EURO },*/ + { 0x07A, RETROK_UNDO }, + { 0, RETROK_UNKNOWN }, +}; +#endif + #if defined(HAVE_SDL) || defined(HAVE_SDL2) const struct rarch_key_map rarch_key_map_sdl[] = { { SDLK_BACKSPACE, RETROK_BACKSPACE }, diff --git a/input/input_keymaps.h b/input/input_keymaps.h index d682af4e0e..fa8394ef00 100644 --- a/input/input_keymaps.h +++ b/input/input_keymaps.h @@ -65,6 +65,12 @@ extern const struct rarch_key_map rarch_key_map_qnx[]; extern const struct rarch_key_map rarch_key_map_dos[]; extern const struct rarch_key_map rarch_key_map_wiiu[]; extern const struct rarch_key_map rarch_key_map_winraw[]; +#ifdef HAVE_LIBNX +extern const struct rarch_key_map rarch_key_map_switch[]; +#endif +#ifdef VITA +extern const struct rarch_key_map rarch_key_map_vita[]; +#endif /** * input_keymaps_init_keyboard_lut: diff --git a/intl/msg_hash_ar.c b/intl/msg_hash_ar.c index d4ad60564b..c237c6e534 100644 --- a/intl/msg_hash_ar.c +++ b/intl/msg_hash_ar.c @@ -696,24 +696,24 @@ int menu_hash_get_help_ar_enum(enum msg_hash_enums msg, char *s, size_t len) snprintf(s, len, "To scan for content, go to '%s' and\n" "select either '%s' or %s'.\n" - " \n" + "\n" "Files will be compared to database entries.\n" "If there is a match, it will add an entry\n" - "to a collection.\n" - " \n" + "to a playlist.\n" + "\n" "You can then easily access this content by\n" "going to '%s' ->\n" "'%s'\n" "instead of having to go through the\n" - "filebrowser everytime.\n" - " \n" + "file browser everytime.\n" + "\n" "NOTE: Content for some cores might still not be\n" "scannable.", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ADD_CONTENT_LIST), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCAN_DIRECTORY), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCAN_FILE), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_LIST), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CONTENT_COLLECTION_LIST) + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLISTS_TAB) ); break; case MENU_ENUM_LABEL_VALUE_EXTRACTING_PLEASE_WAIT: @@ -1499,14 +1499,6 @@ int menu_hash_get_help_ar_enum(enum msg_hash_enums msg, char *s, size_t len) "When slowmotion, content will slow\n" "down by factor."); break; - case MENU_ENUM_LABEL_INPUT_AXIS_THRESHOLD: - snprintf(s, len, - "Defines axis threshold.\n" - " \n" - "How far an axis must be tilted to result\n" - "in a button press.\n" - " Possible values are [0.0, 1.0]."); - break; case MENU_ENUM_LABEL_INPUT_TURBO_PERIOD: snprintf(s, len, "Turbo period.\n" diff --git a/intl/msg_hash_ar.h b/intl/msg_hash_ar.h index 4261ff67ba..eed9a5adfb 100644 --- a/intl/msg_hash_ar.h +++ b/intl/msg_hash_ar.h @@ -530,10 +530,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONFIG_SAVE_ON_EXIT, "Save Configuration on Exit" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_COLLECTION_LIST, - "Collections" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_DATABASE_DIRECTORY, "Database" @@ -759,8 +755,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Autoconfig Enable") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, - "Analog Stick Deadzone") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "Menu Swap OK & Cancel Buttons") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_BIND_ALL, @@ -1553,8 +1547,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBRETRODB_SUPPORT, "LibretroDB support") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBUSB_SUPPORT, "Libusb support") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBXML2_SUPPORT, - "libxml2 XML parsing support") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETPLAY_SUPPORT, "Netplay (peer-to-peer) support") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETWORK_COMMAND_IFACE_SUPPORT, @@ -2467,10 +2459,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_SYNC, "Synchronize audio. Recommended." ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_AXIS_THRESHOLD, - "How far an axis must be tilted to result in a button press." - ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_BIND_TIMEOUT, "Amount of seconds to wait until proceeding to the next bind." @@ -2610,8 +2598,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_BATTERY_LEVEL_ENABLE, "Show battery level") MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FILE, "Select File") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FROM_COLLECTION, - "Select From Collection") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FROM_PLAYLIST, + "Select from Playlist") MSG_HASH(MENU_ENUM_LABEL_VALUE_FILTER, "Filter") MSG_HASH(MENU_ENUM_LABEL_VALUE_SCALE, @@ -2694,8 +2682,8 @@ MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_OVERLAY_SHOW_PHYSICAL_INPUTS, MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_OVERLAY_SHOW_PHYSICAL_INPUTS_PORT, "Select the port for the overlay to listen to if Show Inputs On Overlay is enabled.") MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_COLLECTION_LIST, - "Scanned content will appear here." + MENU_ENUM_SUBLABEL_PLAYLISTS_TAB, + "Scanned content matching the database will appear here." ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SCALE_INTEGER, @@ -2950,9 +2938,9 @@ MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_ENABLE_CLIENT, MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_DISCONNECT, "Disconnects an active Netplay connection.") MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_DIRECTORY, - "Scans a directory for compatible files and add them to the collection.") + "Scans a directory for content that matches the database.") MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_FILE, - "Scans a compatible file and add it to the collection.") + "Scans a file for content that matches the database.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SWAP_INTERVAL, "Uses a custom swap interval for Vsync. Set this to effectively halve monitor refresh rate." ) @@ -2974,7 +2962,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_CORE_UPDATER_AUTO_EXTRACT_ARCHIVE, MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_REFRESH_ROOMS, "Scan for new rooms.") MSG_HASH(MENU_ENUM_SUBLABEL_DELETE_ENTRY, - "Remove this entry from the collection.") + "Remove this entry from the playlist.") MSG_HASH(MENU_ENUM_SUBLABEL_INFORMATION, "View more information about the content.") MSG_HASH(MENU_ENUM_SUBLABEL_ADD_TO_FAVORITES, @@ -3050,7 +3038,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_SHOW_ADVANCED_SETTINGS, MSG_HASH(MENU_ENUM_SUBLABEL_THREADED_DATA_RUNLOOP_ENABLE, "Perform tasks on a separate thread.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_REMOVE, - "Allow the user to remove entries from collections.") + "Allow the user to remove entries from playlists.") MSG_HASH(MENU_ENUM_SUBLABEL_SYSTEM_DIRECTORY, "Sets the System directory. Cores can query for this directory to load BIOSes, system-specific configs, etc.") MSG_HASH(MENU_ENUM_SUBLABEL_RGUI_BROWSER_DIRECTORY, @@ -3135,7 +3123,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_LIBRETRO_INFO_PATH, MSG_HASH(MENU_ENUM_SUBLABEL_JOYPAD_AUTOCONFIG_DIR, "If a joypad is plugged in, that joypad will be autoconfigured if a config file corresponding to it is present inside this directory.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_DIRECTORY, - "Save all collections to this directory.") + "Save all playlists to this directory.") MSG_HASH( MENU_ENUM_SUBLABEL_CACHE_DIRECTORY, "If set to a directory, content which is temporarily extracted (e.g. from archives) will be extracted to this directory." @@ -3319,7 +3307,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_XMB_MAIN_MENU_ENABLE_SETTINGS, MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS_PASSWORD, "Supplying a password when hiding the settings tab makes it possible to later restore it from the menu, by going to the Main Menu tab, selecting Enable Settings Tab and entering the password.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_RENAME, - "Allow the user to rename entries in collections.") + "Allow the user to rename entries in playlists.") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_RENAME, "Allow to rename entries") MSG_HASH(MENU_ENUM_SUBLABEL_RENAME_ENTRY, diff --git a/intl/msg_hash_chs.c b/intl/msg_hash_chs.c index 498c4e4e4c..3073da2669 100644 --- a/intl/msg_hash_chs.c +++ b/intl/msg_hash_chs.c @@ -632,15 +632,15 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_VALUE_HELP_SCANNING_CONTENT_DESC: snprintf(s, len, - "若要扫描游戏内容,请访问菜单「%s」 \n" + "若要扫描游戏内容,请访问菜单「%s」\n" "并选择「%s」或者「%s」。\n" - " \n" - "文件将会同数据库中的条目进行对比。 \n" - "若文件匹配某个条目,则它会被加入收藏中。 \n" - " \n" - "你可以无需每次都打开文件浏览器,而可以直接 \n" + "\n" + "文件将会同数据库中的条目进行对比。\n" + "若文件匹配某个条目,则它会被加入戏列表中。\n" + "\n" + "你可以无需每次都打开文件浏览器,而可以直接\n" "通过菜单项「%s」->「%s」 来访\n" - "问这些游戏内容。 \n" + "问这些游戏内容。\n" " \n" "注意:不是所有核心的游戏内容都支持扫描录入。" , @@ -648,7 +648,7 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCAN_DIRECTORY), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCAN_FILE), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_LIST), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CONTENT_COLLECTION_LIST) + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLISTS_TAB) ); break; case MENU_ENUM_LABEL_VALUE_EXTRACTING_PLEASE_WAIT: @@ -1399,13 +1399,6 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) " \n" "减速游戏时,速度将被降低的倍数。"); break; - case MENU_ENUM_LABEL_INPUT_AXIS_THRESHOLD: - snprintf(s, len, - "摇杆灵敏度\n" - " \n" - "必须把摇杆推到多大幅度才算按下按键。\n" - "数值范围为0.0至1.0。"); - break; case MENU_ENUM_LABEL_INPUT_TURBO_PERIOD: snprintf(s, len, "Turbo period.\n" diff --git a/intl/msg_hash_chs.h b/intl/msg_hash_chs.h index 18cdfc12db..cbfbb3dcad 100644 --- a/intl/msg_hash_chs.h +++ b/intl/msg_hash_chs.h @@ -523,10 +523,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONFIRM_ON_EXIT, "退出时进行询问" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_COLLECTION_LIST, - "收藏" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_DATABASE_DIRECTORY, "游戏内容数据库文件夹" @@ -754,8 +750,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "启用自动配置") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, - "摇杆灵敏度") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "互换确定键和取消键") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_BIND_ALL, @@ -1579,8 +1573,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBRETRODB_SUPPORT, "LibretroDB 支持") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBUSB_SUPPORT, "Libusb 支持") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBXML2_SUPPORT, - "libxml2 XML解析支持") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETPLAY_SUPPORT, "Netplay (点对点) 支持") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETWORK_COMMAND_IFACE_SUPPORT, @@ -1775,8 +1767,10 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_CROP_OVERSCAN, "裁剪过扫描部分(需重启)") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DISABLE_COMPOSITION, "禁用桌面元素") +#if defined(_3DS) MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_3DS_LCD_BOTTOM, "3DS底部屏幕") +#endif MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DRIVER, "视频驱动") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FILTER, @@ -2520,10 +2514,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_SYNC, "同步音频。推荐。" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_AXIS_THRESHOLD, - "必须把摇杆推到多大幅度才算按下按键。" - ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_BIND_TIMEOUT, "Amount of seconds to wait until proceeding to the next bind." @@ -2668,7 +2658,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_BATTERY_LEVEL_ENABLE, "显示电池电量") MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FILE, "选择文件") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FROM_COLLECTION, +MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FROM_PLAYLIST, "从收藏中选择") MSG_HASH(MENU_ENUM_LABEL_VALUE_FILTER, "过滤器") @@ -2751,7 +2741,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_OVERLAY_SHOW_PHYSICAL_INPUTS_PORT, "如果开启「在图层上显示控制器」,\n" "请选择相应屏幕图层的端口来侦听。") MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_COLLECTION_LIST, + MENU_ENUM_SUBLABEL_PLAYLISTS_TAB, "扫描到的游戏内容将在此处显示。" ) MSG_HASH( @@ -3170,9 +3160,9 @@ MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_ENABLE_CLIENT, MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_DISCONNECT, "断开当前网络连接。") MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_DIRECTORY, - "扫描目录并将兼容的文件添加到合集中。") + "扫描目录并将兼容的文件添加到播放列表。") MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_FILE, - "扫描一个兼容的文件并将其添加到合集中") + "扫描一个兼容的文件并将其添加到播放列表") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SWAP_INTERVAL, "为垂直同步使用自定义的交换间隔。该设置可以\n" "有效地降低显示器刷新率。" @@ -3283,7 +3273,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_SHOW_ADVANCED_SETTINGS, MSG_HASH(MENU_ENUM_SUBLABEL_THREADED_DATA_RUNLOOP_ENABLE, "在单独的线程上执行任务。") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_REMOVE, - "允许用户从收藏夹中删除游戏。") + "允许用户从播放列表中删除条目。") MSG_HASH(MENU_ENUM_SUBLABEL_SYSTEM_DIRECTORY, "设置系统文件夹。固件和 BIOS 存放在这里。") MSG_HASH(MENU_ENUM_SUBLABEL_RGUI_BROWSER_DIRECTORY, @@ -3377,7 +3367,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_JOYPAD_AUTOCONFIG_DIR, "如果插入的游戏手柄与该目录中的配置文件匹配,\n" "这个游戏手柄将自动完成配置。") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_DIRECTORY, - "保存游戏列表文件的文件夹。") + "保存播放列表文件的文件夹。") MSG_HASH( MENU_ENUM_SUBLABEL_CACHE_DIRECTORY, "如果设置为目录,临时提取的内容(例如从档案中)\n" @@ -3586,7 +3576,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS_PASSWORD, "启用方法:在主菜单中选择「启用设置页」\n" "并输入密码来重新启用设置页。") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_RENAME, - "允许在集合中重命名条目。") + "允许重命名播放列表中的条目。") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_RENAME, "允许重命名条目") MSG_HASH( diff --git a/intl/msg_hash_cht.c b/intl/msg_hash_cht.c index b273803849..a35a38cd0e 100644 --- a/intl/msg_hash_cht.c +++ b/intl/msg_hash_cht.c @@ -646,23 +646,23 @@ int menu_hash_get_help_cht_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_VALUE_HELP_SCANNING_CONTENT_DESC: snprintf(s, len, - "若要掃瞄遊戲內容,請訪問菜單「%s」 \n" + "若要掃瞄遊戲內容,請訪問菜單「%s」\n" "並選擇「%s」或者「%s」。\n" - " \n" - "文件將會同數據庫中的條目進行對比。 \n" - "若文件匹配某個條目,則它會被加入收藏中。 \n" - " \n" - "你可以無需每次都打開文件瀏覽器,而可以直接 \n" + "\n" + "文件將會同數據庫中的條目進行對比。\n" + "若文件匹配某個條目,則它會被加入遊戲列表中。\n" + "\n" + "你可以無需每次都打開文件瀏覽器,而可以直接\n" "通過菜單項「%s」->「%s」 來訪\n" - "問這些遊戲內容。 \n" - " \n" + "問這些遊戲內容。\n" + "\n" "注意:不是所有核心的遊戲內容都支持掃瞄錄入。" , msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ADD_CONTENT_LIST), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCAN_DIRECTORY), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCAN_FILE), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_LIST), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CONTENT_COLLECTION_LIST) + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLISTS_TAB) ); break; case MENU_ENUM_LABEL_VALUE_EXTRACTING_PLEASE_WAIT: @@ -1443,14 +1443,6 @@ int menu_hash_get_help_cht_enum(enum msg_hash_enums msg, char *s, size_t len) "When slowmotion, content will slow\n" "down by factor."); break; - case MENU_ENUM_LABEL_INPUT_AXIS_THRESHOLD: - snprintf(s, len, - "Defines axis threshold.\n" - " \n" - "How far an axis must be tilted to result\n" - "in a button press.\n" - " Possible values are [0.0, 1.0]."); - break; case MENU_ENUM_LABEL_INPUT_TURBO_PERIOD: snprintf(s, len, "Turbo period.\n" diff --git a/intl/msg_hash_cht.h b/intl/msg_hash_cht.h index 7661b5aa54..51fcd9bec1 100644 --- a/intl/msg_hash_cht.h +++ b/intl/msg_hash_cht.h @@ -473,10 +473,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONFIRM_ON_EXIT, "退出時進行詢問" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_COLLECTION_LIST, - "收藏" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_DATABASE_DIRECTORY, "遊戲內容數據庫目錄" @@ -702,8 +698,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "啟用自動設定") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, - "輸入軸閾值") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "選單切換 確定/取消 按鈕") /*FIXME:"Menu Swap OK & Cancel Buttons"*/ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_BIND_ALL, @@ -1431,8 +1425,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBRETRODB_SUPPORT, "LibretroDB 支持") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBUSB_SUPPORT, "Libusb 支持") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBXML2_SUPPORT, - "libxml2 XML解析支持") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETPLAY_SUPPORT, "Netplay (點對點) 支持") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETWORK_COMMAND_IFACE_SUPPORT, @@ -1591,8 +1583,10 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_CROP_OVERSCAN, "Crop Overscan (Reload)") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DISABLE_COMPOSITION, "禁用桌面元素") +#if defined(_3DS) MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_3DS_LCD_BOTTOM, "3DS底部屏幕") +#endif MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DRIVER, "視訊驅動") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FILTER, @@ -2296,10 +2290,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_SYNC, "同步聲音。推薦。" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_AXIS_THRESHOLD, - "How far an axis must be tilted to result in a button press." - ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_BIND_TIMEOUT, "Amount of seconds to wait until proceeding to the next bind." @@ -2439,8 +2429,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_BATTERY_LEVEL_ENABLE, "顯示電池電量") MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FILE, "選擇文件") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FROM_COLLECTION, - "從收藏中選擇") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FROM_PLAYLIST, + "從播放列表中選擇") MSG_HASH(MENU_ENUM_LABEL_VALUE_FILTER, "過濾器") MSG_HASH(MENU_ENUM_LABEL_VALUE_SCALE, @@ -2512,7 +2502,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FONT_SIZE, MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_OVERLAY_HIDE_IN_MENU, "Hide the overlay while inside the menu, and show it again when exiting the menu.") MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_COLLECTION_LIST, + MENU_ENUM_SUBLABEL_PLAYLISTS_TAB, "Scanned content will appear here." ) MSG_HASH( @@ -2768,9 +2758,9 @@ MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_ENABLE_CLIENT, MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_DISCONNECT, "Disconnects an active Netplay connection.") MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_DIRECTORY, - "Scans a directory for compatible files and add them to the collection.") + "Scans a directory for content that matches the database.") MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_FILE, - "Scans a compatible file and add it to the collection.") + "Scans a file for content that matches the database.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SWAP_INTERVAL, "Uses a custom swap interval for Vsync. Set this to effectively halve monitor refresh rate." ) @@ -2790,7 +2780,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_CORE_UPDATER_AUTO_EXTRACT_ARCHIVE, MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_REFRESH_ROOMS, "Scan for new rooms.") MSG_HASH(MENU_ENUM_SUBLABEL_DELETE_ENTRY, - "Remove this entry from the collection.") + "Remove this entry from the playlist.") MSG_HASH(MENU_ENUM_SUBLABEL_INFORMATION, "View more information about the content.") MSG_HASH(MENU_ENUM_SUBLABEL_RUN, @@ -2862,7 +2852,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_SHOW_ADVANCED_SETTINGS, MSG_HASH(MENU_ENUM_SUBLABEL_THREADED_DATA_RUNLOOP_ENABLE, "Perform tasks on a separate thread.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_REMOVE, - "Allow the user to remove entries from collections.") + "Allow the user to remove entries from playlists.") MSG_HASH(MENU_ENUM_SUBLABEL_SYSTEM_DIRECTORY, "Sets the System directory. Cores can query for this directory to load BIOSes, system-specific configs, etc.") MSG_HASH(MENU_ENUM_SUBLABEL_RGUI_BROWSER_DIRECTORY, @@ -2945,7 +2935,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_LIBRETRO_INFO_PATH, MSG_HASH(MENU_ENUM_SUBLABEL_JOYPAD_AUTOCONFIG_DIR, "If a joypad is plugged in, that joypad will be autoconfigured if a config file corresponding to it is present inside this directory.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_DIRECTORY, - "Save all collections to this directory.") + "Save all playlists to this directory.") MSG_HASH( MENU_ENUM_SUBLABEL_CACHE_DIRECTORY, "If set to a directory, content which is temporarily extracted (e.g. from archives) will be extracted to this directory." @@ -3123,7 +3113,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_XMB_MAIN_MENU_ENABLE_SETTINGS, MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS_PASSWORD, "請輸入隱藏 settings tab 的密碼。事後可在選項中取消") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_RENAME, - "Allow the user to rename entries in collections.") + "Allow the user to rename entries in playlists.") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_RENAME, "Allow to rename entries") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_LOAD_CORE, diff --git a/intl/msg_hash_de.c b/intl/msg_hash_de.c index 35d288c79d..1a0e7fa67e 100644 --- a/intl/msg_hash_de.c +++ b/intl/msg_hash_de.c @@ -339,9 +339,9 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_PLAYLIST_DIRECTORY: snprintf(s, len, - "Wiedergabelisten-Verzeichnis. \n" + "Playlists-Verzeichnis. \n" " \n" - "Speichere alle Wiedergabelisten in diesem \n" + "Speichere alle Playlists in diesem \n" "Verzeichnis."); break; case MENU_ENUM_LABEL_DUMMY_ON_CORE_SHUTDOWN: @@ -676,17 +676,17 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) snprintf(s, len, "Um nach Inhalten zu suchen, gehe zu '%s' und\n" "wähle '%s' oder %s'.\n" - " \n" + "\n" "Die Dateien werden werden mit einer Datenbank abgeglichen.\n" - "Bei einem Treffer wird die Datei zu einer Sammlung\n" + "Bei einem Treffer wird die Datei zu einer Playlist\n" "hinzugefügt.\n" - " \n" + "\n" "du kannst diese Inhalte einfach aufrufen, indem du\n" "zu'%s' ->\n" "'%s'\n gehst," "anstatt jedes Mal den Dateibrowser\n" "verwenden zu müssen.\n" - " \n" + "\n" "HINWEIS: Inhalte für einige Cores können möglicherweise\n" "noch nicht durchsucht werden." , @@ -694,7 +694,7 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCAN_DIRECTORY), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCAN_FILE), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_LIST), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CONTENT_COLLECTION_LIST) + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLISTS_TAB) ); break; case MENU_ENUM_LABEL_VALUE_EXTRACTING_PLEASE_WAIT: @@ -1492,14 +1492,6 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) "Ist die Zeitlupe eingeschaltet, wird das Spiel \n" "um diesen Faktor verlangsamt."); break; - case MENU_ENUM_LABEL_INPUT_AXIS_THRESHOLD: - snprintf(s, len, - "Definiert Achsen-Grenzwert.\n" - " \n" - "Wie weit eine Achse bewegt werden muss, um einen \n" - "Tastendruck auszulösen .\n" - "Mögliche Werte liegen im Bereich [0.0, 1.0]."); - break; case MENU_ENUM_LABEL_INPUT_TURBO_PERIOD: snprintf(s, len, "Turbo-Frequenz.\n" diff --git a/intl/msg_hash_de.h b/intl/msg_hash_de.h index 1be3956bfc..aa8d12dc5c 100644 --- a/intl/msg_hash_de.h +++ b/intl/msg_hash_de.h @@ -506,10 +506,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONFIG_SAVE_ON_EXIT, "Einstellungen beim Beenden speichern" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_COLLECTION_LIST, - "Sammlungen" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_DATABASE_DIRECTORY, "Inhaltsdatenbank" @@ -735,8 +731,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Automatische Konfiguration aktivieren") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, - "Schwellenwert der Analogsticks") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "Vertausche OK- und Zurück-Tasten im Menü") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_BIND_ALL, @@ -1140,9 +1134,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_NETWORKS_FOUND, MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_PERFORMANCE_COUNTERS, "Keine Leistungszähler.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_PLAYLISTS, - "Keine Wiedergabelisten.") + "Keine Playlists.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_PLAYLIST_ENTRIES_AVAILABLE, - "Keine Wiedergabelisten-Einträge verfügbar.") + "Keine Playlist-Einträge verfügbar.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_SETTINGS_FOUND, "Keine Einstellungen gefunden.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_SHADER_PARAMETERS, @@ -1190,11 +1184,11 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_PAUSE_NONACTIVE, MSG_HASH(MENU_ENUM_LABEL_VALUE_PERFCNT_ENABLE, "Leistungsindikatoren") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLISTS_TAB, - "Wiedergabelisten") + "Playlists") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_DIRECTORY, - "Wiedergabelisten") + "Playlists") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_SETTINGS, - "Wiedergabelisten") + "Playlists") MSG_HASH(MENU_ENUM_LABEL_VALUE_POINTER_ENABLE, "Touch-Unterstützung") MSG_HASH(MENU_ENUM_LABEL_VALUE_PORT, @@ -1500,8 +1494,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBRETRODB_SUPPORT, "LibretroDB-Unterstützung") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBUSB_SUPPORT, "Libusb-Unterstützung") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBXML2_SUPPORT, - "Libxml2-XML-Parsing-Unterstützung") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETPLAY_SUPPORT, "Netplay-Unterstützung (Peer-to-Peer)") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETWORK_COMMAND_IFACE_SUPPORT, @@ -1664,8 +1656,10 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_CROP_OVERSCAN, "Bildränder (Overscan) zuschneiden (Neustart erforderlich)") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DISABLE_COMPOSITION, "Deaktiviere Desktop-Gestaltung") +#if defined(_3DS) MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_3DS_LCD_BOTTOM, "3DS-Bildschirm unten") +#endif MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DRIVER, "Videotreiber") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FILTER, @@ -1891,7 +1885,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_PRIVACY_SETTINGS, MSG_HASH(MENU_ENUM_SUBLABEL_DIRECTORY_SETTINGS, "Ändere die Standard-Verzeichnisse für dieses System") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_SETTINGS, - "Ändere die Einstellungen für die Wiedergabelisten.") + "Ändere die Einstellungen für die Playlists.") MSG_HASH(MENU_ENUM_SUBLABEL_NETWORK_SETTINGS, "Ändere die Einstellungen für das Netzwerk.") MSG_HASH(MENU_ENUM_SUBLABEL_ADD_CONTENT_LIST, @@ -2404,10 +2398,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_SYNC, "Synchronisiere Audio. Empfohlen." ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_AXIS_THRESHOLD, - "Legt fest, wie weit ein Analog-Stick bewegt werden muss, bis er reagiert." - ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_BIND_TIMEOUT, "Zeitdauer in Sekunden, nach der die nächste Tastenbelegung abgefragt wird." @@ -2528,7 +2518,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_PAUSE_NONACTIVE, MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_DISABLE_COMPOSITION, "Aktiviere oder deaktiviere Desktop-Gestaltung (nur Windows).") MSG_HASH(MENU_ENUM_SUBLABEL_HISTORY_LIST_ENABLE, - "Aktiviere Wiedergabeliste für kürzlich geöffnete Inhalte.") + "Aktiviere Playlist für kürzlich geöffnete Inhalte.") MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_HISTORY_SIZE, "Begrenzt die Anzahl der Einträge in der Verlaufsliste.") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_UNIFIED_MENU_CONTROLS, @@ -2543,8 +2533,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_BATTERY_LEVEL_ENABLE, "Akkustand anzeigen") MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FILE, "Wähle Datei") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FROM_COLLECTION, - "Wähle aus Sammlung") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FROM_PLAYLIST, + "Wähle aus Playlist") MSG_HASH(MENU_ENUM_LABEL_VALUE_FILTER, "Filter") MSG_HASH(MENU_ENUM_LABEL_VALUE_SCALE, @@ -2620,7 +2610,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_OVERLAY_SHOW_PHYSICAL_INPUTS, MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_OVERLAY_SHOW_PHYSICAL_INPUTS_PORT, "Wähle den Port des Controllers aus, dessen Eingaben im Overlay angezeigt werden sollen.") MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_COLLECTION_LIST, + MENU_ENUM_SUBLABEL_PLAYLISTS_TAB, "Während der Suche gefundener Inhalt wird hier erscheinen." ) MSG_HASH( @@ -2876,9 +2866,9 @@ MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_ENABLE_CLIENT, MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_DISCONNECT, "Beendet eine aktive Netplay-Verbindung.") MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_DIRECTORY, - "Durchsuche ein Verzeichnis nach kompatiblen Dateien und füge diese zur Sammlung hinzu.") + "Durchsuche ein Verzeichnis nach kompatiblen Dateien.") MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_FILE, - "Untersuche eine kompatible Datei und fügt diese zur Sammlung hinzu.") + "Untersuche eine kompatible Datei.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SWAP_INTERVAL, "Verwende ein eigenes Intervall für Vsync. Aktivieren, um die Bildschirm-Wiederholrate zu halbieren." ) @@ -2898,7 +2888,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_CORE_UPDATER_AUTO_EXTRACT_ARCHIVE, MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_REFRESH_ROOMS, "Suche nach neuen Räumen.") MSG_HASH(MENU_ENUM_SUBLABEL_DELETE_ENTRY, - "Entferne diesen Eintrag aus der Sammlung.") + "Entferne diesen Eintrag aus der Playlist.") MSG_HASH(MENU_ENUM_SUBLABEL_INFORMATION, "Zeige weiterführende Informationen über diesen Inhalt an.") MSG_HASH(MENU_ENUM_SUBLABEL_ADD_TO_FAVORITES, @@ -2974,7 +2964,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_SHOW_ADVANCED_SETTINGS, MSG_HASH(MENU_ENUM_SUBLABEL_THREADED_DATA_RUNLOOP_ENABLE, "Führe Aufgaben im Hintergrund aus.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_REMOVE, - "Erlaube dem Benutzer, Einträge aus der Sammlung zu entfernen.") + "Erlaube dem Benutzer, Einträge aus den Playlists zu entfernen.") MSG_HASH(MENU_ENUM_SUBLABEL_SYSTEM_DIRECTORY, "Lege das Systemverzeichnis fest. Cores können dieses Verzeichnis verwenden, um ein BIOS, system-spezifische Konfigurationen usw. zu laden.") MSG_HASH(MENU_ENUM_SUBLABEL_RGUI_BROWSER_DIRECTORY, @@ -3057,7 +3047,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_LIBRETRO_INFO_PATH, MSG_HASH(MENU_ENUM_SUBLABEL_JOYPAD_AUTOCONFIG_DIR, "Wenn ein Controller eingesteckt wird, wird er automatisch konfiguriert, sofern eine passende Konfigurationsdatei in diesem Verzeichnis vorhanden ist.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_DIRECTORY, - "Speichere alle Sammlungen in diesem Verzeichnis.") + "Speichere alle Playlists in diesem Verzeichnis.") MSG_HASH( MENU_ENUM_SUBLABEL_CACHE_DIRECTORY, "Wenn ein Verzeichnis gewählt wird, wird Inhalt, der temporär entpackt wird (z.B. aus Archiven) in dieses Verzeichnis entpackt." @@ -3237,7 +3227,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_XMB_MAIN_MENU_ENABLE_SETTINGS, MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS_PASSWORD, "Wird vor dem Verstecken der Einstellungen ein Passwort vergeben, wird es später möglich sein, den Reiter wiederherzustellen, in dem die Funktion 'Aktiviere den Reiter 'Einstellungen' ausgewählt und das Passwort dort eingegeben wird.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_RENAME, - "Erlaube dem Benutzer, Einträge in der Sammlung umzubenennen.") + "Erlaube dem Benutzer, Einträge in den Playlists umzubenennen.") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_RENAME, "Umbenennen von Einträgen erlauben") MSG_HASH(MENU_ENUM_LABEL_VALUE_RENAME_ENTRY, diff --git a/intl/msg_hash_el.c b/intl/msg_hash_el.c index 8ca0867487..fc2c26292a 100644 --- a/intl/msg_hash_el.c +++ b/intl/msg_hash_el.c @@ -706,24 +706,24 @@ int menu_hash_get_help_el_enum(enum msg_hash_enums msg, char *s, size_t len) snprintf(s, len, "To scan for content, go to '%s' and\n" "select either '%s' or %s'.\n" - " \n" + "\n" "Files will be compared to database entries.\n" "If there is a match, it will add an entry\n" - "to a collection.\n" - " \n" + "to a playlist.\n" + "\n" "You can then easily access this content by\n" "going to '%s' ->\n" "'%s'\n" "instead of having to go through the\n" - "filebrowser everytime.\n" - " \n" + "file browser every time.\n" + "\n" "NOTE: Content for some cores might still not be\n" "scannable.", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ADD_CONTENT_LIST), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCAN_DIRECTORY), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCAN_FILE), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_LIST), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CONTENT_COLLECTION_LIST) + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLISTS_TAB) ); break; case MENU_ENUM_LABEL_VALUE_EXTRACTING_PLEASE_WAIT: @@ -1559,14 +1559,6 @@ int menu_hash_get_help_el_enum(enum msg_hash_enums msg, char *s, size_t len) "When slowmotion, content will slow\n" "down by factor."); break; - case MENU_ENUM_LABEL_INPUT_AXIS_THRESHOLD: - snprintf(s, len, - "Defines axis threshold.\n" - " \n" - "How far an axis must be tilted to result\n" - "in a button press.\n" - " Possible values are [0.0, 1.0]."); - break; case MENU_ENUM_LABEL_INPUT_TURBO_PERIOD: snprintf(s, len, "Turbo period.\n" diff --git a/intl/msg_hash_el.h b/intl/msg_hash_el.h index 9fd13ec7a7..277010eeb8 100644 --- a/intl/msg_hash_el.h +++ b/intl/msg_hash_el.h @@ -554,10 +554,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONFIG_SAVE_ON_EXIT, "Απόθηκευση Διαμόρφωσης στην Έξοδο" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_COLLECTION_LIST, - "Συλλογές" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_DATABASE_DIRECTORY, "Βάσεις Δεδομένων" @@ -1002,10 +998,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Ενεργοποίηση Αυτόματης Διαμόρφωσης" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, - "Νεκρή Ζώνη Αναλογικού" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "Εναλλαγή Κουμπιών Επιβεβαίωσης & Ακύρωσης Στο Μενού" @@ -2670,10 +2662,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBUSB_SUPPORT, "Υποστήριξη Libusb" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBXML2_SUPPORT, - "Υποστήριξη ανάλυσης libxml2 XML" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETPLAY_SUPPORT, "Υποστήριξη Netplay (peer-to-peer)" @@ -3058,10 +3046,12 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_DISABLE_COMPOSITION, "Disable Desktop Composition" ) +#if defined(_3DS) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_3DS_LCD_BOTTOM, "Κάτω οθόνη 3DS" ) +#endif MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_DRIVER, "Οδηγός Βίντεο" @@ -4542,10 +4532,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_SYNC, "Συγχρονισμός ήχου. Προτείνεται." ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_AXIS_THRESHOLD, - "Πόσο μακριά ένας άξωνας πρέπει να γείρει ώστε να οδηγήσει σε πάτημα κουμπιού." - ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_BIND_TIMEOUT, "Χρόνος αναμονής σε δευτερόλεπτα μέχρι την συνέχιση στην επόμενη σύνδεση πλήκτρων." @@ -4739,10 +4725,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SELECT_FILE, "Επιλογή Αρχείου" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_SELECT_FROM_COLLECTION, - "Επιλογή Από Συλλογή" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_FILTER, "Φίλτρα" @@ -4885,7 +4867,7 @@ MSG_HASH( "Επιλογή της θύρας για όταν είναι ενεργοποιημένη η επιλογή 'Εμφάνιση Εισαγωγών Στην Οθόνη'" ) MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_COLLECTION_LIST, + MENU_ENUM_SUBLABEL_PLAYLISTS_TAB, "Το σαρωμένο περιεχόμενο θα εμφανίζεται εδώ." ) MSG_HASH( @@ -5295,11 +5277,11 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_SCAN_DIRECTORY, - "Σαρώνει ένα ευρετήριο για συμβατά αρχεία και τα προσθέτει στην συλλογή." + "Σαρώνει ένα ευρετήριο για συμβατά αρχεία." ) MSG_HASH( MENU_ENUM_SUBLABEL_SCAN_FILE, - "Σαρώνει ένα συμβατό αρχείο και το προσθέτει στην συλλογή." + "Σαρώνει ένα συμβατό αρχείο" ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SWAP_INTERVAL, @@ -5333,10 +5315,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_REFRESH_ROOMS, "Σάρωση για νέα δωμάτια." ) -MSG_HASH( - MENU_ENUM_SUBLABEL_DELETE_ENTRY, - "Κατάργηση αυτής της καταχώρησης από την συλλογή." - ) MSG_HASH( MENU_ENUM_SUBLABEL_INFORMATION, "View more information about the content." @@ -5477,10 +5455,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_THREADED_DATA_RUNLOOP_ENABLE, "Perform tasks on a separate thread." ) -MSG_HASH( - MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_REMOVE, - "Επιτρέψτε στον χρήστη να καταργεί τις καταχωρήσεις από την συλλογή." - ) MSG_HASH( MENU_ENUM_SUBLABEL_SYSTEM_DIRECTORY, "Sets the System directory. Cores can query for this directory to load BIOSes, system-specific configs, etc." @@ -5648,7 +5622,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_PLAYLIST_DIRECTORY, - "Save all collections to this directory." + "Save all playlists to this directory." ) MSG_HASH( MENU_ENUM_SUBLABEL_CACHE_DIRECTORY, @@ -5970,10 +5944,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS_PASSWORD, "Supplying a password when hiding the settings tab makes it possible to later restore it from the menu, by going to the Main Menu tab, selecting Enable Settings Tab and entering the password." ) -MSG_HASH( - MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_RENAME, - "Επιτρέψτε στον χρήστη να μετονομάζει τις καταχωρήσεις στην συλλογή." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_RENAME, "Επίτρεψη μετονομασίας καταχωρήσεων" diff --git a/intl/msg_hash_eo.h b/intl/msg_hash_eo.h index b67e4a6245..8bd0a1bf94 100644 --- a/intl/msg_hash_eo.h +++ b/intl/msg_hash_eo.h @@ -399,10 +399,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONFIG_SAVE_ON_EXIT, "Save Configuration on Exit" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_COLLECTION_LIST, - "Collections" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_DATABASE_DIRECTORY, "Content Database" @@ -622,8 +618,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Autoconfig Enable") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, - "Analog Stick Deadzone") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "Menu Swap OK & Cancel Buttons") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_BIND_ALL, @@ -1050,7 +1044,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_PERFCNT_ENABLE, MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLISTS_TAB, "Playlists") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_DIRECTORY, - "Playlist") + "Playlists") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_SETTINGS, "Playlists") MSG_HASH(MENU_ENUM_LABEL_VALUE_POINTER_ENABLE, @@ -1341,8 +1335,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBRETRODB_SUPPORT, "LibretroDB support") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBUSB_SUPPORT, "Libusb support") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBXML2_SUPPORT, - "libxml2 XML parsing support") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETPLAY_SUPPORT, "Netplay (peer-to-peer) support") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETWORK_COMMAND_IFACE_SUPPORT, @@ -1501,8 +1493,10 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_CROP_OVERSCAN, "Crop Overscan (Reload)") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DISABLE_COMPOSITION, "Disable Desktop Composition") +#if defined(_3DS) MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_3DS_LCD_BOTTOM, "3DS Fundo Ekrano") +#endif MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DRIVER, "Video Driver") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FILTER, @@ -2205,10 +2199,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_SYNC, "Synchronize audio. Recommended." ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_AXIS_THRESHOLD, - "How far an axis must be tilted to result in a button press." - ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_BIND_TIMEOUT, "Amount of seconds to wait until proceeding to the next bind." @@ -2398,8 +2388,8 @@ MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FONT_SIZE, MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_OVERLAY_HIDE_IN_MENU, "Hide the overlay while inside the menu, and show it again when exiting the menu.") MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_COLLECTION_LIST, - "Scanned content will appear here." + MENU_ENUM_SUBLABEL_PLAYLISTS_TAB, + "Scanned content matching the database will appear here." ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SCALE_INTEGER, @@ -2654,9 +2644,9 @@ MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_ENABLE_CLIENT, MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_DISCONNECT, "Disconnects an active Netplay connection.") MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_DIRECTORY, - "Scans a directory for compatible files and add them to the collection.") + "Scans a directory for content that matches the database.") MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_FILE, - "Scans a compatible file and add it to the collection.") + "Scans a file for content that matches the database.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SWAP_INTERVAL, "Uses a custom swap interval for Vsync. Set this to effectively halve monitor refresh rate." ) @@ -2676,7 +2666,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_CORE_UPDATER_AUTO_EXTRACT_ARCHIVE, MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_REFRESH_ROOMS, "Scan for new rooms.") MSG_HASH(MENU_ENUM_SUBLABEL_DELETE_ENTRY, - "Remove this entry from the collection.") + "Remove this entry from the playlist.") MSG_HASH(MENU_ENUM_SUBLABEL_INFORMATION, "View more information about the content.") MSG_HASH(MENU_ENUM_SUBLABEL_RUN, @@ -2748,7 +2738,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_SHOW_ADVANCED_SETTINGS, MSG_HASH(MENU_ENUM_SUBLABEL_THREADED_DATA_RUNLOOP_ENABLE, "Perform tasks on a separate thread.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_REMOVE, - "Allow the user to remove entries from collections.") + "Allow the user to remove entries from playlists.") MSG_HASH(MENU_ENUM_SUBLABEL_SYSTEM_DIRECTORY, "Sets the System directory. Cores can query for this directory to load BIOSes, system-specific configs, etc.") MSG_HASH(MENU_ENUM_SUBLABEL_RGUI_BROWSER_DIRECTORY, @@ -2833,7 +2823,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_LIBRETRO_INFO_PATH, MSG_HASH(MENU_ENUM_SUBLABEL_JOYPAD_AUTOCONFIG_DIR, "If a joypad is plugged in, that joypad will be autoconfigured if a config file corresponding to it is present inside this directory.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_DIRECTORY, - "Save all collections to this directory.") + "Save all playlists to this directory.") MSG_HASH( MENU_ENUM_SUBLABEL_CACHE_DIRECTORY, "If set to a directory, content which is temporarily extracted (e.g. from archives) will be extracted to this directory." @@ -3011,7 +3001,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_XMB_MAIN_MENU_ENABLE_SETTINGS, MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS_PASSWORD, "Supplying a password when hiding the settings tab makes it possible to later restore it from the menu, by going to the Main Menu tab, selecting Enable Settings Tab and entering the password.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_RENAME, - "Allow the user to rename entries in collections.") + "Allow the user to rename entries in playlists.") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_RENAME, "Allow to rename entries") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_LOAD_CORE, diff --git a/intl/msg_hash_es.c b/intl/msg_hash_es.c index 1b0842119f..7cf9685353 100644 --- a/intl/msg_hash_es.c +++ b/intl/msg_hash_es.c @@ -102,18 +102,18 @@ int menu_hash_get_help_es_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_VALUE_HELP_SCANNING_CONTENT_DESC: snprintf(s, len, - "Para escanear contenidos ve a '%s' \n" + "Para escanear contenidos ve a '%s'\n" "y selecciona '%s' o '%s'.\n" - " \n" - "Esto comparará los archivos con las entradas en \n" - "la base de datos. Si hay una coincidencia, \n" - "añadirá una entrada en una colección.\n" - " \n" + "\n" + "Esto comparará los archivos con las entradas en\n" + "la base de datos. Si hay una coincidencia,\n" + "añadirá una entrada en una lista de reproducción.\n" + "\n" "Entonces podrás acceder fácilmente al contenido\n" "si vas a '%s' -> '%s'\n" - "en vez de tener que pasar por el navegador \n" + "en vez de tener que pasar por el navegador\n" "de archivos constantemente.\n" - " \n" + "\n" "NOTA: El contenido de algunos núcleos podría\n" "no ser localizable. Entre los ejemplos están\n" "PlayStation, MAME, FBA, y puede que otros.", @@ -121,7 +121,7 @@ int menu_hash_get_help_es_enum(enum msg_hash_enums msg, char *s, size_t len) msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCAN_DIRECTORY), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCAN_FILE), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_LIST), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CONTENT_COLLECTION_LIST) + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLISTS_TAB) ); break; case MENU_ENUM_LABEL_VALUE_EXTRACTING_PLEASE_WAIT: @@ -987,15 +987,6 @@ int menu_hash_get_help_es_enum(enum msg_hash_enums msg, char *s, size_t len) "Al reducir la velocidad, el contenido \n" "se ralentizará según este factor."); break; - case MENU_ENUM_LABEL_INPUT_AXIS_THRESHOLD: - snprintf(s, len, - "Define el margen de los ejes.\n" - " \n" - "Indica la distancia mínima que debe \n" - "recorrer un eje para que provoque \n" - "una pulsación del botón.\n" - "Los valores posibles son [0.0, 1.0]."); - break; case MENU_ENUM_LABEL_INPUT_TURBO_PERIOD: snprintf(s, len, "Período de turbo.\n" diff --git a/intl/msg_hash_es.h b/intl/msg_hash_es.h index bbfe18ff73..d28468f27a 100644 --- a/intl/msg_hash_es.h +++ b/intl/msg_hash_es.h @@ -581,10 +581,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONFIG_SAVE_ON_EXIT, "Guardar configuración al salir" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_COLLECTION_LIST, - "Colecciones" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_DATABASE_DIRECTORY, "Base de datos" @@ -1045,10 +1041,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Activar Auto-configuración" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, - "Zona muerta analógica" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "Menú: cambiar OK y Cancelar" @@ -2738,10 +2730,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBUSB_SUPPORT, "Soporte de Libusb" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBXML2_SUPPORT, - "Soporte de parseo XML libxml2" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETPLAY_SUPPORT, "Soporte de juego en red (peer-to-peer)" @@ -3126,10 +3114,12 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_DISABLE_COMPOSITION, "Desactivar composición de escritorio" ) +#if defined(_3DS) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_3DS_LCD_BOTTOM, "Pantalla inferior 3DS" ) +#endif MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_DRIVER, "Controlador de video" @@ -4623,10 +4613,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_SYNC, "Sincronizar audio. Recomendado" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_AXIS_THRESHOLD, - "Cuanto debe mover la palanca para ser detectada. Evita movimientos indeseados en los mandos que no vuelven perfectamente al centro" - ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_BIND_TIMEOUT, "Cantidad de segundos a esperar hasta la siguiente asignación" @@ -4821,8 +4807,8 @@ MSG_HASH( "Seleccionar archivo" ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_SELECT_FROM_COLLECTION, - "Seleccionar de la colección" + MENU_ENUM_LABEL_VALUE_SELECT_FROM_PLAYLIST, + "Seleccionar de la lista de reproducción" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_FILTER, @@ -4985,7 +4971,7 @@ MSG_HASH( "Seleccionar el puerto en que los controles en pantalla escucharán las pulsaciones" ) MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_COLLECTION_LIST, + MENU_ENUM_SUBLABEL_PLAYLISTS_TAB, "El contenido escaneado aparecerá aquí" ) MSG_HASH( @@ -5396,11 +5382,11 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_SCAN_DIRECTORY, - "Escanea una carpeta en busca de archivos compatibles y los añade a la colección" + "Escanea una carpeta en busca de archivos compatibles." ) MSG_HASH( MENU_ENUM_SUBLABEL_SCAN_FILE, - "Escanea un archivo compatible y lo añade a la colección" + "Escanea un archivo compatible." ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SWAP_INTERVAL, @@ -5436,7 +5422,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_DELETE_ENTRY, - "Eliminar esta entrada de la colección" + "Eliminar esta entrada de la lista de reproducción" ) MSG_HASH( MENU_ENUM_SUBLABEL_INFORMATION, @@ -5580,7 +5566,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_REMOVE, - "Permitir al usuario eliminar entradas de las colecciones" + "Permitir al usuario eliminar entradas de las listas de reproducción" ) MSG_HASH( MENU_ENUM_SUBLABEL_SYSTEM_DIRECTORY, @@ -5749,7 +5735,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_PLAYLIST_DIRECTORY, - "Guardar colecciones en esta carpeta" + "Guardar listas de reproducción en esta carpeta" ) MSG_HASH( MENU_ENUM_SUBLABEL_CACHE_DIRECTORY, @@ -6073,7 +6059,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_RENAME, - "Permitir al usuario renombrar entradas en colecciones" + "Permitir al usuario renombrar entradas en listas de reproducción" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_RENAME, diff --git a/intl/msg_hash_fr.h b/intl/msg_hash_fr.h index 1fe39d6a1f..f19fba3360 100644 --- a/intl/msg_hash_fr.h +++ b/intl/msg_hash_fr.h @@ -474,10 +474,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONFIG_SAVE_ON_EXIT, "Sauvegarder la configuration en quittant" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_COLLECTION_LIST, - "Collections" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_DATABASE_DIRECTORY, "Base de données" @@ -701,8 +697,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Activer l'autoconfiguration") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, - "Seuil des axes analogiques") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "Inverser les boutons OK et Annuler dans le menu") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_BIND_ALL, @@ -1456,8 +1450,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBRETRODB_SUPPORT, "Support de LibretroDB") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBUSB_SUPPORT, "Support de Libusb") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBXML2_SUPPORT, - "Support du parser XML libxml2") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETPLAY_SUPPORT, "Support du jeu en réseau (peer-to-peer)") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETWORK_COMMAND_IFACE_SUPPORT, @@ -1618,8 +1610,10 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_CROP_OVERSCAN, "Tronquer l'overscan (Reload)") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DISABLE_COMPOSITION, "Désactiver le compositeur de bureau") +#if defined(_3DS) MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_3DS_LCD_BOTTOM, "Écran inférieur 3DS") +#endif MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DRIVER, "Pilote vidéo") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FILTER, @@ -2344,10 +2338,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_SYNC, "Synchroniser le son avec le jeu. Recommandé." ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_AXIS_THRESHOLD, - "Indique à quel point un axe doit être poussé avant d'obtenir une pression sur un bouton." - ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_BIND_TIMEOUT, "Nombre de secondes à attendre avant de passer à l'assignation suivante." @@ -2483,8 +2473,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_BATTERY_LEVEL_ENABLE, "Afficher le niveau de la batterie") MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FILE, "Sélectionner un fichier") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FROM_COLLECTION, - "Sélectionner depuis la collection") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FROM_PLAYLIST, + "Sélectionner depuis la playlist") MSG_HASH(MENU_ENUM_LABEL_VALUE_FILTER, "Filtre") MSG_HASH(MENU_ENUM_LABEL_VALUE_SCALE, @@ -2556,7 +2546,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FONT_SIZE, MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_OVERLAY_HIDE_IN_MENU, "Cacher l'overlay quand vous êtes dans le menu. Il sera actif uniquement dans les jeux.") MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_COLLECTION_LIST, + MENU_ENUM_SUBLABEL_PLAYLISTS_TAB, "Les contenus scannés apparaitront ici." ) MSG_HASH( @@ -2812,9 +2802,9 @@ MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_ENABLE_CLIENT, MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_DISCONNECT, "Se déconnecter de la session de jeu en réseau active.") MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_DIRECTORY, - "Analyse récursivement un dossier pour y trouver des contenus compatibles qui seront ajoutés dans des playlists.") + "Analyse récursivement un dossier pour y trouver des contenus compatibles.") MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_FILE, - "Analyse un fichier pour vérifier s'il est compatible et l'ajouter à une playlist.") + "Analyse un fichier pour vérifier s'il est compatible.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SWAP_INTERVAL, "Uses a custom swap interval for Vsync. Set this to effectively halve monitor refresh rate." ) @@ -2906,7 +2896,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_SHOW_ADVANCED_SETTINGS, MSG_HASH(MENU_ENUM_SUBLABEL_THREADED_DATA_RUNLOOP_ENABLE, "Perform tasks on a separate thread.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_REMOVE, - "Autoriser l'utilisateur à supprimer des entrées des collections") + "Autoriser l'utilisateur à supprimer des entrées des playlists") MSG_HASH(MENU_ENUM_SUBLABEL_SYSTEM_DIRECTORY, "Définir le répertoire système. Les cœur peuvent utiliser ce répertoire pour charger des BIOS, configurations, etc.") MSG_HASH(MENU_ENUM_SUBLABEL_RGUI_BROWSER_DIRECTORY, @@ -2989,7 +2979,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_LIBRETRO_INFO_PATH, MSG_HASH(MENU_ENUM_SUBLABEL_JOYPAD_AUTOCONFIG_DIR, "If a joypad is plugged in, that joypad will be autoconfigured if a config file corresponding to it is present inside this directory.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_DIRECTORY, - "Sauvegarder toutes les collections dans ce dossier.") + "Sauvegarder toutes les playlists dans ce dossier.") MSG_HASH( MENU_ENUM_SUBLABEL_CACHE_DIRECTORY, "If set to a directory, content which is temporarily extracted (e.g. from archives) will be extracted to this directory." @@ -3167,7 +3157,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_XMB_MAIN_MENU_ENABLE_SETTINGS, MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS_PASSWORD, "Supplying a password when hiding the settings tab makes it possible to later restore it from the menu, by going to the Main Menu tab, selecting Enable Settings Tab and entering the password.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_RENAME, - "Autoriser l'utilisateur à renommer les entrées des collections.") + "Autoriser l'utilisateur à renommer les entrées des playlists.") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_RENAME, "Autoriser le renommage des entrées") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_LOAD_CORE, diff --git a/intl/msg_hash_it.c b/intl/msg_hash_it.c index c81047efa0..50a72b7c05 100644 --- a/intl/msg_hash_it.c +++ b/intl/msg_hash_it.c @@ -98,7 +98,7 @@ int menu_hash_get_help_it_enum(enum msg_hash_enums msg, char *s, size_t len) " \n" "I files saranno comparati alle entrate del database.\n" "Se c'è un riscontro, sarà aggiunta un'entrata\n" - "alla collezione.\n" + "alla playlist.\n" " \n" "Puoi accedere facilmente a questo contenuto\n" "andando su '%s' ->\n" @@ -114,7 +114,7 @@ int menu_hash_get_help_it_enum(enum msg_hash_enums msg, char *s, size_t len) msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCAN_DIRECTORY), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCAN_FILE), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_LIST), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CONTENT_COLLECTION_LIST) + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLISTS_TAB) ); break; case MENU_ENUM_LABEL_VALUE_EXTRACTING_PLEASE_WAIT: @@ -879,14 +879,6 @@ int menu_hash_get_help_it_enum(enum msg_hash_enums msg, char *s, size_t len) "When slowmotion, content will slow\n" "down by factor."); break; - case MENU_ENUM_LABEL_INPUT_AXIS_THRESHOLD: - snprintf(s, len, - "Defines axis threshold.\n" - " \n" - "How far an axis must be tilted to result\n" - "in a button press.\n" - " Possible values are [0.0, 1.0]."); - break; case MENU_ENUM_LABEL_INPUT_TURBO_PERIOD: snprintf(s, len, "Turbo period.\n" diff --git a/intl/msg_hash_it.h b/intl/msg_hash_it.h index 99fa7614cc..cc85ed1948 100644 --- a/intl/msg_hash_it.h +++ b/intl/msg_hash_it.h @@ -478,10 +478,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONFIG_SAVE_ON_EXIT, "Salva la configurazione all' uscita" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_COLLECTION_LIST, - "Collezioni" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_DATABASE_DIRECTORY, "Database" @@ -707,8 +703,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, "Pistola D-pad Destro") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Abilita Autoconfigurazione") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, - "Deadzone dello stick analogico") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "Scambia i pulsanti OK & Annulla ") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_BIND_ALL, @@ -1166,7 +1160,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_PERFCNT_ENABLE, MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLISTS_TAB, "Playlists") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_DIRECTORY, - "Playlist") + "Playlists") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_SETTINGS, "Playlists") MSG_HASH(MENU_ENUM_LABEL_VALUE_POINTER_ENABLE, @@ -1474,8 +1468,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBRETRODB_SUPPORT, "Supporto LibretroDB ") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBUSB_SUPPORT, "Supporto Libusb ") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBXML2_SUPPORT, - "Supporto libxml2 XML parsing ") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETPLAY_SUPPORT, "Supporto Netplay (peer-to-peer) ") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETWORK_COMMAND_IFACE_SUPPORT, @@ -1636,8 +1628,10 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_CROP_OVERSCAN, "Crop Overscan (Ricarica)") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DISABLE_COMPOSITION, "Disattiva composizione del Desktop") +#if defined(_3DS) MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_3DS_LCD_BOTTOM, "3DS Bottom Screen") +#endif MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DRIVER, "Driver Video") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FILTER, @@ -2376,10 +2370,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_SYNC, "Sincronizza l'audio. Consigliato." ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_AXIS_THRESHOLD, - "Quanto deve essere inclinato un asse durante la pressione di un pulsante." - ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_BIND_TIMEOUT, "Quantità di secondi da attendere fino al prossimo bind." @@ -2515,8 +2505,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_BATTERY_LEVEL_ENABLE, "Visualizza il livello della batteria") MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FILE, "Seleziona File") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FROM_COLLECTION, - "Seleziona da collezione") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FROM_PLAYLIST, + "Seleziona da Playlist") MSG_HASH(MENU_ENUM_LABEL_VALUE_FILTER, "Filtra") MSG_HASH(MENU_ENUM_LABEL_VALUE_SCALE, @@ -2592,7 +2582,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_OVERLAY_SHOW_PHYSICAL_INPUTS, MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_OVERLAY_SHOW_PHYSICAL_INPUTS_PORT, "Select the port for the overlay to listen to if Show Inputs On Overlay is enabled.") MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_COLLECTION_LIST, + MENU_ENUM_SUBLABEL_PLAYLISTS_TAB, "Qui vengono visualizzati i contenuti scansionati." ) MSG_HASH( @@ -2848,9 +2838,9 @@ MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_ENABLE_CLIENT, MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_DISCONNECT, "Disconnette da una connessione Netplay attiva") MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_DIRECTORY, - "Effettua la scansione di una directory per i file compatibili e li aggiunge alla raccolta.") + "Effettua la scansione di una directory per i file compatibili.") MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_FILE, - "Esegue la scansione di un file compatibile e li aggiunge alla raccolta.") + "Esegue la scansione di un file compatibile.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SWAP_INTERVAL, "Utilizza un intervallo di scambio personalizzato per Vsync. Impostando un valore corretto dimezza la frequenza di aggiornamento del monitor." ) @@ -2870,7 +2860,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_CORE_UPDATER_AUTO_EXTRACT_ARCHIVE, MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_REFRESH_ROOMS, "Scansiona nuove camere.") MSG_HASH(MENU_ENUM_SUBLABEL_DELETE_ENTRY, - "Rimuovi questo titolo dalla collezione") + "Rimuovi questo titolo dalla playlist") MSG_HASH(MENU_ENUM_SUBLABEL_INFORMATION, "Visualizza ulteriori informazioni sul contenuto.") MSG_HASH(MENU_ENUM_SUBLABEL_ADD_TO_FAVORITES, @@ -2946,7 +2936,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_SHOW_ADVANCED_SETTINGS, MSG_HASH(MENU_ENUM_SUBLABEL_THREADED_DATA_RUNLOOP_ENABLE, "Esegue le attività su un thread separato.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_REMOVE, - "Consente all'utente di rimuovere le voci dalla collezione.") + "Consente all'utente di rimuovere le voci dalla playlists.") MSG_HASH(MENU_ENUM_SUBLABEL_SYSTEM_DIRECTORY, "Imposta la directory di sistema. I core possono richiedere questa directory per caricare BIOS, configurazioni specifiche del sistema, ecc.") MSG_HASH(MENU_ENUM_SUBLABEL_RGUI_BROWSER_DIRECTORY, @@ -3031,7 +3021,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_LIBRETRO_INFO_PATH, MSG_HASH(MENU_ENUM_SUBLABEL_JOYPAD_AUTOCONFIG_DIR, "Se un joypad viene collegato, verrà automaticamente configurato se all'interno di questa directory è presente un file di configurazione corrispondente.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_DIRECTORY, - "Salva tutte le collezioni in questa directory.") + "Salva tutte le playlists in questa directory.") MSG_HASH( MENU_ENUM_SUBLABEL_CACHE_DIRECTORY, "Se non viene impostata una directory, il contenuto estratto temporaneamente (ad esempio dagli archivi) si troverà in questa directory." @@ -3215,7 +3205,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_XMB_MAIN_MENU_ENABLE_SETTINGS, MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS_PASSWORD, "Fornisce una password quando si nasconde la colonna Impostazioni per poi ripristinarli dal menu, andando alla colonna Menù Principale, selezionando abilita la colonna Impostazioni e immettere la password") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_RENAME, - "Consente all'utente di rinominare le voci nelle collezioni.") + "Consente all'utente di rinominare le voci nelle playlists.") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_RENAME, "Permette di rinominare le voci") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_LOAD_CORE, diff --git a/intl/msg_hash_ja.c b/intl/msg_hash_ja.c index e4d823c82e..230cf993ff 100644 --- a/intl/msg_hash_ja.c +++ b/intl/msg_hash_ja.c @@ -665,31 +665,30 @@ int menu_hash_get_help_jp_enum(enum msg_hash_enums msg, char *s, size_t len) strlcat(s, u, len); } break; - case MENU_ENUM_LABEL_VALUE_HELP_SCANNING_CONTENT_DESC: - snprintf(s, len, + case MENU_ENUM_LABEL_VALUE_HELP_SCANNING_CONTENT_DESC: + snprintf(s, len, "To scan for content, go to '%s' and\n" - "select either '%s' or %s'.\n" - " \n" - "Files will be compared to database entries.\n" - "If there is a match, it will add an entry\n" - "to a collection.\n" - " \n" - "You can then easily access this content by\n" - "going to '%s' ->\n" - "'%s'\n" - "instead of having to go through the\n" - "filebrowser everytime.\n" - " \n" - "NOTE: Content for some cores might still not be\n" - "scannable." - , + "select either '%s' or %s'.\n" + "\n" + "Files will be compared to database entries.\n" + "If there is a match, it will add an entry\n" + "to a playlist.\n" + "\n" + "You can then easily access this content by\n" + "going to '%s' ->\n" + "'%s'\n" + "instead of having to go through the\n" + "file browser every time.\n" + "\n" + "NOTE: Content for some cores might still not be\n" + "scannable.", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ADD_CONTENT_LIST), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCAN_DIRECTORY), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCAN_FILE), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_LIST), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CONTENT_COLLECTION_LIST) - ); - break; + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLISTS_TAB) + ); + break; case MENU_ENUM_LABEL_VALUE_EXTRACTING_PLEASE_WAIT: snprintf(s, len, "Welcome to RetroArch\n" @@ -1475,14 +1474,6 @@ int menu_hash_get_help_jp_enum(enum msg_hash_enums msg, char *s, size_t len) "When slowmotion, content will slow\n" "down by factor."); break; - case MENU_ENUM_LABEL_INPUT_AXIS_THRESHOLD: - snprintf(s, len, - "Defines axis threshold.\n" - " \n" - "How far an axis must be tilted to result\n" - "in a button press.\n" - " Possible values are [0.0, 1.0]."); - break; case MENU_ENUM_LABEL_INPUT_TURBO_PERIOD: snprintf(s, len, "Turbo period.\n" diff --git a/intl/msg_hash_ja.h b/intl/msg_hash_ja.h index 5df46be382..4e1d965c27 100644 --- a/intl/msg_hash_ja.h +++ b/intl/msg_hash_ja.h @@ -565,10 +565,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONFIG_SAVE_ON_EXIT, "終了前に設定を自動保存" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_COLLECTION_LIST, - "コレクション" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_DATABASE_DIRECTORY, "コンテンツデータベース" @@ -807,8 +803,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, "ライトガンの十字キーの右") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "自動設定を有効") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, - "入力軸のしきい値") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "メニューのOKとキャンセルボタンをスワップ") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_BIND_ALL, @@ -1640,8 +1634,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBRETRODB_SUPPORT, "LibretroDB対応") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBUSB_SUPPORT, "Libusb対応") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBXML2_SUPPORT, - "libxml2 XMLパース対応") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETPLAY_SUPPORT, "ネットプレイ(ピアツーピア)対応") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETWORK_COMMAND_IFACE_SUPPORT, @@ -1810,8 +1802,10 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_CROP_OVERSCAN, "オーバースキャンをクロップ(再起動が必要)") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DISABLE_COMPOSITION, "デスクトップコンポジションを無効") +#if defined(_3DS) MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_3DS_LCD_BOTTOM, "3DSボトム画面") +#endif MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DRIVER, "ビデオのドライバ") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FILTER, @@ -2546,10 +2540,6 @@ MSG_HASH( ) MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_SYNC, "オーディオを同期する。推奨。") -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_AXIS_THRESHOLD, - "入力を確定するために要するスティックの傾き量です。" - ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_BIND_TIMEOUT, "次のバインドに移るまでの待機秒数です。" @@ -2689,8 +2679,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_BATTERY_LEVEL_ENABLE, "バッテリー残量を表示") MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FILE, "ファイル選択") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FROM_COLLECTION, - "コレクションから選択") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FROM_PLAYLIST, + "プレイリストから選択") MSG_HASH(MENU_ENUM_LABEL_VALUE_FILTER, "フィルター") MSG_HASH(MENU_ENUM_LABEL_VALUE_SCALE, @@ -2770,7 +2760,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FONT_SIZE, MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_OVERLAY_HIDE_IN_MENU, "メニュー表示中はオーバーレイを隠し、メニューを閉じたときに再表示する。") MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_COLLECTION_LIST, + MENU_ENUM_SUBLABEL_PLAYLISTS_TAB, "スキャンしたコンテンツを表示します。" ) MSG_HASH( @@ -3018,9 +3008,9 @@ MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_ENABLE_CLIENT, MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_DISCONNECT, "アクティブなネットプレイ接続を切断する。") MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_DIRECTORY, - "フォルダ内のすべての対応ファイルをスキャンして\nコレクションに追加します。") + "フォルダ内のすべての対応ファイルをスキャン") MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_FILE, - "対応ファイルをスキャンしてコレクションに追加\nします。") + "対応ファイルをスキャンし。") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SWAP_INTERVAL, "Uses a custom swap interval for Vsync. Set this to effectively halve monitor refresh rate." ) @@ -3040,7 +3030,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_CORE_UPDATER_AUTO_EXTRACT_ARCHIVE, MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_REFRESH_ROOMS, "新しいネットプレイルームをスキャンします。") MSG_HASH(MENU_ENUM_SUBLABEL_DELETE_ENTRY, - "このエントリーをコレクションから削除する。") + "このエントリーをプレイリストから削除する。") MSG_HASH(MENU_ENUM_SUBLABEL_INFORMATION, "このコンテンツについての詳細を表示する。") MSG_HASH(MENU_ENUM_SUBLABEL_RUN, @@ -3112,7 +3102,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_SHOW_ADVANCED_SETTINGS, MSG_HASH(MENU_ENUM_SUBLABEL_THREADED_DATA_RUNLOOP_ENABLE, "タスクを別のスレッドで実行する。") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_REMOVE, - "ユーザーがコレクションからエントリーを削除できるようにする。") + "ユーザーがプレイリストからエントリーを削除できるようにする。") MSG_HASH(MENU_ENUM_SUBLABEL_SYSTEM_DIRECTORY, "システムフォルダを指定します。コアはBIOSや特定システムの設定などをロードするため、このフォルダを探索することができます。") MSG_HASH(MENU_ENUM_SUBLABEL_RGUI_BROWSER_DIRECTORY, @@ -3341,7 +3331,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_XMB_MAIN_MENU_ENABLE_SETTINGS, MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS_PASSWORD, "設定タブを隠す際にあらかじめパスワードを設定しておくことで、そのパスワードを使用してメニューから設定タブを復元することができます。") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_RENAME, - "コレクションのエントリーの名前変更をユーザーに許可する。") + "プレイリストのエントリーの名前変更をユーザーに許可する。") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_RENAME, "エントリーの名前変更を許可") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_LOAD_CORE, @@ -3397,15 +3387,15 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_ADD_TO_FAVORITES, MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_ADD_TO_FAVORITES, "「お気に入りに追加」オプションを表示/非表示にする。") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_START_RECORDING, - "Show Start Recording") + "「録画を開始」を表示") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_START_RECORDING, "Show/hide the 'Start Recording' option.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_START_STREAMING, - "Show Start Streaming") + "「ストリーミングを開始」を表示") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_START_STREAMING, "Show/hide the 'Start Streaming' option.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_RESET_CORE_ASSOCIATION, - "Show Reset Core Association") + "「コアの関連付けをリセット」を表示") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_RESET_CORE_ASSOCIATION, "Show/hide the 'Reset Core Association' option.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_OPTIONS, @@ -4025,7 +4015,7 @@ MSG_HASH( "色テーマを選択します。" ) MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_USE_PREFERRED_SYSTEM_COLOR_THEME, - "Use preferred system color theme") + "システムの優先色テーマを使用") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_USE_PREFERRED_SYSTEM_COLOR_THEME, "Use your operating system's color theme (if any) - overrides theme settings.") MSG_HASH(MSG_RESAMPLER_QUALITY_LOWEST, @@ -4058,9 +4048,157 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_WINDOW_SAVE_POSITION, "ウィンドウの位置とサイズを記憶") MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_COREAUDIO_SUPPORT, - "CoreAudio support" + "CoreAudio対応" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_COREAUDIO3_SUPPORT, - "CoreAudio V3 support" + "CoreAudio V3対応" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SIDELOAD_CORE_LIST, + "コアをインストールや復元" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SOUNDS, + "メニュー音" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_SEND_DEBUG_INFO, + "デバッグ情報を送信" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_HELP_SEND_DEBUG_INFO, + "デバッグ情報を送信" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SCREEN_ORIENTATION, + "画面の向き" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SOUND_OK, + "OKの音を有効" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SOUND_CANCEL, + "キュンセルの音を有効" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SOUND_NOTICE, + "通知の音を有効" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SOUND_BGM, + "BGMの音を有効" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QUIT_PRESS_TWICE, + "終了キーを2回続けて押す" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIBRATE_ON_KEYPRESS, + "キー操作で振動" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ENABLE_DEVICE_VIBRATION, + "対応されたコアにデバイス振動を使用" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_HOLD_START, + "スタートをホールド(2秒)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_FPS_TOGGLE, + "FPS表示の切り替え" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_HOST_TOGGLE, + "ネットプレイホストの切り替え" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_RUNTIME_LOG, + "実行時ログを保存(コアごと)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_RUNTIME_LOG_AGGREGATE, + "実行時ログを保存(総計)" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_RUNTIME_LOG_DIRECTORY, + "実行時ログの保存フォルダ" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PLAYLIST_RUNTIME_PER_CORE, + "コアごと" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PLAYLIST_RUNTIME_AGGREGATE, + "総計" + ) +MSG_HASH( + MSG_FAILED_TO_SAVE_DEBUG_INFO, + "デバッグ情報を保存に失敗しました。" + ) +MSG_HASH( + MSG_FAILED_TO_SEND_DEBUG_INFO, + "デバッグ情報を送信に失敗しました。" + ) +MSG_HASH( + MSG_SENDING_DEBUG_INFO, + "デバッグ情報をサーバーに送信中..." + ) +MSG_HASH( + MSG_SENT_DEBUG_INFO, + "デバッグ情報を送信に成功しました。ID番号は%u。" + ) +MSG_HASH( + MSG_PRESS_TWO_MORE_TIMES_TO_SEND_DEBUG_INFO, + "後2回押すとデバッグ情報をRetroArchチームに送信します。" + ) +MSG_HASH( + MSG_PRESS_ONE_MORE_TIME_TO_SEND_DEBUG_INFO, + "後1回押すとデバッグ情報をRetroArchチームに送信します。" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VRR_RUNLOOP_ENABLE, + "正確なコンテンツフレームレートに同期 (G-Sync, FreeSync)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MEMORY_SHOW, + "メモリ詳細を含む" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_TICKER_TYPE, + "ティッカーのテキストアニメーション" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_TICKER_SPEED, + "ティッカーのテキスト速度" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE, + "日付/時刻の形式" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PLAYLIST_SORT_ALPHABETICAL, + "ABC順にプレイリストを分類" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PLAYLIST_USE_OLD_FORMAT, + "古い形式でプレイリストを保存" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PLAYLIST_SHOW_INLINE_CORE_NAME, + "関連付けたコアをプレイリストに表示" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PLAYLIST_SHOW_SUBLABELS, + "プレイリストのサブレーベルを表示" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PLAYLIST_SUBLABEL_RUNTIME_TYPE, + "プレイリストサブレーベルの実行時ログ形式" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RUNTIME_LOG_DIRECTORY, + "実行時ログ" ) diff --git a/intl/msg_hash_ko.c b/intl/msg_hash_ko.c index 87c0c0adfb..29b45397fd 100644 --- a/intl/msg_hash_ko.c +++ b/intl/msg_hash_ko.c @@ -680,24 +680,24 @@ int menu_hash_get_help_ko_enum(enum msg_hash_enums msg, char *s, size_t len) snprintf(s, len, "To scan for content, go to '%s' and\n" "select either '%s' or %s'.\n" - " \n" + "\n" "Files will be compared to database entries.\n" "If there is a match, it will add an entry\n" - "to a collection.\n" - " \n" + "to a playlist.\n" + "\n" "You can then easily access this content by\n" "going to '%s' ->\n" "'%s'\n" "instead of having to go through the\n" - "filebrowser everytime.\n" - " \n" + "file browser every time.\n" + "\n" "NOTE: Content for some cores might still not be\n" "scannable.", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ADD_CONTENT_LIST), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCAN_DIRECTORY), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCAN_FILE), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_LIST), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CONTENT_COLLECTION_LIST) + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLISTS_TAB) ); break; case MENU_ENUM_LABEL_VALUE_EXTRACTING_PLEASE_WAIT: @@ -1473,14 +1473,6 @@ int menu_hash_get_help_ko_enum(enum msg_hash_enums msg, char *s, size_t len) "When slowmotion, content will slow\n" "down by factor."); break; - case MENU_ENUM_LABEL_INPUT_AXIS_THRESHOLD: - snprintf(s, len, - "Defines axis threshold.\n" - " \n" - "How far an axis must be tilted to result\n" - "in a button press.\n" - " Possible values are [0.0, 1.0]."); - break; case MENU_ENUM_LABEL_INPUT_TURBO_PERIOD: snprintf(s, len, "Turbo period.\n" diff --git a/intl/msg_hash_ko.h b/intl/msg_hash_ko.h index bfec9bae41..9925ca5c83 100644 --- a/intl/msg_hash_ko.h +++ b/intl/msg_hash_ko.h @@ -462,10 +462,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONFIG_SAVE_ON_EXIT, "종료시 환경설정 저장하기" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_COLLECTION_LIST, - "컬렉션" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_DATABASE_DIRECTORY, "데이터베이스" @@ -689,8 +685,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, "무기 D-패드 오른쪽") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "자동설정 사용") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, - "아날로그 스틱 데드존") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "확인/취소 버튼 반전") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_BIND_ALL, @@ -1428,8 +1422,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBRETRODB_SUPPORT, "LibretroDB 지원") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBUSB_SUPPORT, "Libusb 지원") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBXML2_SUPPORT, - "libxml2 XML 파싱 지원") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETPLAY_SUPPORT, "넷플레이 (P2P) 지원") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETWORK_COMMAND_IFACE_SUPPORT, @@ -1588,8 +1580,10 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_CROP_OVERSCAN, "오버스캔 잘라내기(재시작)") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DISABLE_COMPOSITION, "데스크탑 구성요소 사용안함") +#if defined(_3DS) MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_3DS_LCD_BOTTOM, "3DS 하단 화면") +#endif MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DRIVER, "비디오 드라이버") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FILTER, @@ -2302,10 +2296,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_SYNC, "오디오 동기화. 사용 권장." ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_AXIS_THRESHOLD, - "축의 기울기가 인식되는 범위를 설정." - ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_BIND_TIMEOUT, "다음 입력 설정으로 넘어가기 전까지 대기하는 시간(초)." @@ -2441,8 +2431,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_BATTERY_LEVEL_ENABLE, "배터리 수준 표시") MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FILE, "파일 선택") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FROM_COLLECTION, - "컬렉션에서 선택") MSG_HASH(MENU_ENUM_LABEL_VALUE_FILTER, "필터") MSG_HASH(MENU_ENUM_LABEL_VALUE_SCALE, @@ -2510,7 +2498,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FONT_SIZE, MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_OVERLAY_HIDE_IN_MENU, "메뉴 화면에서 오버레이를 숨기고 메뉴 종료 시에 다시 표시.") MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_COLLECTION_LIST, + MENU_ENUM_SUBLABEL_PLAYLISTS_TAB, "검색된 컨텐츠가 이곳에 표시됨." ) MSG_HASH( @@ -2765,10 +2753,6 @@ MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_ENABLE_CLIENT, "클라이언트 모드로 넷플레이 사용.") MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_DISCONNECT, "활성 중인 모든 넷플레이 연결 해제.") -MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_DIRECTORY, - "디렉토리에서 실행 가능한 파일을 검색하고 컬렉션에 추가.") -MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_FILE, - "실행 가능한 파일을 검색하고 컬렉션에 추가.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SWAP_INTERVAL, "수직 동기에 사용자 스왑 간격을 사용. 모니터 재생 빈도를 효과적으로 줄이는데 사용." ) @@ -2787,8 +2771,6 @@ MSG_HASH(MENU_ENUM_SUBLABEL_CORE_UPDATER_AUTO_EXTRACT_ARCHIVE, ) MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_REFRESH_ROOMS, "새 호스트 검색.") -MSG_HASH(MENU_ENUM_SUBLABEL_DELETE_ENTRY, - "컬렉션에서 현재 항목 삭제.") MSG_HASH(MENU_ENUM_SUBLABEL_INFORMATION, "컨텐츠에 대한 자세한 정보 확인.") MSG_HASH(MENU_ENUM_SUBLABEL_RUN, @@ -2859,8 +2841,6 @@ MSG_HASH(MENU_ENUM_SUBLABEL_SHOW_ADVANCED_SETTINGS, "파워 유저를 위한 고급 설정 보이기(기본값은 숨김).") MSG_HASH(MENU_ENUM_SUBLABEL_THREADED_DATA_RUNLOOP_ENABLE, "분할된 스레드에서 작업을 수행.") -MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_REMOVE, - "사용자가 컬렉션에서 항목을 제거할 수 있게 허용.") MSG_HASH(MENU_ENUM_SUBLABEL_SYSTEM_DIRECTORY, "시스템 디렉토리를 설정. 코어는 이 디렉토리에서 BIOS, 시스템 특정 구성 등을 불러들일 수 있습니다.") MSG_HASH(MENU_ENUM_SUBLABEL_RGUI_BROWSER_DIRECTORY, @@ -2940,8 +2920,6 @@ MSG_HASH(MENU_ENUM_SUBLABEL_LIBRETRO_INFO_PATH, "앱/코어 정보 파일이 저장될 공간.") MSG_HASH(MENU_ENUM_SUBLABEL_JOYPAD_AUTOCONFIG_DIR, "조이패드가 연결되면 해당 디렉토리에 설정 파일이 있는 경우 자동으로 구성해줍니다.") -MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_DIRECTORY, - "모든 컬렉션이 이 디렉토리에 저장됩니다.") MSG_HASH( MENU_ENUM_SUBLABEL_CACHE_DIRECTORY, "디렉토리를 설정하면 설정하면 임시로 압축해제된 컨첸츠가 이 디렉토리에 추출됩니다." @@ -3117,8 +3095,6 @@ MSG_HASH(MENU_ENUM_SUBLABEL_XMB_MAIN_MENU_ENABLE_SETTINGS, "설정 탭을 표시/해제 합니다. 다시 표시하기 위해 재시작이 필요합니다.") MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS_PASSWORD, "설정 탭을 숨길때 비밀번호를 설정해 나중에 되돌릴수 있게 끔 합니다. 메인 메뉴에서 '설정 탭 표시'를 선택 후 비밀번호를 입력해 되돌릴수 있습니다.") -MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_RENAME, - "콜렉션에 있는 엔트리들을 편집할 수 있게 허용합니다.") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_RENAME, "엔트리 편집 허용") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_LOAD_CORE, diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index 4ff5531de8..f270b20e18 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -193,8 +193,6 @@ MSG_HASH(MENU_ENUM_LABEL_CONNECT_NETPLAY_ROOM, "connect_room") MSG_HASH(MENU_ENUM_LABEL_CONTENT_ACTIONS, "content_actions") -MSG_HASH(MENU_ENUM_LABEL_CONTENT_COLLECTION_LIST, - "select_from_collection") MSG_HASH(MENU_ENUM_LABEL_BROWSE_URL_LIST, "browse_url_list") MSG_HASH(MENU_ENUM_LABEL_CONTENT_DATABASE_DIRECTORY, @@ -521,8 +519,12 @@ MSG_HASH(MENU_ENUM_LABEL_MENU_INPUT_SWAP_OK_CANCEL, "menu_swap_ok_cancel") MSG_HASH(MENU_ENUM_LABEL_INPUT_AUTODETECT_ENABLE, "input_autodetect_enable") -MSG_HASH(MENU_ENUM_LABEL_INPUT_AXIS_THRESHOLD, +MSG_HASH(MENU_ENUM_LABEL_INPUT_BUTTON_AXIS_THRESHOLD, "input_axis_threshold") +MSG_HASH(MENU_ENUM_LABEL_INPUT_ANALOG_DEADZONE, + "input_analog_deadzone") +MSG_HASH(MENU_ENUM_LABEL_INPUT_ANALOG_SENSITIVITY, + "input_analog_sensitivity") MSG_HASH(MENU_ENUM_LABEL_INPUT_BIND_MODE, "input_bind_mode") MSG_HASH(MENU_ENUM_LABEL_INPUT_BIND_TIMEOUT, @@ -647,6 +649,10 @@ MSG_HASH(MENU_ENUM_LABEL_LOGGING_SETTINGS, "logging_settings") MSG_HASH(MENU_ENUM_LABEL_LOG_VERBOSITY, "log_verbosity") +MSG_HASH(MENU_ENUM_LABEL_LOG_TO_FILE, + "log_to_file") +MSG_HASH(MENU_ENUM_LABEL_LOG_TO_FILE_TIMESTAMP, + "log_to_file_timestamp") MSG_HASH(MENU_ENUM_LABEL_MAIN_MENU, "main_menu") MSG_HASH(MENU_ENUM_LABEL_MANAGEMENT, @@ -1125,6 +1131,12 @@ MSG_HASH(MENU_ENUM_LABEL_XMB_VERTICAL_THUMBNAILS, "xmb_vertical_thumbnails") MSG_HASH(MENU_ENUM_LABEL_MENU_RGUI_THUMBNAIL_DOWNSCALER, "rgui_thumbnail_downscaler") +MSG_HASH(MENU_ENUM_LABEL_MENU_RGUI_THUMBNAIL_DELAY, + "rgui_thumbnail_delay") +MSG_HASH(MENU_ENUM_LABEL_MENU_RGUI_INLINE_THUMBNAILS, + "rgui_inline_thumbnails") +MSG_HASH(MENU_ENUM_LABEL_MENU_RGUI_SWAP_THUMBNAILS, + "rgui_swap_thumbnails") MSG_HASH(MENU_ENUM_LABEL_THUMBNAILS_DIRECTORY, "thumbnails_directory") MSG_HASH(MENU_ENUM_LABEL_THUMBNAILS_UPDATER_LIST, @@ -1605,12 +1617,18 @@ MSG_HASH(MENU_ENUM_LABEL_MENU_RGUI_BORDER_FILLER_THICKNESS_ENABLE, "menu_rgui_border_filler_thickness_enable") MSG_HASH(MENU_ENUM_LABEL_MENU_RGUI_BACKGROUND_FILLER_THICKNESS_ENABLE, "menu_rgui_background_filler_thickness_enable") -MSG_HASH(MENU_ENUM_LABEL_MENU_RGUI_LOCK_ASPECT, - "menu_rgui_lock_aspect") MSG_HASH(MENU_ENUM_LABEL_MENU_RGUI_INTERNAL_UPSCALE_LEVEL, "rgui_internal_upscale_level") +MSG_HASH(MENU_ENUM_LABEL_MENU_RGUI_ASPECT_RATIO, + "rgui_aspect_ratio") +MSG_HASH(MENU_ENUM_LABEL_MENU_RGUI_ASPECT_RATIO_LOCK, + "rgui_aspect_ratio_lock") MSG_HASH(MENU_ENUM_LABEL_MENU_RGUI_FULL_WIDTH_LAYOUT, "menu_rgui_full_width_layout") +MSG_HASH(MENU_ENUM_LABEL_MENU_RGUI_SHADOWS, + "menu_rgui_shadows") +MSG_HASH(MENU_ENUM_LABEL_MENU_RGUI_EXTENDED_ASCII, + "rgui_extended_ascii") MSG_HASH(MENU_ENUM_LABEL_CONTENT_SHOW_REWIND, "menu_show_rewind_settings") MSG_HASH(MENU_ENUM_LABEL_CONTENT_SHOW_LATENCY, @@ -1779,8 +1797,12 @@ MSG_HASH(MENU_ENUM_LABEL_NO_IMAGES_AVAILABLE, "no_images") MSG_HASH(MENU_ENUM_LABEL_NO_FAVORITES_AVAILABLE, "no_favorites") +#if defined(_3DS) MSG_HASH(MENU_ENUM_LABEL_VIDEO_3DS_LCD_BOTTOM, "video_3ds_lcd_bottom") +MSG_HASH(MENU_ENUM_LABEL_VIDEO_3DS_DISPLAY_MODE, + "video_3ds_display_mode") +#endif MSG_HASH(MENU_ENUM_LABEL_PLAYLIST_USE_OLD_FORMAT, "playlist_use_old_format") MSG_HASH(MENU_ENUM_LABEL_MENU_SOUND_OK, @@ -1809,3 +1831,5 @@ MSG_HASH(MENU_ENUM_LABEL_VIBRATE_ON_KEYPRESS, "vibrate_on_keypress") MSG_HASH(MENU_ENUM_LABEL_ENABLE_DEVICE_VIBRATION, "enable_device_vibration") +MSG_HASH(MENU_ENUM_LABEL_LOG_DIR, + "log_dir") diff --git a/intl/msg_hash_nl.h b/intl/msg_hash_nl.h index b7eb9ad1c8..2cea609bb3 100644 --- a/intl/msg_hash_nl.h +++ b/intl/msg_hash_nl.h @@ -399,10 +399,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONFIG_SAVE_ON_EXIT, "Configuratie Opslaan Tijdens Afsluiten" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_COLLECTION_LIST, - "Collecties" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_DATABASE_DIRECTORY, "Inhoud Database" @@ -626,8 +622,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Autoconfiguratie Activeren") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, - "Analoge As Deadzone") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "Menu Swap OK & Cancel Buttons") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_BIND_ALL, @@ -1049,9 +1043,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_PERFCNT_ENABLE, MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLISTS_TAB, "Afspeellijsten") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_DIRECTORY, - "Afspeellijst") + "Afspeellijsten") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_SETTINGS, - "Playlists") + "Afspeellijsten") MSG_HASH(MENU_ENUM_LABEL_VALUE_POINTER_ENABLE, "Touch Ondersteuning") MSG_HASH(MENU_ENUM_LABEL_VALUE_PORT, @@ -1069,7 +1063,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_BBFC_RATING, MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_CERO_RATING, "CERO Rating") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_COOP, - "Co-op supported") + "Co-op ondersteund") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_CRC32, "CRC32") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_DESCRIPTION, @@ -1109,7 +1103,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_RELEASE_MONTH, MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_RELEASE_YEAR, "Release datum Jaar") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_RUMBLE, - "Rumble supported") + "Rumble ondersteund") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_SERIAL, "Serial") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_SHA1, @@ -1343,8 +1337,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBRETRODB_SUPPORT, "LibretroDB ondersteuning") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBUSB_SUPPORT, "Libusb ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBXML2_SUPPORT, - "libxml2 XML parsing ondersteuning") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETPLAY_SUPPORT, "Netplay (peer-to-peer) ondersteuning") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETWORK_COMMAND_IFACE_SUPPORT, @@ -1503,8 +1495,10 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_CROP_OVERSCAN, "Overscan Afsnijden (Herladen Vereist)") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DISABLE_COMPOSITION, "Desktop Compositie Deactiveren") +#if defined(_3DS) MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_3DS_LCD_BOTTOM, "3DS onderste scherm") +#endif MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DRIVER, "Video Driver") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FILTER, @@ -2189,7 +2183,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_MAX_USERS, - "Maximum amount of users supported by RetroArch." + "Maximaal aantal gebruikers ondersteund door RetroArch." ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_POLL_TYPE_BEHAVIOR, @@ -2207,10 +2201,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_SYNC, "Synchroniseer audio. Aangeraden." ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_AXIS_THRESHOLD, - "How far an axis must be tilted to result in a button press." - ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_BIND_TIMEOUT, "Amount of seconds to wait until proceeding to the next bind." @@ -2375,9 +2365,13 @@ MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_NICKNAME, MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_POST_FILTER_RECORD, "Capture the image after filters (but not shaders) are applied. Your video will look as fancy as what you see on your screen.") MSG_HASH(MENU_ENUM_SUBLABEL_CORE_LIST, - "Select which core to use.") + "Selecteer welke core je wilt gebruiken.") +MSG_HASH( + MENU_ENUM_SUBLABEL_DOWNLOAD_CORE, + "Installeer een core vanaf de online updater." + ) MSG_HASH(MENU_ENUM_SUBLABEL_LOAD_CONTENT_LIST, - "Select which content to start.") + "Selecteer de inhoud om op te starten.") MSG_HASH(MENU_ENUM_SUBLABEL_NETWORK_INFORMATION, "Show network interface(s) and associated IP addresses.") MSG_HASH(MENU_ENUM_SUBLABEL_SYSTEM_INFORMATION, @@ -2401,7 +2395,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FONT_SIZE, MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_OVERLAY_HIDE_IN_MENU, "Hide the overlay while inside the menu, and show it again when exiting the menu.") MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_COLLECTION_LIST, + MENU_ENUM_SUBLABEL_PLAYLISTS_TAB, "Gescande inhoud zal hier getoond worden." ) MSG_HASH( @@ -2578,7 +2572,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_IP_ADDRESS, - "The address of the host to connect to." + "Het adres van de host waar we naartoe verbinden." ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_TCP_UDP_PORT, @@ -2638,11 +2632,11 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_TIMEDATE_ENABLE, - "Shows current date and/or time inside the menu." + "Huidige tijd/datum weergeven in het menu." ) MSG_HASH( MENU_ENUM_SUBLABEL_BATTERY_LEVEL_ENABLE, - "Shows current battery level inside the menu." + "Batterijstand weergeven in het menu." ) MSG_HASH( MENU_ENUM_SUBLABEL_NAVIGATION_WRAPAROUND, @@ -2657,9 +2651,9 @@ MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_ENABLE_CLIENT, MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_DISCONNECT, "Disconnects an active Netplay connection.") MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_DIRECTORY, - "Scans a directory for compatible files and add them to the collection.") + "Scans a directory for content that matches the database.") MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_FILE, - "Scans a compatible file and add it to the collection.") + "Scans a file for content that matches the database.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SWAP_INTERVAL, "Uses a custom swap interval for Vsync. Set this to effectively halve monitor refresh rate." ) @@ -2679,7 +2673,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_CORE_UPDATER_AUTO_EXTRACT_ARCHIVE, MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_REFRESH_ROOMS, "Scan for new rooms.") MSG_HASH(MENU_ENUM_SUBLABEL_DELETE_ENTRY, - "Remove this entry from the collection.") + "Remove this entry from the playlist.") MSG_HASH(MENU_ENUM_SUBLABEL_INFORMATION, "View more information about the content.") MSG_HASH(MENU_ENUM_SUBLABEL_RUN, @@ -2751,7 +2745,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_SHOW_ADVANCED_SETTINGS, MSG_HASH(MENU_ENUM_SUBLABEL_THREADED_DATA_RUNLOOP_ENABLE, "Perform tasks on a separate thread.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_REMOVE, - "Allow the user to remove entries from collections.") + "Allow the user to remove entries from playlists.") MSG_HASH(MENU_ENUM_SUBLABEL_SYSTEM_DIRECTORY, "Sets the System directory. Cores can query for this directory to load BIOSes, system-specific configs, etc.") MSG_HASH(MENU_ENUM_SUBLABEL_RGUI_BROWSER_DIRECTORY, @@ -2834,7 +2828,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_LIBRETRO_INFO_PATH, MSG_HASH(MENU_ENUM_SUBLABEL_JOYPAD_AUTOCONFIG_DIR, "If a joypad is plugged in, that joypad will be autoconfigured if a config file corresponding to it is present inside this directory.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_DIRECTORY, - "Save all collections to this directory.") + "Save all playlists to this directory.") MSG_HASH( MENU_ENUM_SUBLABEL_CACHE_DIRECTORY, "If set to a directory, content which is temporarily extracted (e.g. from archives) will be extracted to this directory." @@ -3012,7 +3006,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_XMB_MAIN_MENU_ENABLE_SETTINGS, MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS_PASSWORD, "Supplying a password when hiding the settings tab makes it possible to later restore it from the menu, by going to the Main Menu tab, selecting Enable Settings Tab and entering the password.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_RENAME, - "Allow the user to rename entries in collections.") + "Allow the user to rename entries in playlists.") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_RENAME, "Allow to rename entries") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_LOAD_CORE, @@ -3233,7 +3227,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_POWER_MANAGEMENT_SETTINGS, MSG_HASH(MENU_ENUM_LABEL_VALUE_SUSTAINED_PERFORMANCE_MODE, "Sustained Performance Mode") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_MPV_SUPPORT, - "mpv support") + "mpv Ondersteuning") MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_ADAPTIVE_VSYNC, "Adaptive Vsync" @@ -3395,12 +3389,16 @@ MSG_HASH( "Geen favorieten beschikbaar." ) MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_WINDOW_SAVE_POSITION, - "Remember Window Position and Size") + "Onthoudt Venster Positie en Grootte") MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_COREAUDIO_SUPPORT, "CoreAudio ondersteuning" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_COREAUDIO3_SUPPORT, - "CoreAudio V3 support" + "CoreAudio V3 ondersteuning" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SOUNDS, + "Menu Geluiden" ) diff --git a/intl/msg_hash_pl.h b/intl/msg_hash_pl.h index 510ba2a690..3b1f838276 100644 --- a/intl/msg_hash_pl.h +++ b/intl/msg_hash_pl.h @@ -534,10 +534,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONFIG_SAVE_ON_EXIT, "Zapisz konfigurację przy wyjściu" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_COLLECTION_LIST, - "Kolekcje" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_DATABASE_DIRECTORY, "Baza danych" @@ -763,8 +759,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, "D-pad prawo") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Włącz autoconfig") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, - "Martwa strefa gałki analogowej") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "Zamień przyciski menu ok i anuluj") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_BIND_ALL, @@ -1246,7 +1240,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_PERFCNT_ENABLE, MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLISTS_TAB, "Listy odtwarzania") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_DIRECTORY, - "Playlista") + "Listy odtwarzania") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_SETTINGS, "Listy odtwarzania") MSG_HASH(MENU_ENUM_LABEL_VALUE_POINTER_ENABLE, @@ -1568,8 +1562,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBRETRODB_SUPPORT, "Obsługa LibretroDB") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBUSB_SUPPORT, "Wsparcie Libusb") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBXML2_SUPPORT, - "Libxml2 obsługa parowania XML") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETPLAY_SUPPORT, "Wsparcie Gry online (peer-to-peer)") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETWORK_COMMAND_IFACE_SUPPORT, @@ -1740,8 +1732,10 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_CROP_OVERSCAN, "Przytnij Overscan (Przeładuj)") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DISABLE_COMPOSITION, "Wyłącz kompozycję pulpitu") +#if defined(_3DS) MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_3DS_LCD_BOTTOM, "Dolny ekran 3DS") +#endif MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DRIVER, "Sterownik wideo") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FILTER, @@ -2502,10 +2496,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_SYNC, "Synchronizuj dźwięk. Zalecane." ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_AXIS_THRESHOLD, - "Jak daleko oś musi być przechylona, aby spowodować naciśnięcie przycisku." - ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_BIND_TIMEOUT, "Ilość sekund oczekiwania na przejście do następnej więzi." @@ -2645,8 +2635,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_BATTERY_LEVEL_ENABLE, "Pokaż poziom naładowania baterii") MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FILE, "Wybierz plik") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FROM_COLLECTION, - "Wybierz z kolekcji") MSG_HASH(MENU_ENUM_LABEL_VALUE_FILTER, "Filtr") MSG_HASH(MENU_ENUM_LABEL_VALUE_SCALE, @@ -2724,7 +2712,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_OVERLAY_SHOW_PHYSICAL_INPUTS, MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_OVERLAY_SHOW_PHYSICAL_INPUTS_PORT, "Wybierz port dla nakładki, aby usłyszeć, czy opcja Pokaż nakładki na nakładkę jest włączona.") MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_COLLECTION_LIST, + MENU_ENUM_SUBLABEL_PLAYLISTS_TAB, "Tutaj pojawi się skanowana zawartość." ) MSG_HASH( @@ -3007,9 +2995,9 @@ MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_ENABLE_CLIENT, MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_DISCONNECT, "Odłącz aktywne połączenie gry online.") MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_DIRECTORY, - "Skanuje katalog w poszukiwaniu kompatybilnych plików i dodaje je do kolekcji.") + "Skanuje katalog w poszukiwaniu kompatybilnych plików.") MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_FILE, - "Skanuje zgodny plik i dodaje go do kolekcji.") + "Skanuje zgodny plik.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SWAP_INTERVAL, "Używa niestandardowego interwału wymiany dla Vsync. Ustaw, aby efektywnie zmniejszyć o połowę częstotliwość odświeżania monitora." ) @@ -3030,8 +3018,6 @@ MSG_HASH(MENU_ENUM_SUBLABEL_CORE_UPDATER_AUTO_EXTRACT_ARCHIVE, ) MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_REFRESH_ROOMS, "Zeskanuj nowe pokoje.") -MSG_HASH(MENU_ENUM_SUBLABEL_DELETE_ENTRY, - "Usuń ten wpis z kolekcji.") MSG_HASH(MENU_ENUM_SUBLABEL_INFORMATION, "Zobacz więcej informacji o zawartości.") MSG_HASH(MENU_ENUM_SUBLABEL_ADD_TO_FAVORITES, @@ -3106,8 +3092,6 @@ MSG_HASH(MENU_ENUM_SUBLABEL_SHOW_ADVANCED_SETTINGS, "Pokaż zaawansowane ustawienia dla zaawansowanych użytkowników (domyślnie ukryty).") MSG_HASH(MENU_ENUM_SUBLABEL_THREADED_DATA_RUNLOOP_ENABLE, "Wykonuj zadania w oddzielnym wątku.") -MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_REMOVE, - "Pozwól użytkownikowi usuwać wpisy ze zbiorów.") MSG_HASH(MENU_ENUM_SUBLABEL_SYSTEM_DIRECTORY, "Ustawia katalog systemowy. Rdzenie mogą wysyłać zapytania do tego katalogu, aby załadować BIOS, konfiguracje specyficzne dla systemu itp.") MSG_HASH(MENU_ENUM_SUBLABEL_RGUI_BROWSER_DIRECTORY, @@ -3191,8 +3175,6 @@ MSG_HASH(MENU_ENUM_SUBLABEL_LIBRETRO_INFO_PATH, "Pliki informacji o aplikacji/rdzeniu przechowywane są tutaj .") MSG_HASH(MENU_ENUM_SUBLABEL_JOYPAD_AUTOCONFIG_DIR, "Jeśli joypad jest podłączony, to zostanie automatycznie skonfigurowany, jeśli plik konfiguracyjny odpowiadający mu jest obecny w tym katalogu.") -MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_DIRECTORY, - "Zapisz wszystkie kolekcje w tym katalogu.") MSG_HASH( MENU_ENUM_SUBLABEL_CACHE_DIRECTORY, "Jeśli ustawione na katalog, zawartość, która jest czasowo wyodrębniana (np. Z archiwów), zostanie wyodrębniona do tego katalogu." @@ -3377,8 +3359,6 @@ MSG_HASH(MENU_ENUM_SUBLABEL_XMB_MAIN_MENU_ENABLE_SETTINGS, "Włącza kartę Ustawienia. Wymagane jest ponowne uruchomienie karty.") MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS_PASSWORD, "Podanie hasła podczas ukrywania karty ustawień pozwala później przywrócić ją z menu, przechodząc do karty Menu główne, wybierając opcję Włącz kartę Ustawienia i wprowadzając hasło.") -MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_RENAME, - "Zezwalaj użytkownikowi na zmianę nazw wpisów w kolekcjach.") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_RENAME, "Zezwalaj na zmianę nazw wpisów") MSG_HASH(MENU_ENUM_SUBLABEL_RENAME_ENTRY, diff --git a/intl/msg_hash_pt_br.c b/intl/msg_hash_pt_br.c index dff66b5f81..092b9c073f 100644 --- a/intl/msg_hash_pt_br.c +++ b/intl/msg_hash_pt_br.c @@ -704,28 +704,28 @@ int menu_hash_get_help_pt_br_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_VALUE_HELP_SCANNING_CONTENT_DESC: snprintf(s, len, - "Para analisar por conteúdo, vá para \n" + "Para analisar por conteúdo, vá para\n" "'%s' e selecione \n" - "'%s' ou '%s'. \n" - " \n" - "Os arquivos serão comparados com registros \n" - "da base de dados. \n" - "Se houver uma correspondência, um registro \n" - "será adicionado a uma coleção. \n" - " \n" + "'%s' ou '%s'.\n" + "\n" + "Os arquivos serão comparados com registros\n" + "da base de dados.\n" + "Se houver uma correspondência, um registro\n" + "será adicionado à uma lista de reprodução.\n" + "\n" "Você poderá então acessar facilmente este \n" - "conteúdo indo até \n" + "conteúdo indo até\n" "'%s' -> '%s'\n" - "em vez de ter que utilizar o \n" + "em vez de ter que utilizar o\n" "navegador de arquivos todas as vezes.\n" - " \n" - "OBS: Conteúdo para alguns núcleos pode ainda \n" + "\n" + "OBS: Conteúdo para alguns núcleos pode ainda\n" "não ser reconhecido.", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ADD_CONTENT_LIST), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCAN_DIRECTORY), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCAN_FILE), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_LIST), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CONTENT_COLLECTION_LIST) + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLISTS_TAB) ); break; case MENU_ENUM_LABEL_VALUE_EXTRACTING_PLEASE_WAIT: @@ -1533,14 +1533,6 @@ int menu_hash_get_help_pt_br_enum(enum msg_hash_enums msg, char *s, size_t len) "Quando está em Câmera Lenta, o conteúdo será \n" "diminuído pelo fator especificado/definido."); break; - case MENU_ENUM_LABEL_INPUT_AXIS_THRESHOLD: - snprintf(s, len, - "Define a zona morta do controle analógico. \n" - " \n" - "Até que ponto um eixo deve ser \n" - "movido para resultar em um botão pressionado. \n" - "Os valores aceitos são entre [0.0, 1.0]."); - break; case MENU_ENUM_LABEL_INPUT_TURBO_PERIOD: snprintf(s, len, "Período do turbo.\n" diff --git a/intl/msg_hash_pt_br.h b/intl/msg_hash_pt_br.h index 19f22420c0..fd005cd987 100644 --- a/intl/msg_hash_pt_br.h +++ b/intl/msg_hash_pt_br.h @@ -589,10 +589,6 @@ 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" @@ -1053,10 +1049,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Habilitar Auto Configuração" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, - "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" @@ -2742,10 +2734,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBUSB_SUPPORT, "Suporte a Libusb" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBXML2_SUPPORT, - "Suporte a libxml2 XML parsing" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETPLAY_SUPPORT, "Suporte de jogo em rede (ponto-a-ponto)" @@ -3266,10 +3254,12 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_DISABLE_COMPOSITION, "Desativar Composição da Área de Trabalho" ) +#if defined(_3DS) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_3DS_LCD_BOTTOM, "Tela Inferior 3DS" ) +#endif MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_DRIVER, "Driver de Vídeo" @@ -4763,10 +4753,6 @@ 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." @@ -4961,8 +4947,8 @@ MSG_HASH( "Selecionar Arquivo" ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_SELECT_FROM_COLLECTION, - "Selecionar de Coleção" + MENU_ENUM_LABEL_VALUE_SELECT_FROM_PLAYLIST, + "Selecionar da Lista de Reprodução" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_FILTER, @@ -5129,7 +5115,7 @@ MSG_HASH( "Selecione a porta para a transparência escutar se Exibir Comandos na Transparência estiver habilitado." ) MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_COLLECTION_LIST, + MENU_ENUM_SUBLABEL_PLAYLISTS_TAB, "O conteúdo analisado aparecerá aqui." ) MSG_HASH( @@ -5540,11 +5526,11 @@ MSG_HASH( ) 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." ) MSG_HASH( MENU_ENUM_SUBLABEL_SCAN_FILE, - "Analisa um arquivo compatível e o adiciona à coleção." + "Analisa um arquivo compatível." ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SWAP_INTERVAL, @@ -5580,7 +5566,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_DELETE_ENTRY, - "Remove esta entrada da coleção." + "Remove esta entrada da lista de reprodução." ) MSG_HASH( MENU_ENUM_SUBLABEL_INFORMATION, @@ -5724,7 +5710,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_REMOVE, - "Permite que o usuário possa remover itens das coleções." + "Permite que o usuário possa remover itens das listas de reprodução." ) MSG_HASH( MENU_ENUM_SUBLABEL_SYSTEM_DIRECTORY, @@ -5893,7 +5879,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_PLAYLIST_DIRECTORY, - "Salva todas as coleções neste diretório." + "Salva todas as listas de reprodução neste diretório." ) MSG_HASH( MENU_ENUM_SUBLABEL_CACHE_DIRECTORY, @@ -6217,7 +6203,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_RENAME, - "Permite que o usuário renomeie os itens nas coleções." + "Permite que o usuário renomeie os itens nas listas de reprodução." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_RENAME, @@ -7785,7 +7771,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_THUMBNAIL_TYPE, - "Tipo de visualização de miniatura de ícones:" + "Miniatura" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_THUMBNAIL_CACHE_LIMIT, diff --git a/intl/msg_hash_pt_pt.c b/intl/msg_hash_pt_pt.c index bfb24b202f..416f592a56 100644 --- a/intl/msg_hash_pt_pt.c +++ b/intl/msg_hash_pt_pt.c @@ -781,14 +781,6 @@ int menu_hash_get_help_pt_pt_enum(enum msg_hash_enums msg, char *s, size_t len) "Quando ativo, o conteúdo será executado numa velocidade\n" "reduzida por esse fator."); break; - case MENU_ENUM_LABEL_INPUT_AXIS_THRESHOLD: - snprintf(s, len, - "Define o limite de eixo.\n" - " \n" - "Representa o valor que deve ser atingido para\n" - "significar o pressionamento de um botão.\n" - " Valores possíveis são [0.0, 1.0]."); - break; case MENU_ENUM_LABEL_INPUT_TURBO_PERIOD: snprintf(s, len, "Período de turbo.\n" diff --git a/intl/msg_hash_pt_pt.h b/intl/msg_hash_pt_pt.h index 4101c40ea8..86a2be8e07 100644 --- a/intl/msg_hash_pt_pt.h +++ b/intl/msg_hash_pt_pt.h @@ -462,10 +462,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONFIG_SAVE_ON_EXIT, "Guardar 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" @@ -689,8 +685,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, "Botão direcional (direita) da pistola") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Ativar auto-configuração de teclas") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, - "Zona morta do eixo analógico") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "Menu trocar botões OK e Cancelar") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_BIND_ALL, @@ -1132,7 +1126,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_PAUSE_NONACTIVE, MSG_HASH(MENU_ENUM_LABEL_VALUE_PERFCNT_ENABLE, "Contadores de desempenhp") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLISTS_TAB, - "Listas de reprodução") + "Selecionar de Listas de Reprodução") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_DIRECTORY, "Pasta de listas de reprodução") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_SETTINGS, @@ -1420,8 +1414,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBRETRODB_SUPPORT, "Suporte de LibretroDB") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBUSB_SUPPORT, "Suporte de Libusb") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBXML2_SUPPORT, - "Suporte de análise de libxml2 XML") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETPLAY_SUPPORT, "Suporte de Netplay (ponto-a-ponto)") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETWORK_COMMAND_IFACE_SUPPORT, @@ -1580,8 +1572,10 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_CROP_OVERSCAN, "Cortar sobreexploração (recarregar)") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DISABLE_COMPOSITION, "Desativar composição do ambiente de trabalho") +#if defined(_3DS) MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_3DS_LCD_BOTTOM, "Tela Inferior 3DS") +#endif MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DRIVER, "Controlador de vídeo") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FILTER, @@ -2291,10 +2285,6 @@ MSG_HASH( MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_SYNC, "Sincronizar o som. Recomendado.") -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_AXIS_THRESHOLD, - "Até que ponto um eixo deve estar inclinado para causar o pressionamento de um botão." - ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_BIND_TIMEOUT, "Quantidade de segundos a aguardar até que seja feita uma nova associação." @@ -2430,8 +2420,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_BATTERY_LEVEL_ENABLE, "Mostrado estado da bateria") MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FILE, "Selecionar ficheiro") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FROM_COLLECTION, - "Selecionar de coleção") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FROM_PLAYLIST, + "Selecionar da Lista de Reprodução") MSG_HASH(MENU_ENUM_LABEL_VALUE_FILTER, "Filtro") MSG_HASH(MENU_ENUM_LABEL_VALUE_SCALE, @@ -2499,7 +2489,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FONT_SIZE, MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_OVERLAY_HIDE_IN_MENU, "Ocultar a sobreposição quando o menu estiver aberto e mostrar novamente ao encerrar o mesmo.") MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_COLLECTION_LIST, + MENU_ENUM_SUBLABEL_PLAYLISTS_TAB, "O conteúdo verificado aparecerá aqui." ) MSG_HASH( @@ -2743,9 +2733,9 @@ MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_ENABLE_CLIENT, MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_DISCONNECT, "Terminar uma ligação de Netplay ativa.") MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_DIRECTORY, - "Verificar uma pasta por ficheiros compatíveis e adicionar os mesmos à coleção.") + "Verificar uma pasta por ficheiros compatíveis.") MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_FILE, - "Verificar um ficheiro compatível e adicioná-lo à coleção.") + "Verificar um ficheiro compatível.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SWAP_INTERVAL, "Usa um intervalo de troca personalizado para Vsync. Utilize isto para reduzir efetivamente a taxa de atualização do monitor." ) @@ -2765,7 +2755,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_CORE_UPDATER_AUTO_EXTRACT_ARCHIVE, MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_REFRESH_ROOMS, "Verificar por novas ROMs.") MSG_HASH(MENU_ENUM_SUBLABEL_DELETE_ENTRY, - "Remover esta entrada da coleção.") + "Remover esta entrada da lista de reprodução.") MSG_HASH(MENU_ENUM_SUBLABEL_INFORMATION, "Ver mais informações sobre o conteúdo.") MSG_HASH(MENU_ENUM_SUBLABEL_RUN, @@ -2837,7 +2827,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_SHOW_ADVANCED_SETTINGS, MSG_HASH(MENU_ENUM_SUBLABEL_THREADED_DATA_RUNLOOP_ENABLE, "Executar tarefas numa thread independente.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_REMOVE, - "Permitir que o utilizador remova entradas das coleções.") + "Permitir que o utilizador remova entradas das listas de reprodução.") MSG_HASH(MENU_ENUM_SUBLABEL_SYSTEM_DIRECTORY, "Define a pasta de sistema. Os núcleos podem verificar esta pasta para o carregamento de ficheiros BIOS, configurações específicas de sistema, etc.") MSG_HASH(MENU_ENUM_SUBLABEL_RGUI_BROWSER_DIRECTORY, @@ -2916,7 +2906,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_LIBRETRO_INFO_PATH, MSG_HASH(MENU_ENUM_SUBLABEL_JOYPAD_AUTOCONFIG_DIR, "Se um comando estiver conectado, o mesmo será configurado automaticamente se o ficheiro de configuração correspondente estiver presente nesta pasta.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_DIRECTORY, - "Guardar todas as coleções nesta pasta.") + "Guardar todas as listas de reprodução nesta pasta.") MSG_HASH( MENU_ENUM_SUBLABEL_CACHE_DIRECTORY, "Se for definido, o conteúdo que for extraído, de forma temporária, será extraído para esta pasta." @@ -3092,7 +3082,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_XMB_MAIN_MENU_ENABLE_SETTINGS, MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS_PASSWORD, "Fornecer uma palavra-passe durante a ocultação do separador das definições faz com que seja possível restaurá-lo mais tarde a partir do menu, através do separador Menu principal, selecionando o separador Ativar definições e introduzindo a palavra-passe.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_RENAME, - "Permitir que o utilizador renomeie entradas nas coleções.") + "Permitir que o utilizador renomeie entradas nas listas de reprodução.") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_RENAME, "Permitir renomeação de entradas") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_LOAD_CORE, diff --git a/intl/msg_hash_ru.h b/intl/msg_hash_ru.h index 2d7cef985b..7924355c65 100644 --- a/intl/msg_hash_ru.h +++ b/intl/msg_hash_ru.h @@ -483,10 +483,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONFIG_SAVE_ON_EXIT, "Сохранить конфигурацию и выйти" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_COLLECTION_LIST, - "Коллекции" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_DATABASE_DIRECTORY, "База данных контента" @@ -710,8 +706,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Автоматическая настройка включена") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, - "Мертвая зона у стиков") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "Поменять кнопки OK и Отмена") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_BIND_ALL, @@ -1163,7 +1157,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_PERFCNT_ENABLE, MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLISTS_TAB, "Плейлисты") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_DIRECTORY, - "Плейлист") + "Плейлисты") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_SETTINGS, "Плейлисты") MSG_HASH(MENU_ENUM_LABEL_VALUE_POINTER_ENABLE, @@ -1455,8 +1449,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBRETRODB_SUPPORT, "Поддержка LibretroDB") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBUSB_SUPPORT, "Поддержка Libusb") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBXML2_SUPPORT, - "Поддержка синтаксического анализа libxml2 XML") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETPLAY_SUPPORT, "Поддержка Netplay (peer-to-peer)") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETWORK_COMMAND_IFACE_SUPPORT, @@ -1617,8 +1609,10 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_CROP_OVERSCAN, "Обрезка обрезки (перезагрузка)") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DISABLE_COMPOSITION, "Отключить компоновку рабочего стола") +#if defined(_3DS) MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_3DS_LCD_BOTTOM, "Нижний экран 3DS") +#endif MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DRIVER, "Видеодрайвер") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FILTER, @@ -2349,10 +2343,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_SYNC, "Синхронизировать звук. Рекомендуется." ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_AXIS_THRESHOLD, - "Как далеко ось должна быть наклонена, чтобы вызвать нажатие кнопки." - ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_BIND_TIMEOUT, "Количество секунд ожидания до перехода к следующей привязке." @@ -2488,8 +2478,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_BATTERY_LEVEL_ENABLE, "Показать заряд батареи") MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FILE, "Выбрать файл") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FROM_COLLECTION, - "Выбрать файл с коллекции") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FROM_PLAYLIST, + "Выбрать из плейлиста.") MSG_HASH(MENU_ENUM_LABEL_VALUE_FILTER, "Фильтр") MSG_HASH(MENU_ENUM_LABEL_VALUE_SCALE, @@ -2561,7 +2551,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FONT_SIZE, MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_OVERLAY_HIDE_IN_MENU, "Спрятать наложения в меню интерфейса, и показывать снова после выхода из него.") MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_COLLECTION_LIST, + MENU_ENUM_SUBLABEL_PLAYLISTS_TAB, "Сканированный контент появится здесь." ) MSG_HASH( @@ -2817,9 +2807,9 @@ MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_ENABLE_CLIENT, MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_DISCONNECT, "Отключить активное соединение Netplay.") MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_DIRECTORY, - "Сканирует каталог для поиска совместимых файлов и добавляет их в коллекцию.") + "Сканирует каталог для поиска совместимых файлов.") MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_FILE, - "Сканирует совместимый файл и добавляет его в коллекцию.") + "Сканирует совместимый файл.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SWAP_INTERVAL, "Использует заданный интервал обновления для вертикальной синхронизации. Установите для эффективной частоты обновления монитора." ) @@ -2839,7 +2829,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_CORE_UPDATER_AUTO_EXTRACT_ARCHIVE, MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_REFRESH_ROOMS, "Сканировать для поиска новых комнат.") MSG_HASH(MENU_ENUM_SUBLABEL_DELETE_ENTRY, - "Удалить эту запись из коллекции.") + "Удалить эту запись из плейлиста.") MSG_HASH(MENU_ENUM_SUBLABEL_INFORMATION, "Просмотреть больше информации о содержимом.") MSG_HASH(MENU_ENUM_SUBLABEL_RUN, @@ -2911,7 +2901,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_SHOW_ADVANCED_SETTINGS, MSG_HASH(MENU_ENUM_SUBLABEL_THREADED_DATA_RUNLOOP_ENABLE, "Выполнять задачи в отдельном потоке.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_REMOVE, - "Разрешить пользователю удалять отдельные записи из коллекции.") + "Разрешить пользователю удалять отдельные записи из плейлистов.") MSG_HASH(MENU_ENUM_SUBLABEL_SYSTEM_DIRECTORY, "Устанавливает каталог System. Ядра могут запрашивать его для загрузки BIOS, прошивок, системных настроек и т.д.") MSG_HASH(MENU_ENUM_SUBLABEL_RGUI_BROWSER_DIRECTORY, @@ -2992,7 +2982,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_LIBRETRO_INFO_PATH, MSG_HASH(MENU_ENUM_SUBLABEL_JOYPAD_AUTOCONFIG_DIR, "Если игровой джойстик подключен, то джойстик будет автомотически подстроен, если существует подходящий файл автоматической настройки.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_DIRECTORY, - "Сохранять все коллекции в выбранной папке.") + "Сохранять все плейлисты в выбранной папке.") MSG_HASH( MENU_ENUM_SUBLABEL_CACHE_DIRECTORY, "Контент извлеченный из архивов будет временно размещен в этой папке." @@ -3166,7 +3156,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_XMB_MAIN_MENU_ENABLE_SETTINGS, MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS_PASSWORD, "Применение пароля при скрытии вкладки Настройки может позже восстановить ее из меню. Для этого нужно перейти на вкладку Главное меню, выбрать Включить вкладку Настройки и ввести пароль.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_RENAME, - "Разрешить пользователю переименовывать записи в коллекции.") + "Разрешить пользователю переименовывать записи в плейлистах.") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_RENAME, "Разрешить переименовывать записи") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_LOAD_CORE, diff --git a/intl/msg_hash_tr.c b/intl/msg_hash_tr.c new file mode 100644 index 0000000000..c99afdd8cb --- /dev/null +++ b/intl/msg_hash_tr.c @@ -0,0 +1,2280 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2011-2017 - Daniel De Matteis + * Copyright (C) 2016-2019 - 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 +#include +#include + +#include +#include + +#include "../msg_hash.h" +#include "../verbosity.h" + +#ifdef RARCH_INTERNAL +#include "../configuration.h" + +int menu_hash_get_help_tr_enum(enum msg_hash_enums msg, char *s, size_t len) +{ + settings_t *settings = config_get_ptr(); + + if (msg == MENU_ENUM_LABEL_CONNECT_NETPLAY_ROOM) + { + snprintf(s, len, + "TODO/FIXME - Fill in message here." + ); + return 0; + } + if (msg <= MENU_ENUM_LABEL_INPUT_HOTKEY_BIND_END && + msg >= MENU_ENUM_LABEL_INPUT_HOTKEY_BIND_BEGIN) + { + unsigned idx = msg - MENU_ENUM_LABEL_INPUT_HOTKEY_BIND_BEGIN; + + switch (idx) + { + case RARCH_FAST_FORWARD_KEY: + snprintf(s, len, + "Normal hız ve Hızlı-sarma arasında \n" + "geçiş yapar." + ); + break; + case RARCH_FAST_FORWARD_HOLD_KEY: + snprintf(s, len, + "Hızlı sarma için basılı tutun. \n" + " \n" + "Tuşu salmak hızlı-sarmayı iptal eder." + ); + break; + case RARCH_SLOWMOTION_KEY: + snprintf(s, len, + "Slowmotion arasında geçiş yapar."); + break; + case RARCH_SLOWMOTION_HOLD_KEY: + snprintf(s, len, + "Slowmotion için basılı tutun."); + break; + case RARCH_PAUSE_TOGGLE: + snprintf(s, len, + "Toggle between paused and non-paused state."); + break; + case RARCH_FRAMEADVANCE: + snprintf(s, len, + "Frame advance when content is paused."); + break; + case RARCH_SHADER_NEXT: + snprintf(s, len, + "Dizindeki bir sonraki gölgelendiriciyi uygular."); + break; + case RARCH_SHADER_PREV: + snprintf(s, len, + "Dizine önceki gölgelendiriciyi uygular."); + break; + case RARCH_CHEAT_INDEX_PLUS: + case RARCH_CHEAT_INDEX_MINUS: + case RARCH_CHEAT_TOGGLE: + snprintf(s, len, + "Hileler."); + break; + case RARCH_RESET: + snprintf(s, len, + "İçeriği sıfırla."); + break; + case RARCH_SCREENSHOT: + snprintf(s, len, + "Ekran görüntüsü almak."); + break; + case RARCH_MUTE: + snprintf(s, len, + "Sesi kapat/aç."); + break; + case RARCH_OSK: + snprintf(s, len, + "Ekran klavyesini aç/kapat"); + break; + case RARCH_FPS_TOGGLE: + snprintf(s, len, + "Saniye sayacındaki kareleri değiştirir."); + break; + case RARCH_SEND_DEBUG_INFO: + snprintf(s, len, + "Analiz için cihazınızın ve RetroArch yapılandırmasına ilişkin tanılama bilgilerini sunucularımıza gönderin."); + break; + case RARCH_NETPLAY_HOST_TOGGLE: + snprintf(s, len, + "Netplay barındırma özelliğini açar/kapatır."); + break; + case RARCH_NETPLAY_GAME_WATCH: + snprintf(s, len, + "Netplay toggle play/spectate mode."); + break; + case RARCH_ENABLE_HOTKEY: + snprintf(s, len, + "Enable other hotkeys. \n" + " \n" + "If this hotkey is bound to either\n" + "a keyboard, joybutton or joyaxis, \n" + "all other hotkeys will be enabled only \n" + "if this one is held at the same time. \n" + " \n" + "Alternatively, all hotkeys for keyboard \n" + "could be disabled by the user."); + break; + case RARCH_VOLUME_UP: + snprintf(s, len, + "Ses seviyesini arttırır."); + break; + case RARCH_VOLUME_DOWN: + snprintf(s, len, + "Ses seviyesini azaltır."); + break; + case RARCH_OVERLAY_NEXT: + snprintf(s, len, + "Switches to next overlay. Wraps around."); + break; + case RARCH_DISK_EJECT_TOGGLE: + snprintf(s, len, + "Diskler için çıkarmayı değiştirir. \n" + " \n" + "Birden fazla disk içeriği için kullanılır. "); + break; + case RARCH_DISK_NEXT: + case RARCH_DISK_PREV: + snprintf(s, len, + "Disk görüntüleri arasında geçiş yapar. Çıkardıktan sonra kullanın. \n" + " \n" + "Çıkartmayı tekrar açarak tamamlayın."); + break; + case RARCH_GRAB_MOUSE_TOGGLE: + snprintf(s, len, + "Fare tutmayı değiştirir. \n" + " \n" + "When mouse is grabbed, RetroArch hides the \n" + "mouse, and keeps the mouse pointer inside \n" + "the window to allow relative mouse input to \n" + "work better."); + break; + case RARCH_GAME_FOCUS_TOGGLE: + snprintf(s, len, + "Oyun odağını değiştirir.\n" + " \n" + "When a game has focus, RetroArch will both disable \n" + "hotkeys and keep/warp the mouse pointer inside the window."); + break; + case RARCH_MENU_TOGGLE: + snprintf(s, len, "Toggles menu."); + break; + case RARCH_LOAD_STATE_KEY: + snprintf(s, len, + "Loads state."); + break; + case RARCH_FULLSCREEN_TOGGLE_KEY: + snprintf(s, len, + "Tam ekrana geçer."); + break; + case RARCH_QUIT_KEY: + snprintf(s, len, + "RetroArch'tan temiz bir şekilde çıkmak için basın. \n" + " \n" + "Killing it in any hard way (SIGKILL, etc.) will \n" + "terminate RetroArch without saving RAM, etc." +#ifdef __unix__ + "\nOn Unix-likes, SIGINT/SIGTERM allows a clean \n" + "deinitialization." +#endif + ""); + break; + case RARCH_STATE_SLOT_PLUS: + case RARCH_STATE_SLOT_MINUS: + snprintf(s, len, + "State slots. \n" + " \n" + "With slot set to 0, save state name is \n" + "*.state (or whatever defined on commandline). \n" + " \n" + "When slot is not 0, path will be , \n" + "where is slot number."); + break; + case RARCH_SAVE_STATE_KEY: + snprintf(s, len, + "Saves state."); + break; + case RARCH_REWIND: + snprintf(s, len, + "Geri sarmak için düğmeyi basılı tutun. \n" + " \n" + "Geri sarma etkin olmalı."); + break; + case RARCH_BSV_RECORD_TOGGLE: + snprintf(s, len, + "Toggle between recording and not."); + break; + default: + if (string_is_empty(s)) + strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_INFORMATION_AVAILABLE), len); + break; + } + + return 0; + } + + switch (msg) + { + case MENU_ENUM_LABEL_ACCOUNTS_RETRO_ACHIEVEMENTS: + snprintf(s, len, "Retro Achievements hesabı için \n" + "giriş bilgileri \n" + " \n" + "Retroachievements.org adresini ziyaret edin ve \n" + "ücretsiz bir hesap için kaydolun. \n" + " \n" + "Kayıt işlemini tamamladıktan sonra, \n" + "kullanıcı adınızı ve şifrenizi RetroArch'a \n" + "girmeniz gerekir."); + break; + case MENU_ENUM_LABEL_CHEEVOS_USERNAME: + snprintf(s, len, "RetroAchievements hesabınızın kullanıcı adı."); + break; + case MENU_ENUM_LABEL_CHEEVOS_PASSWORD: + snprintf(s, len, "RetroAchievements hesabınızın şifresi."); + break; + case MENU_ENUM_LABEL_USER_LANGUAGE: + snprintf(s, len, "LMenüyü ve ekrandaki tüm mesajları burada \n" + "seçtiğiniz dile göre yerelleştirir. \n" + " \n" + "Değişikliklerin etkili olması için \n" + "yeniden başlatmayı gerektirir. \n" + " \n" + "Not: Tüm diller şu anda uygulanamayabilir \n" + "Dilin uygulanmaması durumunda \n" + "İngilizce'ye geri dönülür."); + break; + case MENU_ENUM_LABEL_VIDEO_FONT_PATH: + snprintf(s, len, "Ekran Görününen metin için \n" + "kullanılan yazı tipini değiştirin."); + break; + case MENU_ENUM_LABEL_GAME_SPECIFIC_OPTIONS: + snprintf(s, len, "İçeriğe özgü Core seçeneklerini otomatik olarak yükle."); + break; + case MENU_ENUM_LABEL_AUTO_OVERRIDES_ENABLE: + snprintf(s, len, "Üzerine yazma yapılandırmalarını otomatik olarak yükle."); + break; + case MENU_ENUM_LABEL_AUTO_REMAPS_ENABLE: + snprintf(s, len, "Yeniden düzenleme dosyalarını otomatik olarak yükle."); + break; + case MENU_ENUM_LABEL_SORT_SAVESTATES_ENABLE: + snprintf(s, len, "Sort save states in folders \n" + "named after the libretro core used."); + break; + case MENU_ENUM_LABEL_SORT_SAVEFILES_ENABLE: + snprintf(s, len, "Sort save files in folders \n" + "named after the libretro core used."); + break; + case MENU_ENUM_LABEL_RESUME_CONTENT: + snprintf(s, len, "Menüden çıkar ve içeriğe geri döner."); + break; + case MENU_ENUM_LABEL_RESTART_CONTENT: + snprintf(s, len, "İçeriği yeniden başlatır."); + break; + case MENU_ENUM_LABEL_CLOSE_CONTENT: + snprintf(s, len, "İçeriği kapatır ve bellekten kaldırır."); + break; + case MENU_ENUM_LABEL_UNDO_LOAD_STATE: + snprintf(s, len, "If a state was loaded, content will \n" + "go back to the state prior to loading."); + break; + case MENU_ENUM_LABEL_UNDO_SAVE_STATE: + snprintf(s, len, "If a state was overwritten, it will \n" + "roll back to the previous save state."); + break; + case MENU_ENUM_LABEL_TAKE_SCREENSHOT: + snprintf(s, len, "Bir ekran görüntüsü oluşturun. \n" + " \n" + "Ekran görüntüsü dizininde saklanacak."); + break; + case MENU_ENUM_LABEL_ADD_TO_FAVORITES: + snprintf(s, len, "Girdinizi Favorilerinize ekleyin."); + break; + case MENU_ENUM_LABEL_RUN: + snprintf(s, len, "İçeriği başlat."); + break; + case MENU_ENUM_LABEL_INFORMATION: + snprintf(s, len, "İçerik hakkında ek meta veri \n" + "bilgilerini göster."); + break; + case MENU_ENUM_LABEL_FILE_BROWSER_CONFIG: + snprintf(s, len, "Konfigürasyon dosyası."); + break; + case MENU_ENUM_LABEL_FILE_BROWSER_COMPRESSED_ARCHIVE: + snprintf(s, len, "Sıkıştırılmış arşiv dosyası."); + break; + case MENU_ENUM_LABEL_FILE_BROWSER_RECORD_CONFIG: + snprintf(s, len, "Kayıt yapılandırma dosyası."); + break; + case MENU_ENUM_LABEL_FILE_BROWSER_CURSOR: + snprintf(s, len, "Veritabanı imleci dosyası."); + break; + case MENU_ENUM_LABEL_FILE_CONFIG: + snprintf(s, len, "Konfigürasyon dosyası."); + break; + case MENU_ENUM_LABEL_SCAN_THIS_DIRECTORY: + snprintf(s, len, + "Geçerli dizinde içerik taramak bunu seçin."); + break; + case MENU_ENUM_LABEL_USE_THIS_DIRECTORY: + snprintf(s, len, + "Burayı dizin olarak ayarlamak seçin."); + break; + case MENU_ENUM_LABEL_CONTENT_DATABASE_DIRECTORY: + snprintf(s, len, + "İçerik Veritabanı Dizini. \n" + " \n" + "Path to content database \n" + "directory."); + break; + case MENU_ENUM_LABEL_THUMBNAILS_DIRECTORY: + snprintf(s, len, + "Küçük Resimler Dizini. \n" + " \n" + "To store thumbnail files."); + break; + case MENU_ENUM_LABEL_LIBRETRO_INFO_PATH: + snprintf(s, len, + "Core Bilgi Dizini. \n" + " \n" + "A directory for where to search \n" + "for libretro core information."); + break; + case MENU_ENUM_LABEL_PLAYLIST_DIRECTORY: + snprintf(s, len, + "Playlist Dizini. \n" + " \n" + "Save all playlist files to this \n" + "directory."); + break; + case MENU_ENUM_LABEL_DUMMY_ON_CORE_SHUTDOWN: + snprintf(s, len, + "Some cores might have \n" + "a shutdown feature. \n" + " \n" + "If this option is left disabled, \n" + "selecting the shutdown procedure \n" + "would trigger RetroArch being shut \n" + "down. \n" + " \n" + "Enabling this option will load a \n" + "dummy core instead so that we remain \n" + "inside the menu and RetroArch won't \n" + "shutdown."); + break; + case MENU_ENUM_LABEL_CHECK_FOR_MISSING_FIRMWARE: + snprintf(s, len, + "Some cores might need \n" + "firmware or bios files. \n" + " \n" + "If this option is disabled, \n" + "it will try to load even if such \n" + "firmware is missing. \n"); + break; + case MENU_ENUM_LABEL_PARENT_DIRECTORY: + snprintf(s, len, + "Üst dizine geri dönün."); + break; + case MENU_ENUM_LABEL_FILE_BROWSER_OPEN_UWP_PERMISSIONS: + snprintf(s, len, + "BroadFileSystemAccess özelliğini etkinleştirmek \n" + "için Windows izin ayarlarını açın. "); + break; + case MENU_ENUM_LABEL_FILE_BROWSER_OPEN_PICKER: + snprintf(s, len, + "Ek dizinlere erişmek için \n" + "sistem dosyası seçiciyi açın."); + break; + case MENU_ENUM_LABEL_FILE_BROWSER_SHADER_PRESET: + snprintf(s, len, + "Hazır Shader dosyası."); + break; + case MENU_ENUM_LABEL_FILE_BROWSER_SHADER: + snprintf(s, len, + "Shader dosyası."); + break; + case MENU_ENUM_LABEL_FILE_BROWSER_REMAP: + snprintf(s, len, + "Remap kontrolleri dosyası."); + break; + case MENU_ENUM_LABEL_FILE_BROWSER_CHEAT: + snprintf(s, len, + "Hile dosyası."); + break; + case MENU_ENUM_LABEL_FILE_BROWSER_OVERLAY: + snprintf(s, len, + "Overlay dosyası."); + break; + case MENU_ENUM_LABEL_FILE_BROWSER_RDB: + snprintf(s, len, + "Veritabanı dosyası."); + break; + case MENU_ENUM_LABEL_FILE_BROWSER_FONT: + snprintf(s, len, + "TrueType font dosyası."); + break; + case MENU_ENUM_LABEL_FILE_BROWSER_PLAIN_FILE: + snprintf(s, len, + "Plain file."); + break; + case MENU_ENUM_LABEL_FILE_BROWSER_MOVIE_OPEN: + snprintf(s, len, + "Video. \n" + " \n" + "Video oynatıcısını açmak için \n" + "kullanılır."); + break; + case MENU_ENUM_LABEL_FILE_BROWSER_MUSIC_OPEN: + snprintf(s, len, + "Müzik. \n" + " \n" + "Müzik oynatıcısını açmak için \n" + "kullanılır."); + break; + case MENU_ENUM_LABEL_FILE_BROWSER_IMAGE: + snprintf(s, len, + "Resim dosyası."); + break; + case MENU_ENUM_LABEL_FILE_BROWSER_IMAGE_OPEN_WITH_VIEWER: + snprintf(s, len, + "Resim. \n" + " \n" + "Resim görüntüleyecisini açmak için \n" + "kullanılır."); + break; + case MENU_ENUM_LABEL_FILE_BROWSER_CORE_SELECT_FROM_COLLECTION: + snprintf(s, len, + "Libretro core. \n" + " \n" + "Selecting this will associate this core \n" + "to the game."); + break; + case MENU_ENUM_LABEL_FILE_BROWSER_CORE: + snprintf(s, len, + "Libretro core. \n" + " \n" + "Select this file to have RetroArch load this core."); + break; + case MENU_ENUM_LABEL_FILE_BROWSER_DIRECTORY: + snprintf(s, len, + "Dizin. \n" + " \n" + "Dizin açmak için seçin."); + break; + case MENU_ENUM_LABEL_CACHE_DIRECTORY: + snprintf(s, len, + "Önbellek Dizini. \n" + " \n" + "RetroArch tarafından sıkıştırılmış içerik \n" + "geçici olarak bu dizine çıkarılır."); + break; + case MENU_ENUM_LABEL_HISTORY_LIST_ENABLE: + snprintf(s, len, + "If enabled, every content loaded \n" + "in RetroArch will be automatically \n" + "added to the recent history list."); + break; + case MENU_ENUM_LABEL_RGUI_BROWSER_DIRECTORY: + snprintf(s, len, + "Dosya Tarayıcı Dizini. \n" + " \n" + "Menü dosyası tarayıcısı için başlangıç dizinini ayarlar."); + break; + case MENU_ENUM_LABEL_INPUT_POLL_TYPE_BEHAVIOR: + snprintf(s, len, + "Influence how input polling is done inside \n" + "RetroArch. \n" + " \n" + "Early - Input polling is performed before \n" + "the frame is processed. \n" + "Normal - Input polling is performed when \n" + "polling is requested. \n" + "Late - Input polling is performed on \n" + "first input state request per frame.\n" + " \n" + "Setting it to 'Early' or 'Late' can result \n" + "in less latency, \n" + "depending on your configuration.\n\n" + "Will be ignored when using netplay." + ); + break; + case MENU_ENUM_LABEL_INPUT_DESCRIPTOR_HIDE_UNBOUND: + snprintf(s, len, + "Hide input descriptors that were not set \n" + "by the core."); + break; + case MENU_ENUM_LABEL_VIDEO_REFRESH_RATE: + snprintf(s, len, + "Video refresh rate of your monitor. \n" + "Used to calculate a suitable audio input rate."); + break; + case MENU_ENUM_LABEL_VIDEO_FORCE_SRGB_DISABLE: + snprintf(s, len, + "Forcibly disable sRGB FBO support. Some Intel \n" + "OpenGL drivers on Windows have video problems \n" + "with sRGB FBO support enabled."); + break; + case MENU_ENUM_LABEL_AUDIO_ENABLE: + snprintf(s, len, + "Ses çıkışını etkinleştir."); + break; + case MENU_ENUM_LABEL_AUDIO_SYNC: + snprintf(s, len, + "Sesi senkronize et (önerilir)."); + break; + case MENU_ENUM_LABEL_AUDIO_LATENCY: + snprintf(s, len, + "Desired audio latency in milliseconds. \n" + "Might not be honored if the audio driver \n" + "can't provide given latency."); + break; + case MENU_ENUM_LABEL_VIDEO_ALLOW_ROTATE: + snprintf(s, len, + "Allow cores to set rotation. If false, \n" + "rotation requests are honored, but ignored.\n\n" + "Used for setups where one manually rotates \n" + "the monitor."); + break; + case MENU_ENUM_LABEL_INPUT_DESCRIPTOR_LABEL_SHOW: + snprintf(s, len, + "Show the input descriptors set by the core \n" + "instead of the default ones."); + break; + case MENU_ENUM_LABEL_CONTENT_HISTORY_SIZE: + snprintf(s, len, + "Number of entries that will be kept in \n" + "content history playlist."); + break; + case MENU_ENUM_LABEL_VIDEO_WINDOWED_FULLSCREEN: + snprintf(s, len, + "To use windowed mode or not when going \n" + "fullscreen."); + break; + case MENU_ENUM_LABEL_VIDEO_FONT_SIZE: + snprintf(s, len, + "Ekrandaki mesajlar için yazı tipi boyutu."); + break; + case MENU_ENUM_LABEL_SAVESTATE_AUTO_INDEX: + snprintf(s, len, + "Automatically increment slot index on each save, \n" + "generating multiple savestate files. \n" + "When the content is loaded, state slot will be \n" + "set to the highest existing value (last savestate)."); + break; + case MENU_ENUM_LABEL_FPS_SHOW: + snprintf(s, len, + "Enables displaying the current frames \n" + "per second."); + break; + case MENU_ENUM_LABEL_MEMORY_SHOW: + snprintf(s, len, + "Geçerli bellek kullanımı/toplamının FPS/Kareler \n" + "ile görüntülenmesini içerir."); + break; + case MENU_ENUM_LABEL_VIDEO_FONT_ENABLE: + snprintf(s, len, + "Ekrandaki mesajları göster veya gizle."); + break; + case MENU_ENUM_LABEL_VIDEO_MESSAGE_POS_X: + case MENU_ENUM_LABEL_VIDEO_MESSAGE_POS_Y: + snprintf(s, len, + "Offset for where messages will be placed \n" + "onscreen. Values are in range [0.0, 1.0]."); + break; + case MENU_ENUM_LABEL_INPUT_OVERLAY_ENABLE: + snprintf(s, len, + "Enable or disable the current overlay."); + break; + case MENU_ENUM_LABEL_INPUT_OVERLAY_HIDE_IN_MENU: + snprintf(s, len, + "Hide the current overlay from appearing \n" + "inside the menu."); + break; + case MENU_ENUM_LABEL_INPUT_OVERLAY_SHOW_PHYSICAL_INPUTS: + snprintf(s, len, + "Show keyboard/controller button presses on \n" + "the onscreen overlay."); + break; + case MENU_ENUM_LABEL_INPUT_OVERLAY_SHOW_PHYSICAL_INPUTS_PORT: + snprintf(s, len, + "Select the port to listen for controller input \n" + "to display on the onscreen overlay."); + break; + case MENU_ENUM_LABEL_OVERLAY_PRESET: + snprintf(s, len, + "Path to input overlay."); + break; + case MENU_ENUM_LABEL_OVERLAY_OPACITY: + snprintf(s, len, + "Overlay opacity."); + break; + case MENU_ENUM_LABEL_INPUT_BIND_TIMEOUT: + snprintf(s, len, + "Input bind timer timeout (in seconds). \n" + "Amount of seconds to wait until proceeding \n" + "to the next bind."); + break; + case MENU_ENUM_LABEL_INPUT_BIND_HOLD: + snprintf(s, len, + "Input bind hold time (in seconds). \n" + "Amount of seconds to hold an input to bind it."); + break; + case MENU_ENUM_LABEL_OVERLAY_SCALE: + snprintf(s, len, + "Overlay scale."); + break; + case MENU_ENUM_LABEL_AUDIO_OUTPUT_RATE: + snprintf(s, len, + "Audio output samplerate."); + break; + case MENU_ENUM_LABEL_VIDEO_SHARED_CONTEXT: + snprintf(s, len, + "Set to true if hardware-rendered cores \n" + "should get their private context. \n" + "Avoids having to assume hardware state changes \n" + "inbetween frames." + ); + break; + case MENU_ENUM_LABEL_CORE_LIST: + snprintf(s, len, + "Core yükle. \n" + " \n" + "Browse for a libretro core \n" + "implementation. Where the browser \n" + "starts depends on your Core Directory \n" + "path. If blank, it will start in root. \n" + " \n" + "If Core Directory is a directory, the menu \n" + "will use that as top folder. If Core \n" + "Directory is a full path, it will start \n" + "in the folder where the file is."); + break; + case MENU_ENUM_LABEL_VALUE_MENU_ENUM_CONTROLS_PROLOG: + snprintf(s, len, + "Menüyü kontrol etmek için \n" + "gamepad'inizde veya klavyenizde aşağıdaki\n" + "kontrolleri kullanabilirsiniz: \n" + " \n" + ); + break; + case MENU_ENUM_LABEL_WELCOME_TO_RETROARCH: + snprintf(s, len, + "RetroArch'a Hoşgeldiniz\n" + ); + break; + case MENU_ENUM_LABEL_VALUE_HELP_AUDIO_VIDEO_TROUBLESHOOTING_DESC: { + /* Work around C89 limitations */ + char u[501]; + const char *t = + "RetroArch relies on an unique form of\n" + "audio/video synchronization where it needs to be\n" + "calibrated against the refresh rate of your\n" + "display for best performance results.\n" + " \n" + "If you experience any audio crackling or video\n" + "tearing, usually it means that you need to\n" + "calibrate the settings. Some choices below:\n" + " \n"; + snprintf(u, sizeof(u), /* can't inline this due to the printf arguments */ + "a) Go to '%s' -> '%s', and enable\n" + "'Threaded Video'. Refresh rate will not matter\n" + "in this mode, framerate will be higher,\n" + "but video might be less smooth.\n" + "b) Go to '%s' -> '%s', and look at\n" + "'%s'. Let it run for\n" + "2048 frames, then press 'OK'.", + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SETTINGS), + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SETTINGS), + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SETTINGS), + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SETTINGS), + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_REFRESH_RATE_AUTO)); + strlcpy(s, t, len); + strlcat(s, u, len); + } + break; + case MENU_ENUM_LABEL_VALUE_HELP_SCANNING_CONTENT_DESC: + snprintf(s, len, + "To scan for content, go to '%s' and\n" + "select either '%s' or %s'.\n" + " \n" + "Files will be compared to database entries.\n" + "If there is a match, it will add an entry\n" + "to a collection.\n" + " \n" + "You can then easily access this content by\n" + "going to '%s' ->\n" + "'%s'\n" + "instead of having to go through the\n" + "filebrowser everytime.\n" + " \n" + "NOTE: Content for some cores might still not be\n" + "scannable.", + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ADD_CONTENT_LIST), + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCAN_DIRECTORY), + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCAN_FILE), + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_LIST), + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLISTS_TAB) + ); + break; + case MENU_ENUM_LABEL_VALUE_EXTRACTING_PLEASE_WAIT: + snprintf(s, len, + "RetroArch'a Hoşgeldiniz\n" + "\n" + "Varlıklar ayıklanıyor, lütfen bekleyin.\n" + "İşlem biraz zaman alabilir...\n" + ); + break; + case MENU_ENUM_LABEL_INPUT_DRIVER: + { + const char *lbl = settings ? settings->arrays.input_driver : NULL; + + if (string_is_equal(lbl, msg_hash_to_str(MENU_ENUM_LABEL_INPUT_DRIVER_UDEV))) + snprintf(s, len, + "udev Input driver. \n" + " \n" + "It uses the recent evdev joypad API \n" + "for joystick support. It supports \n" + "hotplugging and force feedback. \n" + " \n" + "The driver reads evdev events for keyboard \n" + "support. It also supports keyboard callback, \n" + "mice and touchpads. \n" + " \n" + "By default in most distros, /dev/input nodes \n" + "are root-only (mode 600). You can set up a udev \n" + "rule which makes these accessible to non-root." + ); + else if (string_is_equal(lbl, + msg_hash_to_str(MENU_ENUM_LABEL_INPUT_DRIVER_LINUXRAW))) + snprintf(s, len, + "linuxraw Input driver. \n" + " \n" + "This driver requires an active TTY. Keyboard \n" + "events are read directly from the TTY which \n" + "makes it simpler, but not as flexible as udev. \n" "Mice, etc, are not supported at all. \n" + " \n" + "This driver uses the older joystick API \n" + "(/dev/input/js*)."); + else + snprintf(s, len, + "Input driver.\n" + " \n" + "Depending on video driver, it might \n" + "force a different input driver."); + } + break; + case MENU_ENUM_LABEL_LOAD_CONTENT_LIST: + snprintf(s, len, + "İçeriği Yükle. \n" + "İçeriğe göz at. \n" + " \n" + "To load content, you need a \n" + "'Core' to use, and a content file. \n" + " \n" + "To control where the menu starts \n" + "to browse for content, set \n" + "'File Browser Directory'. \n" + "If not set, it will start in root. \n" + " \n" + "The browser will filter out \n" + "extensions for the last core set \n" + "in 'Load Core', and use that core \n" + "when content is loaded." + ); + break; + case MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY: + snprintf(s, len, + "Geçmişten içerik yükleniyor. \n" + " \n" + "As content is loaded, content and libretro \n" + "core combinations are saved to history. \n" + " \n" + "The history is saved to a file in the same \n" + "directory as the RetroArch config file. If \n" + "no config file was loaded in startup, history \n" + "will not be saved or loaded, and will not exist \n" + "in the main menu." + ); + break; + case MENU_ENUM_LABEL_VIDEO_DRIVER: + snprintf(s, len, + "Geçerli Video sürücüsü."); + + if (string_is_equal(settings->arrays.video_driver, "gl")) + { + snprintf(s, len, + "OpenGL Video sürücüsü. \n" + " \n" + "This driver allows libretro GL cores to \n" + "be used in addition to software-rendered \n" + "core implementations.\n" + " \n" + "Performance for software-rendered and \n" + "libretro GL core implementations is \n" + "dependent on your graphics card's \n" + "underlying GL driver)."); + } + else if (string_is_equal(settings->arrays.video_driver, "sdl2")) + { + snprintf(s, len, + "SDL 2 Video sürücüsü.\n" + " \n" + "This is an SDL 2 software-rendered video \n" + "driver.\n" + " \n" + "Performance for software-rendered libretro \n" + "core implementations is dependent \n" + "on your platform SDL implementation."); + } + else if (string_is_equal(settings->arrays.video_driver, "sdl1")) + { + snprintf(s, len, + "SDL Video sürücüsü.\n" + " \n" + "This is an SDL 1.2 software-rendered video \n" + "driver.\n" + " \n" + "Performance is considered to be suboptimal. \n" + "Consider using it only as a last resort."); + } + else if (string_is_equal(settings->arrays.video_driver, "d3d")) + { + snprintf(s, len, + "Direct3D Video sürücüsü. \n" + " \n" + "Performance for software-rendered cores \n" + "is dependent on your graphic card's \n" + "underlying D3D driver)."); + } + else if (string_is_equal(settings->arrays.video_driver, "exynos")) + { + snprintf(s, len, + "Exynos-G2D Video sürücüsü. \n" + " \n" + "This is a low-level Exynos video driver. \n" + "Uses the G2D block in Samsung Exynos SoC \n" + "for blit operations. \n" + " \n" + "Performance for software rendered cores \n" + "should be optimal."); + } + else if (string_is_equal(settings->arrays.video_driver, "drm")) + { + snprintf(s, len, + "Plain DRM Video sürücüsü. \n" + " \n" + "This is a low-level video driver using. \n" + "libdrm for hardware scaling using \n" + "GPU overlays."); + } + else if (string_is_equal(settings->arrays.video_driver, "sunxi")) + { + snprintf(s, len, + "Sunxi-G2D Video sürücüsü. \n" + " \n" + "This is a low-level Sunxi video driver. \n" + "Uses the G2D block in Allwinner SoCs."); + } + break; + case MENU_ENUM_LABEL_AUDIO_DSP_PLUGIN: + snprintf(s, len, + "Audio DSP plugin.\n" + " Processes audio before it's sent to \n" + "the driver." + ); + break; + case MENU_ENUM_LABEL_AUDIO_RESAMPLER_DRIVER: + { + const char *lbl = settings ? settings->arrays.audio_resampler : NULL; + + if (string_is_equal(lbl, msg_hash_to_str( + MENU_ENUM_LABEL_AUDIO_RESAMPLER_DRIVER_SINC))) + strlcpy(s, + "Pencereli SINC uygulaması.", len); + else if (string_is_equal(lbl, msg_hash_to_str( + MENU_ENUM_LABEL_AUDIO_RESAMPLER_DRIVER_CC))) + strlcpy(s, + "Convoluted Cosine implementation.", len); + else if (string_is_empty(s)) + strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_INFORMATION_AVAILABLE), len); + } + break; + + case MENU_ENUM_LABEL_CRT_SWITCH_RESOLUTION: snprintf(s, len, "SET CRT"); + break; + + case MENU_ENUM_LABEL_CRT_SWITCH_RESOLUTION_SUPER: snprintf(s, len, "SET CRT SUPER"); + break; + + case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET: + snprintf(s, len, + "Load Shader Preset. \n" + " \n" + " Load a shader preset directly. \n" + "The menu shader menu is updated accordingly. \n" + " \n" + "If the CGP uses scaling methods which are not \n" + "simple, (i.e. source scaling, same scaling \n" + "factor for X/Y), the scaling factor displayed \n" + "in the menu might not be correct." + ); + break; + case MENU_ENUM_LABEL_VIDEO_SHADER_SCALE_PASS: + snprintf(s, len, + "Scale for this pass. \n" + " \n" + "The scale factor accumulates, i.e. 2x \n" + "for first pass and 2x for second pass \n" + "will give you a 4x total scale. \n" + " \n" + "If there is a scale factor for last \n" + "pass, the result is stretched to \n" + "screen with the filter specified in \n" + "'Default Filter'. \n" + " \n" + "If 'Don't Care' is set, either 1x \n" + "scale or stretch to fullscreen will \n" + "be used depending if it's not the last \n" + "pass or not." + ); + break; + case MENU_ENUM_LABEL_VIDEO_SHADER_NUM_PASSES: + snprintf(s, len, + "Shader Passes. \n" + " \n" + "RetroArch allows you to mix and match various \n" + "shaders with arbitrary shader passes, with \n" + "custom hardware filters and scale factors. \n" + " \n" + "This option specifies the number of shader \n" + "passes to use. If you set this to 0, and use \n" + "Apply Shader Changes, you use a 'blank' shader. \n" + " \n" + "The Default Filter option will affect the \n" + "stretching filter."); + break; + case MENU_ENUM_LABEL_VIDEO_SHADER_PARAMETERS: + snprintf(s, len, + "Shader Parameters. \n" + " \n" + "Modifies current shader directly. Will not be \n" + "saved to CGP/GLSLP preset file."); + break; + case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_PARAMETERS: + snprintf(s, len, + "Shader Preset Parameters. \n" + " \n" + "Modifies shader preset currently in menu." + ); + break; + case MENU_ENUM_LABEL_VIDEO_SHADER_PASS: + snprintf(s, len, + "Path to shader. \n" + " \n" + "All shaders must be of the same \n" + "type (i.e. CG, GLSL or HLSL). \n" + " \n" + "Set Shader Directory to set where \n" + "the browser starts to look for \n" + "shaders." + ); + break; + case MENU_ENUM_LABEL_CONFIGURATION_SETTINGS: + snprintf(s, len, + "Determines how configuration files \n" + "are loaded and prioritized."); + break; + case MENU_ENUM_LABEL_CONFIG_SAVE_ON_EXIT: + snprintf(s, len, + "Saves config to disk on exit.\n" + "Useful for menu as settings can be\n" + "modified. Overwrites the config.\n" + " \n" + "#include's and comments are not \n" + "preserved. \n" + " \n" + "By design, the config file is \n" + "considered immutable as it is \n" + "likely maintained by the user, \n" + "and should not be overwritten \n" + "behind the user's back." +#if defined(RARCH_CONSOLE) || defined(RARCH_MOBILE) + "\nThis is not not the case on \n" + "consoles however, where \n" + "looking at the config file \n" + "manually isn't really an option." +#endif + ); + break; + case MENU_ENUM_LABEL_CONFIRM_ON_EXIT: + snprintf(s, len, "Are you sure you want to quit?"); + break; + case MENU_ENUM_LABEL_SHOW_HIDDEN_FILES: + snprintf(s, len, "Show hidden files\n" + "and folders."); + break; + case MENU_ENUM_LABEL_VIDEO_SHADER_FILTER_PASS: + snprintf(s, len, + "Hardware filter for this pass. \n" + " \n" + "If 'Don't Care' is set, 'Default \n" + "Filter' will be used." + ); + break; + case MENU_ENUM_LABEL_AUTOSAVE_INTERVAL: + snprintf(s, len, + "Autosaves the non-volatile SRAM \n" + "at a regular interval.\n" + " \n" + "This is disabled by default unless set \n" + "otherwise. The interval is measured in \n" + "seconds. \n" + " \n" + "A value of 0 disables autosave."); + break; + case MENU_ENUM_LABEL_INPUT_BIND_DEVICE_TYPE: + snprintf(s, len, + "Input Device Type. \n" + " \n" + "Picks which device type to use. This is \n" + "relevant for the libretro core itself." + ); + break; + case MENU_ENUM_LABEL_LIBRETRO_LOG_LEVEL: + snprintf(s, len, + "Sets log level for libretro cores \n" + "(GET_LOG_INTERFACE). \n" + " \n" + " If a log level issued by a libretro \n" + " core is below libretro_log level, it \n" + " is ignored.\n" + " \n" + " DEBUG logs are always ignored unless \n" + " verbose mode is activated (--verbose).\n" + " \n" + " DEBUG = 0\n" + " INFO = 1\n" + " WARN = 2\n" + " ERROR = 3" + ); + break; + case MENU_ENUM_LABEL_STATE_SLOT_INCREASE: + case MENU_ENUM_LABEL_STATE_SLOT_DECREASE: + snprintf(s, len, + "State slots.\n" + " \n" + " With slot set to 0, save state name is *.state \n" + " (or whatever defined on commandline).\n" + "When slot is != 0, path will be (path)(d), \n" + "where (d) is slot number."); + break; + case MENU_ENUM_LABEL_SHADER_APPLY_CHANGES: + snprintf(s, len, + "Apply Shader Changes. \n" + " \n" + "After changing shader settings, use this to \n" + "apply changes. \n" + " \n" + "Changing shader settings is a somewhat \n" + "expensive operation so it has to be \n" + "done explicitly. \n" + " \n" + "When you apply shaders, the menu shader \n" + "settings are saved to a temporary file (either \n" + "menu.cgp or menu.glslp) and loaded. The file \n" + "persists after RetroArch exits. The file is \n" + "saved to Shader Directory." + ); + break; + case MENU_ENUM_LABEL_SHADER_WATCH_FOR_CHANGES: + snprintf(s, len, + "Watch shader files for new changes. \n" + " \n" + "After saving changes to a shader on disk, \n" + "it will automatically be recompiled \n" + "and applied to the running content." + ); + break; + case MENU_ENUM_LABEL_MENU_TOGGLE: + snprintf(s, len, + "Toggles menu."); + break; + case MENU_ENUM_LABEL_GRAB_MOUSE_TOGGLE: + snprintf(s, len, + "Toggles mouse grab.\n" + " \n" + "When mouse is grabbed, RetroArch hides the \n" + "mouse, and keeps the mouse pointer inside \n" + "the window to allow relative mouse input to \n" + "work better."); + break; + case MENU_ENUM_LABEL_GAME_FOCUS_TOGGLE: + snprintf(s, len, + "Toggles game focus.\n" + " \n" + "When a game has focus, RetroArch will both disable \n" + "hotkeys and keep/warp the mouse pointer inside the window."); + break; + case MENU_ENUM_LABEL_DISK_NEXT: + snprintf(s, len, + "Cycles through disk images. Use after \n" + "ejecting. \n" + " \n" + " Complete by toggling eject again."); + break; + case MENU_ENUM_LABEL_VIDEO_FILTER: +#ifdef HAVE_FILTERS_BUILTIN + snprintf(s, len, + "CPU-based video filter."); +#else + snprintf(s, len, + "CPU-based video filter.\n" + " \n" + "Path to a dynamic library."); +#endif + break; + case MENU_ENUM_LABEL_AUDIO_DEVICE: + snprintf(s, len, + "Override the default audio device \n" + "the audio driver uses.\n" + "This is driver dependent. E.g.\n" +#ifdef HAVE_ALSA + " \n" + "ALSA wants a PCM device." +#endif +#ifdef HAVE_OSS + " \n" + "OSS wants a path (e.g. /dev/dsp)." +#endif +#ifdef HAVE_JACK + " \n" + "JACK wants portnames (e.g. system:playback1\n" + ",system:playback_2)." +#endif +#ifdef HAVE_RSOUND + " \n" + "RSound wants an IP address to an RSound \n" + "server." +#endif + ); + break; + case MENU_ENUM_LABEL_DISK_EJECT_TOGGLE: + snprintf(s, len, + "Toggles eject for disks.\n" + " \n" + "Used for multiple-disk content."); + break; + case MENU_ENUM_LABEL_ENABLE_HOTKEY: + snprintf(s, len, + "Enable other hotkeys.\n" + " \n" + " If this hotkey is bound to either keyboard, \n" + "joybutton or joyaxis, all other hotkeys will \n" + "be disabled unless this hotkey is also held \n" + "at the same time. \n" + " \n" + "This is useful for RETRO_KEYBOARD centric \n" + "implementations which query a large area of \n" + "the keyboard, where it is not desirable that \n" + "hotkeys get in the way."); + break; + case MENU_ENUM_LABEL_REWIND_ENABLE: + snprintf(s, len, + "Enable rewinding.\n" + " \n" + "This will take a performance hit, \n" + "so it is disabled by default."); + break; + case MENU_ENUM_LABEL_CHEAT_APPLY_AFTER_TOGGLE: + snprintf(s, len, + "Geçiş yaptıktan hemen sonra hileyi uygulayın."); + break; + case MENU_ENUM_LABEL_CHEAT_APPLY_AFTER_LOAD: + snprintf(s, len, + "Oyun yüklendiğinde hileleri otomatik uygulayın."); + break; + case MENU_ENUM_LABEL_LIBRETRO_DIR_PATH: + snprintf(s, len, + "Core Dizini. \n" + " \n" + "A directory for where to search for \n" + "libretro core implementations."); + break; + case MENU_ENUM_LABEL_VIDEO_REFRESH_RATE_AUTO: + snprintf(s, len, + "Refresh Rate Auto.\n" + " \n" + "The accurate refresh rate of our monitor (Hz).\n" + "This is used to calculate audio input rate with \n" + "the formula: \n" + " \n" + "audio_input_rate = game input rate * display \n" + "refresh rate / game refresh rate\n" + " \n" + "If the implementation does not report any \n" + "values, NTSC defaults will be assumed for \n" + "compatibility.\n" + " \n" + "This value should stay close to 60Hz to avoid \n" + "large pitch changes. If your monitor does \n" + "not run at 60Hz, or something close to it, \n" + "disable VSync, and leave this at its default."); + break; + case MENU_ENUM_LABEL_VIDEO_REFRESH_RATE_POLLED: + snprintf(s, len, + "Set Polled Refresh Rate\n" + " \n" + "Sets the refresh rate to the actual value\n" + "polled from the display driver."); + break; + case MENU_ENUM_LABEL_VIDEO_ROTATION: + snprintf(s, len, + "Forces a certain rotation \n" + "of the screen.\n" + " \n" + "The rotation is added to rotations which\n" + "the libretro core sets (see Video Allow\n" + "Rotate)."); + break; + case MENU_ENUM_LABEL_VIDEO_SCALE: + snprintf(s, len, + "Tam ekran çözünürlüğü.\n" + " \n" + "0 çözünürlüğü, \n" + "ortamın çözünürlüğünü kullanır.\n"); + break; + case MENU_ENUM_LABEL_FASTFORWARD_RATIO: + snprintf(s, len, + "Fastforward ratio.\n" + " \n" + "The maximum rate at which content will\n" + "be run when using fast forward.\n" + " \n" + " (E.g. 5.0 for 60 fps content => 300 fps \n" + "cap).\n" + " \n" + "RetroArch will go to sleep to ensure that \n" + "the maximum rate will not be exceeded.\n" + "Do not rely on this cap to be perfectly \n" + "accurate."); + break; + case MENU_ENUM_LABEL_VRR_RUNLOOP_ENABLE: + snprintf(s, len, + "Sync to Exact Content Framerate.\n" + " \n" + "This option is the equivalent of forcing x1 speed\n" + "while still allowing fast forward.\n" + "No deviation from the core requested refresh rate,\n" + "no sound Dynamic Rate Control)."); + break; + case MENU_ENUM_LABEL_VIDEO_MONITOR_INDEX: + snprintf(s, len, + "Which monitor to prefer.\n" + " \n" + "0 (default) means no particular monitor \n" + "is preferred, 1 and up (1 being first \n" + "monitor), suggests RetroArch to use that \n" + "particular monitor."); + break; + case MENU_ENUM_LABEL_VIDEO_CROP_OVERSCAN: + snprintf(s, len, + "Forces cropping of overscanned \n" + "frames.\n" + " \n" + "Exact behavior of this option is \n" + "core-implementation specific."); + break; + case MENU_ENUM_LABEL_VIDEO_SCALE_INTEGER: + snprintf(s, len, + "Only scales video in integer \n" + "steps.\n" + " \n" + "The base size depends on system-reported \n" + "geometry and aspect ratio.\n" + " \n" + "If Force Aspect is not set, X/Y will be \n" + "integer scaled independently."); + break; + case MENU_ENUM_LABEL_AUDIO_VOLUME: + snprintf(s, len, + "Audio volume, expressed in dB.\n" + " \n" + " 0 dB is normal volume. No gain will be applied.\n" + "Gain can be controlled in runtime with Input\n" + "Volume Up / Input Volume Down."); + break; + case MENU_ENUM_LABEL_AUDIO_RATE_CONTROL_DELTA: + snprintf(s, len, + "Audio rate control.\n" + " \n" + "Setting this to 0 disables rate control.\n" + "Any other value controls audio rate control \n" + "delta.\n" + " \n" + "Defines how much input rate can be adjusted \n" + "dynamically.\n" + " \n" + " Input rate is defined as: \n" + " input rate * (1.0 +/- (rate control delta))"); + break; + case MENU_ENUM_LABEL_AUDIO_MAX_TIMING_SKEW: + snprintf(s, len, + "Maximum audio timing skew.\n" + " \n" + "Defines the maximum change in input rate.\n" + "You may want to increase this to enable\n" + "very large changes in timing, for example\n" + "running PAL cores on NTSC displays, at the\n" + "cost of inaccurate audio pitch.\n" + " \n" + " Input rate is defined as: \n" + " input rate * (1.0 +/- (max timing skew))"); + break; + case MENU_ENUM_LABEL_OVERLAY_NEXT: + snprintf(s, len, + "Toggles to next overlay.\n" + " \n" + "Wraps around."); + break; + case MENU_ENUM_LABEL_LOG_VERBOSITY: + snprintf(s, len, + "Enable or disable verbosity level \n" + "of frontend."); + break; + case MENU_ENUM_LABEL_VOLUME_UP: + snprintf(s, len, + "Ses seviyesini arttırır."); + break; + case MENU_ENUM_LABEL_VOLUME_DOWN: + snprintf(s, len, + "Ses seviyesini azaltır."); + break; + case MENU_ENUM_LABEL_VIDEO_DISABLE_COMPOSITION: + snprintf(s, len, + "Forcibly disable composition.\n" + "Only valid on Windows Vista/7 for now."); + break; + case MENU_ENUM_LABEL_PERFCNT_ENABLE: + snprintf(s, len, + "Enable or disable frontend \n" + "performance counters."); + break; + case MENU_ENUM_LABEL_SYSTEM_DIRECTORY: + snprintf(s, len, + "Sistem Dizini. \n" + " \n" + "Sets the 'system' directory.\n" + "Cores can query for this\n" + "directory to load BIOSes, \n" + "system-specific configs, etc."); + break; + case MENU_ENUM_LABEL_SAVESTATE_AUTO_SAVE: + case MENU_ENUM_LABEL_SAVESTATE_AUTO_LOAD: + snprintf(s, len, + "Automatically saves a savestate at the \n" + "end of RetroArch's lifetime.\n" + " \n" + "RetroArch will automatically load any savestate\n" + "with this path on startup if 'Auto Load State\n" + "is enabled."); + break; + case MENU_ENUM_LABEL_VIDEO_THREADED: + snprintf(s, len, + "Use threaded video driver.\n" + " \n" + "Using this might improve performance at the \n" + "possible cost of latency and more video \n" + "stuttering."); + break; + case MENU_ENUM_LABEL_VIDEO_VSYNC: + snprintf(s, len, + "Video V-Sync.\n"); + break; + case MENU_ENUM_LABEL_VIDEO_HARD_SYNC: + snprintf(s, len, + "Attempts to hard-synchronize \n" + "CPU and GPU.\n" + " \n" + "Can reduce latency at the cost of \n" + "performance."); + break; + case MENU_ENUM_LABEL_REWIND_GRANULARITY: + snprintf(s, len, + "Rewind granularity.\n" + " \n" + " When rewinding defined number of \n" + "frames, you can rewind several frames \n" + "at a time, increasing the rewinding \n" + "speed."); + break; + case MENU_ENUM_LABEL_REWIND_BUFFER_SIZE: + snprintf(s, len, + "Rewind buffer size (MB).\n" + " \n" + " The amount of memory in MB to reserve \n" + "for rewinding. Increasing this value \n" + "increases the rewind history length.\n"); + break; + case MENU_ENUM_LABEL_REWIND_BUFFER_SIZE_STEP: + snprintf(s, len, + "Rewind buffer size step (MB).\n" + " \n" + " Each time you increase or decrease \n" + "the rewind buffer size value via this \n" + "UI it will change by this amount.\n"); + break; + case MENU_ENUM_LABEL_SCREENSHOT: + snprintf(s, len, + "Ekran görüntüsü al."); + break; + case MENU_ENUM_LABEL_VIDEO_FRAME_DELAY: + snprintf(s, len, + "Sets how many milliseconds to delay\n" + "after VSync before running the core.\n" + "\n" + "Can reduce latency at the cost of\n" + "higher risk of stuttering.\n" + " \n" + "Maximum is 15."); + break; + case MENU_ENUM_LABEL_VIDEO_HARD_SYNC_FRAMES: + snprintf(s, len, + "Sets how many frames CPU can \n" + "run ahead of GPU when using 'GPU \n" + "Hard Sync'.\n" + " \n" + "Maximum is 3.\n" + " \n" + " 0: Syncs to GPU immediately.\n" + " 1: Syncs to previous frame.\n" + " 2: Etc ..."); + break; + case MENU_ENUM_LABEL_VIDEO_BLACK_FRAME_INSERTION: + snprintf(s, len, + "Inserts a black frame inbetween \n" + "frames.\n" + " \n" + "Useful for 120 Hz monitors who want to \n" + "play 60 Hz material with eliminated \n" + "ghosting.\n" + " \n" + "Video refresh rate should still be \n" + "configured as if it is a 60 Hz monitor \n" + "(divide refresh rate by 2)."); + break; + case MENU_ENUM_LABEL_RGUI_SHOW_START_SCREEN: + snprintf(s, len, + "Show startup screen in menu.\n" + "Is automatically set to false when seen\n" + "for the first time.\n" + " \n" + "This is only updated in config if\n" + "'Save Configuration on Exit' is enabled.\n"); + break; + case MENU_ENUM_LABEL_VIDEO_FULLSCREEN: + snprintf(s, len, "Toggles fullscreen."); + break; + case MENU_ENUM_LABEL_BLOCK_SRAM_OVERWRITE: + snprintf(s, len, + "Block SRAM from being overwritten \n" + "when loading save states.\n" + " \n" + "Might potentially lead to buggy games."); + break; + case MENU_ENUM_LABEL_PAUSE_NONACTIVE: + snprintf(s, len, + "Pause gameplay when window focus \n" + "is lost."); + break; + case MENU_ENUM_LABEL_VIDEO_GPU_SCREENSHOT: + snprintf(s, len, + "Screenshots output of GPU shaded \n" + "material if available."); + break; + case MENU_ENUM_LABEL_SCREENSHOT_DIRECTORY: + snprintf(s, len, + "Ekran görüntüsü Dizini. \n" + " \n" + "Ekran görüntülerinin bulunacağı dizin." + ); + break; + case MENU_ENUM_LABEL_VIDEO_SWAP_INTERVAL: + snprintf(s, len, + "VSync Swap Interval.\n" + " \n" + "Uses a custom swap interval for VSync. Set this \n" + "to effectively halve monitor refresh rate."); + break; + case MENU_ENUM_LABEL_SAVEFILE_DIRECTORY: + snprintf(s, len, + "Savefile Directory. \n" + " \n" + "Save all save files (*.srm) to this \n" + "directory. This includes related files like \n" + ".bsv, .rt, .psrm, etc...\n" + " \n" + "This will be overridden by explicit command line\n" + "options."); + break; + case MENU_ENUM_LABEL_SAVESTATE_DIRECTORY: + snprintf(s, len, + "Savestate Directory. \n" + " \n" + "Save all save states (*.state) to this \n" + "directory.\n" + " \n" + "This will be overridden by explicit command line\n" + "options."); + break; + case MENU_ENUM_LABEL_ASSETS_DIRECTORY: + snprintf(s, len, + "Assets Directory. \n" + " \n" + " This location is queried by default when \n" + "menu interfaces try to look for loadable \n" + "assets, etc."); + break; + case MENU_ENUM_LABEL_DYNAMIC_WALLPAPERS_DIRECTORY: + snprintf(s, len, + "Dynamic Wallpapers Directory. \n" + " \n" + " The place to store backgrounds that will \n" + "be loaded dynamically by the menu depending \n" + "on context."); + break; + case MENU_ENUM_LABEL_SLOWMOTION_RATIO: + snprintf(s, len, + "Slowmotion ratio." + " \n" + "When slowmotion, content will slow\n" + "down by factor."); + break; + case MENU_ENUM_LABEL_INPUT_BUTTON_AXIS_THRESHOLD: + snprintf(s, len, + "Defines the axis threshold.\n" + " \n" + "How far an axis must be tilted to result\n" + "in a button press.\n" + " Possible values are [0.0, 1.0]."); + break; + case MENU_ENUM_LABEL_INPUT_TURBO_PERIOD: + snprintf(s, len, + "Turbo period.\n" + " \n" + "Describes the period of which turbo-enabled\n" + "buttons toggle.\n" + " \n" + "Numbers are described in frames." + ); + break; + case MENU_ENUM_LABEL_INPUT_DUTY_CYCLE: + snprintf(s, len, + "Duty cycle.\n" + " \n" + "Describes how long the period of a turbo-enabled\n" + "should be.\n" + " \n" + "Numbers are described in frames." + ); + break; + case MENU_ENUM_LABEL_INPUT_TOUCH_ENABLE: + snprintf(s, len, "Dokunma desteğini etkinleştirin."); + break; + case MENU_ENUM_LABEL_INPUT_PREFER_FRONT_TOUCH: + snprintf(s, len, "Geri dokunma yerine önü kullanın."); + break; + case MENU_ENUM_LABEL_MOUSE_ENABLE: + snprintf(s, len, "Menü içinde fare girişini etkinleştirin."); + break; + case MENU_ENUM_LABEL_POINTER_ENABLE: + snprintf(s, len, "Menü içinde dokunmatik girişi etkinleştirin."); + break; + case MENU_ENUM_LABEL_MENU_WALLPAPER: + snprintf(s, len, "Arka plan olarak ayarlamak için resmin yolu."); + break; + case MENU_ENUM_LABEL_NAVIGATION_WRAPAROUND: + snprintf(s, len, + "Wrap-around to beginning and/or end \n" + "if boundary of list is reached \n" + "horizontally and/or vertically."); + break; + case MENU_ENUM_LABEL_PAUSE_LIBRETRO: + snprintf(s, len, + "If disabled, the game will keep \n" + "running in the background when we are in the \n" + "menu."); + break; + case MENU_ENUM_LABEL_SUSPEND_SCREENSAVER_ENABLE: + snprintf(s, len, + "Suspends the screensaver. Is a hint that \n" + "does not necessarily have to be \n" + "honored by the video driver."); + break; + case MENU_ENUM_LABEL_NETPLAY_MODE: + snprintf(s, len, + "Netplay client mode for the current user. \n" + "Will be 'Server' mode if disabled."); + break; + case MENU_ENUM_LABEL_NETPLAY_DELAY_FRAMES: + snprintf(s, len, + "The amount of delay frames to use for netplay. \n" + " \n" + "Increasing this value will increase \n" + "performance, but introduce more latency."); + break; + case MENU_ENUM_LABEL_NETPLAY_PUBLIC_ANNOUNCE: + snprintf(s, len, + "Whether to announce netplay games publicly. \n" + " \n" + "If set to false, clients must manually connect \n" + "rather than using the public lobby."); + break; + case MENU_ENUM_LABEL_NETPLAY_START_AS_SPECTATOR: + snprintf(s, len, + "Whether to start netplay in spectator mode. \n" + " \n" + "If set to true, netplay will be in spectator mode \n" + "on start. It's always possible to change mode \n" + "later."); + break; + case MENU_ENUM_LABEL_NETPLAY_ALLOW_SLAVES: + snprintf(s, len, + "Whether to allow connections in slave mode. \n" + " \n" + "Slave-mode clients require very little processing \n" + "power on either side, but will suffer \n" + "significantly from network latency."); + break; + case MENU_ENUM_LABEL_NETPLAY_REQUIRE_SLAVES: + snprintf(s, len, + "Whether to disallow connections not in slave mode. \n" + " \n" + "Not recommended except for very fast networks \n" + "with very weak machines. \n"); + break; + case MENU_ENUM_LABEL_NETPLAY_STATELESS_MODE: + snprintf(s, len, + "Whether to run netplay in a mode not requiring\n" + "save states. \n" + " \n" + "If set to true, a very fast network is required,\n" + "but no rewinding is performed, so there will be\n" + "no netplay jitter.\n"); + break; + case MENU_ENUM_LABEL_NETPLAY_CHECK_FRAMES: + snprintf(s, len, + "The frequency in frames with which netplay \n" + "will verify that the host and client are in \n" + "sync. \n" + " \n" + "With most cores, this value will have no \n" + "visible effect and can be ignored. With \n" + "nondeterminstic cores, this value determines \n" + "how often the netplay peers will be brought \n" + "into sync. With buggy cores, setting this \n" + "to any non-zero value will cause severe \n" + "performance issues. Set to zero to perform \n" + "no checks. This value is only used on the \n" + "netplay host. \n"); + break; + case MENU_ENUM_LABEL_NETPLAY_INPUT_LATENCY_FRAMES_MIN: + snprintf(s, len, + "The number of frames of input latency for \n" + "netplay to use to hide network latency. \n" + " \n" + "When in netplay, this option delays local \n" + "input, so that the frame being run is \n" + "closer to the frames being received from \n" + "the network. This reduces jitter and makes \n" + "netplay less CPU-intensive, but at the \n" + "price of noticeable input lag. \n"); + break; + case MENU_ENUM_LABEL_NETPLAY_INPUT_LATENCY_FRAMES_RANGE: + snprintf(s, len, + "The range of frames of input latency that \n" + "may be used by netplay to hide network \n" + "latency. \n" + "\n" + "If set, netplay will adjust the number of \n" + "frames of input latency dynamically to \n" + "balance CPU time, input latency and \n" + "network latency. This reduces jitter and \n" + "makes netplay less CPU-intensive, but at \n" + "the price of unpredictable input lag. \n"); + break; + case MENU_ENUM_LABEL_NETPLAY_NAT_TRAVERSAL: + snprintf(s, len, + "When hosting, attempt to listen for\n" + "connections from the public internet, using\n" + "UPnP or similar technologies to escape LANs. \n"); + break; + case MENU_ENUM_LABEL_NETPLAY_USE_MITM_SERVER: + snprintf(s, len, + "When hosting a netplay session, relay connection through a \n" + "man-in-the-middle server \n" + "to get around firewalls or NAT/UPnP issues. \n"); + break; + case MENU_ENUM_LABEL_NETPLAY_MITM_SERVER: + snprintf(s, len, + "Specifies the man-in-the-middle server \n" + "to use for netplay. A server that is \n" + "located closer to you may have less latency. \n"); + break; + case MENU_ENUM_LABEL_VIDEO_MAX_SWAPCHAIN_IMAGES: + snprintf(s, len, + "Maximum amount of swapchain images. This \n" + "can tell the video driver to use a specific \n" + "video buffering mode. \n" + " \n" + "Single buffering - 1\n" + "Double buffering - 2\n" + "Triple buffering - 3\n" + " \n" + "Setting the right buffering mode can have \n" + "a big impact on latency."); + break; + case MENU_ENUM_LABEL_VIDEO_SMOOTH: + snprintf(s, len, + "Smoothens picture with bilinear filtering. \n" + "Should be disabled if using shaders."); + break; + case MENU_ENUM_LABEL_TIMEDATE_ENABLE: + snprintf(s, len, + "Menü içindeki geçerli tarihi ve/veya saati gösterir."); + break; + case MENU_ENUM_LABEL_TIMEDATE_STYLE: + snprintf(s, len, + "Style to show the current date and/or time in."); + break; + case MENU_ENUM_LABEL_BATTERY_LEVEL_ENABLE: + snprintf(s, len, + "Menü içindeki geçerli pil seviyesini gösterir."); + break; + case MENU_ENUM_LABEL_CORE_ENABLE: + snprintf(s, len, + "Menü içindeki geçerli Core'u gösterir."); + break; + case MENU_ENUM_LABEL_NETPLAY_ENABLE_HOST: + snprintf(s, len, + "Netplay'i ana bilgisayar (sunucu) modunda etkinleştirir."); + break; + case MENU_ENUM_LABEL_NETPLAY_ENABLE_CLIENT: + snprintf(s, len, + "Netplay'ü istemci modunda etkinleştirir."); + break; + case MENU_ENUM_LABEL_NETPLAY_DISCONNECT: + snprintf(s, len, + "Aktif bir Netplay bağlantısını keser."); + break; + case MENU_ENUM_LABEL_NETPLAY_LAN_SCAN_SETTINGS: + snprintf(s, len, + "Yerel ağdaki Netplay ana bilgisayarlarını arayın ve bağlanın."); + break; + case MENU_ENUM_LABEL_NETPLAY_SETTINGS: + snprintf(s, len, + "Netplay ile ilgili ayar."); + break; + case MENU_ENUM_LABEL_DYNAMIC_WALLPAPER: + snprintf(s, len, + "Dynamically load a new background \n" + "depending on context."); + break; + case MENU_ENUM_LABEL_CORE_UPDATER_BUILDBOT_URL: + snprintf(s, len, + "URL to core updater directory on the \n" + "Libretro buildbot."); + break; + case MENU_ENUM_LABEL_BUILDBOT_ASSETS_URL: + snprintf(s, len, + "URL to assets updater directory on the \n" + "Libretro buildbot."); + break; + case MENU_ENUM_LABEL_INPUT_REMAP_BINDS_ENABLE: + snprintf(s, len, + "if enabled, overrides the input binds \n" + "with the remapped binds set for the \n" + "current core."); + break; + case MENU_ENUM_LABEL_OVERLAY_DIRECTORY: + snprintf(s, len, + "Overlay Directory. \n" + " \n" + "Defines a directory where overlays are \n" + "kept for easy access."); + break; + case MENU_ENUM_LABEL_INPUT_MAX_USERS: + snprintf(s, len, + "Maximum amount of users supported by \n" + "RetroArch."); + break; + case MENU_ENUM_LABEL_CORE_UPDATER_AUTO_EXTRACT_ARCHIVE: + snprintf(s, len, + "After downloading, automatically extract \n" + "archives that the downloads are contained \n" + "inside."); + break; + case MENU_ENUM_LABEL_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE: + snprintf(s, len, + "Filter files being shown by \n" + "supported extensions."); + break; + case MENU_ENUM_LABEL_NETPLAY_NICKNAME: + snprintf(s, len, + "The username of the person running RetroArch. \n" + "This will be used for playing online games."); + break; + case MENU_ENUM_LABEL_NETPLAY_TCP_UDP_PORT: + snprintf(s, len, + "The port of the host IP address. \n" + "Can be either a TCP or UDP port."); + break; + case MENU_ENUM_LABEL_NETPLAY_SPECTATOR_MODE_ENABLE: + snprintf(s, len, + "Enable or disable spectator mode for \n" + "the user during netplay."); + break; + case MENU_ENUM_LABEL_NETPLAY_IP_ADDRESS: + snprintf(s, len, + "The address of the host to connect to."); + break; + case MENU_ENUM_LABEL_NETPLAY_PASSWORD: + snprintf(s, len, + "The password for connecting to the netplay \n" + "host. Used only in host mode."); + break; + case MENU_ENUM_LABEL_NETPLAY_SPECTATE_PASSWORD: + snprintf(s, len, + "The password for connecting to the netplay \n" + "host with only spectator privileges. Used \n" + "only in host mode."); + break; + case MENU_ENUM_LABEL_STDIN_CMD_ENABLE: + snprintf(s, len, + "Stdin komut arayüzünü etkinleştirin."); + break; + case MENU_ENUM_LABEL_UI_COMPANION_START_ON_BOOT: + snprintf(s, len, + "Kullanıcı Arabirimi yardımcı sürücüsünü başlat \n" + "boot sırasında (varsa)."); + break; + case MENU_ENUM_LABEL_MENU_DRIVER: + snprintf(s, len, "Menu driver to use."); + break; + case MENU_ENUM_LABEL_INPUT_MENU_ENUM_TOGGLE_GAMEPAD_COMBO: + snprintf(s, len, + "Geçiş menüsüne Gamepad düğme kombinasyonu. \n" + " \n" + "0 - Boş \n" + "1 - L + R + Y + D-Pad Down \n" + "aynı anda basın. \n" + "2 - L3 + R3 aynı anda basın. \n" + "3 - Start + Select aynı anda basın."); + break; + case MENU_ENUM_LABEL_INPUT_ALL_USERS_CONTROL_MENU: + snprintf(s, len, "Herhangi bir kullanıcının menüyü kontrol etmesine izin verir. \n" + " \n" + "Devre dışı bırakıldığında, sadece kullanıcı 1 menüyü kontrol edebilir."); + break; + case MENU_ENUM_LABEL_INPUT_AUTODETECT_ENABLE: + snprintf(s, len, + "Enable input auto-detection.\n" + " \n" + "Will attempt to auto-configure \n" + "joypads, Plug-and-Play style."); + break; + case MENU_ENUM_LABEL_CAMERA_ALLOW: + snprintf(s, len, + "Kameranın Core tarafından erişimine izin ver \n" + "veya verme."); + break; + case MENU_ENUM_LABEL_LOCATION_ALLOW: + snprintf(s, len, + "Konum servislerine izin ver veya verme \n" + "Corelar tarafından erişilir."); + break; + case MENU_ENUM_LABEL_TURBO: + snprintf(s, len, + "Turbo enable.\n" + " \n" + "Holding the turbo while pressing another \n" + "button will let the button enter a turbo \n" + "mode where the button state is modulated \n" + "with a periodic signal. \n" + " \n" + "The modulation stops when the button \n" + "itself (not turbo button) is released."); + break; + case MENU_ENUM_LABEL_OSK_ENABLE: + snprintf(s, len, + "Ekran klavyesini etkinleştir/devre dışı bırak."); + break; + case MENU_ENUM_LABEL_AUDIO_MUTE: + snprintf(s, len, + "Sesi kapat/aç."); + break; + case MENU_ENUM_LABEL_REWIND: + snprintf(s, len, + "Geri sarmak için düğmeyi basılı tutun.\n" + " \n" + "Geri sarma etkin olmalı."); + break; + case MENU_ENUM_LABEL_EXIT_EMULATOR: + snprintf(s, len, + "RetroArch'tan temiz bir şekilde çıkmak için tuş." +#if !defined(RARCH_MOBILE) && !defined(RARCH_CONSOLE) + "\nKilling it in any hard way (SIGKILL, \n" + "etc) will terminate without saving\n" + "RAM, etc. On Unix-likes,\n" + "SIGINT/SIGTERM allows\n" + "a clean deinitialization." +#endif + ); + break; + case MENU_ENUM_LABEL_LOAD_STATE: + snprintf(s, len, + "Konumu yükle."); + break; + case MENU_ENUM_LABEL_SAVE_STATE: + snprintf(s, len, + "Konumu kaydet."); + break; + case MENU_ENUM_LABEL_NETPLAY_GAME_WATCH: + snprintf(s, len, + "Netplay toggle play/spectate mode."); + break; + case MENU_ENUM_LABEL_CHEAT_INDEX_PLUS: + snprintf(s, len, + "Increment cheat index.\n"); + break; + case MENU_ENUM_LABEL_CHEAT_INDEX_MINUS: + snprintf(s, len, + "Decrement cheat index.\n"); + break; + case MENU_ENUM_LABEL_SHADER_PREV: + snprintf(s, len, + "Applies previous shader in directory."); + break; + case MENU_ENUM_LABEL_SHADER_NEXT: + snprintf(s, len, + "Dizindeki bir sonraki gölgelendiriciyi uygular."); + break; + case MENU_ENUM_LABEL_RESET: + snprintf(s, len, + "İçeriği sıfırla.\n"); + break; + case MENU_ENUM_LABEL_PAUSE_TOGGLE: + snprintf(s, len, + "Toggle between paused and non-paused state."); + break; + case MENU_ENUM_LABEL_CHEAT_TOGGLE: + snprintf(s, len, + "Toggle cheat index.\n"); + break; + case MENU_ENUM_LABEL_CHEAT_IDX: + snprintf(s, len, + "Index position in list.\n"); + break; + case MENU_ENUM_LABEL_CHEAT_ADDRESS_BIT_POSITION: + snprintf(s, len, + "Address bitmask when Memory Search Size < 8-bit.\n"); + break; + case MENU_ENUM_LABEL_CHEAT_REPEAT_COUNT: + snprintf(s, len, + "The number of times the cheat will be applied.\nUse with the other two Iteration options to affect large areas of memory."); + break; + case MENU_ENUM_LABEL_CHEAT_REPEAT_ADD_TO_ADDRESS: + snprintf(s, len, + "Her “Yineleme Sayısı” ndan sonra Hafıza Adresi, bu sayı ile “Hafıza Arama Boyutu” ile artacaktır."); + break; + case MENU_ENUM_LABEL_CHEAT_REPEAT_ADD_TO_VALUE: + snprintf(s, len, + "Her 'İterasyon Sayısı' ndan sonra, Değer bu miktar kadar artacaktır."); + break; + case MENU_ENUM_LABEL_CHEAT_MATCH_IDX: + snprintf(s, len, + "Görüntülenecek eşleşmeyi seçin."); + break; + case MENU_ENUM_LABEL_CHEAT_START_OR_CONT: + snprintf(s, len, + "Yeni hileler oluşturmak için belleği tarayın"); + break; + case MENU_ENUM_LABEL_CHEAT_START_OR_RESTART: + snprintf(s, len, + "Sol/Sağ ile bit-boyut arasında geçiş yapın\n"); + break; + case MENU_ENUM_LABEL_CHEAT_SEARCH_EXACT: + snprintf(s, len, + "Sol/Sağ ile değerleri değiştirinn"); + break; + case MENU_ENUM_LABEL_CHEAT_SEARCH_LT: + snprintf(s, len, + " "); + break; + case MENU_ENUM_LABEL_CHEAT_SEARCH_GT: + snprintf(s, len, + " "); + break; + case MENU_ENUM_LABEL_CHEAT_SEARCH_EQ: + snprintf(s, len, + " "); + break; + case MENU_ENUM_LABEL_CHEAT_SEARCH_NEQ: + snprintf(s, len, + " "); + break; + case MENU_ENUM_LABEL_CHEAT_SEARCH_EQPLUS: + snprintf(s, len, + "Sol/Sağ ile değerleri değiştirin\n"); + break; + case MENU_ENUM_LABEL_CHEAT_SEARCH_EQMINUS: + snprintf(s, len, + "Değeri değiştirmek için Sol/Sağ\n"); + break; + case MENU_ENUM_LABEL_CHEAT_ADD_MATCHES: + snprintf(s, len, + " "); + break; + case MENU_ENUM_LABEL_CHEAT_VIEW_MATCHES: + snprintf(s, len, + " "); + break; + case MENU_ENUM_LABEL_CHEAT_CREATE_OPTION: + snprintf(s, len, + " "); + break; + case MENU_ENUM_LABEL_CHEAT_DELETE_OPTION: + snprintf(s, len, + " "); + break; + case MENU_ENUM_LABEL_CHEAT_ADD_NEW_TOP: + snprintf(s, len, + " "); + break; + case MENU_ENUM_LABEL_CHEAT_RELOAD_CHEATS: + snprintf(s, len, + " "); + break; + case MENU_ENUM_LABEL_CHEAT_ADD_NEW_BOTTOM: + snprintf(s, len, + " "); + break; + case MENU_ENUM_LABEL_CHEAT_DELETE_ALL: + snprintf(s, len, + " "); + break; + case MENU_ENUM_LABEL_CHEAT_BIG_ENDIAN: + snprintf(s, len, + "Büyük endia : 258 = 0x0102\n" + "Küçük endia : 258 = 0x0201"); + break; + case MENU_ENUM_LABEL_HOLD_FAST_FORWARD: + snprintf(s, len, + "Hold for fast-forward. Releasing button \n" + "disables fast-forward."); + break; + case MENU_ENUM_LABEL_SLOWMOTION_HOLD: + snprintf(s, len, + "Slowmotion için basılı tutun"); + break; + case MENU_ENUM_LABEL_FRAME_ADVANCE: + snprintf(s, len, + "İçerik duraklatıldığında kare ilerlemesi."); + break; + case MENU_ENUM_LABEL_BSV_RECORD_TOGGLE: + snprintf(s, len, + "Kayıt yapma arasında geçiş yapmak için"); + break; + case MENU_ENUM_LABEL_L_X_PLUS: + case MENU_ENUM_LABEL_L_X_MINUS: + case MENU_ENUM_LABEL_L_Y_PLUS: + case MENU_ENUM_LABEL_L_Y_MINUS: + case MENU_ENUM_LABEL_R_X_PLUS: + case MENU_ENUM_LABEL_R_X_MINUS: + case MENU_ENUM_LABEL_R_Y_PLUS: + case MENU_ENUM_LABEL_R_Y_MINUS: + snprintf(s, len, + "Axis for analog stick (DualShock-esque).\n" + " \n" + "Bound as usual, however, if a real analog \n" + "axis is bound, it can be read as a true analog.\n" + " \n" + "Positive X axis is right. \n" + "Positive Y axis is down."); + break; + case MENU_ENUM_LABEL_VALUE_WHAT_IS_A_CORE_DESC: + snprintf(s, len, + "RetroArch kendi başına hiçbir şey yapmaz. \n" + " \n" + "Bir şeyler yapması için programa \n" + "bir program yüklemeniz gerekir.. \n" + "\n" + "Böylelikle programa 'Libretro Core', \n" + "yada kısaca 'core' diyoruz. \n" + " \n" + "Core yüklemek için 'Core Yükle' \n" + "kısmından bir tane seçin.\n" + " \n" +#ifdef HAVE_NETWORKING + "Coreları birkaç yolla elde edebilirsiniz: \n" + "* İndirmek için şöyle\n" + "'%s' -> '%s'.\n" + "* El ile yapmak için 'Core' klasörüne taşıyın\n" + "'%s'.", + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ONLINE_UPDATER), + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CORE_UPDATER_LIST), + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LIBRETRO_DIR_PATH) +#else + "You can obtain cores by\n" + "manually moving them over to\n" + "'%s'.", + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LIBRETRO_DIR_PATH) +#endif + ); + break; + case MENU_ENUM_LABEL_VALUE_HELP_CHANGE_VIRTUAL_GAMEPAD_DESC: + snprintf(s, len, + "You can change the virtual gamepad overlay\n" + "by going to '%s' -> '%s'." + " \n" + "From there you can change the overlay,\n" + "change the size and opacity of the buttons, etc.\n" + " \n" + "NOTE: By default, virtual gamepad overlays are\n" + "hidden when in the menu.\n" + "If you'd like to change this behavior,\n" + "you can set '%s' to false.", + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SETTINGS), + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OVERLAY_SETTINGS), + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_HIDE_IN_MENU) + ); + break; + case MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_ENABLE: + snprintf(s, len, + "OSD için arka plan rengini etkinleştirir."); + break; + case MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_RED: + snprintf(s, len, + "OSD arka plan renginin kırmızı değerini ayarlar. Geçerli değerler 0 ile 255 arasındadır."); + break; + case MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_GREEN: + snprintf(s, len, + "OSD arka plan renginin yeşil değerini ayarlar. Geçerli değerler 0 ile 255 arasındadır."); + break; + case MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_BLUE: + snprintf(s, len, + "OSD arka plan renginin mavi değerini ayarlar. Geçerli değerler 0 ile 255 arasındadır."); + break; + case MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_OPACITY: + snprintf(s, len, + "OSD arka plan renginin opaklığını ayarlar. Geçerli değerler 0,0 ile 1,0 arasındadır."); + break; + case MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_COLOR_RED: + snprintf(s, len, + "OSD metin renginin kırmızı değerini ayarlar. Geçerli değerler 0 ile 255 arasındadır."); + break; + case MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_COLOR_GREEN: + snprintf(s, len, + "OSD metin renginin yeşil değerini ayarlar. Geçerli değerler 0 ile 255 arasındadır."); + break; + case MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_COLOR_BLUE: + snprintf(s, len, + "OSD metin renginin mavi değerini ayarlar. Geçerli değerler 0 ile 255 arasındadır."); + break; + case MENU_ENUM_LABEL_MIDI_DRIVER: + snprintf(s, len, + "Kullanılacak MIDI sürücüsü."); + break; + case MENU_ENUM_LABEL_MIDI_INPUT: + snprintf(s, len, + "Sets the input device (driver specific).\n" + "When set to \"Off\", MIDI input will be disabled.\n" + "Device name can also be typed in."); + break; + case MENU_ENUM_LABEL_MIDI_OUTPUT: + snprintf(s, len, + "Çıkış cihazını ayarlar (sürücüye özel).\n" + "\"Off\"olarak ayarlandığında, MIDI çıkışı devre dışı bırakılır.\n" + "Cihaz adı da yazılabilir.\n" + " \n" + "When MIDI output is enabled and core and game/app support MIDI output,\n" + "some or all sounds (depends on game/app) will be generated by MIDI device.\n" + "In case of \"null\" MIDI driver this means that those sounds won't be audible."); + break; + case MENU_ENUM_LABEL_MIDI_VOLUME: + snprintf(s, len, + "Çıkış cihazının ana ses seviyesini ayarlar."); + break; + default: + if (string_is_empty(s)) + strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_INFORMATION_AVAILABLE), len); + return -1; + } + + return 0; +} +#endif + +#ifdef HAVE_MENU +static const char *menu_hash_to_str_tr_label_enum(enum msg_hash_enums msg) +{ + if (msg <= MENU_ENUM_LABEL_INPUT_HOTKEY_BIND_END && + msg >= MENU_ENUM_LABEL_INPUT_HOTKEY_BIND_BEGIN) + { + static char hotkey_lbl[128] = {0}; + unsigned idx = msg - MENU_ENUM_LABEL_INPUT_HOTKEY_BIND_BEGIN; + snprintf(hotkey_lbl, sizeof(hotkey_lbl), "input_hotkey_binds_%d", idx); + return hotkey_lbl; + } + + switch (msg) + { +#include "msg_hash_lbl.h" + default: +#if 0 + RARCH_LOG("Unimplemented: [%d]\n", msg); +#endif + break; + } + + return "null"; +} +#endif + +const char *msg_hash_to_str_tr(enum msg_hash_enums msg) { +#ifdef HAVE_MENU + const char *ret = menu_hash_to_str_tr_label_enum(msg); + + if (ret && !string_is_equal(ret, "null")) + return ret; +#endif + + switch (msg) { +#include "msg_hash_tr.h" + default: +#if 0 + RARCH_LOG("Unimplemented: [%d]\n", msg); + { + RARCH_LOG("[%d] : %s\n", msg - 1, msg_hash_to_str(((enum msg_hash_enums)(msg - 1)))); + } +#endif + break; + } + + return "null"; +} diff --git a/intl/msg_hash_tr.h b/intl/msg_hash_tr.h new file mode 100644 index 0000000000..bf81a2b61d --- /dev/null +++ b/intl/msg_hash_tr.h @@ -0,0 +1,8548 @@ +#ifdef HAVE_LAKKA_SWITCH +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SWITCH_GPU_PROFILE, + "GPU Hız aşırtma" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SWITCH_GPU_PROFILE, + "Switch GPU'sunu Hız aşırtma veya hız düşürme yap" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SWITCH_BACKLIGHT_CONTROL, + "Ekran parlaklığı" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SWITCH_BACKLIGHT_CONTROL, + "Switch'in ekran parlaklığını arttırın veya azaltın" + ) +#endif +#if defined(HAVE_LAKKA_SWITCH) || defined(HAVE_LIBNX) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SWITCH_CPU_PROFILE, + "CPU Hızaşırtma" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SWITCH_CPU_PROFILE, + "Switch CPU'suna hız aşırtma yap" + ) +#endif +MSG_HASH( + MSG_COMPILER, + "Derleyici" + ) +MSG_HASH( + MSG_UNKNOWN_COMPILER, + "Bilinmeyen derleyici" + ) +MSG_HASH( + MSG_NATIVE, + "Native") +MSG_HASH( + MSG_DEVICE_DISCONNECTED_FROM_PORT, + "Cihaz bağlantı noktasından çıkarıldı" + ) +MSG_HASH( + MSG_UNKNOWN_NETPLAY_COMMAND_RECEIVED, + "Bilinmeyen netplay komutu alındı" + ) +MSG_HASH( + MSG_FILE_ALREADY_EXISTS_SAVING_TO_BACKUP_BUFFER, + "Dosya zaten mevcut. Yedekleme arabelleğine kaydetme" + ) +MSG_HASH( + MSG_GOT_CONNECTION_FROM, + "Şuradan gelen bağlantı: \"%s\"" + ) +MSG_HASH( + MSG_GOT_CONNECTION_FROM_NAME, + "Şuradan gelen bağlantı: \"%s (%s)\"" + ) +MSG_HASH( + MSG_PUBLIC_ADDRESS, + "Bağlantı Noktası Eşleme Başarılı" + ) +MSG_HASH( + MSG_UPNP_FAILED, + "Bağlantı Noktası Eşlemesi Başarısız Oldu" + ) +MSG_HASH( + MSG_NO_ARGUMENTS_SUPPLIED_AND_NO_MENU_BUILTIN, + "Argüman yok ve menü yerleşik değil, yardım görüntüleniyor..." + ) +MSG_HASH( + MSG_SETTING_DISK_IN_TRAY, + "Setting disk in tray" + ) +MSG_HASH( + MSG_WAITING_FOR_CLIENT, + "İstemci bekleniyor..." + ) +MSG_HASH( + MSG_NETPLAY_YOU_HAVE_LEFT_THE_GAME, + "Oyundan çıktın" + ) +MSG_HASH( + MSG_NETPLAY_YOU_HAVE_JOINED_AS_PLAYER_N, + "%u oyuncu olarak katıldınız" + ) +MSG_HASH( + MSG_NETPLAY_YOU_HAVE_JOINED_WITH_INPUT_DEVICES_S, + "%.*s Giriş cihazlarıyla katıldınız" + ) +MSG_HASH( + MSG_NETPLAY_PLAYER_S_LEFT, + "Oyuncu %.*s oyunu terk etti" + ) +MSG_HASH( + MSG_NETPLAY_S_HAS_JOINED_AS_PLAYER_N, + "%.*s oyuncu olarak katıldı %u" + ) +MSG_HASH( + MSG_NETPLAY_S_HAS_JOINED_WITH_INPUT_DEVICES_S, + "%.*s giriş cihazlarıyla birlikte katıldı %.*s" + ) +MSG_HASH( + MSG_NETPLAY_NOT_RETROARCH, + "Eşiniz RetroArch'ı çalıştırmadığından veya RetroArch'ın eski bir sürümünü çalıştırdığından netplay bağlantı girişimi başarısız oldu." + ) +MSG_HASH( + MSG_NETPLAY_OUT_OF_DATE, + "Netplay eşi RetroArch'ın eski bir sürümünü kullanıyor. Bağlantı gerçekleştiremez." + ) +MSG_HASH( + MSG_NETPLAY_DIFFERENT_VERSIONS, + "UYARI: Bir netplay eşi RetroArch'ın farklı bir sürümünü çalıştırıyor. Sorun oluşursa, aynı sürümü kullanın." + ) +MSG_HASH( + MSG_NETPLAY_DIFFERENT_CORES, + "Netplay eşi farklı bir Core kullanıyor. Bağlantı gerçekleştiremez." + ) +MSG_HASH( + MSG_NETPLAY_DIFFERENT_CORE_VERSIONS, + "UYARI: Netplay eşi, Cor'un farklı bir sürümünü çalıştırıyor. Sorun oluşursa, aynı sürümü kullanın." + ) +MSG_HASH( + MSG_NETPLAY_ENDIAN_DEPENDENT, + "Bu Core, sistemler arasında mimariler arası Netplay'i desteklemiyor" + ) +MSG_HASH( + MSG_NETPLAY_PLATFORM_DEPENDENT, + "Bu Core, mimariler arası Netplay'i desteklemiyor" + ) +MSG_HASH( + MSG_NETPLAY_ENTER_PASSWORD, + "Netplay sunucu şifresini girin:" + ) +MSG_HASH( + MSG_DISCORD_CONNECTION_REQUEST, + "Bu kullanıcıdan bağlantıya izin vermek istiyor musunuz:" + ) +MSG_HASH( + MSG_NETPLAY_INCORRECT_PASSWORD, + "Yanlış parola" + ) +MSG_HASH( + MSG_NETPLAY_SERVER_NAMED_HANGUP, + "\"%s\" bağlantısı koptu" + ) +MSG_HASH( + MSG_NETPLAY_SERVER_HANGUP, + "Bir netplay istemcisinin bağlantısı kesildi" + ) +MSG_HASH( + MSG_NETPLAY_CLIENT_HANGUP, + "Netplay bağlantısı kesildi" + ) +MSG_HASH( + MSG_NETPLAY_CANNOT_PLAY_UNPRIVILEGED, + "Oynama izniniz yok" + ) +MSG_HASH( + MSG_NETPLAY_CANNOT_PLAY_NO_SLOTS, + "Boş oyuncu slotu yok" + ) +MSG_HASH( + MSG_NETPLAY_CANNOT_PLAY_NOT_AVAILABLE, + "İstenen giriş cihazları mevcut değil" + ) +MSG_HASH( + MSG_NETPLAY_CANNOT_PLAY, + "Oynatma moduna geçilemiyor" + ) +MSG_HASH( + MSG_NETPLAY_PEER_PAUSED, + "Netplay eşi \"%s\" durdurdu" + ) +MSG_HASH( + MSG_NETPLAY_CHANGED_NICK, + "\"%s\"Takma adınız olarak değiştirildi" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SHARED_CONTEXT, + "Donanım tarafından oluşturulan Core'lar kendi özel bağlamlarını kullanır. Donanım durumunun çerçeveler arasında değişmesi gerektiğini varsaymaktan kaçınır." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_HORIZONTAL_ANIMATION, + "Menü için yatay animasyonu etkinleştirin. Performans etkisi olacaktır." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_SETTINGS, + "Menü ekranı görünüm ayarlarını düzenler." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_HARD_SYNC, + "CPU ve GPU’yu sabit senkronize edin. Performansdan ödün vererek geçikmeyi azaltır." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_THREADED, + "Gecikme ve daha fazla video takılma pahasına performansı artırır. Aksi takdirde tam hız elde edemiyorsanız kullanın." + ) +MSG_HASH( + MSG_AUDIO_VOLUME, + "Ses seviyesi" + ) +MSG_HASH( + MSG_AUTODETECT, + "Otomatik tespit" + ) +MSG_HASH( + MSG_AUTOLOADING_SAVESTATE_FROM, + "Belirtilen yoldan otomatik yükleme" + ) +MSG_HASH( + MSG_CAPABILITIES, + "Kabiliyetler" + ) +MSG_HASH( + MSG_CONNECTING_TO_NETPLAY_HOST, + "Netplay sunucusuna bağlanma" + ) +MSG_HASH( + MSG_CONNECTING_TO_PORT, + "Port'a bağlanma" + ) +MSG_HASH( + MSG_CONNECTION_SLOT, + "Bağlantı yuvası" + ) +MSG_HASH( + MSG_SORRY_UNIMPLEMENTED_CORES_DONT_DEMAND_CONTENT_NETPLAY, + "Üzgünüz, uygulanamadı: içerik talep etmeyen Core'lar Netplay'e katılamaz" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ACCOUNTS_CHEEVOS_PASSWORD, + "Şifre" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ACCOUNTS_CHEEVOS_SETTINGS, + "Cheevos Hesapları" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ACCOUNTS_CHEEVOS_USERNAME, + "Kullanıcı adı" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ACCOUNTS_LIST, + "Hesaplar" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ACCOUNTS_LIST_END, + "Hesap Listesi Sonu" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ACCOUNTS_RETRO_ACHIEVEMENTS, + "RetroAchievements" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_LIST, + "Başarılar" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_PAUSE, + "Hardcore Modunda Başarıları Duraklat" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_RESUME, + "Hardcore Modunda Başarıları Sürdür" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_LIST_HARDCORE, + "Başarılar (Hardcore)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ADD_CONTENT_LIST, + "İçeriği Tara" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONFIGURATIONS_LIST, + "Yapılandırma Dosyası" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ADD_TAB, + "İçeriği içe aktar" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_TAB, + "Netplay Odaları" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ASK_ARCHIVE, + "Sor" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ASSETS_DIRECTORY, + "İçerikler" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_BLOCK_FRAMES, + "Block Frames" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_DEVICE, + "Cihaz" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_DRIVER, + "Ses" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_DSP_PLUGIN, + "DSP Eklentisi" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_ENABLE, + "Ses" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_FILTER_DIR, + "Ses Filtresi" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_TURBO_DEADZONE_LIST, + "Turbo/Deadzone" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_LATENCY, + "Ses Geçikmesi (ms)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_MAX_TIMING_SKEW, + "Maksimum Zamanlama Eğimi" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_MUTE, + "Sustur" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_OUTPUT_RATE, + "Çıkış hızı (Hz)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_RATE_CONTROL_DELTA, + "Dinamik Ses Hızı Kontrolü" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_RESAMPLER_DRIVER, + "Ses Resampler" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_SETTINGS, + "Ses" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_SYNC, + "Senkronizasyon" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_VOLUME, + "Ses Arttırma (dB)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_WASAPI_EXCLUSIVE_MODE, + "WASAPI Özel mod" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_WASAPI_FLOAT_FORMAT, + "WASAPI Float Biçimi" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_WASAPI_SH_BUFFER_LENGTH, + "WASAPI Shared Buffer Length" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUTOSAVE_INTERVAL, + "SaveRAM Otomatik kaydetme aralığı" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUTO_OVERRIDES_ENABLE, + "Üzerine Yazılmış Dosyaları Otomatik Olarak Yükle" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUTO_REMAPS_ENABLE, + "Remap Dosyalarını Otomatik Olarak Yükle" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUTO_SHADERS_ENABLE, + "Gölgelendirici Hazır Ayarlarını Otomatik Olarak Yükleme" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_BACK, + "Geri" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_CONFIRM, + "Onayla" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_INFO, + "Bilgi" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_QUIT, + "Çıkış" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_SCROLL_DOWN, + "Aşağı kaydır" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_SCROLL_UP, + "Yukarı kaydır" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_START, + "Başlat" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_TOGGLE_KEYBOARD, + "Klavye aç/kapa" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_TOGGLE_MENU, + "Menu aç/kapa" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS, + "Temel menü kontrolleri" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_CONFIRM, + "Onayla/OK" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_INFO, + "Bilgi" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_QUIT, + "Çıkış" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_SCROLL_UP, + "Yukarı kaydır" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_START, + "Varsayılanlar" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_TOGGLE_KEYBOARD, + "Klavye aç/kapa" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_TOGGLE_MENU, + "Menu aç/kapa" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BLOCK_SRAM_OVERWRITE, + "Savestate'i yüklerken SaveRAM'in üzerine yazma" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BLUETOOTH_ENABLE, + "Bluetooth" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BUILDBOT_ASSETS_URL, + "Buildbot Varlıkları URL’si" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CACHE_DIRECTORY, + "Cache" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CAMERA_ALLOW, + "Kameraya İzin Ver" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CAMERA_DRIVER, + "Kamera" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT, + "Hile" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_APPLY_CHANGES, + "Değişiklikleri uygula" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_START_SEARCH, + "Yeni Hile Kodu Aramaya Başla" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_CONTINUE_SEARCH, + "Aramaya Devam Et" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_DATABASE_PATH, + "Hile Dosyası" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_FILE, + "Hile Dosyası" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_FILE_LOAD, + "Hile Dosyası Yükle (Değiştir)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_FILE_LOAD_APPEND, + "Hile Dosyası Yükle (Ekleme)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_FILE_SAVE_AS, + "Hile Dosyasını Farklı Kaydet" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_NUM_PASSES, + "Hile Geçişleri" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_DESCRIPTION, + "Açıklama" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_HARDCORE_MODE_ENABLE, + "Hardcore Mode" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_LEADERBOARDS_ENABLE, + "Liderler" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_BADGES_ENABLE, + "Başarı Rozetleri" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_LOCKED_ACHIEVEMENTS, + "Kilitli Başarılar:" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_LOCKED_ENTRY, + "Kilitli" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_SETTINGS, + "RetroAchievements" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_TEST_UNOFFICIAL, + "Resmi Olmayan Başarıları Test Et" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ACHIEVEMENTS, + "Açılmış Başarılar:" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ENTRY, + "Açılmış" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ENTRY_HARDCORE, + "Hardcore" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_VERBOSE_ENABLE, + "Verbose Mode" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_AUTO_SCREENSHOT, + "Otomatik Ekran Görüntüsü" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CLOSE_CONTENT, + "İçeriği Kapat" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONFIG, + "Yapılandırma" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONFIGURATIONS, + "Yapılandırmayı yükle" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONFIGURATION_SETTINGS, + "Yapılandırma" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONFIG_SAVE_ON_EXIT, + "Çıkışta Yapılandırmayı Kaydet" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_DATABASE_DIRECTORY, + "Veritabanı" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_DIR, + "İçerik" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_HISTORY_SIZE, + "Geçmiş Listesi Boyutu" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_REMOVE, + "Girişleri kaldırmaya izin ver" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_SETTINGS, + "Hızlı Menü" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_ASSETS_DIR, + "İndirilenler" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_ASSETS_DIRECTORY, + "İndirilenler" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_CHEAT_OPTIONS, + "Hileler" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_COUNTERS, + "Core Sayaçları" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_ENABLE, + "Core ismini göster" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_INFORMATION, + "Core Bilgisi" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_INFO_AUTHORS, + "Yaratıcı" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_INFO_CATEGORIES, + "Kategoriler" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_INFO_CORE_LABEL, + "Core etiketi" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_INFO_CORE_NAME, + "Core ismi" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_INFO_FIRMWARE, + "Yazılım(lar)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_INFO_LICENSES, + "Lisans(lar)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_INFO_PERMISSIONS, + "İzinler" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_INFO_SUPPORTED_EXTENSIONS, + "Desteklenen uzantılar" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_INFO_SYSTEM_MANUFACTURER, + "Sistem üreticisi" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_INFO_SYSTEM_NAME, + "Sistem adı" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_INPUT_REMAPPING_OPTIONS, + "Kontroller" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_LIST, + "Core yükle" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SIDELOAD_CORE_LIST, + "Core Yükleme veya Geri Yükleme" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SIDELOAD_CORE_ERROR, + "Core yüklemesi başarısız oldu" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SIDELOAD_CORE_SUCCESS, + "Çekirdek kurulumu başarılı" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_OPTIONS, + "Seçenekler" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_SETTINGS, + "Core" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_SET_SUPPORTS_NO_CONTENT_ENABLE, + "Otomatik Olarak Bir Core Başlat" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_UPDATER_AUTO_EXTRACT_ARCHIVE, + "İndirilen arşivi otomatik olarak çıkart" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_UPDATER_BUILDBOT_URL, + "Buildbot Cores URL" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_UPDATER_LIST, + "Core Güncelleyici" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_UPDATER_SETTINGS, + "Güncelleyici" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CPU_ARCHITECTURE, + "CPU Mimarisi:" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CPU_CORES, + "CPU Coreları:" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CURSOR_DIRECTORY, + "İmleç" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CURSOR_MANAGER, + "İmleç Yöneticisi" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CUSTOM_RATIO, + "Özel Orantı" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DATABASE_MANAGER, + "Veritabanı Yöneticisi" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DATABASE_SELECTION, + "Veri Tabanı Seçimi" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DELETE_ENTRY, + "Kaldır" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_FAVORITES, + "Başlangıç dizini" + ) +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, + "Dizin bulunamadı." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, + "Dizin" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DISK_CYCLE_TRAY_STATUS, + "Disk Döngüsü Tepsisi Durumu" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DISK_IMAGE_APPEND, + "Disk Görüntüsü Ekleme" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DISK_INDEX, + "Disk Dizini" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DISK_OPTIONS, + "Disk Kontrolü" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DONT_CARE, + "Don't care" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DOWNLOADED_FILE_DETECT_CORE_LIST, + "İndirilenler" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DOWNLOAD_CORE, + "Core indir" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DOWNLOAD_CORE_CONTENT, + "İçerik İndirici" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DPI_OVERRIDE_ENABLE, + "DPI Üzerine yazma" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DPI_OVERRIDE_VALUE, + "DPI Üzerine yazma" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DRIVER_SETTINGS, + "Sürücüler" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DUMMY_ON_CORE_SHUTDOWN, + "Core Kapatmada Kukla Kullan" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHECK_FOR_MISSING_FIRMWARE, + "Yüklemeden Önce Eksik Ürün Yazılımı Denetimi Yapın" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DYNAMIC_WALLPAPER, + "Dinamik Arkaplan" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DYNAMIC_WALLPAPERS_DIRECTORY, + "Dinamik Arkaplanlar" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_ENABLE, + "Başarılar" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_FALSE, + "Yanlış" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_FASTFORWARD_RATIO, + "Maksimum çalışma hızı" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_FAVORITES_TAB, + "Favoriler" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_FPS_SHOW, + "Ekran Hızı Görüntüleme" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MEMORY_SHOW, + "Bellek Ayrıntılarını Dahil Et" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_FRAME_THROTTLE_ENABLE, + "Maksimum Çalışma Hızını Sınırla" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VRR_RUNLOOP_ENABLE, + "Tam İçerik Kare Hızına Eşitle (G-Sync, FreeSync)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_FRAME_THROTTLE_SETTINGS, + "Frame Throttle" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_FRONTEND_COUNTERS, + "Frontend Sayaçları" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_OPTIONS, + "İçeriğe Özgü Çekirdek Seçeneklerini Otomatik Olarak Yükle" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_OPTIONS_CREATE, + "Oyun seçenekleri dosyası oluştur" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_OPTIONS_IN_USE, + "Oyun seçenekleri dosyasını kaydet" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_HELP, + "Yardım" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_HELP_AUDIO_VIDEO_TROUBLESHOOTING, + "Audio/Video Troubleshooting" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_HELP_CHANGE_VIRTUAL_GAMEPAD, + "Changing Virtual Gamepad Overlay" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_HELP_CONTROLS, + "Temel Menü Kontrolleri" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_HELP_LIST, + "Yardım" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_HELP_LOADING_CONTENT, + "İçerik Yükleme" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_HELP_SCANNING_CONTENT, + "Scanning For Content" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_HELP_WHAT_IS_A_CORE, + "Core Nedir?" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_HISTORY_LIST_ENABLE, + "History List" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_HISTORY_TAB, + "Geçmiş" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_HORIZONTAL_MENU, + "Horizontal Menu" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_IMAGES_TAB, + "Görüntü" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INFORMATION, + "Bilgi" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INFORMATION_LIST, + "Bilgi" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_ADC_TYPE, + "Analog To Digital Type" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_ALL_USERS_CONTROL_MENU, + "All Users Control Menu" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X, + "Left Analog X" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS, + "Left analog X- (left)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS, + "Left analog X+ (right)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y, + "Left Analog Y" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_MINUS, + "Left analog Y- (up)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS, + "Left analog Y+ (down)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X, + "Right Analog X" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS, + "Right analog X- (left)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_PLUS, + "Right analog X+ (right)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y, + "Right Analog Y" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, + "Right analog Y- (up)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, + "Right analog Y+ (down)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, + "Autoconfig" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_BUTTON_AXIS_THRESHOLD, + "Input Button Axis Threshold" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_DEADZONE, + "Analog Deadzone" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_SENSITIVITY, + "Analog Sensitivity" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, + "Menu Swap OK & Cancel Buttons" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_BIND_ALL, + "Bind All" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_BIND_DEFAULT_ALL, + "Bind Default All" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_BIND_TIMEOUT, + "Bind Timeout" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_BIND_HOLD, + "Bind Hold" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_BLOCK_TIMEOUT, + "Input Block Timeout" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_DESCRIPTOR_HIDE_UNBOUND, + "Hide Unbound Core Input Descriptors" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_DESCRIPTOR_LABEL_SHOW, + "Display Input Descriptor Labels" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_DEVICE_INDEX, + "Device Index" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_DEVICE_TYPE, + "Device Type" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_INDEX, + "Mouse Index" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_DRIVER, + "Input" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_DUTY_CYCLE, + "Duty Cycle" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_HOTKEY_BINDS, + "Hotkey Binds" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_ICADE_ENABLE, + "Keyboard Gamepad Mapping" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_A, + "A tuşu (right)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, + "B tuşu (down)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_DOWN, + "Down D-pad" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L2, + "L2 tuşu (trigger)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L3, + "L3 tuşu (thumb)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L, + "L tuşu (shoulder)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_LEFT, + "Left D-pad" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R2, + "R2 tuşu (trigger)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R3, + "R3 tuşu (thumb)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R, + "R tuşu (shoulder)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_RIGHT, + "Right D-pad" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_SELECT, + "Select tuşu" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_START, + "Start tuşu" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_UP, + "Up D-pad" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_X, + "X tuşu (top)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, + "Y tuşu (left)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_KEY, + "(Key: %s)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "Mouse 1" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "Mouse 2" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "Mouse 3" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "Mouse 4" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "Mouse 5" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "Wheel Up" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "Wheel Down" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "Wheel Left" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "Wheel Right" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, + "Keyboard Gamepad Mapping Type" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, + "Max Users" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_MENU_ENUM_TOGGLE_GAMEPAD_COMBO, + "Menu Toggle Gamepad Combo" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_MINUS, + "Cheat index -" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_PLUS, + "Cheat index +" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_TOGGLE, + "Cheat toggle" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_EJECT_TOGGLE, + "Disk eject toggle" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_NEXT, + "Disk next" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_PREV, + "Disk prev" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_ENABLE_HOTKEY, + "Kısayol tuşları" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_HOLD_KEY, + "Basılı Tutarak Hızlı İleri Sarma" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_KEY, + "Aç/kapat Yaparak Hızlı İleri Sarma" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_FRAMEADVANCE, + "Frameadvance" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_SEND_DEBUG_INFO, + "Send Debug Info" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_FPS_TOGGLE, + "FPS toggle" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_HOST_TOGGLE, + "Netplay hosting toggle" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_FULLSCREEN_TOGGLE_KEY, + "Fullscreen toggle" + ) +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, + "Menu toggle" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_BSV_RECORD_TOGGLE, + "Input replay movie record toggle" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, + "Audio mute toggle" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_GAME_WATCH, + "Netplay toggle play/spectate mode" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_OSK, + "On-screen keyboard toggle" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_OVERLAY_NEXT, + "Overlay next" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE, + "Pause toggle" + ) +#ifdef HAVE_LAKKA +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, + "RetroArch'ı yeniden başlat" + ) +#else +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, + "RetroArch'dan çık" + ) +#endif +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_RESET, + "Oyunu sıfırla" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND, + "Gerisar" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_DETAILS, + "Cheat Details" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_SEARCH, + "Start or Continue Cheat Search" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_SAVE_STATE_KEY, + "Save state" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_SCREENSHOT, + "Ekran Görüntüsü Al" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, + "Next shader" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_PREV, + "Previous shader" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION_HOLD_KEY, + "Slow motion hold" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION_KEY, + "Slow motion toggle" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS, + "Savestate slot -" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS, + "Savestate slot +" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_DOWN, + "Volume -" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_UP, + "Volume +" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_ENABLE, + "Display Overlay" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_HIDE_IN_MENU, + "Hide Overlay In Menu" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_SHOW_PHYSICAL_INPUTS, + "Show Inputs On Overlay" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_SHOW_PHYSICAL_INPUTS_PORT, + "Show Inputs Listen Port" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_POLL_TYPE_BEHAVIOR, + "Poll Type Behavior" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_POLL_TYPE_BEHAVIOR_EARLY, + "Early" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_POLL_TYPE_BEHAVIOR_LATE, + "Late" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_POLL_TYPE_BEHAVIOR_NORMAL, + "Normal" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_PREFER_FRONT_TOUCH, + "Prefer Front Touch" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_REMAPPING_DIRECTORY, + "Input Remapping" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_REMAP_BINDS_ENABLE, + "Remap Binds for this core" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_SAVE_AUTOCONFIG, + "Save Autoconfig" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_SETTINGS, + "Input" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_SMALL_KEYBOARD_ENABLE, + "Small Keyboard" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_TOUCH_ENABLE, + "Touch" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, + "Turbo" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_TURBO_PERIOD, + "Turbo Period" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_USER_BINDS, + "User %u Binds" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LATENCY_SETTINGS, + "Gecikme Ayarları" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INTERNAL_STORAGE_STATUS, + "Internal storage status" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_JOYPAD_AUTOCONFIG_DIR, + "Input Autoconfig" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_JOYPAD_DRIVER, + "Joypad" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LAKKA_SERVICES, + "Servisler" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LANG_CHINESE_SIMPLIFIED, + "Çince (Basitleştirilmiş)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LANG_CHINESE_TRADITIONAL, + "Çince (Geleneksel)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LANG_DUTCH, + "Flemenkçe" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LANG_ENGLISH, + "İngilizce" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LANG_ESPERANTO, + "Esperanto" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LANG_FRENCH, + "Fransızca" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LANG_GERMAN, + "Almanca" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LANG_ITALIAN, + "İtalyanca" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LANG_JAPANESE, + "Japonca" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LANG_KOREAN, + "Korece" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LANG_POLISH, + "Polanya Dili" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LANG_PORTUGUESE_BRAZIL, + "Portekizce (Brezilya)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LANG_PORTUGUESE_PORTUGAL, + "Portekizce (Portekiz)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LANG_RUSSIAN, + "Rusça" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LANG_SPANISH, + "İspanyolca" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LANG_VIETNAMESE, + "Vietnamca" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LANG_ARABIC, + "Arapça" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LANG_GREEK, + "Yunanca" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LEFT_ANALOG, + "Left Analog" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LIBRETRO_DIR_PATH, + "Core" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LIBRETRO_INFO_PATH, + "Core Info" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LIBRETRO_LOG_LEVEL, + "Core Logging Level" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LINEAR, + "Linear" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LOAD_ARCHIVE, + "Load Archive" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_HISTORY, + "Load Recent" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_LIST, + "İçerik yükle" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LOAD_STATE, + "Load State" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LOCATION_ALLOW, + "Konum'u etkinleştir" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LOCATION_DRIVER, + "Konum" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LOGGING_SETTINGS, + "Logging" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LOG_VERBOSITY, + "Logging Verbosity" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LOG_TO_FILE, + "Log To File" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_LOG_TO_FILE, + "Redirects system event log messages to file. Requires 'Logging Verbosity' to be enabled." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LOG_TO_FILE_TIMESTAMP, + "Timestamped Log Files" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_LOG_TO_FILE_TIMESTAMP, + "When logging to file, redirects the output from each RetroArch session to a new timestamped file. If disabled, log is overwritten each time RetroArch is restarted." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MAIN_MENU, + "Ana Menü" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MANAGEMENT, + "Veri Tabanı Ayarları" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME, + "Menü Rengi Teması" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_BLUE, + "Blue" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_BLUE_GREY, + "Blue Grey" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_DARK_BLUE, + "Dark Blue" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_GREEN, + "Green" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_NVIDIA_SHIELD, + "Shield" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_RED, + "Red" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_YELLOW, + "Yellow" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_FOOTER_OPACITY, + "Footer Opacity" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_HEADER_OPACITY, + "Header Opacity" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_DRIVER, + "Menu" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_ENUM_THROTTLE_FRAMERATE, + "Throttle Menu Framerate" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_FILE_BROWSER_SETTINGS, + "Ayarlar" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_LINEAR_FILTER, + "Menu Linear Filter" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_LINEAR_FILTER, + "Adds a slight blur to the menu to take the edge off hard pixel edges." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_HORIZONTAL_ANIMATION, + "Horizontal Animation" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SETTINGS, + "Appearance" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_WALLPAPER, + "Background" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_WALLPAPER_OPACITY, + "Background opacity" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MISSING, + "Missing" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MORE, + "..." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MOUSE_ENABLE, + "Mouse Support" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MULTIMEDIA_SETTINGS, + "Multimedia" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MUSIC_TAB, + "Müzik" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE, + "Filter unknown extensions" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NAVIGATION_WRAPAROUND, + "Navigation Wrap-Around" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NEAREST, + "Nearest" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY, + "Netplay" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_ALLOW_SLAVES, + "Allow Slave-Mode Clients" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_CHECK_FRAMES, + "Netplay Check Frames" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_INPUT_LATENCY_FRAMES_MIN, + "Input Latency Frames" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_INPUT_LATENCY_FRAMES_RANGE, + "Input Latency Frames Range" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_DELAY_FRAMES, + "Netplay Delay Frames" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_DISCONNECT, + "Disconnect from netplay host" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_ENABLE, + "Netplay" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_ENABLE_CLIENT, + "Connect to netplay host" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_ENABLE_HOST, + "Netplay host'u başlat" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_DISABLE_HOST, + "Netplay host'unu durdur" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_IP_ADDRESS, + "Sunucu Adresi" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_LAN_SCAN_SETTINGS, + "Yerel ağı tara" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_MODE, + "Netplay Client" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_NICKNAME, + "Kullanıcı Adı" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_PASSWORD, + "Sunucu Şifresi" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_PUBLIC_ANNOUNCE, + "Netplay'i Genel Olarak Duyurun" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_REQUEST_DEVICE_I, + "Request Device %u" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_REQUIRE_SLAVES, + "Disallow Non-Slave-Mode Clients" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_SETTINGS, + "Netplay ayarları" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_SHARE_ANALOG, + "Analog Input Sharing" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_SHARE_ANALOG_MAX, + "Max" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_SHARE_ANALOG_AVERAGE, + "Average" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_SHARE_DIGITAL, + "Digital Input Sharing" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_SHARE_DIGITAL_OR, + "Share" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_SHARE_DIGITAL_XOR, + "Grapple" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_SHARE_DIGITAL_VOTE, + "Vote" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_SHARE_NONE, + "None" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_SHARE_NO_PREFERENCE, + "No preference" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_START_AS_SPECTATOR, + "Netplay Spectator Mode" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_STATELESS_MODE, + "Netplay Stateless Mode" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_SPECTATE_PASSWORD, + "Server Spectate-Only Password" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_SPECTATOR_MODE_ENABLE, + "Netplay Spectator" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_TCP_UDP_PORT, + "Netplay TCP Port" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_NAT_TRAVERSAL, + "Netplay NAT Traversal" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETWORK_CMD_ENABLE, + "Network Commands" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETWORK_CMD_PORT, + "Network Command Port" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETWORK_INFORMATION, + "Ağ Bilgisi" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETWORK_REMOTE_ENABLE, + "Network Gamepad" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETWORK_REMOTE_PORT, + "Network Remote Base Port" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETWORK_SETTINGS, + "Ağ Ayarları" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NO, + "Yok" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NONE, + "None" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE, + "Bilinmiyor" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NO_ACHIEVEMENTS_TO_DISPLAY, + "Gösterilecek başarı yok." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NO_CORE, + "Core Yok" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NO_CORES_AVAILABLE, + "Kullanılabilir Core yok." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NO_CORE_INFORMATION_AVAILABLE, + "Core bilgisi yok." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NO_CORE_OPTIONS_AVAILABLE, + "Core seçenekleri yok." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NO_ENTRIES_TO_DISPLAY, + "No entries to display." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NO_HISTORY_AVAILABLE, + "Geçmiş yok.." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NO_INFORMATION_AVAILABLE, + "Bilgi yok." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NO_ITEMS, + "Öğe yok." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NO_NETPLAY_HOSTS_FOUND, + "Netplay sunucuları yok." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NO_NETWORKS_FOUND, + "Ağ bulunamadı." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NO_PERFORMANCE_COUNTERS, + "No performance counters." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NO_PLAYLISTS, + "Oynatma Listesi yok." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NO_PLAYLIST_ENTRIES_AVAILABLE, + "Oyna listesi girişi yok." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NO_SETTINGS_FOUND, + "Ayarlar bulunamadı." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NO_SHADER_PARAMETERS, + "No shader parameters." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_OFF, + "KAPALI" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ON, + "AÇIK" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ONLINE, + "Online" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ONLINE_UPDATER, + "Çevrimiçi Güncelleyici" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ONSCREEN_DISPLAY_SETTINGS, + "Onscreen Display" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ONSCREEN_OVERLAY_SETTINGS, + "Onscreen Overlay" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_ONSCREEN_OVERLAY_SETTINGS, + "Adjust Bezels and Onscreen controls" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ONSCREEN_NOTIFICATIONS_SETTINGS, + "Onscreen Notifications" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_ONSCREEN_NOTIFICATIONS_SETTINGS, + "Adjust the Onscreen Notifications" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_OPEN_ARCHIVE, + "Browse Archive" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_OPTIONAL, + "Optional" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_OVERLAY, + "Overlay" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_OVERLAY_AUTOLOAD_PREFERRED, + "Autoload Preferred Overlay" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_OVERLAY_DIRECTORY, + "Overlay" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_OVERLAY_OPACITY, + "Overlay Opacity" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_OVERLAY_PRESET, + "Overlay Preset" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_OVERLAY_SCALE, + "Overlay Scale" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_OVERLAY_SETTINGS, + "Onscreen Overlay" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PAL60_ENABLE, + "PAL60 Modunu kullan" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PARENT_DIRECTORY, + "Parent directory" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_FILE_BROWSER_OPEN_UWP_PERMISSIONS, + "Enable external file access" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_FILE_BROWSER_OPEN_UWP_PERMISSIONS, + "Open Windows file access permissions settings" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_FILE_BROWSER_OPEN_PICKER, + "Aç..." +) +MSG_HASH( + MENU_ENUM_SUBLABEL_FILE_BROWSER_OPEN_PICKER, + "Open another directory using the system file picker" +) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PAUSE_LIBRETRO, + "Pause when menu activated" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PAUSE_NONACTIVE, + "Don't run in background" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PERFCNT_ENABLE, + "Performance Counters" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PLAYLISTS_TAB, + "Playlists" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PLAYLIST_DIRECTORY, + "Playlists" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PLAYLIST_SETTINGS, + "Playlists" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_POINTER_ENABLE, + "Touch Support" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PORT, + "Port" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PRESENT, + "Present" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PRIVACY_SETTINGS, + "Gizlilik" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MIDI_SETTINGS, + "MIDI" + ) +#ifdef HAVE_LAKKA +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QUIT_RETROARCH, + "RetroArch'ı Yeniden Başlat" + ) +#else +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QUIT_RETROARCH, + "RetroArch'dan Çık" + ) +#endif +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ANALOG, + "Analog supported" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RDB_ENTRY_BBFC_RATING, + "BBFC Değerlendirmesi" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RDB_ENTRY_CERO_RATING, + "CERO Değerlendirmesi" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RDB_ENTRY_COOP, + "Co-op destekli" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RDB_ENTRY_CRC32, + "CRC32" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RDB_ENTRY_DESCRIPTION, + "Açıklama" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RDB_ENTRY_DEVELOPER, + "Geliştirici" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RDB_ENTRY_EDGE_MAGAZINE_ISSUE, + "Edge Magazin Sayısı" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RDB_ENTRY_EDGE_MAGAZINE_RATING, + "Edge Magazin Değerlendirmesi" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RDB_ENTRY_EDGE_MAGAZINE_REVIEW, + "Edge Magazin İncelemesi" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ELSPA_RATING, + "ELSPA Rating" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ENHANCEMENT_HW, + "Enhancement Hardware" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ESRB_RATING, + "ESRB Değerlendirmesi" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RDB_ENTRY_FAMITSU_MAGAZINE_RATING, + "Famitsu Magazin Değerlendirmesi" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RDB_ENTRY_FRANCHISE, + "Franchise" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RDB_ENTRY_GENRE, + "Tür" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RDB_ENTRY_MD5, + "MD5" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RDB_ENTRY_NAME, + "İsim" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ORIGIN, + "Origin" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RDB_ENTRY_PEGI_RATING, + "PEGI Rating" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RDB_ENTRY_PUBLISHER, + "Publisher" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RDB_ENTRY_RELEASE_MONTH, + "Releasedate Month" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RDB_ENTRY_RELEASE_YEAR, + "Releasedate Year" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RDB_ENTRY_RUMBLE, + "Rumble supported" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RDB_ENTRY_SERIAL, + "Serial" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RDB_ENTRY_SHA1, + "SHA1" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RDB_ENTRY_START_CONTENT, + "İçeriği Başlat" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RDB_ENTRY_TGDB_RATING, + "TGDB Rating" + ) +#ifdef HAVE_LAKKA_SWITCH +MSG_HASH( + MENU_ENUM_LABEL_VALUE_REBOOT, + "RCM'ye yeniden başlat" + ) +#else +MSG_HASH( + MENU_ENUM_LABEL_VALUE_REBOOT, + "Yeniden Başlat" + ) +#endif +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RECORDING_CONFIG_DIRECTORY, + "Recording Config" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RECORDING_OUTPUT_DIRECTORY, + "Recording Output" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RECORDING_SETTINGS, + "Kayıt Yapma" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RECORD_CONFIG, + "Custom Record Config" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_STREAM_CONFIG, + "Custom Stream Config" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RECORD_DRIVER, + "Record" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MIDI_DRIVER, + "MIDI" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RECORD_ENABLE, + "Recording Support" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RECORD_PATH, + "Save Output Recording as..." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RECORD_USE_OUTPUT_DIRECTORY, + "Save Recordings in Output Dir" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_REMAP_FILE, + "Remap File" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_REMAP_FILE_LOAD, + "Load Remap File" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_CORE, + "Save Core Remap File" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_CONTENT_DIR, + "Save Content Directory Remap File" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_GAME, + "Save Game Remap File" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_REMAP_FILE_REMOVE_CORE, + "Delete Core Remap File" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_REMAP_FILE_REMOVE_GAME, + "Delete Game Remap File" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_REMAP_FILE_REMOVE_CONTENT_DIR, + "Delete Game Content Directory Remap File" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_REQUIRED, + "Gerekli" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RESTART_CONTENT, + "Yeniden başlat" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RESTART_RETROARCH, + "RetroArch'ı yeniden başlat" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RESUME, + "Devam et" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RESUME_CONTENT, + "Devam et" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RETROKEYBOARD, + "RetroKeyboard" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RETROPAD, + "RetroPad" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RETROPAD_WITH_ANALOG, + "RetroPad w/ Analog" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RETRO_ACHIEVEMENTS_SETTINGS, + "Başarılar" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_REWIND_ENABLE, + "Rewind Support" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_APPLY_AFTER_TOGGLE, + "Apply After Toggle" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_APPLY_AFTER_LOAD, + "Auto-Apply Cheats During Game Load" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_REWIND_GRANULARITY, + "Rewind Granularity" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_REWIND_BUFFER_SIZE, + "Rewind Buffer Size (MB)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_REWIND_BUFFER_SIZE_STEP, + "Rewind Buffer Size Step (MB)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_REWIND_SETTINGS, + "Geri sar" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_SETTINGS, + "Hile Ayarları" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_DETAILS_SETTINGS, + "Hile Detayları" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_SEARCH_SETTINGS, + "Start or Continue Cheat Search" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_BROWSER_DIRECTORY, + "Dosya Gezgini" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_CONFIG_DIRECTORY, + "Yapılandırma" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_SHOW_START_SCREEN, + "Display Start Screen" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RIGHT_ANALOG, + "Right Analog" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES, + "Favorilere ekle" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES_PLAYLIST, + "Favorilere ekle" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RESET_CORE_ASSOCIATION, + "Core ilişkilendirilmesini sıfırla" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RUN, + "Başlat" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RUN_MUSIC, + "Başlat" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SAMBA_ENABLE, + "SAMBA" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SAVEFILE_DIRECTORY, + "Savefile" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SAVESTATE_AUTO_INDEX, + "Save State Auto Index" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SAVESTATE_AUTO_LOAD, + "Auto Load State" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SAVESTATE_AUTO_SAVE, + "Auto Save State" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SAVESTATE_DIRECTORY, + "Savestate" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SAVESTATE_THUMBNAIL_ENABLE, + "Savestate Thumbnails" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG, + "Mevcut Yapılandırmayı Kaydet" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_CORE, + "Save Core Overrides" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR, + "Save Content Directory Overrides" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_GAME, + "Save Game Overrides" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SAVE_NEW_CONFIG, + "Yeni Yapılandırmayı Kaydet" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SAVE_STATE, + "Save State" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SAVING_SETTINGS, + "Kaydetme" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SCAN_DIRECTORY, + "Dizin Tarama" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SCAN_FILE, + "Dosya Tarama" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SCAN_THIS_DIRECTORY, + "" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SCREENSHOT_DIRECTORY, + "Ekran görüntüsü" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SCREEN_RESOLUTION, + "Ekran çözünürlüğü" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SEARCH, + "Arama" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SECONDS, + "saniye" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SETTINGS, + "Ayarlar" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SETTINGS_TAB, + "Ayarlar" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SHADER, + "Shader" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SHADER_APPLY_CHANGES, + "Apply Changes" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SHADER_OPTIONS, + "Shaders" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_RIBBON, + "Ribbon" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_RIBBON_SIMPLIFIED, + "Ribbon (simplified)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_SIMPLE_SNOW, + "Simple Snow" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_SNOW, + "Snow" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SHOW_ADVANCED_SETTINGS, + "Gelişmiş ayarları göster" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SHOW_HIDDEN_FILES, + "Show Hidden Files and Folders" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SHUTDOWN, + "Kapat" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SLOWMOTION_RATIO, + "Slow-Motion Ratio" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RUN_AHEAD_ENABLED, + "Run-Ahead to Reduce Latency" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RUN_AHEAD_FRAMES, + "Number of Frames to Run Ahead" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RUN_AHEAD_SECONDARY_INSTANCE, + "RunAhead Use Second Instance" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RUN_AHEAD_HIDE_WARNINGS, + "RunAhead Hide Warnings" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SORT_SAVEFILES_ENABLE, + "Sort Saves In Folders" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SORT_SAVESTATES_ENABLE, + "Sort Savestates In Folders" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SAVESTATES_IN_CONTENT_DIR_ENABLE, + "Write Savestates to Content Dir" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SAVEFILES_IN_CONTENT_DIR_ENABLE, + "Write Saves to Content Dir" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEMFILES_IN_CONTENT_DIR_ENABLE, + "System Files are in Content Dir" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SCREENSHOTS_IN_CONTENT_DIR_ENABLE, + "Write Screenshots to Content Dir" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SSH_ENABLE, + "SSH" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_START_CORE, + "Core'u Başlat" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_START_NET_RETROPAD, + "Start Remote RetroPad" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_START_VIDEO_PROCESSOR, + "Start Video Processor" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_STATE_SLOT, + "State Slot" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_STATUS, + "Durum" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_STDIN_CMD_ENABLE, + "stdin Commands" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SUPPORTED_CORES, + "Önerilan Core'lar" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SUSPEND_SCREENSAVER_ENABLE, + "Ekran Koruyucuyu önle" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_BGM_ENABLE, + "System BGM" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_DIRECTORY, + "Sistem/BIOS" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFORMATION, + "Sistem bilgisi" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_7ZIP_SUPPORT, + "7zip Desteği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_ALSA_SUPPORT, + "ALSA Desteği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_BUILD_DATE, + "Yapılandırma Tarihi" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_CG_SUPPORT, + "Cg Desteği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_COCOA_SUPPORT, + "Cocoa Desteği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_COMMAND_IFACE_SUPPORT, + "Command interface support" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_CORETEXT_SUPPORT, + "CoreText Desteği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_CPU_FEATURES, + "CPU Features" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DISPLAY_METRIC_DPI, + "Display metric DPI" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DISPLAY_METRIC_MM_HEIGHT, + "Display metric height (mm)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DISPLAY_METRIC_MM_WIDTH, + "Display metric width (mm)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DSOUND_SUPPORT, + "DirectSound Desteği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_WASAPI_SUPPORT, + "WASAPI Desteği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DYLIB_SUPPORT, + "Dynamic library Desteği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DYNAMIC_SUPPORT, + "Dynamic run-time loading of libretro library" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_EGL_SUPPORT, + "EGL Desteği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FBO_SUPPORT, + "OpenGL/Direct3D render-to-texture (multi-pass shaders) support" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FFMPEG_SUPPORT, + "FFmpeg Desteği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FREETYPE_SUPPORT, + "FreeType Desteği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_STB_TRUETYPE_SUPPORT, + "STB TrueType Desteği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FRONTEND_IDENTIFIER, + "Frontend identifier" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FRONTEND_NAME, + "Frontend name" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FRONTEND_OS, + "Frontend OS" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_GIT_VERSION, + "Git versiyonu" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_GLSL_SUPPORT, + "GLSL Desteği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_HLSL_SUPPORT, + "HLSL Desteği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_JACK_SUPPORT, + "JACK Desteği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_KMS_SUPPORT, + "KMS/EGL Desteği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LAKKA_VERSION, + "Lakka Version" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBRETRODB_SUPPORT, + "LibretroDB support" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBUSB_SUPPORT, + "Libusb Desteği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETPLAY_SUPPORT, + "Netplay (peer-to-peer) support" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETWORK_COMMAND_IFACE_SUPPORT, + "Network Command interface support" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETWORK_REMOTE_SUPPORT, + "Network Gamepad support" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OPENAL_SUPPORT, + "OpenAL Desteği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OPENGLES_SUPPORT, + "OpenGL ES Desteği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OPENGL_SUPPORT, + "OpenGL Desteği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OPENSL_SUPPORT, + "OpenSL Desteği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OPENVG_SUPPORT, + "OpenVG Desteği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OSS_SUPPORT, + "OSS Desteği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OVERLAY_SUPPORT, + "Overlay support" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE, + "Power source" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_CHARGED, + "Charged" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_CHARGING, + "Charging" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_DISCHARGING, + "Discharging" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_NO_SOURCE, + "No source" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_PULSEAUDIO_SUPPORT, + "PulseAudio support" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_PYTHON_SUPPORT, + "Python (script support in shaders) support" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RBMP_SUPPORT, + "BMP Desteği (RBMP)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RETRORATING_LEVEL, + "RetroRating level" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RJPEG_SUPPORT, + "JPEG Desteği (RJPEG)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_ROARAUDIO_SUPPORT, + "RoarAudio Desteği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RPNG_SUPPORT, + "PNG Desteği (RPNG)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RSOUND_SUPPORT, + "RSound Desteği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RTGA_SUPPORT, + "TGA Desteği (RTGA)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_SDL2_SUPPORT, + "SDL2 Desteği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_SDL_IMAGE_SUPPORT, + "SDL image Desteği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_SDL_SUPPORT, + "SDL1.2 Desteği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_SLANG_SUPPORT, + "Slang Desteği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_THREADING_SUPPORT, + "Threading Desteği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_UDEV_SUPPORT, + "Udev Desteği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_V4L2_SUPPORT, + "Video4Linux2 Desteği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_VIDEO_CONTEXT_DRIVER, + "Video context driver" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_VULKAN_SUPPORT, + "Vulkan Desteği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_METAL_SUPPORT, + "Metal Desteği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_WAYLAND_SUPPORT, + "Wayland Desteği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_X11_SUPPORT, + "X11 Desteği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_XAUDIO2_SUPPORT, + "XAudio2 Desteği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_XVIDEO_SUPPORT, + "XVideo Desteği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_ZLIB_SUPPORT, + "Zlib Desteği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_TAKE_SCREENSHOT, + "Ekran Görüntüsü Al" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_THREADED_DATA_RUNLOOP_ENABLE, + "Threaded tasks" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_THUMBNAILS, + "Küçük Resimler" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_THUMBNAILS_RGUI, + "Top Thumbnail" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LEFT_THUMBNAILS, + "Left Thumbnails" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LEFT_THUMBNAILS_RGUI, + "Bottom Thumbnail" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LEFT_THUMBNAILS_OZONE, + "Second Thumbnail" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_XMB_VERTICAL_THUMBNAILS, + "Thumbnails Vertical Disposition" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_RGUI_INLINE_THUMBNAILS, + "Show Playlist Thumbnails" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_RGUI_INLINE_THUMBNAILS, + "Enable display of inline downscaled thumbnails while viewing playlists. When disabled, 'Top Thumbnail' may still be toggled fullscreen by pressing RetroPad Y." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_RGUI_SWAP_THUMBNAILS, + "Swap Thumbnails" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_RGUI_SWAP_THUMBNAILS, + "Swaps the display positions of 'Top Thumbnail' and 'Bottom Thumbnail'." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_RGUI_THUMBNAIL_DOWNSCALER, + "Thumbnail Downscaling Method" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_RGUI_THUMBNAIL_DOWNSCALER, + "Resampling method used when shrinking large thumbnails to fit the display." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_THUMB_SCALE_POINT, + "Nearest Neighbour (Fast)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_THUMB_SCALE_BILINEAR, + "Bilinear" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_THUMB_SCALE_SINC, + "Sinc/Lanczos3 (Slow)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_UPSCALE_NONE, + "None" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_UPSCALE_AUTO, + "Auto" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_UPSCALE_X2, + "x2" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_UPSCALE_X3, + "x3" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_UPSCALE_X4, + "x4" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_UPSCALE_X5, + "x5" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_UPSCALE_X6, + "x6" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_UPSCALE_X7, + "x7" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_UPSCALE_X8, + "x8" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_UPSCALE_X9, + "x9" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_4_3, + "4:3" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_16_9, + "16:9" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_16_9_CENTRE, + "16:9 (Centered)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_16_10, + "16:10" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_16_10_CENTRE, + "16:10 (Centered)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_LOCK_NONE, + "OFF" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_LOCK_FIT_SCREEN, + "Ekrana Sığdır" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_LOCK_INTEGER, + "Integer Scale" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_THUMBNAILS_DIRECTORY, + "Küçük Resimler" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_THUMBNAILS_UPDATER_LIST, + "Küçük resim Güncelleyici" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_THUMBNAIL_MODE_BOXARTS, + "Boxarts" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_THUMBNAIL_MODE_SCREENSHOTS, + "Ekran Görüntüleri" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_THUMBNAIL_MODE_TITLE_SCREENS, + "Title Screens" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_TIMEDATE_ENABLE, + "Show date / time" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE, + "Style of date / time" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_TIMEDATE_STYLE, + "Changes the style current date and/or time is shown inside the menu." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE_YMD_HMS, + "YYYY-MM-DD HH:MM:SS" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE_YMD_HM, + "YYYY-MM-DD HH:MM" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE_MDYYYY, + "MM-DD-YYYY HH:MM" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE_HMS, + "HH:MM:SS" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE_HM, + "HH:MM" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE_DM_HM, + "DD/MM HH:MM" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE_MD_HM, + "MM/DD HH:MM" + ) + MSG_HASH( + MENU_ENUM_LABEL_VALUE_TIMEDATE_STYLE_AM_PM, + "HH:MM:SS (AM/PM)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_TICKER_TYPE, + "Ticker Text Animation" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_TICKER_TYPE, + "Select horizontal scrolling method used to display long menu text strings." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_TICKER_TYPE_BOUNCE, + "Bounce Left/Right" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_TICKER_TYPE_LOOP, + "Scroll Left" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_TICKER_SPEED, + "Ticker Text Speed" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_TICKER_SPEED, + "Animation speed when scrolling long menu text strings." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME, + "Menu Color Theme" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_RGUI_MENU_COLOR_THEME, + "Select a different color theme. Choosing 'Custom' enables the use of menu theme preset files." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_MENU_THEME_PRESET, + "Custom Menu Theme Preset" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_RGUI_MENU_THEME_PRESET, + "Select a menu theme preset from the file browser." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_CUSTOM, + "Custom" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_CLASSIC_RED, + "Classic Red" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_CLASSIC_ORANGE, + "Classic Orange" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_CLASSIC_YELLOW, + "Classic Yellow" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_CLASSIC_GREEN, + "Classic Green" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_CLASSIC_BLUE, + "Classic Blue" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_CLASSIC_VIOLET, + "Classic Violet" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_CLASSIC_GREY, + "Classic Grey" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_LEGACY_RED, + "Legacy Red" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_DARK_PURPLE, + "Dark Purple" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_MIDNIGHT_BLUE, + "Midnight Blue" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_GOLDEN, + "Golden" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_ELECTRIC_BLUE, + "Electric Blue" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_APPLE_GREEN, + "Apple Green" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_VOLCANIC_RED, + "Volcanic Red" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_LAGOON, + "Lagoon" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_BROGRAMMER, + "Brogrammer" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_DRACULA, + "Dracula" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_FAIRYFLOSS, + "Fairy Floss" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_FLATUI, + "Flat UI" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_GRUVBOX_DARK, + "Gruvbox Dark" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_GRUVBOX_LIGHT, + "Gruvbox Light" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_HACKING_THE_KERNEL, + "Hacking the Kernel" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_NORD, + "Nord" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_NOVA, + "Nova" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_ONE_DARK, + "One Dark" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_PALENIGHT, + "Palenight" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_SOLARIZED_DARK, + "Solarized Dark" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_SOLARIZED_LIGHT, + "Solarized Light" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_TANGO_DARK, + "Tango Dark" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_TANGO_LIGHT, + "Tango Light" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_ZENBURN, + "Zenburn" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_MENU_COLOR_THEME_ANTI_ZENBURN, + "Anti-Zenburn" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_TRUE, + "True" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_UI_COMPANION_ENABLE, + "UI Companion" + ) +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, + "Desktop menu (restart)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_UI_MENUBAR_ENABLE, + "Menubar" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_UNABLE_TO_READ_COMPRESSED_FILE, + "Unable to read compressed file." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_UNDO_LOAD_STATE, + "Undo Load State" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_UNDO_SAVE_STATE, + "Undo Save State" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_UNKNOWN, + "Bilinmeyen" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_UPDATER_SETTINGS, + "Güncelleyici" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_UPDATE_ASSETS, + "İçerikleri Güncelle" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_UPDATE_AUTOCONFIG_PROFILES, + "Joypad Profillerini Güncelle" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_UPDATE_CG_SHADERS, + "Cg Gölgelendiricilerini Güncelle" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_UPDATE_CHEATS, + "Hileleri Güncelle" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_UPDATE_CORE_INFO_FILES, + "Core Bilgi Dosyalarını Güncelle" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_UPDATE_DATABASES, + "Veritabanlarını Güncelle" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_UPDATE_GLSL_SHADERS, + "GLSL Gölgelendiricileri Güncelle" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_UPDATE_LAKKA, + "Lakka'yı Güncelle" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_UPDATE_OVERLAYS, + "Güncelle Overlays" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_UPDATE_SLANG_SHADERS, + "Slang Gölgelendiricilerini Güncelle" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_USER, + "Kullanıcı" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_KEYBOARD, + "Kbd" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_USER_INTERFACE_SETTINGS, + "Kullanıcı Arayüzü" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_USER_LANGUAGE, + "Dil" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_USER_SETTINGS, + "Kullanıcı" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_USE_BUILTIN_IMAGE_VIEWER, + "Use Builtin Image Viewer" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_USE_BUILTIN_PLAYER, + "Use Builtin Media Player" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_USE_THIS_DIRECTORY, + "" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_ALLOW_ROTATE, + "Allow rotation" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO, + "Config Aspect Ratio" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_AUTO, + "Auto Aspect Ratio" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_INDEX, + "Aspect Ratio" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION, + "Siyah Çerçeve Ekleme" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_CROP_OVERSCAN, + "Crop Overscan (Reload)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_DISABLE_COMPOSITION, + "Disable Desktop Composition" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_DRIVER, + "Video" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_FILTER, + "Video Filter" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_FILTER_DIR, + "Video Filtresi" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_FILTER_FLICKER, + "Flicker filter" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_FONT_ENABLE, + "Ekrandaki Bildirimler" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_FONT_PATH, + "Bildirim Yazı Tipi" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_FONT_SIZE, + "Notification Size" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_ASPECT, + "En boy oranını zorla" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_SRGB_DISABLE, + "Force-disable sRGB FBO" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_FRAME_DELAY, + "Frame Delay" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_FULLSCREEN, + "Tam Ekran Modunda Başlat" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_GAMMA, + "Video Gamma" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_GPU_RECORD, + "GPU ile Kaydetmeyi kullan" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT, + "GPU Screenshot" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_HARD_SYNC, + "Hard GPU Sync" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_HARD_SYNC_FRAMES, + "Hard GPU Sync Frames" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_MAX_SWAPCHAIN_IMAGES, + "Max swapchain images" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_POS_X, + "Notification X Position" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_POS_Y, + "Notification Y Position" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_MONITOR_INDEX, + "Monitor Index" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_POST_FILTER_RECORD, + "Use Post Filter Recording" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_REFRESH_RATE, + "Vertical Refresh Rate" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_REFRESH_RATE_AUTO, + "Estimated Screen Framerate" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_REFRESH_RATE_POLLED, + "Set Display-Reported Refresh Rate" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_ROTATION, + "Video Rotation" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SCREEN_ORIENTATION, + "Screen Orientation" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_SCALE, + "Windowed Scale" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_RECORD_THREADS, + "Recording Threads" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_SCALE_INTEGER, + "Integer Scale" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_SETTINGS, + "Video" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_DIR, + "Video Shader" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_NUM_PASSES, + "Shader Passes" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PARAMETERS, + "Shader Parameters" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET, + "Load Shader Preset" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_AS, + "Save Shader Preset As" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_CORE, + "Save Core Preset" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_PARENT, + "Save Content Directory Preset" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_GAME, + "Save Game Preset" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_SHARED_CONTEXT, + "Hardware Shared Context" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_SMOOTH, + "Bilinear Filtering" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_SOFT_FILTER, + "Soft Filter" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_SWAP_INTERVAL, + "Vertical Sync (Vsync) Swap Interval" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_TAB, + "Video" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_THREADED, + "Threaded Video" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_VFILTER, + "Deflicker" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_HEIGHT, + "Custom Aspect Ratio Height" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH, + "Custom Aspect Ratio Width" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_X, + "Custom Aspect Ratio X Pos." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y, + "Custom Aspect Ratio Y Pos." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_VI_WIDTH, + "Set VI Screen Width" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_VSYNC, + "Vertical Sync (Vsync)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_WINDOWED_FULLSCREEN, + "Windowed Fullscreen Mode" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_WINDOW_WIDTH, + "Pencere genişliği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_WINDOW_HEIGHT, + "Pencere yüksekliği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_FULLSCREEN_X, + "Tam ekran genişliği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_FULLSCREEN_Y, + "Tam ekran yüksekliği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_WIFI_DRIVER, + "Wi-Fi" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_WIFI_SETTINGS, + "Wi-Fi" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_XMB_ALPHA_FACTOR, + "Menu Alpha Factor" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_FONT_COLOR_RED, + "Menu Font Red Color" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_FONT_COLOR_GREEN, + "Menu Font Green Color" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_FONT_COLOR_BLUE, + "Menu Font Blue Color" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_XMB_FONT, + "Menu Font" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_CUSTOM, + "Custom" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_FLATUI, + "FlatUI" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_MONOCHROME, + "Monochrome" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_MONOCHROME_INVERTED, + "Monochrome Inverted" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_SYSTEMATIC, + "Systematic" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_NEOACTIVE, + "NeoActive" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, + "Pixel" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, + "RetroActive" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, + "Dot-Art" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_AUTOMATIC, + "Automatic" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_AUTOMATIC_INVERTED, + "Automatic Inverted" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, + "Menu Color Theme" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_APPLE_GREEN, + "Elma Yeşili" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_DARK, + "Dark" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_LIGHT, + "Light" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_MORNING_BLUE, + "Morning Blue" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_DARK_PURPLE, + "Dark Purple" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_ELECTRIC_BLUE, + "Elektrik Mavisi" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_GOLDEN, + "Altın" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_LEGACY_RED, + "Legacy Red" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_MIDNIGHT_BLUE, + "Gece Mavisi" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_PLAIN, + "Plain" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_UNDERSEA, + "Denizaltı" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_VOLCANIC_RED, + "Volkanik Kırmızı" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_XMB_RIBBON_ENABLE, + "Menu Shader Pipeline" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_XMB_SCALE_FACTOR, + "Menu Scale Factor" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_XMB_SHADOWS_ENABLE, + "Icon Shadows" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_HISTORY, + "Geçmiş Sekmesini Göster" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_ADD, + "İçerik Ekle Sekmesini Göster" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_PLAYLISTS, + "Oynatma Listesi Sekmesini Göster" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES, + "Favoriler Sekmesini Göster" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_IMAGES, + "Resim Sekmesini Göster" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_MUSIC, + "Müzik Sekmesini Göster" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS, + "Ayarlar Sekmesini Göster" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_VIDEO, + "Video Sekmesini Göster" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_NETPLAY, + "Netplay Sekmesini Göster" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_XMB_LAYOUT, + "Menü düzeni" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_XMB_THEME, + "Menü Simgesi Teması" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_YES, + "Var" + ) +MSG_HASH( + MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_TWO, + "Shader Preset" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEEVOS_ENABLE, + "Klasik oyunlarda özel başarılar kazanmak için yarış.\n" + "Daha fazla bilgi için http://retroachievements.org adresini ziyaret edin." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEEVOS_TEST_UNOFFICIAL, + "Test amaçlı gayri resmi başarıları ve/veya beta özelliklerini kullanın." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEEVOS_HARDCORE_MODE_ENABLE, + "Double the amount of points earned.\n" + "Disables savestates, cheats, rewind, pause, and slow-motion for all games.\n" + "Toggling this setting at runtime will restart your game." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEEVOS_LEADERBOARDS_ENABLE, + "Oyuna özgü liderler tablosu.\n" + "Hardcore Modu devre dışı bırakılmışsa etkisi yoktur." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEEVOS_BADGES_ENABLE, + "Başarı Listesi'ndeki rozetleri görüntüle." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEEVOS_VERBOSE_ENABLE, + "Bildirimlerde daha fazla bilgi göster." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEEVOS_AUTO_SCREENSHOT, + "Bir başarı tetiklendiğinde otomatik olarak ekran görüntüsü al." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_DRIVER_SETTINGS, + "Sistem tarafından kullanılan sürücüleri değiştir." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_RETRO_ACHIEVEMENTS_SETTINGS, + "Başarı ayarlarını değiştir." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_SETTINGS, + "Core ayarlarını değiştir." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_RECORDING_SETTINGS, + "Kayıt ayarlarını değiştirin." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_ONSCREEN_DISPLAY_SETTINGS, + "Ekran kaplamasını, klavye kaplamasını ve ekrandaki bildirim ayarlarını değiştirin." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_FRAME_THROTTLE_SETTINGS, + "Geri sarma, ileri sarma ve slow-motion ayarlarını değiştirme." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SAVING_SETTINGS, + "Kaydetme ayarlarını değiştirin." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_LOGGING_SETTINGS, + "Günlük ayarlarını değiştirin." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_USER_INTERFACE_SETTINGS, + "Kullanıcı arayüzü ayarlarını değiştirin." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_USER_SETTINGS, + "Hesap, kullanıcı adı ve dil ayarlarını değiştirin." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PRIVACY_SETTINGS, + "Gizlilik ayarlarınızı değiştirin." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MIDI_SETTINGS, + "MIDI ayarlarını değiştirin." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_DIRECTORY_SETTINGS, + "Dosyaların bulunduğu varsayılan dizinleri değiştirin." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PLAYLIST_SETTINGS, + "Çalma listesi ayarlarını değiştirin." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETWORK_SETTINGS, + "Sunucu ve ağ ayarlarını yapılandırın." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_ADD_CONTENT_LIST, + "İçeriği tarayın ve veritabanına ekleyin." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_SETTINGS, + "Ses çıkışı ayarlarını değiştirin." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_BLUETOOTH_ENABLE, + "Bluetooth durumunu belirler." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONFIG_SAVE_ON_EXIT, + "Çıkışta yapılandırma dosyasındaki değişiklikleri kaydeder." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONFIGURATION_SETTINGS, + "Yapılandırma dosyaları için varsayılan ayarları değiştirin." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONFIGURATIONS_LIST, + "Yapılandırma dosyalarını yönetin ve oluşturun." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CPU_CORES, + "CPU'nun sahip olduğu çekirdek miktarı." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_FPS_SHOW, + "Ekrandaki saniye başına geçerli kare hızını görüntüler." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_FRAMECOUNT_SHOW, + "Displays the current frame count onscreen." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MEMORY_SHOW, + "Includes the current memory usage/total onscreen with FPS/Frames." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_HOTKEY_BINDS, + "Kısayol tuşu ayarlarını yapılandırın." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_MENU_ENUM_TOGGLE_GAMEPAD_COMBO, + "Geçiş menüsüne Gamepad düğme kombinasyonu." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_SETTINGS, + "Joypad, klavye ve fare ayarlarını değiştirin." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_USER_BINDS, + "Bu kullanıcı için kontrolleri yapılandırın." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_LATENCY_SETTINGS, + "Video, ses ve giriş gecikmesi ile ilgili ayarları değiştirin." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_LOG_VERBOSITY, + "Olayları bir terminale veya dosyaya kaydedin." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY, + "Netplay oturumun kurun veya katılın." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_LAN_SCAN_SETTINGS, + "Yerel ağdaki Netplay ana bilgisayarlarını arayın ve bağlanın." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INFORMATION_LIST_LIST, + "Sistem bilgisini göster." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_ONLINE_UPDATER, + "RetroArch için eklentileri, bileşenleri ve içeriği indirin." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SAMBA_ENABLE, + "Ağ klasörlerini SMB protokolü ile paylaşın." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SERVICES_SETTINGS, + "İşletim sistemi düzeyinde servisleri yönetin." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SHOW_HIDDEN_FILES, + "Dosya tarayıcısının içindeki gizli dosyaları/dizinleri göster." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SSH_ENABLE, + "Uzaktan komut satırına erişmek için SSH kullanın." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SUSPEND_SCREENSAVER_ENABLE, + "Sisteminizin ekran koruyucusunun aktif hale gelmesini önler." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_WINDOW_SCALE, + "Pencere boyutunu Core görünüm alanı boyutuna göre ayarlar. Alternatif olarak, sabit bir pencere boyutu için bir pencere genişliğini ve yüksekliğini ayarlayabilirsiniz." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_USER_LANGUAGE, + "Arayüzün dilini ayarlar." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_BLACK_FRAME_INSERTION, + "Çerçevelerin arasına siyah bir çerçeve ekler. Gölgelenmeyi önlemek için 60Hz içerik oynatmak isteyen 120Hz ekranlı kullanıcılar için kullanışlıdır." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_FRAME_DELAY, + "Daha fazla video takılma riski pahasına gecikmeyi azaltır. V-Sync'ten sonra gecikme ekler (ms cinsinden)." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_HARD_SYNC_FRAMES, + "'Hard GPU Sync'i kullanırken CPU'nun GPU'dan kaç kare çalışabileceğini belirler.." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_MAX_SWAPCHAIN_IMAGES, + "Video sürücüsüne açıkça belirtilen arabelleğe alma modunu kullanmasını söyler." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_MONITOR_INDEX, + "Hangi ekranın kullanılacağını seçer." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_REFRESH_RATE_AUTO, + "The accurate estimated refresh rate of the screen in Hz." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_REFRESH_RATE_POLLED, + "The refresh rate as reported by the display driver." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SETTINGS, + "Video çıkış ayarlarını değiştirin." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_WIFI_SETTINGS, + "Kablosuz ağları tarar ve bağlantı kurar." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_HELP_LIST, + "Programın nasıl çalıştığı hakkında daha fazla bilgi edinin." + ) +MSG_HASH( + MSG_ADDED_TO_FAVORITES, + "Favorilere eklendi" + ) +MSG_HASH( + MSG_RESET_CORE_ASSOCIATION, + "Oynatma listesi ile Core ilişkisi sıfırlandı" + ) +MSG_HASH( + MSG_APPENDED_DISK, + "Appended disk" + ) +MSG_HASH( + MSG_APPLICATION_DIR, + "Application Dir" + ) +MSG_HASH( + MSG_APPLYING_CHEAT, + "Applying cheat changes." + ) +MSG_HASH( + MSG_APPLYING_SHADER, + "Applying shader" + ) +MSG_HASH( + MSG_AUDIO_MUTED, + "Ses kapatıldı" + ) +MSG_HASH( + MSG_AUDIO_UNMUTED, + "Ses açıldı." + ) +MSG_HASH( + MSG_AUTOCONFIG_FILE_ERROR_SAVING, + "Otomatik yapılandırma dosyası kaydedilirken hata oluştu." + ) +MSG_HASH( + MSG_AUTOCONFIG_FILE_SAVED_SUCCESSFULLY, + "Otomatik yapılandırma dosyası başarıyla kaydedildi." + ) +MSG_HASH( + MSG_AUTOSAVE_FAILED, + "Could not initialize autosave." + ) +MSG_HASH( + MSG_AUTO_SAVE_STATE_TO, + "Auto save state to" + ) +MSG_HASH( + MSG_BLOCKING_SRAM_OVERWRITE, + "Blocking SRAM Overwrite" + ) +MSG_HASH( + MSG_BRINGING_UP_COMMAND_INTERFACE_ON_PORT, + "Bringing up command interface on port" + ) +MSG_HASH( + MSG_BYTES, + "bytes" + ) +MSG_HASH( + MSG_CANNOT_INFER_NEW_CONFIG_PATH, + "Cannot infer new config path. Use current time." + ) +MSG_HASH( + MSG_CHEEVOS_HARDCORE_MODE_ENABLE, + "Achievements Hardcore Mode Enabled, savestate & rewind were disabled." + ) +MSG_HASH( + MSG_COMPARING_WITH_KNOWN_MAGIC_NUMBERS, + "Comparing with known magic numbers..." + ) +MSG_HASH( + MSG_COMPILED_AGAINST_API, + "Compiled against API" + ) +MSG_HASH( + MSG_CONFIG_DIRECTORY_NOT_SET, + "Config directory not set. Cannot save new config." + ) +MSG_HASH( + MSG_CONNECTED_TO, + "Connected to" + ) +MSG_HASH( + MSG_CONTENT_CRC32S_DIFFER, + "Content CRC32s differ. Cannot use different games." + ) +MSG_HASH( + MSG_CONTENT_LOADING_SKIPPED_IMPLEMENTATION_WILL_DO_IT, + "Content loading skipped. Implementation will load it on its own." + ) +MSG_HASH( + MSG_CORE_DOES_NOT_SUPPORT_SAVESTATES, + "Core does not support save states." + ) +MSG_HASH( + MSG_CORE_OPTIONS_FILE_CREATED_SUCCESSFULLY, + "Core seçenekleri dosyası başarıyla oluşturuldu." + ) +MSG_HASH( + MSG_COULD_NOT_FIND_ANY_NEXT_DRIVER, + "Could not find any next driver" + ) +MSG_HASH( + MSG_COULD_NOT_FIND_COMPATIBLE_SYSTEM, + "Could not find compatible system." + ) +MSG_HASH( + MSG_COULD_NOT_FIND_VALID_DATA_TRACK, + "Could not find valid data track" + ) +MSG_HASH( + MSG_COULD_NOT_OPEN_DATA_TRACK, + "could not open data track" + ) +MSG_HASH( + MSG_COULD_NOT_READ_CONTENT_FILE, + "Could not read content file" + ) +MSG_HASH( + MSG_COULD_NOT_READ_MOVIE_HEADER, + "Could not read movie header." + ) +MSG_HASH( + MSG_COULD_NOT_READ_STATE_FROM_MOVIE, + "Could not read state from movie." + ) +MSG_HASH( + MSG_CRC32_CHECKSUM_MISMATCH, + "CRC32 checksum mismatch between content file and saved content checksum in replay file header. Replay highly likely to desync on playback." + ) +MSG_HASH( + MSG_CUSTOM_TIMING_GIVEN, + "Custom timing given" + ) +MSG_HASH( + MSG_DECOMPRESSION_ALREADY_IN_PROGRESS, + "Decompression already in progress." + ) +MSG_HASH( + MSG_DECOMPRESSION_FAILED, + "Decompression failed." + ) +MSG_HASH( + MSG_DETECTED_VIEWPORT_OF, + "Detected viewport of" + ) +MSG_HASH( + MSG_DID_NOT_FIND_A_VALID_CONTENT_PATCH, + "Did not find a valid content patch." + ) +MSG_HASH( + MSG_DISCONNECT_DEVICE_FROM_A_VALID_PORT, + "Disconnect device from a valid port." + ) +MSG_HASH( + MSG_DISK_CLOSED, + "Closed" + ) +MSG_HASH( + MSG_DISK_EJECTED, + "Ejected" + ) +MSG_HASH( + MSG_DOWNLOADING, + "İndiriliyor" + ) +MSG_HASH( + MSG_INDEX_FILE, + "indeks" + ) +MSG_HASH( + MSG_DOWNLOAD_FAILED, + "Yükleme başarısız" + ) +MSG_HASH( + MSG_ERROR, + "Hatta" + ) +MSG_HASH( + MSG_ERROR_LIBRETRO_CORE_REQUIRES_CONTENT, + "Libretro core requires content, but nothing was provided." + ) +MSG_HASH( + MSG_ERROR_LIBRETRO_CORE_REQUIRES_SPECIAL_CONTENT, + "Libretro core requires special content, but none were provided." + ) +MSG_HASH( + MSG_ERROR_LIBRETRO_CORE_REQUIRES_VFS, + "Core does not support VFS, and loading from a local copy failed" +) +MSG_HASH( + MSG_ERROR_PARSING_ARGUMENTS, + "Error parsing arguments." + ) +MSG_HASH( + MSG_ERROR_SAVING_CORE_OPTIONS_FILE, + "Error saving core options file." + ) +MSG_HASH( + MSG_ERROR_SAVING_REMAP_FILE, + "Error saving remap file." + ) +MSG_HASH( + MSG_ERROR_REMOVING_REMAP_FILE, + "Error removing remap file." + ) +MSG_HASH( + MSG_ERROR_SAVING_SHADER_PRESET, + "Error saving shader preset." + ) +MSG_HASH( + MSG_EXTERNAL_APPLICATION_DIR, + "External Application Dir" + ) +MSG_HASH( + MSG_EXTRACTING, + "Extracting" + ) +MSG_HASH( + MSG_EXTRACTING_FILE, + "Extracting file" + ) +MSG_HASH( + MSG_FAILED_SAVING_CONFIG_TO, + "Failed saving config to" + ) +MSG_HASH( + MSG_FAILED_TO, + "Failed to" + ) +MSG_HASH( + MSG_FAILED_TO_ACCEPT_INCOMING_SPECTATOR, + "Failed to accept incoming spectator." + ) +MSG_HASH( + MSG_FAILED_TO_ALLOCATE_MEMORY_FOR_PATCHED_CONTENT, + "Failed to allocate memory for patched content..." + ) +MSG_HASH( + MSG_FAILED_TO_APPLY_SHADER, + "Failed to apply shader." + ) +MSG_HASH( + MSG_FAILED_TO_BIND_SOCKET, + "Failed to bind socket." + ) +MSG_HASH( + MSG_FAILED_TO_CREATE_THE_DIRECTORY, + "Failed to create the directory." + ) +MSG_HASH( + MSG_FAILED_TO_EXTRACT_CONTENT_FROM_COMPRESSED_FILE, + "Failed to extract content from compressed file" + ) +MSG_HASH( + MSG_FAILED_TO_GET_NICKNAME_FROM_CLIENT, + "Failed to get nickname from client." + ) +MSG_HASH( + MSG_FAILED_TO_LOAD, + "Failed to load" + ) +MSG_HASH( + MSG_FAILED_TO_LOAD_CONTENT, + "Failed to load content" + ) +MSG_HASH( + MSG_FAILED_TO_LOAD_MOVIE_FILE, + "Failed to load movie file" + ) +MSG_HASH( + MSG_FAILED_TO_LOAD_OVERLAY, + "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, + "Failed to patch" + ) +MSG_HASH( + MSG_FAILED_TO_RECEIVE_HEADER_FROM_CLIENT, + "Failed to receive header from client." + ) +MSG_HASH( + MSG_FAILED_TO_RECEIVE_NICKNAME, + "Failed to receive nickname." + ) +MSG_HASH( + MSG_FAILED_TO_RECEIVE_NICKNAME_FROM_HOST, + "Failed to receive nickname from host." + ) +MSG_HASH( + MSG_FAILED_TO_RECEIVE_NICKNAME_SIZE_FROM_HOST, + "Failed to receive nickname size from host." + ) +MSG_HASH( + MSG_FAILED_TO_RECEIVE_SRAM_DATA_FROM_HOST, + "Failed to receive SRAM data from host." + ) +MSG_HASH( + MSG_FAILED_TO_REMOVE_DISK_FROM_TRAY, + "Failed to remove disk from tray." + ) +MSG_HASH( + MSG_FAILED_TO_REMOVE_TEMPORARY_FILE, + "Failed to remove temporary file" + ) +MSG_HASH( + MSG_FAILED_TO_SAVE_SRAM, + "Failed to save SRAM" + ) +MSG_HASH( + MSG_FAILED_TO_SAVE_STATE_TO, + "Failed to save state to" + ) +MSG_HASH( + MSG_FAILED_TO_SEND_NICKNAME, + "Failed to send nickname." + ) +MSG_HASH( + MSG_FAILED_TO_SEND_NICKNAME_SIZE, + "Failed to send nickname size." + ) +MSG_HASH( + MSG_FAILED_TO_SEND_NICKNAME_TO_CLIENT, + "Failed to send nickname to client." + ) +MSG_HASH( + MSG_FAILED_TO_SEND_NICKNAME_TO_HOST, + "Failed to send nickname to host." + ) +MSG_HASH( + MSG_FAILED_TO_SEND_SRAM_DATA_TO_CLIENT, + "Failed to send SRAM data to client." + ) +MSG_HASH( + MSG_FAILED_TO_START_AUDIO_DRIVER, + "Failed to start audio driver. Will continue without audio." + ) +MSG_HASH( + MSG_FAILED_TO_START_MOVIE_RECORD, + "Failed to start movie record." + ) +MSG_HASH( + MSG_FAILED_TO_START_RECORDING, + "Failed to start recording." + ) +MSG_HASH( + MSG_FAILED_TO_TAKE_SCREENSHOT, + "Failed to take screenshot." + ) +MSG_HASH( + MSG_FAILED_TO_UNDO_LOAD_STATE, + "Failed to undo load state." + ) +MSG_HASH( + MSG_FAILED_TO_UNDO_SAVE_STATE, + "Failed to undo save state." + ) +MSG_HASH( + MSG_FAILED_TO_UNMUTE_AUDIO, + "Failed to unmute audio." + ) +MSG_HASH( + MSG_FATAL_ERROR_RECEIVED_IN, + "Fatal error received in" + ) +MSG_HASH( + MSG_FILE_NOT_FOUND, + "File not found" + ) +MSG_HASH( + MSG_FOUND_AUTO_SAVESTATE_IN, + "Found auto savestate in" + ) +MSG_HASH( + MSG_FOUND_DISK_LABEL, + "Found disk label" + ) +MSG_HASH( + MSG_FOUND_FIRST_DATA_TRACK_ON_FILE, + "Found first data track on file" + ) +MSG_HASH( + MSG_FOUND_LAST_STATE_SLOT, + "Found last state slot" + ) +MSG_HASH( + MSG_FOUND_SHADER, + "Found shader" + ) +MSG_HASH( + MSG_FRAMES, + "Frames" + ) +MSG_HASH( + MSG_GAME_SPECIFIC_CORE_OPTIONS_FOUND_AT, + "Per-Game Options: game-specific core options found at" + ) +MSG_HASH( + MSG_GOT_INVALID_DISK_INDEX, + "Got invalid disk index." + ) +MSG_HASH( + MSG_GRAB_MOUSE_STATE, + "Grab mouse state" + ) +MSG_HASH( + MSG_GAME_FOCUS_ON, + "Game focus on" + ) +MSG_HASH( + MSG_GAME_FOCUS_OFF, + "Game focus off" + ) +MSG_HASH( + MSG_HW_RENDERED_MUST_USE_POSTSHADED_RECORDING, + "Libretro core is hardware rendered. Must use post-shaded recording as well." + ) +MSG_HASH( + MSG_INFLATED_CHECKSUM_DID_NOT_MATCH_CRC32, + "Inflated checksum did not match CRC32." + ) +MSG_HASH( + MSG_INPUT_CHEAT, + "Input Cheat" + ) +MSG_HASH( + MSG_INPUT_CHEAT_FILENAME, + "Input Cheat Filename" + ) +MSG_HASH( + MSG_INPUT_PRESET_FILENAME, + "Input Preset Filename" + ) +MSG_HASH( + MSG_INPUT_RENAME_ENTRY, + "Rename Title" + ) +MSG_HASH( + MSG_INTERFACE, + "Arayüz" + ) +MSG_HASH( + MSG_INTERNAL_STORAGE, + "Internal Storage" + ) +MSG_HASH( + MSG_REMOVABLE_STORAGE, + "Removable Storage" + ) +MSG_HASH( + MSG_INVALID_NICKNAME_SIZE, + "Invalid nickname size." + ) +MSG_HASH( + MSG_IN_BYTES, + "in bytes" + ) +MSG_HASH( + MSG_IN_GIGABYTES, + "in gigabytes" + ) +MSG_HASH( + MSG_IN_MEGABYTES, + "in megabytes" + ) +MSG_HASH( + MSG_LIBRETRO_ABI_BREAK, + "is compiled against a different version of libretro than this libretro implementation." + ) +MSG_HASH( + MSG_LIBRETRO_FRONTEND, + "Frontend for libretro" + ) +MSG_HASH( + MSG_LOADED_STATE_FROM_SLOT, + "Loaded state from slot #%d." + ) +MSG_HASH( + MSG_LOADED_STATE_FROM_SLOT_AUTO, + "Loaded state from slot #-1 (auto)." + ) +MSG_HASH( + MSG_LOADING, + "Yükleniyor" + ) +MSG_HASH( + MSG_FIRMWARE, + "One or more firmware files are missing" + ) +MSG_HASH( + MSG_LOADING_CONTENT_FILE, + "Loading content file" + ) +MSG_HASH( + MSG_LOADING_HISTORY_FILE, + "Loading history file" + ) +MSG_HASH( + MSG_LOADING_STATE, + "Loading state" + ) +MSG_HASH( + MSG_MEMORY, + "Memory" + ) +MSG_HASH( + MSG_MOVIE_FILE_IS_NOT_A_VALID_BSV1_FILE, + "Input replay movie file is not a valid BSV1 file." + ) +MSG_HASH( + MSG_MOVIE_FORMAT_DIFFERENT_SERIALIZER_VERSION, + "Input replay movie format seems to have a different serializer version. Will most likely fail." + ) +MSG_HASH( + MSG_MOVIE_PLAYBACK_ENDED, + "Input replay movie playback ended." + ) +MSG_HASH( + MSG_MOVIE_RECORD_STOPPED, + "Stopping movie record." + ) +MSG_HASH( + MSG_NETPLAY_FAILED, + "Failed to initialize netplay." + ) +MSG_HASH( + MSG_NO_CONTENT_STARTING_DUMMY_CORE, + "No content, starting dummy core." + ) +MSG_HASH( + MSG_NO_SAVE_STATE_HAS_BEEN_OVERWRITTEN_YET, + "No save state has been overwritten yet." + ) +MSG_HASH( + MSG_NO_STATE_HAS_BEEN_LOADED_YET, + "No state has been loaded yet." + ) +MSG_HASH( + MSG_OVERRIDES_ERROR_SAVING, + "Error saving overrides." + ) +MSG_HASH( + MSG_OVERRIDES_SAVED_SUCCESSFULLY, + "Overrides saved successfully." + ) +MSG_HASH( + MSG_PAUSED, + "Durduruldu." + ) +MSG_HASH( + MSG_PROGRAM, + "RetroArch" + ) +MSG_HASH( + MSG_READING_FIRST_DATA_TRACK, + "Reading first data track..." + ) +MSG_HASH( + MSG_RECEIVED, + "received" + ) +MSG_HASH( + MSG_RECORDING_TERMINATED_DUE_TO_RESIZE, + "Recording terminated due to resize." + ) +MSG_HASH( + MSG_RECORDING_TO, + "Recording to" + ) +MSG_HASH( + MSG_REDIRECTING_CHEATFILE_TO, + "Redirecting cheat file to" + ) +MSG_HASH( + MSG_REDIRECTING_SAVEFILE_TO, + "Redirecting save file to" + ) +MSG_HASH( + MSG_REDIRECTING_SAVESTATE_TO, + "Redirecting savestate to" + ) +MSG_HASH( + MSG_REMAP_FILE_SAVED_SUCCESSFULLY, + "Remap file saved successfully." + ) +MSG_HASH( + MSG_REMAP_FILE_REMOVED_SUCCESSFULLY, + "Remap file removed successfully." + ) +MSG_HASH( + MSG_REMOVED_DISK_FROM_TRAY, + "Removed disk from tray." + ) +MSG_HASH( + MSG_REMOVING_TEMPORARY_CONTENT_FILE, + "Removing temporary content file" + ) +MSG_HASH( + MSG_RESET, + "Reset" + ) +MSG_HASH( + MSG_RESTARTING_RECORDING_DUE_TO_DRIVER_REINIT, + "Restarting recording due to driver reinit." + ) +MSG_HASH( + MSG_RESTORED_OLD_SAVE_STATE, + "Restored old save state." + ) +MSG_HASH( + MSG_RESTORING_DEFAULT_SHADER_PRESET_TO, + "Shaders: restoring default shader preset to" + ) +MSG_HASH( + MSG_REVERTING_SAVEFILE_DIRECTORY_TO, + "Reverting savefile directory to" + ) +MSG_HASH( + MSG_REVERTING_SAVESTATE_DIRECTORY_TO, + "Reverting savestate directory to" + ) +MSG_HASH( + MSG_REWINDING, + "Gerisarılıyor." + ) +MSG_HASH( + MSG_REWIND_INIT, + "Initializing rewind buffer with size" + ) +MSG_HASH( + MSG_REWIND_INIT_FAILED, + "Failed to initialize rewind buffer. Rewinding will be disabled." + ) +MSG_HASH( + MSG_REWIND_INIT_FAILED_THREADED_AUDIO, + "Implementation uses threaded audio. Cannot use rewind." + ) +MSG_HASH( + MSG_REWIND_REACHED_END, + "Reached end of rewind buffer." + ) +MSG_HASH( + MSG_SAVED_NEW_CONFIG_TO, + "Saved new config to" + ) +MSG_HASH( + MSG_SAVED_STATE_TO_SLOT, + "Saved state to slot #%d." + ) +MSG_HASH( + MSG_SAVED_STATE_TO_SLOT_AUTO, + "Saved state to slot #-1 (auto)." + ) +MSG_HASH( + MSG_SAVED_SUCCESSFULLY_TO, + "Saved successfully to" + ) +MSG_HASH( + MSG_SAVING_RAM_TYPE, + "Saving RAM type" + ) +MSG_HASH( + MSG_SAVING_STATE, + "Saving state" + ) +MSG_HASH( + MSG_SCANNING, + "Taranıyor" + ) +MSG_HASH( + MSG_SCANNING_OF_DIRECTORY_FINISHED, + "Dizin taraması tamamlandı" + ) +MSG_HASH( + MSG_SENDING_COMMAND, + "Sending command" + ) +MSG_HASH( + MSG_SEVERAL_PATCHES_ARE_EXPLICITLY_DEFINED, + "Several patches are explicitly defined, ignoring all..." + ) +MSG_HASH( + MSG_SHADER, + "Shader" + ) +MSG_HASH( + MSG_SHADER_PRESET_SAVED_SUCCESSFULLY, + "Shader preset saved successfully." + ) +MSG_HASH( + MSG_SKIPPING_SRAM_LOAD, + "Skipping SRAM load." + ) +MSG_HASH( + MSG_SLOW_MOTION, + "Slow motion." + ) +MSG_HASH( + MSG_FAST_FORWARD, + "Fast forward." + ) +MSG_HASH( + MSG_SLOW_MOTION_REWIND, + "Slow motion rewind." + ) +MSG_HASH( + MSG_SRAM_WILL_NOT_BE_SAVED, + "SRAM will not be saved." + ) +MSG_HASH( + MSG_STARTING_MOVIE_PLAYBACK, + "Starting movie playback." + ) +MSG_HASH( + MSG_STARTING_MOVIE_RECORD_TO, + "Starting movie record to" + ) +MSG_HASH( + MSG_STATE_SIZE, + "State size" + ) +MSG_HASH( + MSG_STATE_SLOT, + "State slot" + ) +MSG_HASH( + MSG_TAKING_SCREENSHOT, + "Taking screenshot." + ) +MSG_HASH( + MSG_SCREENSHOT_SAVED, + "Screenshot saved" + ) +MSG_HASH( + MSG_CHANGE_THUMBNAIL_TYPE, + "Change thumbnail type" + ) +MSG_HASH( + MSG_NO_THUMBNAIL_AVAILABLE, + "No thumbnail available" + ) +MSG_HASH( + MSG_PRESS_AGAIN_TO_QUIT, + "Press again to quit..." + ) +MSG_HASH( + MSG_TO, + "to" + ) +MSG_HASH( + MSG_UNDID_LOAD_STATE, + "Undid load state." + ) +MSG_HASH( + MSG_UNDOING_SAVE_STATE, + "Undoing save state" + ) +MSG_HASH( + MSG_UNKNOWN, + "Unknown" + ) +MSG_HASH( + MSG_UNPAUSED, + "Unpaused." + ) +MSG_HASH( + MSG_UNRECOGNIZED_COMMAND, + "Unrecognized command" + ) +MSG_HASH( + MSG_USING_CORE_NAME_FOR_NEW_CONFIG, + "Using core name for new config." + ) +MSG_HASH( + MSG_USING_LIBRETRO_DUMMY_CORE_RECORDING_SKIPPED, + "Using libretro dummy core. Skipping recording." + ) +MSG_HASH( + MSG_VALUE_CONNECT_DEVICE_FROM_A_VALID_PORT, + "Connect device from a valid port." + ) +MSG_HASH( + MSG_VALUE_DISCONNECTING_DEVICE_FROM_PORT, + "Disconnecting device from port" + ) +MSG_HASH( + MSG_VALUE_REBOOTING, + "Rebooting..." + ) +MSG_HASH( + MSG_VALUE_SHUTTING_DOWN, + "Shutting down..." + ) +MSG_HASH( + MSG_VERSION_OF_LIBRETRO_API, + "Version of libretro API" + ) +MSG_HASH( + MSG_VIEWPORT_SIZE_CALCULATION_FAILED, + "Viewport size calculation failed! Will continue using raw data. This will probably not work right ..." + ) +MSG_HASH( + MSG_VIRTUAL_DISK_TRAY, + "virtual disk tray." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_LATENCY, + "Desired audio latency in milliseconds. Might not be honored if the audio driver can't provide given latency." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_MUTE, + "Mute/unmute audio." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_RATE_CONTROL_DELTA, + "Helps smooth out imperfections in timing when synchronizing audio and video. Be aware that if disabled, proper synchronization is nearly impossible to obtain." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CAMERA_ALLOW, + "Allow or disallow camera access by cores." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_LOCATION_ALLOW, + "Allow or disallow location services access by cores." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_MAX_USERS, + "Maximum amount of users supported by RetroArch." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_POLL_TYPE_BEHAVIOR, + "Influence how input polling is done inside RetroArch. Setting it to 'Early' or 'Late' can result in less latency, depending on your configuration." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_ALL_USERS_CONTROL_MENU, + "Allows any user to control the menu. If disabled, only User 1 can control the menu." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_VOLUME, + "Audio volume (in dB). 0 dB is normal volume, and no gain is applied." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_WASAPI_EXCLUSIVE_MODE, + "Allow the WASAPI driver to take exclusive control of the audio device. If disabled, it will use shared mode instead." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_WASAPI_FLOAT_FORMAT, + "Use float format for the WASAPI driver, if supported by your audio device." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_WASAPI_SH_BUFFER_LENGTH, + "The intermediate buffer length (in frames) when using the WASAPI driver in shared mode." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_SYNC, + "Synchronize audio. Recommended." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_BUTTON_AXIS_THRESHOLD, + "How far an axis must be tilted to result in a button press." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_BIND_TIMEOUT, + "Amount of seconds to wait until proceeding to the next bind." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_BIND_HOLD, + "Amount of seconds to hold an input to bind it." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_TURBO_PERIOD, + "Describes the period when turbo-enabled buttons are toggled. Numbers are described in frames." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DUTY_CYCLE, + "Describes how long the period of a turbo-enabled button should be. Numbers are described in frames." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_VSYNC, + "Synchronizes the output video of the graphics card to the refresh rate of the screen. Recommended." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_ALLOW_ROTATE, + "Allow cores to set rotation. When disabled, rotation requests are ignored. Useful for setups where one manually rotates the screen." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_DUMMY_ON_CORE_SHUTDOWN, + "Some cores might have a shutdown feature. If enabled, it will prevent the core from shutting RetroArch down. Instead, it loads a dummy core." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHECK_FOR_MISSING_FIRMWARE, + "Check if all the required firmware is present before attempting to load content." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_REFRESH_RATE, + "Vertical refresh rate of your screen. Used to calculate a suitable audio input rate.\n" + "NOTE: This will be ignored if 'Threaded Video' is enabled." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_ENABLE, + "Determines if audio is outputted." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_MAX_TIMING_SKEW, + "The maximum change in audio input rate. Increasing this enables very large changes in timing at the cost of an inaccurate audio pitch (e.g., running PAL cores on NTSC displays)." + ) +MSG_HASH( + MSG_FAILED, + "failed" + ) +MSG_HASH( + MSG_SUCCEEDED, + "succeeded" + ) +MSG_HASH( + MSG_DEVICE_NOT_CONFIGURED, + "not configured" + ) +MSG_HASH( + MSG_DEVICE_NOT_CONFIGURED_FALLBACK, + "not configured, using fallback" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST, + "Database Cursor List" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_DEVELOPER, + "Database - Filter : Developer" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_PUBLISHER, + "Database - Filter : Publisher" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DISABLED, + "Disabled" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ENABLED, + "Enabled" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_HISTORY_PATH, + "Content History Path" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_ORIGIN, + "Database - Filter : Origin" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_FRANCHISE, + "Database - Filter : Franchise" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_ESRB_RATING, + "Database - Filter : ESRB Rating" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_ELSPA_RATING, + "Database - Filter : ELSPA Rating" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_PEGI_RATING, + "Database - Filter : PEGI Rating" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_CERO_RATING, + "Database - Filter : CERO Rating" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_BBFC_RATING, + "Database - Filter : BBFC Rating" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_MAX_USERS, + "Database - Filter : Max Users" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_RELEASEDATE_BY_MONTH, + "Database - Filter : Releasedate By Month" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_RELEASEDATE_BY_YEAR, + "Database - Filter : Releasedate By Year" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_EDGE_MAGAZINE_ISSUE, + "Database - Filter : Edge Magazine Issue" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_EDGE_MAGAZINE_RATING, + "Database - Filter : Edge Magazine Rating" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_DATABASE_INFO, + "Veritabanı Bilgisi" + ) +MSG_HASH( + MSG_WIFI_SCAN_COMPLETE, + "Wi-Fi taraması tamamlandı." + ) +MSG_HASH( + MSG_SCANNING_WIRELESS_NETWORKS, + "Kablosuz ağları tarama..." + ) +MSG_HASH( + MSG_NETPLAY_LAN_SCAN_COMPLETE, + "Netplay taraması tamamlandı." + ) +MSG_HASH( + MSG_NETPLAY_LAN_SCANNING, + "Netplay sunucuları aranıyor ..." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PAUSE_NONACTIVE, + "RetroArch etkin pencere olmadığında oyunu duraklat." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_DISABLE_COMPOSITION, + "Pencere yöneticileri, görsel efektleri uygulamak, yanıt vermeyen pencereleri tespit etmek için diğer şeylerin yanı sıra bileşimi kullanır." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_HISTORY_LIST_ENABLE, + "Son kullanılan oyunların, resimlerin, müziklerin ve videoların oynatma listesini tutar." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_HISTORY_SIZE, + "Oyunlar, resimler, müzik ve videolar için son oynatma listesindeki giriş sayısını sınırlayın." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_UNIFIED_MENU_CONTROLS, + "Unified Menu Controls" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_UNIFIED_MENU_CONTROLS, + "Use the same controls for both the menu and the game. Applies to the keyboard." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QUIT_PRESS_TWICE, + "Press quit twice" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_QUIT_PRESS_TWICE, + "Press the quit hotkey twice to exit RetroArch." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_FONT_ENABLE, + "Ekrandaki mesajları göster." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETWORK_USER_REMOTE_ENABLE, + "User %d Remote" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BATTERY_LEVEL_ENABLE, + "Show battery level" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SHOW_SUBLABELS, + "Show menu sublabels" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_SHOW_SUBLABELS, + "Shows additional information for the currently selected menu entry." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SELECT_FILE, + "Select File" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_FILTER, + "Filter" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SCALE, + "Scale" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_START_WHEN_LOADED, + "Netplay will start when content is loaded." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_LOAD_CONTENT_MANUALLY, + "Couldn't find a suitable core or content file, load manually." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BROWSE_URL_LIST, + "Browse URL" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BROWSE_URL, + "URL Path" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BROWSE_START, + "Start" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_BOKEH, + "Bokeh" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_SNOWFLAKE, + "Snowflake" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_REFRESH_ROOMS, + "Refresh Room List" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME, + "Nickname: %s" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME_LAN, + "Nickname (lan): %s" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_COMPAT_CONTENT_FOUND, + "Compatible content found" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_CROP_OVERSCAN, + "Cuts off a few pixels around the edges of the image customarily left blank by developers which sometimes also contain garbage pixels." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SMOOTH, + "Adds a slight blur to the image to take the edge off of the hard pixel edges. This option has very little impact on performance." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_FILTER, + "Apply a CPU-powered video filter.\n" + "NOTE: Might come at a high performance cost. Some video filters might only work for cores that use 32bit or 16bit color." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEEVOS_USERNAME, + "RetroAchievements hesabınızın kullanıcı adını girin." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEEVOS_PASSWORD, + "RetroAchievements hesabınızın şifresini girin." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_NICKNAME, + "Kullanıcı adınızı buraya girin. Diğer şeylerin yanı sıra Netplay oturumları için de kullanılacak." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_POST_FILTER_RECORD, + "Filtreler (ancak gölgelendiriciler değil) uygulandıktan sonra görüntüyü çekin. Videonuz, ekranda gördüğünüz kadar süslü görünecek." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_LIST, + "Kullanılacak Core'u seçin." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_START_CORE, + "İçerik olmadan Core'u başlat" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_DOWNLOAD_CORE, + "Çevrimiçi güncelleyiciden bir Core yükleyin." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SIDELOAD_CORE_LIST, + "İndirilen dizinden bir Core kurun ya da geri yükleyin." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_LOAD_CONTENT_LIST, + "Hangi içeriğin başlayacağını seçin." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETWORK_INFORMATION, + "Ağ arayüzlerini ve ilgili IP adreslerini göster." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SYSTEM_INFORMATION, + "Show information specific to the device." + ) +#ifdef HAVE_LAKKA +MSG_HASH( + MENU_ENUM_SUBLABEL_QUIT_RETROARCH, + "Programı yeniden başlat." + ) +#else +MSG_HASH( + MENU_ENUM_SUBLABEL_QUIT_RETROARCH, + "Programdan çık." + ) +#endif +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_WINDOW_WIDTH, + "Set the custom width for the display window." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_WINDOW_HEIGHT, + "Set the custom height for the display window." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_WINDOW_SAVE_POSITION, + "Remember window size and position, enabling this has precedence over Windowed Scale" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_FULLSCREEN_X, + "Set the custom width size for the non-windowed fullscreen mode. Leaving it unset will use the desktop resolution." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_FULLSCREEN_Y, + "Set the custom height size for the non-windowed fullscreen mode. Leaving it unset will use the desktop resolution." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_MESSAGE_POS_X, + "Specify custom X axis position for onscreen text." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_MESSAGE_POS_Y, + "Specify custom Y axis position for onscreen text." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_FONT_SIZE, + "Specify the font size in points." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_OVERLAY_HIDE_IN_MENU, + "Hide the overlay while inside the menu, and show it again when exiting the menu." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_OVERLAY_SHOW_PHYSICAL_INPUTS, + "Show keyboard/controller inputs on the onscreen overlay." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_OVERLAY_SHOW_PHYSICAL_INPUTS_PORT, + "Select the port for the overlay to listen to if Show Inputs On Overlay is enabled." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SCALE_INTEGER, + "Only scales video in integer steps. The base size depends on system-reported geometry and aspect ratio. If 'Force Aspect' is not set, X/Y will be integer scaled independently." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_GPU_SCREENSHOT, + "Screenshots output of GPU shaded material if available." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_ROTATION, + "Forces a certain rotation of the video. The rotation is added to rotations which the core sets." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SCREEN_ORIENTATION, + "Forces a certain orientation of the screen from the operating system." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_FORCE_SRGB_DISABLE, + "Forcibly disable sRGB FBO support. Some Intel OpenGL drivers on Windows have video problems with sRGB FBO support if this is enabled. Enabling this can work around it." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_FULLSCREEN, + "Start in fullscreen. Can be changed at runtime. Can be overridden by a command line switch" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_WINDOWED_FULLSCREEN, + "If fullscreen, prefer using a windowed fullscreen mode." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_GPU_RECORD, + "Records output of GPU shaded material if available." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SAVESTATE_AUTO_INDEX, + "When making a savestate, save state index is automatically increased before it is saved. When loading content, the index will be set to the highest existing index." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_BLOCK_SRAM_OVERWRITE, + "Block Save RAM from being overwritten when loading save states. Might potentially lead to buggy games." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_FASTFORWARD_RATIO, + "The maximum rate at which content will be run when using fast forward (e.g., 5.0x for 60 fps content = 300 fps cap). If set to 0.0x, fastforward ratio is unlimited (no FPS cap)." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SLOWMOTION_RATIO, + "When in slow motion, content will slow down by the factor specified/set." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_RUN_AHEAD_ENABLED, + "Run core logic one or more frames ahead then load the state back to reduce perceived input lag." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_RUN_AHEAD_FRAMES, + "The number of frames to run ahead. Causes gameplay issues such as jitter if you exceed the number of lag frames internal to the game." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_BLOCK_TIMEOUT, + "The number of milliseconds to wait to get a complete input sample, use it if you have issues with simultaneous button presses (Android only)." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_RUN_AHEAD_SECONDARY_INSTANCE, + "Use a second instance of the RetroArch core to run ahead. Prevents audio problems due to loading state." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_RUN_AHEAD_HIDE_WARNINGS, + "Hides the warning message that appears when using RunAhead and the core does not support savestates." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REWIND_ENABLE, + "Made a mistake? Rewind and try again.\n" + "Beware that this causes a performance hit when playing." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_APPLY_AFTER_TOGGLE, + "Apply cheat immediately after toggling." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_APPLY_AFTER_LOAD, + "Auto-apply cheats when game loads." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_REPEAT_COUNT, + "The number of times the cheat will be applied.\n" + "Use with the other two Iteration options to affect large areas of memory." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_REPEAT_ADD_TO_ADDRESS, + "After each 'Number of Iterations' the Memory Address will be increased by this number times the 'Memory Search Size'." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_REPEAT_ADD_TO_VALUE, + "After each 'Number of Iterations' the Value will be increased by this amount." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REWIND_GRANULARITY, + "When rewinding a defined number of frames, you can rewind several frames at a time, increasing the rewind speed." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REWIND_BUFFER_SIZE, + "The amount of memory (in MB) to reserve for the rewind buffer. Increasing this will increase the amount of rewind history." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REWIND_BUFFER_SIZE_STEP, + "Each time you increase or decrease the rewind buffer size value via this UI it will change by this amount" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_IDX, + "Index position in list." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_ADDRESS_BIT_POSITION, + "Address bitmask when Memory Search Size < 8-bit." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_MATCH_IDX, + "Select the match to view." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_START_OR_CONT, + "" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_START_OR_RESTART, + "Left/Right to change bit-size" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_SEARCH_EXACT, + "Left/Right to change value" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_SEARCH_LT, + "" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_SEARCH_GT, + "" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_SEARCH_LTE, + "" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_SEARCH_GTE, + "" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_SEARCH_EQ, + "" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_SEARCH_NEQ, + "" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_SEARCH_EQPLUS, + "Left/Right to change value" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_SEARCH_EQMINUS, + "Left/Right to change value" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_ADD_MATCHES, + "" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_VIEW_MATCHES, + "" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_CREATE_OPTION, + "" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_DELETE_OPTION, + "" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_ADD_NEW_TOP, + "" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_ADD_NEW_BOTTOM, + "" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_DELETE_ALL, + "" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_RELOAD_CHEATS, + "" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_BIG_ENDIAN, + "Big endian : 258 = 0x0102,\n" + "Little endian : 258 = 0x0201" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_LIBRETRO_LOG_LEVEL, + "Sets log level for cores. If a log level issued by a core is below this value, it is ignored." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PERFCNT_ENABLE, + "Performance counters for RetroArch (and cores).\n" + "The counter data can help determine system bottlenecks and fine-tune system and application performance" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SAVESTATE_AUTO_SAVE, + "Automatically makes a savestate at the end of RetroArch's runtime. RetroArch will automatically load this savestate if 'Auto Load State' is enabled." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SAVESTATE_AUTO_LOAD, + "Automatically load the auto save state on startup." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SAVESTATE_THUMBNAIL_ENABLE, + "Show thumbnails of save states inside the menu." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUTOSAVE_INTERVAL, + "Autosaves the non-volatile Save RAM at a regular interval. This is disabled by default unless set otherwise. The interval is measured in seconds. A value of 0 disables autosave." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_REMAP_BINDS_ENABLE, + "If enabled, overrides the input binds with the remapped binds set for the current core." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_AUTODETECT_ENABLE, + "If enabled attempts to autoconfigure controllers, Plug-and-Play style." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_INPUT_SWAP_OK_CANCEL, + "Swap buttons for OK/Cancel. Disabled is the Japanese button orientation, enabled is the western orientation." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PAUSE_LIBRETRO, + "If disabled, the content will keep running in the background when RetroArch's menu is toggled." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_DRIVER, + "Video driver to use." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_DRIVER, + "Audio driver to use." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DRIVER, + "Kullanılacak giriş sürücüsü. Video sürücüsüne bağlı olarak, farklı bir giriş sürücüsünü zorlayabilir." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_JOYPAD_DRIVER, + "kullanılacak Joypad sürücüsü." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_RESAMPLER_DRIVER, + "Audio resampler driver to use." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CAMERA_DRIVER, + "Kullanılacak kamera sürücüsü." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_LOCATION_DRIVER, + "Kullanılacak konum sürücüsü." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_DRIVER, + "Kullanılacak menü sürücüsü." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_RECORD_DRIVER, + "Kullanılacak kayıt sürücüsü." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MIDI_DRIVER, + "Kullanılacak MIDI sürücüsü." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_WIFI_DRIVER, + "Kullanılacak WiFi sürücüsü." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE, + "Filter files being shown in filebrowser by supported extensions." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_WALLPAPER, + "Select an image to set as menu wallpaper." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_DYNAMIC_WALLPAPER, + "Dynamically load a new wallpaper depending on context." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_DEVICE, + "Override the default audio device the audio driver uses. This is driver dependent." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_DSP_PLUGIN, + "Audio DSP plugin that processes audio before it's sent to the driver." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_OUTPUT_RATE, + "Audio output sample rate." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OVERLAY_OPACITY, + "Opacity of all UI elements of the overlay." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OVERLAY_SCALE, + "Scale of all UI elements of the overlay." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_OVERLAY_ENABLE, + "Overlays are used for borders and on-screen controls" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OVERLAY_PRESET, + "Select an overlay from the file browser." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_IP_ADDRESS, + "The address of the host to connect to." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_TCP_UDP_PORT, + "The port of the host IP address. Can be either a TCP or UDP port." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_PASSWORD, + "The password for connecting to the netplay host. Used only in host mode." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_PUBLIC_ANNOUNCE, + "Whether to announce netplay games publicly. If unset, clients must manually connect rather than using the public lobby." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_SPECTATE_PASSWORD, + "The password for connecting to the netplay host with only spectator privileges. Used only in host mode." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_START_AS_SPECTATOR, + "Whether to start netplay in spectator mode." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_ALLOW_SLAVES, + "Whether to allow connections in slave mode. Slave-mode clients require very little processing power on either side, but will suffer significantly from network latency." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_REQUIRE_SLAVES, + "Whether to disallow connections not in slave mode. Not recommended except for very fast networks with very weak machines." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_STATELESS_MODE, + "Whether to run netplay in a mode not requiring save states. If set to true, a very fast network is required, but no rewinding is performed, so there will be no netplay jitter." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_CHECK_FRAMES, + "The frequency in frames with which netplay will verify that the host and client are in sync." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_NAT_TRAVERSAL, + "When hosting, attempt to listen for connections from the public Internet, using UPnP or similar technologies to escape LANs." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_STDIN_CMD_ENABLE, + "stdin command interface." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MOUSE_ENABLE, + "Allows the menu to be controlled with the mouse." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_POINTER_ENABLE, + "Allows the menu to be controlled with screen touches." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_THUMBNAILS, + "Type of thumbnail to display." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_THUMBNAILS_RGUI, + "Type of thumbnail to display at the top right of playlists. This thumbnail may be toggled fullscreen by pressing RetroPad Y." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_LEFT_THUMBNAILS, + "Type of thumbnail to display at the left." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_LEFT_THUMBNAILS_RGUI, + "Type of thumbnail to display at the bottom right of playlists." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_LEFT_THUMBNAILS_OZONE, + "Replace the content metadata panel by another thumbnail." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_XMB_VERTICAL_THUMBNAILS, + "Display the left thumbnail under the right one, on the right side of the screen." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_TIMEDATE_ENABLE, + "Shows current date and/or time inside the menu." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_BATTERY_LEVEL_ENABLE, + "Shows current battery level inside the menu." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NAVIGATION_WRAPAROUND, + "Wrap-around to beginning and/or end if boundary of list is reached horizontally or vertically." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_ENABLE_HOST, + "Enables netplay in host (server) mode." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_ENABLE_CLIENT, + "Netplay sunucu adresini girin ve istemci modunda bağlanın." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_DISCONNECT, + "Disconnects an active Netplay connection." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SCAN_DIRECTORY, + "Uyumlu içerik için bir dizin tarar. Bulunduğunda, içerik oynatma listesine eklenir." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SCAN_FILE, + "Uyumlu içerik için bir dosyayı tarar. Bulunduğunda, içerik oynatma listesine eklenir." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SWAP_INTERVAL, + "Uses a custom swap interval for Vsync. Set this to effectively halve monitor refresh rate." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SORT_SAVEFILES_ENABLE, + "Sort save files in folders named after the core used." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SORT_SAVESTATES_ENABLE, + "Sort save states in folders named after the core used." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_REQUEST_DEVICE_I, + "Request to play with the given input device." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_UPDATER_BUILDBOT_URL, + "URL to core updater directory on the Libretro buildbot." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_BUILDBOT_ASSETS_URL, + "URL to assets updater directory on the Libretro buildbot." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_UPDATER_AUTO_EXTRACT_ARCHIVE, + "İndirdikten sonra, indirilen arşivlerde bulunan dosyaları otomatik olarak çıkartın." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_REFRESH_ROOMS, + "Yeni odalar için tarayın." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_DELETE_ENTRY, + "Bu girişi Oyatma listesinden kaldır." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INFORMATION, + "İçerikle ilgili daha fazla bilgi görüntüleyin." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_ADD_TO_FAVORITES, + "Girişi favorilerinize ekleyin." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_ADD_TO_FAVORITES_PLAYLIST, + "Girdiyi favorilerinize ekleyin." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_RUN, + "İçeriği çalıştırın." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_FILE_BROWSER_SETTINGS, + "Filebrowser ayarlarını düzenler." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUTO_REMAPS_ENABLE, + "Özelleştirilmiş kontrolleri başlangıçta yükleyin." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUTO_OVERRIDES_ENABLE, + "Özelleştirilmiş yapılandırmayı başlangıçta yükleyin." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_GAME_SPECIFIC_OPTIONS, + "Özelleştirilmiş Core seçeneklerini başlangıçta varsayılan olarak yükleyin." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_ENABLE, + "Menüdeki geçerli Core adını gösterir." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_DATABASE_MANAGER, + "Veritabanlarını görüntüle." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CURSOR_MANAGER, + "Önceki aramaları görüntüle." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_TAKE_SCREENSHOT, + "Ekranın görüntüsünü yakalar." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CLOSE_CONTENT, + "Closes the current content. Any unsaved changes might be lost." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_LOAD_STATE, + "Load a saved state from the currently selected slot." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SAVE_STATE, + "Save a state to the currently selected slot." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_RESUME, + "Çalışmakta olan içeriği devam ettirin ve Hızlı Menüden çıkın." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_RESUME_CONTENT, + "Çalışmakta olan içeriği devam ettirin ve Hızlı Menüden çıkın." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_STATE_SLOT, + "Changes the currently selected state slot." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_UNDO_LOAD_STATE, + "If a state was loaded, content will go back to the state prior to loading." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_UNDO_SAVE_STATE, + "If a state was overwritten, it will roll back to the previous save state." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_ACCOUNTS_RETRO_ACHIEVEMENTS, + "RetroAchievements hizmeti. Daha fazla bilgi için http://retroachievements.org adresini ziyaret edin." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_ACCOUNTS_LIST, + "Yapılandırılmış hesapları yönetir." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_META_REWIND, + "Geri sarma ayarlarını yönetir." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_META_CHEAT_DETAILS, + "Hile ayrıntıları ayarlarını yönetir." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_META_CHEAT_SEARCH, + "Hile kodu aramayı başlatın veya devam edin." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_RESTART_CONTENT, + "İçeriği baştan yeniden başlatır." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CORE, + "Core'da yüklü olan tüm içerik için geçerli olacak bir üzerine yazma dosyasını kaydeder. Ana yapılandırmadan öncelikli olacaktır." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR, + "Saves an override configuration file which will apply for all content loaded from the same directory as the current file. Will take precedence over the main configuration." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SAVE_CURRENT_CONFIG_OVERRIDE_GAME, + "Saves an override configuration file which will apply for the current content only. Will take precedence over the main configuration." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_CHEAT_OPTIONS, + "Set up cheat codes." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SHADER_OPTIONS, + "Set up shaders to visually augment the image." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_INPUT_REMAPPING_OPTIONS, + "Change the controls for the currently running content." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_OPTIONS, + "Change the options for the currently running content." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SHOW_ADVANCED_SETTINGS, + "Show advanced settings for power users (hidden by default)." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_THREADED_DATA_RUNLOOP_ENABLE, + "Perform tasks on a separate thread." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_REMOVE, + "Kullanıcının girişleri listelerden kaldırmasına izin ver." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SYSTEM_DIRECTORY, + "Sets the System directory. Cores can query for this directory to load BIOSes, system-specific configs, etc." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_RGUI_BROWSER_DIRECTORY, + "Sets start directory for the filebrowser." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_DIR, + "Usually set by developers who bundle libretro/RetroArch apps to point to assets." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_DYNAMIC_WALLPAPERS_DIRECTORY, + "Directory to store wallpapers dynamically loaded by the menu depending on context." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_THUMBNAILS_DIRECTORY, + "Supplementary thumbnails (boxarts/misc. images, etc.) are stored here." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_RGUI_CONFIG_DIRECTORY, + "Sets start directory for menu configuration browser." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_INPUT_LATENCY_FRAMES_MIN, + "The number of frames of input latency for netplay to use to hide network latency. Reduces jitter and makes netplay less CPU-intensive, at the expense of noticeable input lag." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_INPUT_LATENCY_FRAMES_RANGE, + "The range of frames of input latency that may be used to hide network latency. Reduces jitter and makes netplay less CPU-intensive, at the expense of unpredictable input lag." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_DISK_CYCLE_TRAY_STATUS, + "Cycle the current disk. If the disk is inserted, it will eject the disk. If the disk has not been inserted, it will be inserted. " + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_DISK_INDEX, + "Change the disk index." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_DISK_OPTIONS, + "Disk image management." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_DISK_IMAGE_APPEND, + "Select a disk image to insert." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_ENUM_THROTTLE_FRAMERATE, + "Makes sure the framerate is capped while inside the menu." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VRR_RUNLOOP_ENABLE, + "No deviation from core requested timing. Use for Variable Refresh Rate screens, G-Sync, FreeSync." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_XMB_LAYOUT, + "Select a different layout for the XMB interface." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_XMB_THEME, + "Select a different icon theme for RetroArch." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_XMB_SHADOWS_ENABLE, + "Draw drop shadows for all icons.\n" + "This will have a minor performance hit." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MATERIALUI_MENU_COLOR_THEME, + "Select a different background color gradient theme." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_WALLPAPER_OPACITY, + "Modify the opacity of the background wallpaper." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_XMB_MENU_COLOR_THEME, + "Select a different background color gradient theme." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_XMB_RIBBON_ENABLE, + "Select an animated background effect. Can be GPU-intensive depending on the effect. If performance is unsatisfactory, either turn this off or revert to a simpler effect." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_XMB_FONT, + "Select a different main font to be used by the menu." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES, + "Show the favorites tab inside the main menu." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_SHOW_IMAGES, + "Show the image tab inside the main menu." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_SHOW_MUSIC, + "Show the music tab inside the main menu." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_SHOW_VIDEO, + "Show the video tab inside the main menu." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_SHOW_NETPLAY, + "Show the netplay tab inside the main menu." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS, + "Show the settings tab inside the main menu." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_SHOW_HISTORY, + "Show the recent history tab inside the main menu." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_SHOW_ADD, + "Show the import content tab inside the main menu." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_SHOW_PLAYLISTS, + "Show playlist tabs inside the main menu." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_RGUI_SHOW_START_SCREEN, + "Show startup screen in menu. This is automatically set to false after the program starts for the first time." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MATERIALUI_MENU_HEADER_OPACITY, + "Modify the opacity of the header graphic." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MATERIALUI_MENU_FOOTER_OPACITY, + "Modify the opacity of the footer graphic." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_DPI_OVERRIDE_ENABLE, + "The menu normally scales itself dynamically. If you want to set a specific scaling size instead, enable this." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_DPI_OVERRIDE_VALUE, + "Set the custom scaling size here.\n" + "NOTE: You have to enable 'DPI Override' for this scaling size to take effect." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_ASSETS_DIRECTORY, + "Save all downloaded files to this directory." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_REMAPPING_DIRECTORY, + "Save all remapped controls to this directory." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_LIBRETRO_DIR_PATH, + "Directory where the program searches for content/cores." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_LIBRETRO_INFO_PATH, + "Application/core information files are stored here." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_JOYPAD_AUTOCONFIG_DIR, + "If a joypad is plugged in, that joypad will be autoconfigured if a config file corresponding to it is present inside this directory." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PLAYLIST_DIRECTORY, + "Save all playlists to this directory." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CACHE_DIRECTORY, + "If set to a directory, content which is temporarily extracted (e.g. from archives) will be extracted to this directory." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CURSOR_DIRECTORY, + "Saved queries are stored to this directory." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_DATABASE_DIRECTORY, + "Databases are stored to this directory." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_ASSETS_DIRECTORY, + "This location is queried by default when menu interfaces try to look for loadable assets, etc." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SAVEFILE_DIRECTORY, + "Save all save files to this directory. If not set, will try to save inside the content file's working directory." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SAVESTATE_DIRECTORY, + "Save all save states to this directory. If not set, will try to save inside the content file's working directory." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SCREENSHOT_DIRECTORY, + "Directory to dump screenshots to." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OVERLAY_DIRECTORY, + "Defines a directory where overlays are kept for easy access." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_DATABASE_PATH, + "Cheat files are kept here." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_FILTER_DIR, + "Directory where audio DSP filter files are kept." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_FILTER_DIR, + "Directory where CPU-based video filter files are kept." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SHADER_DIR, + "Defines a directory where GPU-based video shader files are kept for easy access." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_RECORDING_OUTPUT_DIRECTORY, + "Recordings will be dumped to this directory." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_RECORDING_CONFIG_DIRECTORY, + "Recording configurations will be kept here." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_FONT_PATH, + "Select a different font for onscreen notifications." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SHADER_APPLY_CHANGES, + "Changes to the shader configuration will take effect immediately. Use this if you changed the amount of shader passes, filtering, FBO scale, etc." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SHADER_NUM_PASSES, + "Increase or decrease the amount of shader pipeline passes. You can bind a separate shader to each pipeline pass and configure its scale and filtering." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET, + "Load a shader preset. The shader pipeline will be automatically set-up." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_SAVE_AS, + "Save the current shader settings as a new shader preset." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_SAVE_CORE, + "Save the current shader settings as the default settings for this application/core." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_SAVE_PARENT, + "Save the current shader settings as the default settings for all files in the current content directory." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_SAVE_GAME, + "Save the current shader settings as the default settings for the content." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SHADER_PARAMETERS, + "Modifies the current shader directly. Changes will not be saved to the preset file." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_PARAMETERS, + "Modifies the shader preset itself currently used in the menu." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_NUM_PASSES, + "Increase or decrease the amount of cheats." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_APPLY_CHANGES, + "Cheat changes will take effect immediately." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_START_SEARCH, + "Start search for a new cheat. Number of bits can be changed." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_CONTINUE_SEARCH, + "Continue search for a new cheat." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_FILE_LOAD, + "Load a cheat file and replace existing cheats." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_FILE_LOAD_APPEND, + "Load a cheat file and append to existing cheats." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_FILE_SAVE_AS, + "Save current cheats as a save file." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_SETTINGS, + "Quickly access all relevant in-game settings." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_INFORMATION, + "View information pertaining to the application/core." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_ASPECT_RATIO, + "Floating point value for video aspect ratio (width / height), used if the Aspect Ratio is set to 'Config'." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_HEIGHT, + "Custom viewport height that is used if the Aspect Ratio is set to 'Custom'." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_WIDTH, + "Custom viewport width that is used if the Aspect Ratio is set to 'Custom'." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_X, + "Custom viewport offset used for defining the X-axis position of the viewport. These are ignored if 'Integer Scale' is enabled. It will be automatically centered then." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y, + "Custom viewport offset used for defining the Y-axis position of the viewport. These are ignored if 'Integer Scale' is enabled. It will be automatically centered then." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_USE_MITM_SERVER, + "Use Relay Server" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_USE_MITM_SERVER, + "Forward netplay connections through a man-in-the-middle server. Useful if the host is behind a firewall or has NAT/UPnP problems." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_MITM_SERVER, + "Relay Server Location" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_MITM_SERVER, + "Choose a specific relay server to use. Geographically closer locations tend to have lower latency." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ADD_TO_MIXER, + "Add to mixer" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ADD_TO_MIXER_AND_PLAY, + "Add to mixer and play" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ADD_TO_MIXER_AND_COLLECTION, + "Add to mixer" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ADD_TO_MIXER_AND_COLLECTION_AND_PLAY, + "Add to mixer and play" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_FILTER_BY_CURRENT_CORE, + "Filter by current core" + ) +MSG_HASH( + MSG_AUDIO_MIXER_VOLUME, + "Global audio mixer volume" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_MIXER_VOLUME, + "Global audio mixer volume (in dB). 0 dB is normal volume, and no gain is applied." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_MIXER_VOLUME, + "Mixer Volume Gain (dB)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_MIXER_MUTE, + "Mixer Mute" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_MIXER_MUTE, + "Mute/unmute mixer audio." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SHOW_ONLINE_UPDATER, + "Show Online Updater" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_SHOW_ONLINE_UPDATER, + "Show/hide the 'Online Updater' option." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_VIEWS_SETTINGS, + "Views" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_VIEWS_SETTINGS, + "Show or hide elements on the menu screen." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SHOW_CORE_UPDATER, + "Show Core Updater" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_SHOW_CORE_UPDATER, + "Show/hide the ability to update cores (and core info files)." + ) +MSG_HASH( + MSG_PREPARING_FOR_CONTENT_SCAN, + "Preparing for content scan..." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_DELETE, + "Delete core" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_DELETE, + "Remove this core from disk." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_FRAMEBUFFER_OPACITY, + "Framebuffer Opacity" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_FRAMEBUFFER_OPACITY, + "Modify the opacity of the framebuffer." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_GOTO_FAVORITES, + "Favorites" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_GOTO_FAVORITES, + "Content which you have added to 'Favorites' will appear here." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_GOTO_MUSIC, + "Music" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_GOTO_MUSIC, + "Music which has been previously played will appear here." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_GOTO_IMAGES, + "Image" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_GOTO_IMAGES, + "Images which have been previously viewed will appear here." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_GOTO_VIDEO, + "Video" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_GOTO_VIDEO, + "Videos which have been previously played will appear here." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MATERIALUI_ICONS_ENABLE, + "Menu Icons" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MATERIALUI_ICONS_ENABLE, + "Show icons at the left of the menu entries." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_XMB_MAIN_MENU_ENABLE_SETTINGS, + "Settings Tab" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_SETTINGS_PASSWORD, + "Set Password For Enabling Settings Tab" + ) +MSG_HASH( + MSG_INPUT_ENABLE_SETTINGS_PASSWORD, + "Enter Password" + ) +MSG_HASH( + MSG_INPUT_ENABLE_SETTINGS_PASSWORD_OK, + "Password correct." + ) +MSG_HASH( + MSG_INPUT_ENABLE_SETTINGS_PASSWORD_NOK, + "Password incorrect." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_XMB_MAIN_MENU_ENABLE_SETTINGS, + "Enables the Settings tab. A restart is required for the tab to appear." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS_PASSWORD, + "Supplying a password when hiding the settings tab makes it possible to later restore it from the menu, by going to the Main Menu tab, selecting Enable Settings Tab and entering the password." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_RENAME, + "Allow the user to rename entries in playlists." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_RENAME, + "Allow to rename entries" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_RENAME_ENTRY, + "Rename the title of the entry." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RENAME_ENTRY, + "Rename" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SHOW_LOAD_CORE, + "Show Load Core" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_SHOW_LOAD_CORE, + "Show/hide the 'Load Core' option." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SHOW_LOAD_CONTENT, + "Show Load Content" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_SHOW_LOAD_CONTENT, + "Show/hide the 'Load Content' option." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SHOW_INFORMATION, + "Show Information" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_SHOW_INFORMATION, + "Show/hide the 'Information' option." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SHOW_CONFIGURATIONS, + "Show Configuration File" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_SHOW_CONFIGURATIONS, + "Show/hide the 'Configuration File' option." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SHOW_HELP, + "Show Help" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_SHOW_HELP, + "Show/hide the 'Help' option." + ) +#ifdef HAVE_LAKKA +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SHOW_QUIT_RETROARCH, + "Show Restart RetroArch" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_SHOW_QUIT_RETROARCH, + "Show/hide the 'Restart RetroArch' option." + ) +#else +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SHOW_QUIT_RETROARCH, + "Show Quit RetroArch" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_SHOW_QUIT_RETROARCH, + "Show/hide the 'Quit RetroArch' option." + ) +#endif +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SHOW_REBOOT, + "Show Reboot" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_SHOW_REBOOT, + "Show/hide the 'Reboot' option." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SHOW_SHUTDOWN, + "Show Shutdown" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_SHOW_SHUTDOWN, + "Show/hide the 'Shutdown' option." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QUICK_MENU_VIEWS_SETTINGS, + "Quick Menu" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_QUICK_MENU_VIEWS_SETTINGS, + "Show or hide elements on the Quick Menu screen." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_TAKE_SCREENSHOT, + "Show Take Screenshot" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_TAKE_SCREENSHOT, + "Show/hide the 'Take Screenshot' option." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SAVE_LOAD_STATE, + "Show Save/Load State" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SAVE_LOAD_STATE, + "Show/hide the options for saving/loading state." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_UNDO_SAVE_LOAD_STATE, + "Show Undo Save/Load State" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_UNDO_SAVE_LOAD_STATE, + "Show/hide the options for undoing save/load state." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_ADD_TO_FAVORITES, + "Show Add to Favorites" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_ADD_TO_FAVORITES, + "Show/hide the 'Add to Favorites' option." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_START_RECORDING, + "Show Start Recording" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_START_RECORDING, + "Show/hide the 'Start Recording' option." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_START_STREAMING, + "Show Start Streaming" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_START_STREAMING, + "Show/hide the 'Start Streaming' option." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_RESET_CORE_ASSOCIATION, + "Show Reset Core Association" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_RESET_CORE_ASSOCIATION, + "Show/hide the 'Reset Core Association' option." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_OPTIONS, + "Show Options" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_OPTIONS, + "Show/hide the 'Options' option." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_CONTROLS, + "Show Controls" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_CONTROLS, + "Show/hide the 'Controls' option." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_CHEATS, + "Show Cheats" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_CHEATS, + "Show/hide the 'Cheats' option." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SHADERS, + "Show Shaders" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SHADERS, + "Show/hide the 'Shaders' option." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SAVE_CORE_OVERRIDES, + "Show Save Core Overrides" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SAVE_CORE_OVERRIDES, + "Show/hide the 'Save Core Overrides' option." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SAVE_GAME_OVERRIDES, + "Show Save Game Overrides" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SAVE_GAME_OVERRIDES, + "Show/hide the 'Save Game Overrides' option." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_INFORMATION, + "Show Information" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_INFORMATION, + "Show/hide the 'Information' option." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_ENABLE, + "Notification Background" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_RED, + "Notification Background Red Color" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_GREEN, + "Notification Background Green Color" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_BLUE, + "Notification Background Blue Color" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_OPACITY, + "Notification Background Opacity" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_DISABLE_KIOSK_MODE, + "Disable Kiosk Mode" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_DISABLE_KIOSK_MODE, + "Disables kiosk mode. A restart is required for the change to take full effect." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_ENABLE_KIOSK_MODE, + "Kiosk Mode" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_ENABLE_KIOSK_MODE, + "Protects the setup by hiding all configuration related settings." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_KIOSK_MODE_PASSWORD, + "Set Password For Disabling Kiosk Mode" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_KIOSK_MODE_PASSWORD, + "Supplying a password when enabling kiosk mode makes it possible to later disable it from the menu, by going to the Main Menu, selecting Disable Kiosk Mode and entering the password." + ) +MSG_HASH( + MSG_INPUT_KIOSK_MODE_PASSWORD, + "Enter Password" + ) +MSG_HASH( + MSG_INPUT_KIOSK_MODE_PASSWORD_OK, + "Password correct." + ) +MSG_HASH( + MSG_INPUT_KIOSK_MODE_PASSWORD_NOK, + "Password incorrect." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_COLOR_RED, + "Notification Red Color" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_COLOR_GREEN, + "Notification Green Color" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_COLOR_BLUE, + "Notification Blue Color" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_FRAMECOUNT_SHOW, + "Display Frame Count" + ) +MSG_HASH( + MSG_CONFIG_OVERRIDE_LOADED, + "Configuration override loaded." + ) +MSG_HASH( + MSG_GAME_REMAP_FILE_LOADED, + "Game remap file loaded." + ) +MSG_HASH( + MSG_CORE_REMAP_FILE_LOADED, + "Core remap file loaded." + ) +MSG_HASH( + MSG_RUNAHEAD_CORE_DOES_NOT_SUPPORT_SAVESTATES, + "RunAhead has been disabled because this core does not support save states." + ) +MSG_HASH( + MSG_RUNAHEAD_FAILED_TO_SAVE_STATE, + "Failed to save state. RunAhead has been disabled." + ) +MSG_HASH( + MSG_RUNAHEAD_FAILED_TO_LOAD_STATE, + "Failed to load state. RunAhead has been disabled." + ) +MSG_HASH( + MSG_RUNAHEAD_FAILED_TO_CREATE_SECONDARY_INSTANCE, + "Failed to create second instance. RunAhead will now use only one instance." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, + "Automatically add content to playlists" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, + "Automatically scans loaded content with the playlist scanner." + ) +MSG_HASH( + MSG_SCANNING_OF_FILE_FINISHED, + "Scanning of file finished" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_WINDOW_OPACITY, + "Window Opacity" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_RESAMPLER_QUALITY, + "Resampler Quality" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_RESAMPLER_QUALITY, + "Lower this value to favor performance/lower latency over audio quality, increase if you want better audio quality at the expense of performance/lower latency." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SHADER_WATCH_FOR_CHANGES, + "Watch shader files for changes" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SHADER_WATCH_FOR_CHANGES, + "Auto-apply changes made to shader files on disk." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_WINDOW_SHOW_DECORATIONS, + "Show Window Decorations" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_STATISTICS_SHOW, + "İstatistikleri göster" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_STATISTICS_SHOW, + "Ekrandaki teknik istatistikleri göster." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_RGUI_BORDER_FILLER_ENABLE, + "Border filler" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_RGUI_BORDER_FILLER_ENABLE, + "Display menu border." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_RGUI_BORDER_FILLER_THICKNESS_ENABLE, + "Border filler thickness" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_RGUI_BORDER_FILLER_THICKNESS_ENABLE, + "Increase coarseness of menu border chequerboard pattern." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_RGUI_BACKGROUND_FILLER_THICKNESS_ENABLE, + "Background filler thickness" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_RGUI_BACKGROUND_FILLER_THICKNESS_ENABLE, + "Increase coarseness of menu background chequerboard pattern." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_RGUI_ASPECT_RATIO_LOCK, + "Lock Menu Aspect Ratio" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_RGUI_ASPECT_RATIO_LOCK, + "Ensures that the menu is always displayed with the correct aspect ratio. If disabled, the quick menu will be stretched to match the currently loaded content." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_RGUI_INTERNAL_UPSCALE_LEVEL, + "Internal Upscaling" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_RGUI_INTERNAL_UPSCALE_LEVEL, + "Upscale menu interface before drawing to screen. When used with 'Menu Linear Filter' enabled, removes scaling artefacts (uneven pixels) while maintaining a sharp image. Has a significant performance impact that increases with upscaling level." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_RGUI_ASPECT_RATIO, + "Menu Aspect Ratio" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_RGUI_ASPECT_RATIO, + "Select menu aspect ratio. Widescreen ratios increase the horizontal resolution of the menu interface. (May require a restart if 'Lock Menu Aspect Ratio' is disabled)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_RGUI_FULL_WIDTH_LAYOUT, + "Use Full-Width Layout" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_RGUI_FULL_WIDTH_LAYOUT, + "Resize and position menu entries to make best use of available screen space. Disable this to use classic fixed-width two column layout." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_RGUI_SHADOWS, + "Shadow Effects" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_RGUI_SHADOWS, + "Enable drop shadows for menu text, borders and thumbnails. Has a modest performance impact." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CRT_SWITCH_RESOLUTION, + "For 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, + "Switch among native and ultrawide super resolutions." + ) +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, + "Show/hide the Rewind options." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_SHOW_LATENCY, + "Show/hide the Latency options." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_LATENCY, + "Show Latency Settings" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_SHOW_OVERLAYS, + "Show/hide the Overlay options." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_OVERLAYS, + "Show Overlay Settings" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_ENABLE_MENU, + "Mixer" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_ENABLE_MENU, + "Play simultaneous audio streams even in the menu." + ) +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_SHADER_PARAMS, + "Shader Parameters" + ) +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_MENU_TOOLS, + "&Tools" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_MENU_HELP, + "&Yardım" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_MENU_HELP_ABOUT, + "RetroArch Hakkında" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_MENU_HELP_DOCUMENTATION, + "Documentation" + ) +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, + "Oynatma listeleri" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_TAB_FILE_BROWSER, + "Dosya tarayıcısı" + ) +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, + "İçerik Tarayıcı" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_THUMBNAIL_BOXART, + "Boxart" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_THUMBNAIL_SCREENSHOT, + "Ekran görütüsü" + ) +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 Bilgisi" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_CORE_SELECTION_ASK, + "" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_INFORMATION, + "Bilgi" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_WARNING, + "Uyarı" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_ERROR, + "Hata" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_NETWORK_ERROR, + "Ağ hatası" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_RESTART_TO_TAKE_EFFECT, + "Değişikliklerin etkili olması için lütfen programı yeniden başlatın." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_LOG, + "Günlük" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_ITEMS_COUNT, + "%1 items" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_DROP_IMAGE_HERE, + "Resmi buraya bırakın" + ) +#ifdef HAVE_QT +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_SCAN_FINISHED, + "Tarama bitti.

\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." + ) +#endif +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SHOW_WIMP, + "Masaüstü Menüsünü Göster" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SHOW_WIMP, + "Kapalıysa, masaüstü menüsünü açar." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_DONT_SHOW_AGAIN, + "Bunu bir daha gösterme" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_STOP, + "Durdur" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_ASSOCIATE_CORE, + "Bağdaştırılmış Core" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_HIDDEN_PLAYLISTS, + "Hidden Playlists" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_HIDE, + "Sakla" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_HIGHLIGHT_COLOR, + "Highlight color:" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_CHOOSE, + "&Seç..." + ) +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, + "Dosya yolu boş." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_FILE_IS_EMPTY, + "Dosya boş." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_FILE_READ_OPEN_FAILED, + "Dosya okumak için açılamadı." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_FILE_WRITE_OPEN_FAILED, + "Dosya yazmak için açılamadı." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_FILE_DOES_NOT_EXIST, + "Dosya bulunmuyor." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_SUGGEST_LOADED_CORE_FIRST, + "Suggest loaded core first:" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_ZOOM, + "Zoom" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_VIEW, + "View" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_VIEW_TYPE_ICONS, + "İkonlar" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_VIEW_TYPE_LIST, + "Liste" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QUICK_MENU_OVERRIDE_OPTIONS, + "Overrides" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_QUICK_MENU_OVERRIDE_OPTIONS, + "Options for overriding the global configuration." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MIXER_ACTION_PLAY, + "Ses akışının oynatılmasını başlatır. Tamamlandığında, mevcut ses akışını bellekten kaldıracak." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MIXER_ACTION_PLAY_LOOPED, + "Ses akışının oynatılmasını başlatır. Tamamlandığında, tekrar baştan başlayıp tekrar çalmaya başlayacaktır." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MIXER_ACTION_PLAY_SEQUENTIAL, + "Ses akışının oynatılmasını başlatır. Tamamlandığında, sıralı sırayla bir sonraki ses akışına atlar ve bu davranışı tekrarlar. Albüm çalma modu olarak kullanışlıdır." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MIXER_ACTION_STOP, + "Ses akışının çalınmasını durdurur, ancak bellekten çıkarmaz. 'Oynat' seçeneğini seçerek tekrar oynamaya başlayabilirsiniz." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MIXER_ACTION_REMOVE, + "Ses akışının çalınmasını durdurur ve tamamen bellekten kaldırır." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MIXER_ACTION_VOLUME, + "Ses akışının sesini ayarlayın." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_ADD_TO_MIXER, + "Ses parçasını kullanılabilir bir ses akışı yuvasına ekleyin. Şu anda mevcut slot bulunmuyorsa, dikkate alınmaz." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_ADD_TO_MIXER_AND_PLAY, + "Ses parçasını kullanılabilir bir ses akışı yuvasına ekleyin ve oynatın. Şu anda mevcut slot bulunmuyorsa, dikkate alınmaz." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MIXER_ACTION_PLAY, + "Oynat" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MIXER_ACTION_PLAY_LOOPED, + "Oynat (Döngüsel)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MIXER_ACTION_PLAY_SEQUENTIAL, + "Oynat (Ardışık)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MIXER_ACTION_STOP, + "Durdur" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MIXER_ACTION_REMOVE, + "Kaldır" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MIXER_ACTION_VOLUME, + "Ses" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DETECT_CORE_LIST_OK_CURRENT_CORE, + "Geçerli Core" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_MENU_SEARCH_CLEAR, + "Temizle" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_ACHIEVEMENT_PAUSE, + "Mevcut oturum için başarıları duraklatın (Bu işlem konum kaydetmeleri, hileleri, geri sarma, duraklatma ve slow-motion etkinleştirir)." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_ACHIEVEMENT_RESUME, + "Mevcut oturum için başarıları sürdürün (Bu işlem konum kaydetmeleri, hileleri, geri sarma, duraklatma ve slow-motion'ı devre dışı bırakır ve mevcut oyunu sıfırlar)." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DISCORD_IN_MENU, + "Menü-İçinde" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DISCORD_IN_GAME, + "Oyun-İçinde" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DISCORD_IN_GAME_PAUSED, + "Oyun-İçinde (Durdurulduğunda)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DISCORD_STATUS_PLAYING, + "Oynatılıyor" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DISCORD_STATUS_PAUSED, + "Durduruldu" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DISCORD_ALLOW, + "Discord Rich Presence" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_DISCORD_ALLOW, + "Discord uygulamasının, oynatılan içerik hakkında daha fazla veri göstermesine izin verir.\n" + "NOT: Tarayıcı sürümüyle çalışmaz, yalnızca masaüstü istemcisiyle çalışır." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MIDI_INPUT, + "Input" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MIDI_INPUT, + "Select input device." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MIDI_OUTPUT, + "Output" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MIDI_OUTPUT, + "Select output device." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MIDI_VOLUME, + "Ses" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MIDI_VOLUME, + "Set output volume (%)." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_POWER_MANAGEMENT_SETTINGS, + "Güç yönetimi" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_POWER_MANAGEMENT_SETTINGS, + "Güç yönetimi ayarlarını değiştirin." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SUSTAINED_PERFORMANCE_MODE, + "Sürdürülebilir Performans Modu" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_MPV_SUPPORT, + "mpv desteği" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_IDX, + "Indeks" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_MATCH_IDX, + "View Match #" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_MATCH, + "Match Address: %08X Mask: %02X" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_COPY_MATCH, + "Create Code Match #" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_DELETE_MATCH, + "Delete Match #" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_BROWSE_MEMORY, + "Browse Address: %08X" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_DESC, + "Açıklama" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_STATE, + "Etkinleştirildi" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_CODE, + "Code" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_HANDLER, + "Handler" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_MEMORY_SEARCH_SIZE, + "Memory Search Size" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_TYPE, + "Tip" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_VALUE, + "Değer" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_ADDRESS, + "Memory Address" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_ADDRESS_BIT_POSITION, + "Memory Address Mask" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_RUMBLE_TYPE, + "Rumble When Memory" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_RUMBLE_VALUE, + "Rumble Value" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_RUMBLE_PORT, + "Rumble Port" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_RUMBLE_PRIMARY_STRENGTH, + "Rumble Primary Strength" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_RUMBLE_PRIMARY_DURATION, + "Rumble Primary Duration (ms)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_RUMBLE_SECONDARY_STRENGTH, + "Rumble Secondary Strength" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_RUMBLE_SECONDARY_DURATION, + "Rumble Secondary Duration (ms)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_REPEAT_COUNT, + "Number of Iterations" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_REPEAT_ADD_TO_VALUE, + "Value Increase Each Iteration" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_REPEAT_ADD_TO_ADDRESS, + "Address Increase Each Iteration" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_ADD_NEW_AFTER, + "Add New Cheat After This One" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_ADD_NEW_BEFORE, + "Add New Cheat Before This One" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_COPY_AFTER, + "Copy This Cheat After" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_COPY_BEFORE, + "Copy This Cheat Before" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_DELETE, + "Delete This Cheat" + ) +MSG_HASH( + MENU_ENUM_LABEL_CHEAT_HANDLER_TYPE_EMU, + "Emulator" + ) +MSG_HASH( + MENU_ENUM_LABEL_CHEAT_HANDLER_TYPE_RETRO, + "RetroArch" + ) +MSG_HASH( + MENU_ENUM_LABEL_CHEAT_TYPE_DISABLED, + "" + ) +MSG_HASH( + MENU_ENUM_LABEL_CHEAT_TYPE_SET_TO_VALUE, + "Set To Value" + ) +MSG_HASH( + MENU_ENUM_LABEL_CHEAT_TYPE_INCREASE_VALUE, + "Increase By Value" + ) +MSG_HASH( + MENU_ENUM_LABEL_CHEAT_TYPE_DECREASE_VALUE, + "Decrease By Value" + ) +MSG_HASH( + MENU_ENUM_LABEL_CHEAT_TYPE_RUN_NEXT_IF_EQ, + "Run next cheat if value = memory" + ) +MSG_HASH( + MENU_ENUM_LABEL_CHEAT_TYPE_RUN_NEXT_IF_NEQ, + "Run next cheat if value != memory" + ) +MSG_HASH( + MENU_ENUM_LABEL_CHEAT_TYPE_RUN_NEXT_IF_LT, + "Run next cheat if value < memory" + ) +MSG_HASH( + MENU_ENUM_LABEL_CHEAT_TYPE_RUN_NEXT_IF_GT, + "Run next cheat if value > memory" + ) +MSG_HASH( + MENU_ENUM_LABEL_RUMBLE_TYPE_DISABLED, + "" + ) +MSG_HASH( + MENU_ENUM_LABEL_RUMBLE_TYPE_CHANGES, + "Değişiklikler" + ) +MSG_HASH( + MENU_ENUM_LABEL_RUMBLE_TYPE_DOES_NOT_CHANGE, + "Does Not Change" + ) +MSG_HASH( + MENU_ENUM_LABEL_RUMBLE_TYPE_INCREASE, + "Increases" + ) +MSG_HASH( + MENU_ENUM_LABEL_RUMBLE_TYPE_DECREASE, + "Decreases" + ) +MSG_HASH( + MENU_ENUM_LABEL_RUMBLE_TYPE_EQ_VALUE, + "= Rumble Value" + ) +MSG_HASH( + MENU_ENUM_LABEL_RUMBLE_TYPE_NEQ_VALUE, + "!= Rumble Value" + ) +MSG_HASH( + MENU_ENUM_LABEL_RUMBLE_TYPE_LT_VALUE, + "< Rumble Value" + ) +MSG_HASH( + MENU_ENUM_LABEL_RUMBLE_TYPE_GT_VALUE, + "> Rumble Value" + ) +MSG_HASH( + MENU_ENUM_LABEL_RUMBLE_TYPE_INCREASE_BY_VALUE, + "Increases by Rumble Value" + ) +MSG_HASH( + MENU_ENUM_LABEL_RUMBLE_TYPE_DECREASE_BY_VALUE, + "Decreases by Rumble Value" + ) +MSG_HASH( + MENU_ENUM_LABEL_CHEAT_MEMORY_SIZE_1, + "1-bit, maksimum değer = 0x01" + ) +MSG_HASH( + MENU_ENUM_LABEL_CHEAT_MEMORY_SIZE_2, + "2-bit, maksimum değer = 0x03" + ) +MSG_HASH( + MENU_ENUM_LABEL_CHEAT_MEMORY_SIZE_4, + "4-bit, maksimum değer = 0x0F" + ) +MSG_HASH( + MENU_ENUM_LABEL_CHEAT_MEMORY_SIZE_8, + "8-bit, maksimum değer = 0xFF" + ) +MSG_HASH( + MENU_ENUM_LABEL_CHEAT_MEMORY_SIZE_16, + "16-bit, maksimum değer = 0xFFFF" + ) +MSG_HASH( + MENU_ENUM_LABEL_CHEAT_MEMORY_SIZE_32, + "32-bit, maksimum değer = 0xFFFFFFFF" + ) +MSG_HASH( + MENU_ENUM_LABEL_RUMBLE_PORT_0, + "1" + ) +MSG_HASH( + MENU_ENUM_LABEL_RUMBLE_PORT_1, + "2" + ) +MSG_HASH( + MENU_ENUM_LABEL_RUMBLE_PORT_2, + "3" + ) +MSG_HASH( + MENU_ENUM_LABEL_RUMBLE_PORT_3, + "4" + ) +MSG_HASH( + MENU_ENUM_LABEL_RUMBLE_PORT_4, + "5" + ) +MSG_HASH( + MENU_ENUM_LABEL_RUMBLE_PORT_5, + "6" + ) +MSG_HASH( + MENU_ENUM_LABEL_RUMBLE_PORT_6, + "7" + ) +MSG_HASH( + MENU_ENUM_LABEL_RUMBLE_PORT_7, + "8" + ) +MSG_HASH( + MENU_ENUM_LABEL_RUMBLE_PORT_8, + "9" + ) +MSG_HASH( + MENU_ENUM_LABEL_RUMBLE_PORT_9, + "10" + ) +MSG_HASH( + MENU_ENUM_LABEL_RUMBLE_PORT_10, + "11" + ) +MSG_HASH( + MENU_ENUM_LABEL_RUMBLE_PORT_11, + "12" + ) +MSG_HASH( + MENU_ENUM_LABEL_RUMBLE_PORT_12, + "13" + ) +MSG_HASH( + MENU_ENUM_LABEL_RUMBLE_PORT_13, + "14" + ) +MSG_HASH( + MENU_ENUM_LABEL_RUMBLE_PORT_14, + "15" + ) +MSG_HASH( + MENU_ENUM_LABEL_RUMBLE_PORT_15, + "16" + ) +MSG_HASH( + MENU_ENUM_LABEL_RUMBLE_PORT_16, + "All" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_START_OR_CONT, + "Hile Aramaya Başla veya Devam Et" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_START_OR_RESTART, + "Hile Aramasını Başlat veya Yeniden Başlat" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_SEARCH_EXACT, + "Search Memory For Values" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_SEARCH_LT, + "Search Memory For Values" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_SEARCH_GT, + "Search Memory For Values" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_SEARCH_EQ, + "Search Memory For Values" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_SEARCH_GTE, + "Search Memory For Values" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_SEARCH_LTE, + "Search Memory For Values" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_SEARCH_NEQ, + "Search Memory For Values" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_SEARCH_EQPLUS, + "Search Memory For Values" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_SEARCH_EQMINUS, + "Search Memory For Values" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_ADD_MATCHES, + "Add the %u Matches to Your List" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_VIEW_MATCHES, + "View the List of %u Matches" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_CREATE_OPTION, + "Create Code From This Match" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_DELETE_OPTION, + "Delete This Match" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_ADD_NEW_TOP, + "Add New Code to Top" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_ADD_NEW_BOTTOM, + "Add New Code to Bottom" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_DELETE_ALL, + "Delete All Codes" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_RELOAD_CHEATS, + "Reload Game-Specific Cheats" + ) +MSG_HASH( + MENU_ENUM_LABEL_CHEAT_SEARCH_EXACT_VAL, + "Equal to %u (%X)" + ) +MSG_HASH( + MENU_ENUM_LABEL_CHEAT_SEARCH_LT_VAL, + "Less Than Before" + ) +MSG_HASH( + MENU_ENUM_LABEL_CHEAT_SEARCH_GT_VAL, + "Greater Than Before" + ) +MSG_HASH( + MENU_ENUM_LABEL_CHEAT_SEARCH_LTE_VAL, + "Less Than or Equal To Before" + ) +MSG_HASH( + MENU_ENUM_LABEL_CHEAT_SEARCH_GTE_VAL, + "Greater Than or Equal To Before" + ) +MSG_HASH( + MENU_ENUM_LABEL_CHEAT_SEARCH_EQ_VAL, + "Equal to Before" + ) +MSG_HASH( + MENU_ENUM_LABEL_CHEAT_SEARCH_NEQ_VAL, + "Not Equal to Before" + ) +MSG_HASH( + MENU_ENUM_LABEL_CHEAT_SEARCH_EQPLUS_VAL, + "Equal to Before+%u (%X)" + ) +MSG_HASH( + MENU_ENUM_LABEL_CHEAT_SEARCH_EQMINUS_VAL, + "Equal to Before-%u (%X)" + ) +MSG_HASH( + MENU_ENUM_LABEL_CHEAT_SEARCH_SETTINGS, + "Start or Continue Cheat Search" + ) +MSG_HASH( + MSG_CHEAT_INIT_SUCCESS, + "Successfully started cheat search" + ) +MSG_HASH( + MSG_CHEAT_INIT_FAIL, + "Failed to start cheat search" + ) +MSG_HASH( + MSG_CHEAT_SEARCH_NOT_INITIALIZED, + "Searching has not been initialized/started" + ) +MSG_HASH( + MSG_CHEAT_SEARCH_FOUND_MATCHES, + "New match count = %u" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_BIG_ENDIAN, + "Big Endian" + ) +MSG_HASH( + MSG_CHEAT_SEARCH_ADDED_MATCHES_SUCCESS, + "Added %u matches" + ) +MSG_HASH( + MSG_CHEAT_SEARCH_ADDED_MATCHES_FAIL, + "Failed to add matches" + ) +MSG_HASH( + MSG_CHEAT_SEARCH_ADD_MATCH_SUCCESS, + "Created code from match" + ) +MSG_HASH( + MSG_CHEAT_SEARCH_ADD_MATCH_FAIL, + "Failed to create code" + ) +MSG_HASH( + MSG_CHEAT_SEARCH_DELETE_MATCH_SUCCESS, + "Deleted match" + ) +MSG_HASH( + MSG_CHEAT_SEARCH_ADDED_MATCHES_TOO_MANY, + "Not enough room. The total number of cheats you can have is 100." + ) +MSG_HASH( + MSG_CHEAT_ADD_TOP_SUCCESS, + "New cheat added to top of list." + ) +MSG_HASH( + MSG_CHEAT_ADD_BOTTOM_SUCCESS, + "New cheat added to bottom of list." + ) +MSG_HASH( + MSG_CHEAT_DELETE_ALL_INSTRUCTIONS, + "Press right five times to delete all cheats." + ) +MSG_HASH( + MSG_CHEAT_DELETE_ALL_SUCCESS, + "All cheats deleted." + ) +MSG_HASH( + MSG_CHEAT_ADD_BEFORE_SUCCESS, + "New cheat added before this one." + ) +MSG_HASH( + MSG_CHEAT_ADD_AFTER_SUCCESS, + "New cheat added after this one." + ) +MSG_HASH( + MSG_CHEAT_COPY_BEFORE_SUCCESS, + "Cheat copied before this one." + ) +MSG_HASH( + MSG_CHEAT_COPY_AFTER_SUCCESS, + "Cheat copied after this one." + ) +MSG_HASH( + MSG_CHEAT_DELETE_SUCCESS, + "Cheat deleted." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_PROGRESS, + "Progress:" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_ALL_PLAYLISTS_LIST_MAX_COUNT, + "\"All Playlists\" max list entries:" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_ALL_PLAYLISTS_GRID_MAX_COUNT, + "\"All Playlists\" max grid entries:" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_SHOW_HIDDEN_FILES, + "Show hidden files and folders:" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_NEW_PLAYLIST, + "Yeni Oynatma Listesi" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_ENTER_NEW_PLAYLIST_NAME, + "Lütfen yeni oynatma listesi adını girin:" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_DELETE_PLAYLIST, + "Oynatma Listesini Sil" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_RENAME_PLAYLIST, + "Oynatma Listesini Yeniden Adlandır" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_CONFIRM_DELETE_PLAYLIST, + "\"%1\" oynatma listesini silmek istediğine emin misin?" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_QUESTION, + "Question" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_COULD_NOT_DELETE_FILE, + "Dosya silinemedi." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_COULD_NOT_RENAME_FILE, + "Dosya yeniden adlandırılamadı." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_GATHERING_LIST_OF_FILES, + "Dosyaların toplanıyor ..." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_ADDING_FILES_TO_PLAYLIST, + "Çalma listesine dosyalar ekleniyor ..." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_PLAYLIST_ENTRY, + "Playlist Entry" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_PLAYLIST_ENTRY_NAME, + "Ad:" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_PLAYLIST_ENTRY_PATH, + "Dizin:" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_PLAYLIST_ENTRY_CORE, + "Core:" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_PLAYLIST_ENTRY_DATABASE, + "Veritabanı:" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_PLAYLIST_ENTRY_EXTENSIONS, + "Uzantılar:" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_PLAYLIST_ENTRY_EXTENSIONS_PLACEHOLDER, + "(space-separated; includes all by default)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_PLAYLIST_ENTRY_FILTER_INSIDE_ARCHIVES, + "Filter inside archives" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_FOR_THUMBNAILS, + "(used to find thumbnails)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_CONFIRM_DELETE_PLAYLIST_ITEM, + "Are you sure you want to delete the item \"%1\"?" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_CANNOT_ADD_TO_ALL_PLAYLISTS, + "Lütfen önce tek bir oynatma listesi seçin." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_DELETE, + "Kaldır" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_ADD_ENTRY, + "Giriş Ekle..." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_ADD_FILES, + "Dosya(lar) ekle..." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_ADD_FOLDER, + "Klasör Ekle..." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_EDIT, + "Düzenle" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_SELECT_FILES, + "Dosyaları Seç" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_SELECT_FOLDER, + "Klasörleri Seç" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_FIELD_MULTIPLE, + "" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_COULD_NOT_UPDATE_PLAYLIST_ENTRY, + "Oyatma listesi girişi güncellenirken hata oluştu." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_PLEASE_FILL_OUT_REQUIRED_FIELDS, + "Lütfen tüm gerekli alanları doldurunuz." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_UPDATE_RETROARCH_NIGHTLY, + "RetroArch'ı güncelle (nightly)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_UPDATE_RETROARCH_FINISHED, + "RetroArch başarıyla güncellendi. Değişikliklerin etkili olması için lütfen uygulamayı yeniden başlatın." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_UPDATE_RETROARCH_FAILED, + "Güncelleme başarısız oldu." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_MENU_HELP_ABOUT_CONTRIBUTORS, + "Katkıda bulunanlar" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_CURRENT_SHADER, + "Geçerli gölgelendirici" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_MOVE_DOWN, + "Move Down" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_MOVE_UP, + "Move Up" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_LOAD, + "Yükle" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_SAVE, + "Kaydet" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_REMOVE, + "Kaldır" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_APPLY, + "Uygula" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_SHADER_ADD_PASS, + "Add Pass" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_SHADER_CLEAR_ALL_PASSES, + "Clear All Passes" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_SHADER_NO_PASSES, + "No shader passes." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_RESET_PASS, + "Reset Pass" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_RESET_ALL_PASSES, + "Reset All Passes" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_RESET_PARAMETER, + "Reset Parameter" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_DOWNLOAD_THUMBNAIL, + "Download thumbnail" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_DOWNLOAD_ALREADY_IN_PROGRESS, + "Bir indirme işlemi zaten devam ediyor." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_STARTUP_PLAYLIST, + "Oynatma listesinde başla:" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_THUMBNAIL_TYPE, + "Simge görünümü küçük resmi türü:" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_THUMBNAIL_CACHE_LIMIT, + "Küçük resim önbellek sınırı:" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_DOWNLOAD_ALL_THUMBNAILS, + "Tüm Küçük Resimleri İndir" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_DOWNLOAD_ALL_THUMBNAILS_ENTIRE_SYSTEM, + "Tüm sistemin" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_DOWNLOAD_ALL_THUMBNAILS_THIS_PLAYLIST, + "Bu Oynatma Listesinin" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_THUMBNAIL_PACK_DOWNLOADED_SUCCESSFULLY, + "Küçük resimler başarıyla indirildi." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_DOWNLOAD_PLAYLIST_THUMBNAIL_PROGRESS, + "Başarılı: %1 Başarısız: %2" + ) +MSG_HASH( + MSG_DEVICE_CONFIGURED_IN_PORT, + "Configured in port:" + ) +MSG_HASH( + MSG_FAILED_TO_SET_DISK, + "Failed to set disk" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QT_CORE_OPTIONS, + "Core Seçenekleri" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_ADAPTIVE_VSYNC, + "Adaptive Vsync" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_ADAPTIVE_VSYNC, + "V-Sync is enabled until performance falls below the target refresh rate.\n" + "This can minimize stuttering when performance falls below realtime, and can be more energy efficient." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CRT_SWITCHRES_SETTINGS, + "CRT SwitchRes" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CRT_SWITCHRES_SETTINGS, + "Output native, low-resolution signals for use with CRT displays." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CRT_SWITCH_X_AXIS_CENTERING, + "Görüntü ekranda doğru şekilde ortalanmamışsa bu seçenekler arasında gezinin." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CRT_SWITCH_X_AXIS_CENTERING, + "X-Axis Centering" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CRT_SWITCH_RESOLUTION_USE_CUSTOM_REFRESH_RATE, + "Gerekirse, yapılandırma dosyasında belirtilen özel bir yenileme hızı kullanın." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CRT_SWITCH_RESOLUTION_USE_CUSTOM_REFRESH_RATE, + "Özel Yenileme Hızını Kullan" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CRT_SWITCH_RESOLUTION_OUTPUT_DISPLAY_ID, + "Select the output port connected to the CRT display." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CRT_SWITCH_RESOLUTION_OUTPUT_DISPLAY_ID, + "Output Display ID" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QUICK_MENU_START_RECORDING, + "Kayda başla" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_QUICK_MENU_START_RECORDING, + "Kaydı başlatır." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QUICK_MENU_STOP_RECORDING, + "Kaydetmeyi durdur" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_QUICK_MENU_STOP_RECORDING, + "Kaydı durdurur." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QUICK_MENU_START_STREAMING, + "Yayın Yapmayı Başlat" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_QUICK_MENU_START_STREAMING, + "Yayın yapmayı başlatır." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QUICK_MENU_STOP_STREAMING, + "Yayın yapmayı durdur" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_QUICK_MENU_STOP_STREAMING, + "Yayın yapmayı durdurur." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_RECORDING_TOGGLE, + "Recording toggle" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_META_STREAMING_TOGGLE, + "Streaming toggle" + ) +MSG_HASH( + MSG_CHEEVOS_HARDCORE_MODE_DISABLED, + "A savestate was loaded, Achievements Hardcore Mode disabled for the current session. Restart to enable hardcore mode." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_RECORD_QUALITY, + "Kayıt Kalitesi" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_STREAM_QUALITY, + "Yayın Kalitesi" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_STREAMING_URL, + "Akış URL’si" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_UDP_STREAM_PORT, + "UDP Stream Port" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ACCOUNTS_TWITCH, + "Twitch" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ACCOUNTS_YOUTUBE, + "YouTube" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_TWITCH_STREAM_KEY, + "Twitch Stream Key" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_YOUTUBE_STREAM_KEY, + "YouTube Stream Key" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_STREAMING_MODE, + "Yayıncı Modu" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_STREAMING_TITLE, + "Yayın Başlığı" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_SPLIT_JOYCON, + "Split Joy-Con" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RESET_TO_DEFAULT_CONFIG, + "Varsayılanlara dön" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_RESET_TO_DEFAULT_CONFIG, + "Geçerli yapılandırmayı varsayılan değerlere sıfırlayın." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_OK, + "Tamam" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_OZONE_MENU_COLOR_THEME, + "Menü Renk Teması" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_OZONE_COLOR_THEME_BASIC_WHITE, + "Temel Beyaz" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_OZONE_COLOR_THEME_BASIC_BLACK, + "Temel Siyah" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OZONE_MENU_COLOR_THEME, + "Farklı bir renk teması seçin." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_OZONE_COLLAPSE_SIDEBAR, + "Kenar çubuğunu daralt" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OZONE_COLLAPSE_SIDEBAR, + "Sol kenar çubuğunu daima daraltın." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_USE_PREFERRED_SYSTEM_COLOR_THEME, + "Tercih edilen sistem renk temasını kullan" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_USE_PREFERRED_SYSTEM_COLOR_THEME, + "İşletim sisteminizin renk temasını kullanın (varsa) - tema ayarlarını geçersiz kılar." + ) +MSG_HASH( + MSG_RESAMPLER_QUALITY_LOWEST, + "En düşük" + ) +MSG_HASH( + MSG_RESAMPLER_QUALITY_LOWER, + "Düşük" + ) +MSG_HASH( + MSG_RESAMPLER_QUALITY_NORMAL, + "Normal" + ) +MSG_HASH( + MSG_RESAMPLER_QUALITY_HIGHER, + "Yüksek" + ) +MSG_HASH( + MSG_RESAMPLER_QUALITY_HIGHEST, + "En Yüksek" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NO_MUSIC_AVAILABLE, + "Kullanılabilir bir müzik yok." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NO_VIDEOS_AVAILABLE, + "Kullanılabilir bir video yok." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NO_IMAGES_AVAILABLE, + "Kullanılabilir bir resim yok." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NO_FAVORITES_AVAILABLE, + "Favoriler yok." + ) +MSG_HASH( + MSG_MISSING_ASSETS, + "Uyarı: Kayıp içerikler, varsa Çevrimiçi Güncelleyiciyi kullanın" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_WINDOW_SAVE_POSITION, + "Pencere Konumunu ve Boyutunu hatırla" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_HOLD_START, + "Start'a Basılı Tutun (2 saniye)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PLAYLIST_USE_OLD_FORMAT, + "Eski formatı kullanarak oynatma listelerini kaydet" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PLAYLIST_SHOW_INLINE_CORE_NAME, + "Oynatma listelerinde ilişkili Core'ları göster" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PLAYLIST_SHOW_INLINE_CORE_NAME, + "Oynatma listesi girişlerinin o anda ilişkilendirilmiş olan Corela (varsa) ne zaman etiketleneceğini belirleyin. NOT: Oynatma listesi alt etiketleri etkinleştirildiğinde bu ayar dikkate alınmaz." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PLAYLIST_INLINE_CORE_DISPLAY_HIST_FAV, + "Geçmiş & Favoriler" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PLAYLIST_INLINE_CORE_DISPLAY_ALWAYS, + "Her zaman" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PLAYLIST_INLINE_CORE_DISPLAY_NEVER, + "Asla" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PLAYLIST_SORT_ALPHABETICAL, + "Oynatma listelerini alfabetik olarak sırala" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PLAYLIST_SORT_ALPHABETICAL, + "İçerik çalma listelerini alfabetik sıraya göre sıralar. Son kullanılan oyunların, resimlerin, müziklerin ve videoların 'geçmiş' oynatma listelerinin hariç tutulduğunu unutmayın." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SOUNDS, + "Menü Sesleri" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SOUND_OK, + "Tamam sesini etkinleştir" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SOUND_CANCEL, + "İptal sesini etkinleştir" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SOUND_NOTICE, + "Bildirim sesini etkinleştir" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SOUND_BGM, + "Enable BGM sound" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DOWN_SELECT, + "Down + Select" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_DRIVER_FALLBACK, + "Grafik sürücünüz RetroArch'taki mevcut video sürücüsü ile uyumlu değil ve %s sürücüsüne geri dönülüyor. Lütfen değişikliklerin geçerli olması için RetroArch'ı yeniden başlatın." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_COREAUDIO_SUPPORT, + "CoreAudio support" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_COREAUDIO3_SUPPORT, + "CoreAudio V3 support" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_RUNTIME_LOG, + "Save runtime log (per core)" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_RUNTIME_LOG, + "Her bir içerik öğesinin ne kadar süre çalıştığını, kayıtlar Core'a ayrılmış olarak izler." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_RUNTIME_LOG_AGGREGATE, + "Çalışma günlüğünü kaydet (toplam)" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_RUNTIME_LOG_AGGREGATE, + "Tüm içeriğin toplamının toplam olarak kaydedildiği her bir içerik öğesinin ne kadar süre çalıştığını takip eder." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RUNTIME_LOG_DIRECTORY, + "Çalışma Zamanı Günlükleri" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_RUNTIME_LOG_DIRECTORY, + "Oynatma zamanı günlük dosyalarını bu dizine kaydedin." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PLAYLIST_SHOW_SUBLABELS, + "Oynatma listesi alt etiketlerini göster" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PLAYLIST_SHOW_SUBLABELS, + "Geçerli Core ilişkilendirme ve çalışma zamanı (varsa) gibi her oynatma listesi girişi için ek bilgi gösterir. Performansı etkiler(değişken)." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PLAYLIST_SUBLABEL_CORE, + "Core:" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PLAYLIST_SUBLABEL_RUNTIME, + "Oyun süresi:" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PLAYLIST_SUBLABEL_LAST_PLAYED, + "Son oynatma:" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PLAYLIST_SUBLABEL_RUNTIME_TYPE, + "Playlist sublabel runtime" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PLAYLIST_SUBLABEL_RUNTIME_TYPE, + "Oynatma listesinin alt etiketlerinde hangi çalışma zamanı günlüğü kaydının görüntüleneceğini seçer. (İlgili çalışma zamanı günlüğünün 'Kaydetme' seçenekler menüsünden etkinleştirilmesi gerektiğini unutmayın))" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PLAYLIST_RUNTIME_PER_CORE, + "Core başına" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PLAYLIST_RUNTIME_AGGREGATE, + "Toplam" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_HELP_SEND_DEBUG_INFO, + "Hata Ayıklama Bilgisi Gönder" + ) +MSG_HASH( + MSG_FAILED_TO_SAVE_DEBUG_INFO, + "Hata ayıklama bilgisi kaydedilemedi." + ) +MSG_HASH( + MSG_FAILED_TO_SEND_DEBUG_INFO, + "Sunucuya hata ayıklama bilgisi gönderilemedi." + ) +MSG_HASH( + MSG_SENDING_DEBUG_INFO, + "Hata ayıklama bilgisi gönderiliyor ..." + ) +MSG_HASH( + MSG_SENT_DEBUG_INFO, + "Sunucuya hata ayıklama bilgisi başarıyla gönderildi. Kimlik numaranız %u." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_HELP_SEND_DEBUG_INFO, + "Analiz için cihazların ve RetroArch yapılandırmasına ilişkin teşhis bilgilerini gönderir." + ) +MSG_HASH( + MSG_PRESS_TWO_MORE_TIMES_TO_SEND_DEBUG_INFO, + "RetroArch ekibine tanılama bilgileri göndermek için iki kez daha basın." + ) +MSG_HASH( + MSG_PRESS_ONE_MORE_TIME_TO_SEND_DEBUG_INFO, + "RetroArch ekibine tanılama bilgileri göndermek için bir kez daha basın." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIBRATE_ON_KEYPRESS, + "Vibrate on key press" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ENABLE_DEVICE_VIBRATION, + "Cihaz titreşimini etkinleştir (desteklenen Corelar için)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LOG_DIR, + "Sistem Olayı Günlükleri" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_LOG_DIR, + "Sistem olay günlüğü dosyalarını bu dizine kaydedin." + ) diff --git a/intl/msg_hash_us.c b/intl/msg_hash_us.c index 384ab23163..f0b6552d68 100644 --- a/intl/msg_hash_us.c +++ b/intl/msg_hash_us.c @@ -719,24 +719,24 @@ int menu_hash_get_help_us_enum(enum msg_hash_enums msg, char *s, size_t len) snprintf(s, len, "To scan for content, go to '%s' and\n" "select either '%s' or %s'.\n" - " \n" + "\n" "Files will be compared to database entries.\n" "If there is a match, it will add an entry\n" - "to a collection.\n" - " \n" + "to a playlist.\n" + "\n" "You can then easily access this content by\n" "going to '%s' ->\n" "'%s'\n" "instead of having to go through the\n" - "filebrowser everytime.\n" - " \n" + "file browser every time.\n" + "\n" "NOTE: Content for some cores might still not be\n" "scannable.", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ADD_CONTENT_LIST), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCAN_DIRECTORY), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCAN_FILE), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_LIST), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CONTENT_COLLECTION_LIST) + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLISTS_TAB) ); break; case MENU_ENUM_LABEL_VALUE_EXTRACTING_PLEASE_WAIT: @@ -1572,9 +1572,9 @@ int menu_hash_get_help_us_enum(enum msg_hash_enums msg, char *s, size_t len) "When slowmotion, content will slow\n" "down by factor."); break; - case MENU_ENUM_LABEL_INPUT_AXIS_THRESHOLD: + case MENU_ENUM_LABEL_INPUT_BUTTON_AXIS_THRESHOLD: snprintf(s, len, - "Defines axis threshold.\n" + "Defines the axis threshold.\n" " \n" "How far an axis must be tilted to result\n" "in a button press.\n" diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index b459a7aef4..4718895150 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -589,10 +589,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONFIG_SAVE_ON_EXIT, "Save Configuration on Exit" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_COLLECTION_LIST, - "Collections" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_DATABASE_DIRECTORY, "Database" @@ -1054,8 +1050,16 @@ MSG_HASH( "Autoconfig" ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, - "Analog Stick Deadzone" + MENU_ENUM_LABEL_VALUE_INPUT_BUTTON_AXIS_THRESHOLD, + "Input Button Axis Threshold" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_DEADZONE, + "Analog Deadzone" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_SENSITIVITY, + "Analog Sensitivity" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, @@ -1564,6 +1568,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_LANG_GREEK, "Greek" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LANG_TURKISH, + "Turkish" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_LEFT_ANALOG, "Left Analog" @@ -1616,6 +1624,22 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_LOG_VERBOSITY, "Logging Verbosity" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LOG_TO_FILE, + "Log To File" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_LOG_TO_FILE, + "Redirects system event log messages to file. Requires 'Logging Verbosity' to be enabled." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LOG_TO_FILE_TIMESTAMP, + "Timestamped Log Files" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_LOG_TO_FILE_TIMESTAMP, + "When logging to file, redirects the output from each RetroArch session to a new timestamped file. If disabled, log is overwritten each time RetroArch is restarted." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MAIN_MENU, "Main Menu" @@ -2086,7 +2110,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_DIRECTORY, - "Playlist" + "Playlists" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_SETTINGS, @@ -2778,10 +2802,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBUSB_SUPPORT, "Libusb support" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBXML2_SUPPORT, - "libxml2 XML parsing support" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETPLAY_SUPPORT, "Netplay (peer-to-peer) support" @@ -2950,10 +2970,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_THUMBNAILS, "Thumbnails" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_THUMBNAILS_RGUI, + "Top Thumbnail" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_LEFT_THUMBNAILS, "Left Thumbnails" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LEFT_THUMBNAILS_RGUI, + "Bottom Thumbnail" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_LEFT_THUMBNAILS_OZONE, "Second Thumbnail" @@ -2962,13 +2990,37 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_XMB_VERTICAL_THUMBNAILS, "Thumbnails Vertical Disposition" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_RGUI_INLINE_THUMBNAILS, + "Show Playlist Thumbnails" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_RGUI_INLINE_THUMBNAILS, + "Enable display of inline downscaled thumbnails while viewing playlists. When disabled, 'Top Thumbnail' may still be toggled fullscreen by pressing RetroPad Y." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_RGUI_SWAP_THUMBNAILS, + "Swap Thumbnails" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_RGUI_SWAP_THUMBNAILS, + "Swaps the display positions of 'Top Thumbnail' and 'Bottom Thumbnail'." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_RGUI_THUMBNAIL_DELAY, + "Thumbnail Delay (ms)" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_RGUI_THUMBNAIL_DELAY, + "Applies a time delay between selecting a playlist entry and loading its associated thumbnails. Setting this to a value of at least 256 ms enables fast lag-free scrolling on even the slowest devices." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_RGUI_THUMBNAIL_DOWNSCALER, "Thumbnail Downscaling Method" ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_RGUI_THUMBNAIL_DOWNSCALER, - "Resampling method used when shrinking large thumbnails to fit the screen." + "Resampling method used when shrinking large thumbnails to fit the display." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RGUI_THUMB_SCALE_POINT, @@ -3022,6 +3074,38 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_RGUI_UPSCALE_X9, "x9" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_4_3, + "4:3" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_16_9, + "16:9" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_16_9_CENTRE, + "16:9 (Centered)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_16_10, + "16:10" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_16_10_CENTRE, + "16:10 (Centered)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_LOCK_NONE, + "OFF" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_LOCK_FIT_SCREEN, + "Fit Screen" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_LOCK_INTEGER, + "Integer Scale" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_THUMBNAILS_DIRECTORY, "Thumbnails" @@ -3402,10 +3486,40 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_DISABLE_COMPOSITION, "Disable Desktop Composition" ) +#if defined(_3DS) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_3DS_LCD_BOTTOM, "3DS Bottom Screen" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_3DS_LCD_BOTTOM, + "Enable display of status information on bottom screen. Disable to increase battery life and improve performance." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_3DS_DISPLAY_MODE, + "3DS Display Mode" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_3DS_DISPLAY_MODE, + "Selects between 3D and 2D display modes. In '3D' mode, pixels are square and a depth effect is applied when viewing the Quick Menu. '2D' mode provides the best performance." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CTR_VIDEO_MODE_3D, + "3D" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CTR_VIDEO_MODE_2D, + "2D" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CTR_VIDEO_MODE_2D_400x240, + "2D (Pixel Grid Effect)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CTR_VIDEO_MODE_2D_800x240, + "2D (High Resolution)" + ) +#endif MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_DRIVER, "Video" @@ -3976,7 +4090,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_LOG_VERBOSITY, - "Log events to the terminal." + "Log events to a terminal or file." ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY, @@ -4806,6 +4920,10 @@ MSG_HASH( MSG_SCREENSHOT_SAVED, "Screenshot saved" ) +MSG_HASH( + MSG_ACHIEVEMENT_UNLOCKED, + "Achievement Unlocked" + ) MSG_HASH( MSG_CHANGE_THUMBNAIL_TYPE, "Change thumbnail type" @@ -4931,7 +5049,7 @@ MSG_HASH( "Synchronize audio. Recommended." ) MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_AXIS_THRESHOLD, + MENU_ENUM_SUBLABEL_INPUT_BUTTON_AXIS_THRESHOLD, "How far an axis must be tilted to result in a button press." ) MSG_HASH( @@ -5144,8 +5262,8 @@ MSG_HASH( "Select File" ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_SELECT_FROM_COLLECTION, - "Select From Collection" + MENU_ENUM_LABEL_VALUE_SELECT_FROM_PLAYLIST, + "Select from a playlist" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_FILTER, @@ -5312,8 +5430,8 @@ MSG_HASH( "Select the port for the overlay to listen to if Show Inputs On Overlay is enabled." ) MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_COLLECTION_LIST, - "Scanned content will appear here." + MENU_ENUM_SUBLABEL_PLAYLISTS_TAB, + "Scanned content matching the database will appear here." ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SCALE_INTEGER, @@ -5699,10 +5817,18 @@ MSG_HASH( MENU_ENUM_SUBLABEL_THUMBNAILS, "Type of thumbnail to display." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_THUMBNAILS_RGUI, + "Type of thumbnail to display at the top right of playlists. This thumbnail may be toggled fullscreen by pressing RetroPad Y." + ) MSG_HASH( MENU_ENUM_SUBLABEL_LEFT_THUMBNAILS, "Type of thumbnail to display at the left." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_LEFT_THUMBNAILS_RGUI, + "Type of thumbnail to display at the bottom right of playlists." + ) MSG_HASH( MENU_ENUM_SUBLABEL_LEFT_THUMBNAILS_OZONE, "Replace the content metadata panel by another thumbnail." @@ -5737,11 +5863,11 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_SCAN_DIRECTORY, - "Scans a directory for compatible files and add them to the collection." + "Scans a directory for content that matches the database." ) MSG_HASH( MENU_ENUM_SUBLABEL_SCAN_FILE, - "Scans a compatible file and add it to the collection." + "Scans a file for content that matches the database." ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SWAP_INTERVAL, @@ -5777,7 +5903,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_DELETE_ENTRY, - "Remove this entry from the collection." + "Remove this entry from the playlist." ) MSG_HASH( MENU_ENUM_SUBLABEL_INFORMATION, @@ -5921,7 +6047,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_REMOVE, - "Allow the user to remove entries from collections." + "Allow the user to remove entries from playlists." ) MSG_HASH( MENU_ENUM_SUBLABEL_SYSTEM_DIRECTORY, @@ -6091,7 +6217,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_PLAYLIST_DIRECTORY, - "Save all collections to this directory." + "Save all playlists to this directory." ) MSG_HASH( MENU_ENUM_SUBLABEL_CACHE_DIRECTORY, @@ -6415,7 +6541,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_RENAME, - "Allow the user to rename entries in collections." + "Allow the user to rename entries in playlists." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_RENAME, @@ -6726,11 +6852,11 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, - "Automatically add content to playlist" + "Automatically add content to playlists" ) MSG_HASH( MENU_ENUM_SUBLABEL_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, - "Automatically scans loaded content so they appear inside playlists." + "Automatically scans loaded content with the playlist scanner." ) MSG_HASH( MSG_SCANNING_OF_FILE_FINISHED, @@ -6793,11 +6919,11 @@ MSG_HASH( "Increase coarseness of menu background chequerboard pattern." ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_MENU_RGUI_LOCK_ASPECT, + MENU_ENUM_LABEL_VALUE_MENU_RGUI_ASPECT_RATIO_LOCK, "Lock Menu Aspect Ratio" ) MSG_HASH( - MENU_ENUM_SUBLABEL_MENU_RGUI_LOCK_ASPECT, + MENU_ENUM_SUBLABEL_MENU_RGUI_ASPECT_RATIO_LOCK, "Ensures that the menu is always displayed with the correct aspect ratio. If disabled, the quick menu will be stretched to match the currently loaded content." ) MSG_HASH( @@ -6808,6 +6934,14 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MENU_RGUI_INTERNAL_UPSCALE_LEVEL, "Upscale menu interface before drawing to screen. When used with 'Menu Linear Filter' enabled, removes scaling artefacts (uneven pixels) while maintaining a sharp image. Has a significant performance impact that increases with upscaling level." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_RGUI_ASPECT_RATIO, + "Menu Aspect Ratio" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_RGUI_ASPECT_RATIO, + "Select menu aspect ratio. Widescreen ratios increase the horizontal resolution of the menu interface. (May require a restart if 'Lock Menu Aspect Ratio' is disabled)" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_RGUI_FULL_WIDTH_LAYOUT, "Use Full-Width Layout" @@ -6816,6 +6950,22 @@ MSG_HASH( MENU_ENUM_SUBLABEL_MENU_RGUI_FULL_WIDTH_LAYOUT, "Resize and position menu entries to make best use of available screen space. Disable this to use classic fixed-width two column layout." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_RGUI_SHADOWS, + "Shadow Effects" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_RGUI_SHADOWS, + "Enable drop shadows for menu text, borders and thumbnails. Has a modest performance impact." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_RGUI_EXTENDED_ASCII, + "Extended ASCII Support" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_RGUI_EXTENDED_ASCII, + "Enable display of non-standard ASCII characters. Required for compatibility with certain non-English Western languages. Has a moderate performance impact." + ) MSG_HASH( MENU_ENUM_SUBLABEL_CRT_SWITCH_RESOLUTION, "For CRT displays only. Attempts to use exact core/game resolution and refresh rate." @@ -8027,7 +8177,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_THUMBNAIL_TYPE, - "Icon view thumbnail type:" + "Thumbnail" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_THUMBNAIL_CACHE_LIMIT, @@ -8454,3 +8604,11 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_ENABLE_DEVICE_VIBRATION, "Enable device vibration (for supported cores)" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LOG_DIR, + "System Event Logs" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_LOG_DIR, + "Save system event log files to this directory." + ) diff --git a/intl/msg_hash_vn.c b/intl/msg_hash_vn.c index 371a7d2e40..1769dd2b88 100644 --- a/intl/msg_hash_vn.c +++ b/intl/msg_hash_vn.c @@ -666,30 +666,29 @@ int menu_hash_get_help_vn_enum(enum msg_hash_enums msg, char *s, size_t len) } break; case MENU_ENUM_LABEL_VALUE_HELP_SCANNING_CONTENT_DESC: - snprintf(s, len, - "To scan for content, go to '%s' and\n" - "select either '%s' or %s'.\n" - " \n" - "Files will be compared to database entries.\n" - "If there is a match, it will add an entry\n" - "to a collection.\n" - " \n" - "You can then easily access this content by\n" - "going to '%s' ->\n" - "'%s'\n" - "instead of having to go through the\n" - "filebrowser everytime.\n" - " \n" - "NOTE: Content for some cores might still not be\n" - "scannable." - , - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ADD_CONTENT_LIST), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCAN_DIRECTORY), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCAN_FILE), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_LIST), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CONTENT_COLLECTION_LIST) - ); - break; + snprintf(s, len, + "To scan for content, go to '%s' and\n" + "select either '%s' or %s'.\n" + "\n" + "Files will be compared to database entries.\n" + "If there is a match, it will add an entry\n" + "to a playlist.\n" + "\n" + "You can then easily access this content by\n" + "going to '%s' ->\n" + "'%s'\n" + "instead of having to go through the\n" + "file browser every time.\n" + "\n" + "NOTE: Content for some cores might still not be\n" + "scannable.", + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ADD_CONTENT_LIST), + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCAN_DIRECTORY), + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCAN_FILE), + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_LIST), + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLISTS_TAB) + ); + break; case MENU_ENUM_LABEL_VALUE_EXTRACTING_PLEASE_WAIT: snprintf(s, len, "Welcome to RetroArch\n" @@ -1476,14 +1475,6 @@ int menu_hash_get_help_vn_enum(enum msg_hash_enums msg, char *s, size_t len) "When slowmotion, content will slow\n" "down by factor."); break; - case MENU_ENUM_LABEL_INPUT_AXIS_THRESHOLD: - snprintf(s, len, - "Defines axis threshold.\n" - " \n" - "How far an axis must be tilted to result\n" - "in a button press.\n" - " Possible values are [0.0, 1.0]."); - break; case MENU_ENUM_LABEL_INPUT_TURBO_PERIOD: snprintf(s, len, "Turbo period.\n" diff --git a/intl/msg_hash_vn.h b/intl/msg_hash_vn.h index 6c802afa81..99dc15aa15 100644 --- a/intl/msg_hash_vn.h +++ b/intl/msg_hash_vn.h @@ -474,10 +474,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONFIG_SAVE_ON_EXIT, "Lưu cấu hình khi thoát" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_COLLECTION_LIST, - "Bộ sưu tập" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_DATABASE_DIRECTORY, "Mục cơ sở dữ liệu nội dung" @@ -701,8 +697,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Kích hoạt Autoconfig") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, - "Analog Stick Deadzone") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "Menu Swap OK & Cancel Buttons") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_BIND_ALL, @@ -1161,7 +1155,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_PERFCNT_ENABLE, MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLISTS_TAB, "Playlists") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_DIRECTORY, - "Playlist Danh mục") + "Playlists Danh mục") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_SETTINGS, "Playlists") MSG_HASH(MENU_ENUM_LABEL_VALUE_POINTER_ENABLE, @@ -1449,8 +1443,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBRETRODB_SUPPORT, "LibretroDB support") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBUSB_SUPPORT, "Libusb support") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBXML2_SUPPORT, - "libxml2 XML parsing support") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETPLAY_SUPPORT, "Netplay (peer-to-peer) support") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETWORK_COMMAND_IFACE_SUPPORT, @@ -1611,8 +1603,10 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_CROP_OVERSCAN, "Crop Overscan (Reload)") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DISABLE_COMPOSITION, "Disable Desktop Composition") +#if defined(_3DS) MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_3DS_LCD_BOTTOM, "Màn hình dưới 3DS") +#endif MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DRIVER, "Video Driver") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FILTER, @@ -2339,10 +2333,6 @@ MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_SYNC, "Synchronize audio. Recommended." ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_AXIS_THRESHOLD, - "How far an axis must be tilted to result in a button press." - ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_BIND_TIMEOUT, "Amount of seconds to wait until proceeding to the next bind." @@ -2482,8 +2472,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_BATTERY_LEVEL_ENABLE, "Display battery level") MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FILE, "Select File") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FROM_COLLECTION, - "Select From Collection") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FROM_PLAYLIST, + "Select from Playlst") MSG_HASH(MENU_ENUM_LABEL_VALUE_FILTER, "Filter") MSG_HASH(MENU_ENUM_LABEL_VALUE_SCALE, @@ -2560,7 +2550,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FONT_SIZE, MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_OVERLAY_HIDE_IN_MENU, "Hide the overlay while inside the menu, and show it again when exiting the menu.") MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_COLLECTION_LIST, + MENU_ENUM_SUBLABEL_PLAYLISTS_TAB, "Scanned content will appear here." ) MSG_HASH( @@ -2816,9 +2806,9 @@ MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_ENABLE_CLIENT, MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_DISCONNECT, "Disconnects an active Netplay connection.") MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_DIRECTORY, - "Scans a directory for compatible files and add them to the collection.") + "Scans a directory for content that matches the database.") MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_FILE, - "Scans a compatible file and add it to the collection.") + "Scans a file for content that matches the database.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SWAP_INTERVAL, "Uses a custom swap interval for Vsync. Set this to effectively halve monitor refresh rate." ) @@ -2838,7 +2828,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_CORE_UPDATER_AUTO_EXTRACT_ARCHIVE, MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_REFRESH_ROOMS, "Scan for new rooms.") MSG_HASH(MENU_ENUM_SUBLABEL_DELETE_ENTRY, - "Remove this entry from the collection.") + "Remove this entry from the playlist.") MSG_HASH(MENU_ENUM_SUBLABEL_INFORMATION, "View more information about the content.") MSG_HASH(MENU_ENUM_SUBLABEL_RUN, @@ -2910,7 +2900,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_SHOW_ADVANCED_SETTINGS, MSG_HASH(MENU_ENUM_SUBLABEL_THREADED_DATA_RUNLOOP_ENABLE, "Perform tasks on a separate thread.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_REMOVE, - "Allow the user to remove entries from collections.") + "Allow the user to remove entries from playlists.") MSG_HASH(MENU_ENUM_SUBLABEL_SYSTEM_DIRECTORY, "Sets the System directory. Cores can query for this directory to load BIOSes, system-specific configs, etc.") MSG_HASH(MENU_ENUM_SUBLABEL_RGUI_BROWSER_DIRECTORY, @@ -2993,7 +2983,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_LIBRETRO_INFO_PATH, MSG_HASH(MENU_ENUM_SUBLABEL_JOYPAD_AUTOCONFIG_DIR, "If a joypad is plugged in, that joypad will be autoconfigured if a config file corresponding to it is present inside this directory.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_DIRECTORY, - "Save all collections to this directory.") + "Save all playlists to this directory.") MSG_HASH( MENU_ENUM_SUBLABEL_CACHE_DIRECTORY, "If set to a directory, content which is temporarily extracted (e.g. from archives) will be extracted to this directory." @@ -3165,7 +3155,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_XMB_MAIN_MENU_ENABLE_SETTINGS, MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SHOW_SETTINGS_PASSWORD, "Supplying a password when hiding the settings tab makes it possible to later restore it from the menu, by going to the Main Menu tab, selecting Enable Settings Tab and entering the password.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_RENAME, - "Allow the user to rename entries in collections.") + "Allow the user to rename entries in playlists.") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_RENAME, "Allow to rename entries") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_LOAD_CORE, diff --git a/libretro-common/encodings/encoding_crc32.c b/libretro-common/encodings/encoding_crc32.c index 9724f3eff7..38b3de2545 100644 --- a/libretro-common/encodings/encoding_crc32.c +++ b/libretro-common/encodings/encoding_crc32.c @@ -119,8 +119,8 @@ uint32_t file_crc32(uint32_t crc, const char *path) for(i = 0; i < CRC32_MAX_MB; i++) { - int nread = filestream_read(file, buf, CRC32_BUFFER_SIZE); - if (nread < 0) + int64_t nread = filestream_read(file, buf, CRC32_BUFFER_SIZE); + if (nread < 0) goto error; crc = encoding_crc32(crc, buf, nread); diff --git a/libretro-common/features/features_cpu.c b/libretro-common/features/features_cpu.c index e247e46a02..5b4595b055 100644 --- a/libretro-common/features/features_cpu.c +++ b/libretro-common/features/features_cpu.c @@ -68,6 +68,7 @@ #if defined(PS2) #include #include +#include #endif #if defined(__PSL1GHT__) @@ -871,12 +872,15 @@ void cpu_features_get_model_name(char *name, int len) } end: /* terminate our string */ - if (pos < len) + if (pos < (size_t)len) name[pos] = '\0'; #elif defined(__MACH__) if (!name) return; - sysctlbyname("machdep.cpu.brand_string", name, &len, NULL, 0); + { + size_t len_size = len; + sysctlbyname("machdep.cpu.brand_string", name, &len_size, NULL, 0); + } #else if (!name) return; diff --git a/libretro-common/file/file_path.c b/libretro-common/file/file_path.c index bfe5c902bd..0a72fdc13e 100644 --- a/libretro-common/file/file_path.c +++ b/libretro-common/file/file_path.c @@ -100,7 +100,7 @@ #define FIO_S_ISDIR SCE_S_ISDIR #endif -#if (defined(__CELLOS_LV2__) && !defined(__PSL1GHT__)) || defined(__QNX__) || defined(PSP) +#if (defined(__CELLOS_LV2__) && !defined(__PSL1GHT__)) || defined(__QNX__) || defined(PSP) || defined(PS2) #include /* stat() is defined here */ #endif diff --git a/libretro-common/formats/libchdr/libchdr_chd.c b/libretro-common/formats/libchdr/libchdr_chd.c index 7ac16a5e4b..4713dd6fc5 100644 --- a/libretro-common/formats/libchdr/libchdr_chd.c +++ b/libretro-common/formats/libchdr/libchdr_chd.c @@ -1335,7 +1335,7 @@ static UINT32 header_guess_unitbytes(chd_file *chd) { /* look for hard disk metadata; if found, then the unit size == sector size */ char metadata[512]; - int i0, i1, i2, i3; + unsigned int i0, i1, i2, i3; if (chd_get_metadata(chd, HARD_DISK_METADATA_TAG, 0, metadata, sizeof(metadata), NULL, NULL, NULL) == CHDERR_NONE && sscanf(metadata, HARD_DISK_METADATA_FORMAT, &i0, &i1, &i2, &i3) == 4) return i3; diff --git a/libretro-common/formats/xml/rxml.c b/libretro-common/formats/xml/rxml.c index 482b75b004..430d51ceb1 100644 --- a/libretro-common/formats/xml/rxml.c +++ b/libretro-common/formats/xml/rxml.c @@ -116,7 +116,7 @@ static bool range_is_space(const char *begin, const char *end) return true; } -static void skip_spaces(const char **ptr_) +static void rxml_skip_spaces(const char **ptr_) { const char *ptr = *ptr_; while (isspace(*ptr)) @@ -146,28 +146,31 @@ static char *strdup_range_escape(const char *begin, const char *end) static struct rxml_attrib_node *rxml_parse_attrs(const char *str) { - char *copy = strdup(str); + const char *elem; + struct rxml_attrib_node *list = NULL; + struct rxml_attrib_node *tail = NULL; + char *attrib = NULL; + char *value = NULL; + char *last_char = NULL; + char *save = NULL; + char *copy = strdup(str); if (!copy) return NULL; - char *last_char = copy + strlen(copy) - 1; + last_char = copy + strlen(copy) - 1; if (*last_char == '/') *last_char = '\0'; - struct rxml_attrib_node *list = NULL; - struct rxml_attrib_node *tail = NULL; - - char *attrib = NULL; - char *value = NULL; - char *save; - const char *elem = strtok_r(copy, " \n\t\f\v\r", &save); + elem = strtok_r(copy, " \n\t\f\v\r", &save); while (elem) { + const char *end; + struct rxml_attrib_node *new_node; const char *eq = strstr(elem, "=\""); if (!eq) goto end; - const char *end = strrchr(eq + 2, '\"'); + end = strrchr(eq + 2, '\"'); if (!end || end != (elem + strlen(elem) - 1)) goto end; @@ -176,15 +179,15 @@ static struct rxml_attrib_node *rxml_parse_attrs(const char *str) if (!attrib || !value) goto end; - struct rxml_attrib_node *new_node = + new_node = (struct rxml_attrib_node*)calloc(1, sizeof(*new_node)); if (!new_node) goto end; new_node->attrib = attrib; new_node->value = value; - attrib = NULL; - value = NULL; + attrib = NULL; + value = NULL; if (tail) { @@ -217,10 +220,11 @@ static char *find_first_space(const char *str) static bool rxml_parse_tag(struct rxml_node *node, const char *str) { + const char *name_end; const char *str_ptr = str; - skip_spaces(&str_ptr); + rxml_skip_spaces(&str_ptr); - const char *name_end = find_first_space(str_ptr); + name_end = find_first_space(str_ptr); if (name_end) { node->name = strdup_range(str_ptr, name_end); @@ -248,7 +252,7 @@ static struct rxml_node *rxml_parse_node(const char **ptr_) if (!node) return NULL; - skip_spaces(ptr_); + rxml_skip_spaces(ptr_); ptr = *ptr_; if (*ptr != '<') @@ -375,15 +379,18 @@ error: static char *purge_xml_comments(const char *str) { - size_t len = strlen(str); + char *copy_dest; + const char *copy_src; + size_t len = strlen(str); char *new_str = (char*)malloc(len + 1); if (!new_str) return NULL; - new_str[len] = '\0'; + new_str[len] = '\0'; + + copy_dest = new_str; + copy_src = str; - char *copy_dest = new_str; - const char *copy_src = str; for (;;) { ptrdiff_t copy_len; @@ -411,6 +418,7 @@ static char *purge_xml_comments(const char *str) rxml_document_t *rxml_load_document(const char *path) { + rxml_document_t *doc; char *memory_buffer = NULL; char *new_memory_buffer = NULL; const char *mem_ptr = NULL; @@ -421,7 +429,7 @@ rxml_document_t *rxml_load_document(const char *path) if (!file) return NULL; - rxml_document_t *doc = (rxml_document_t*)calloc(1, sizeof(*doc)); + doc = (rxml_document_t*)calloc(1, sizeof(*doc)); if (!doc) goto error; @@ -474,7 +482,7 @@ void rxml_free_document(rxml_document_t *doc) free(doc); } -char *rxml_node_attrib(struct rxml_node *node, const char *attrib) +const char *rxml_node_attrib(struct rxml_node *node, const char *attrib) { struct rxml_attrib_node *attribs = NULL; for (attribs = node->attrib; attribs; attribs = attribs->next) diff --git a/libretro-common/glsym/glsym_gl.c b/libretro-common/glsym/glsym_gl.c index 4f0c8280f7..51d3bf0f31 100644 --- a/libretro-common/glsym/glsym_gl.c +++ b/libretro-common/glsym/glsym_gl.c @@ -24,7 +24,7 @@ #include -#define SYM(x) { "gl" #x, &(gl##x) } +#define SYM(x) { "gl" #x, (void*)&(gl##x) } const struct rglgen_sym_map rglgen_symbol_map[] = { #ifdef HAVE_LIBNX diff --git a/libretro-common/include/compat/msvc.h b/libretro-common/include/compat/msvc.h index ad55bd8874..4681b12cf2 100644 --- a/libretro-common/include/compat/msvc.h +++ b/libretro-common/include/compat/msvc.h @@ -56,6 +56,8 @@ extern "C" { #undef UNICODE /* Do not bother with UNICODE at this time. */ #include #include + +#define _USE_MATH_DEFINES #include /* Python headers defines ssize_t and sets HAVE_SSIZE_T. diff --git a/libretro-common/include/formats/rxml.h b/libretro-common/include/formats/rxml.h index 21adc347e0..200a27917b 100644 --- a/libretro-common/include/formats/rxml.h +++ b/libretro-common/include/formats/rxml.h @@ -54,10 +54,6 @@ struct rxml_node struct rxml_node *children; struct rxml_node *next; - - /* Dummy. Used by libxml2 compat. - * Is always set to 0, so XML_ELEMENT_NODE check goes through. */ - int type; }; rxml_document_t *rxml_load_document(const char *path); @@ -65,30 +61,6 @@ void rxml_free_document(rxml_document_t *doc); struct rxml_node *rxml_root_node(rxml_document_t *doc); -/* Drop const-correctness here to avoid warnings - * when used as libxml2 compat. - * xmlGetProp() returns xmlChar*, which is supposed - * to be passed to xmlFree(). */ -char *rxml_node_attrib(struct rxml_node *node, const char *attrib); - -#ifdef RXML_LIBXML2_COMPAT -/* Compat for part of libxml2 that RetroArch uses. */ -#define LIBXML_TEST_VERSION ((void)0) -typedef char xmlChar; /* It's really unsigned char, but it doesn't matter. */ -typedef struct rxml_node *xmlNodePtr; -typedef void *xmlParserCtxtPtr; -typedef rxml_document_t *xmlDocPtr; -#define XML_ELEMENT_NODE (0) -#define xmlNewParserCtxt() ((void*)-1) -#define xmlCtxtReadFile(ctx, path, a, b) rxml_load_document(path) -#define xmlGetProp(node, prop) rxml_node_attrib(node, prop) -#define xmlFree(p) ((void)0) -#define xmlNodeGetContent(node) (node->data) -#define xmlDocGetRootElement(doc) rxml_root_node(doc) -#define xmlFreeDoc(doc) rxml_free_document(doc) -#define xmlFreeParserCtxt(ctx) ((void)0) -#endif - -RETRO_END_DECLS +const char *rxml_node_attrib(struct rxml_node *node, const char *attrib); #endif diff --git a/libretro-common/include/glsym/glsym.h b/libretro-common/include/glsym/glsym.h index a64fe573fb..4e06a4a07a 100644 --- a/libretro-common/include/glsym/glsym.h +++ b/libretro-common/include/glsym/glsym.h @@ -38,4 +38,8 @@ #endif #endif +#ifdef HAVE_GLSYM_PRIVATE +#include "glsym_private.h" +#endif + #endif diff --git a/libretro-common/include/libchdr/chd.h b/libretro-common/include/libchdr/chd.h index 454de38774..a21ee9dd52 100644 --- a/libretro-common/include/libchdr/chd.h +++ b/libretro-common/include/libchdr/chd.h @@ -212,7 +212,7 @@ extern "C" { /* standard hard disk metadata */ #define HARD_DISK_METADATA_TAG 0x47444444 /* 'GDDD' */ -#define HARD_DISK_METADATA_FORMAT "CYLS:%d,HEADS:%d,SECS:%d,BPS:%d" +#define HARD_DISK_METADATA_FORMAT "CYLS:%u,HEADS:%u,SECS:%u,BPS:%u" /* hard disk identify information */ #define HARD_DISK_IDENT_METADATA_TAG 0x49444e54 /* 'IDNT' */ @@ -226,11 +226,11 @@ extern "C" { /* standard CD-ROM metadata */ #define CDROM_OLD_METADATA_TAG 0x43484344 /* 'CHCD' */ #define CDROM_TRACK_METADATA_TAG 0x43485452 /* 'CHTR' */ -#define CDROM_TRACK_METADATA_FORMAT "TRACK:%d TYPE:%s SUBTYPE:%s FRAMES:%d" +#define CDROM_TRACK_METADATA_FORMAT "TRACK:%u TYPE:%s SUBTYPE:%s FRAMES:%u" #define CDROM_TRACK_METADATA2_TAG 0x43485432 /* 'CHT2' */ -#define CDROM_TRACK_METADATA2_FORMAT "TRACK:%d TYPE:%s SUBTYPE:%s FRAMES:%d PREGAP:%d PGTYPE:%s PGSUB:%s POSTGAP:%d" +#define CDROM_TRACK_METADATA2_FORMAT "TRACK:%u TYPE:%s SUBTYPE:%s FRAMES:%u PREGAP:%u PGTYPE:%s PGSUB:%s POSTGAP:%u" #define GDROM_TRACK_METADATA_TAG 0x43484744 /* 'CHTD' */ -#define GDROM_TRACK_METADATA_FORMAT "TRACK:%d TYPE:%s SUBTYPE:%s FRAMES:%d PAD:%d PREGAP:%d PGTYPE:%s PGSUB:%s POSTGAP:%d" +#define GDROM_TRACK_METADATA_FORMAT "TRACK:%u TYPE:%s SUBTYPE:%s FRAMES:%u PAD:%u PREGAP:%u PGTYPE:%s PGSUB:%s POSTGAP:%u" /* standard A/V metadata */ #define AV_METADATA_TAG 0x41564156 /* 'AVAV' */ diff --git a/libretro-common/include/libretro.h b/libretro-common/include/libretro.h index 1482ea4104..b089316718 100644 --- a/libretro-common/include/libretro.h +++ b/libretro-common/include/libretro.h @@ -274,6 +274,7 @@ enum retro_language RETRO_LANGUAGE_VIETNAMESE = 15, RETRO_LANGUAGE_ARABIC = 16, RETRO_LANGUAGE_GREEK = 17, + RETRO_LANGUAGE_TURKISH = 18, RETRO_LANGUAGE_LAST, /* Ensure sizeof(enum) == sizeof(int) */ @@ -485,7 +486,6 @@ enum retro_mod /* Environment commands. */ #define RETRO_ENVIRONMENT_SET_ROTATION 1 /* const unsigned * -- * Sets screen rotation of graphics. - * Is only implemented if rotation can be accelerated by hardware. * Valid values are 0, 1, 2, 3, which rotates screen by 0, 90, 180, * 270 degrees counter-clockwise respectively. */ diff --git a/libretro-common/include/retro_miscellaneous.h b/libretro-common/include/retro_miscellaneous.h index 814bdef923..3893416ee4 100644 --- a/libretro-common/include/retro_miscellaneous.h +++ b/libretro-common/include/retro_miscellaneous.h @@ -166,7 +166,7 @@ typedef struct # endif # endif #elif PS2 -# define PRI_SIZET "lu" +# define PRI_SIZET "u" #else # if (SIZE_MAX == 0xFFFF) # define PRI_SIZET "hu" diff --git a/libretro-common/include/string/stdstring.h b/libretro-common/include/string/stdstring.h index 3d278d7cf2..af07b01121 100644 --- a/libretro-common/include/string/stdstring.h +++ b/libretro-common/include/string/stdstring.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2019 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (stdstring.h). @@ -44,12 +44,7 @@ static INLINE bool string_is_equal(const char *a, const char *b) { if (!a || !b) return false; - while(*a && (*a == *b)) - { - a++; - b++; - } - return (*(const unsigned char*)a - *(const unsigned char*)b) == 0; + return !strcmp(a, b); } static INLINE bool string_is_not_equal(const char *a, const char *b) diff --git a/libretro-common/lists/file_list.c b/libretro-common/lists/file_list.c index 2d7780cab6..a4bd5a9b78 100644 --- a/libretro-common/lists/file_list.c +++ b/libretro-common/lists/file_list.c @@ -116,7 +116,7 @@ bool file_list_insert(file_list_t *list, free(copy); } - file_list_add(list, idx, path, label, type, + file_list_add(list, (unsigned)idx, path, label, type, directory_ptr, entry_idx); return true; diff --git a/libretro-common/net/net_http.c b/libretro-common/net/net_http.c index 4f2ad2635e..fef8400012 100644 --- a/libretro-common/net/net_http.c +++ b/libretro-common/net/net_http.c @@ -483,15 +483,18 @@ struct http_t *net_http_new(struct http_connection_t *conn) return state; error: - if (conn->methodcopy) - free(conn->methodcopy); - if (conn->contenttypecopy) - free(conn->contenttypecopy); - conn->methodcopy = NULL; - conn->contenttypecopy = NULL; - conn->postdatacopy = NULL; + if (conn) + { + if (conn->methodcopy) + free(conn->methodcopy); + if (conn->contenttypecopy) + free(conn->contenttypecopy); + conn->methodcopy = NULL; + conn->contenttypecopy = NULL; + conn->postdatacopy = NULL; + } #ifdef HAVE_SSL - if (conn->sock_state.ssl && conn->sock_state.ssl_ctx && fd >= 0) + if (conn && conn->sock_state.ssl && conn->sock_state.ssl_ctx && fd >= 0) { ssl_socket_close(conn->sock_state.ssl_ctx); ssl_socket_free(conn->sock_state.ssl_ctx); diff --git a/libretro-common/rthreads/rsemaphore.c b/libretro-common/rthreads/rsemaphore.c new file mode 100644 index 0000000000..aa2a285d50 --- /dev/null +++ b/libretro-common/rthreads/rsemaphore.c @@ -0,0 +1,116 @@ +/* + Copyright 2005 Allen B. Downey + + This file contains an example program from The Little Book of + Semaphores, available from Green Tea Press, greenteapress.com + + This program 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 Foundation; either version 2 of the License, or + (at your option) any later version. + + This program 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 this program; if not, see http://www.gnu.org/licenses/gpl.html + or write to the Free Software Foundation, Inc., 51 Franklin St, + Fifth Floor, Boston, MA 02110-1301 USA +*/ + +/* Code taken from http://greenteapress.com/semaphores/semaphore.c + * and changed to use libretro-common's mutexes and conditions. + */ + +#include + +#include +#include + +struct ssem +{ + int value; + int wakeups; + slock_t *mutex; + scond_t *cond; +}; + +ssem_t *ssem_new(int value) +{ + ssem_t *semaphore = (ssem_t*)calloc(1, sizeof(*semaphore)); + + if (!semaphore) + goto error; + + semaphore->value = value; + semaphore->wakeups = 0; + semaphore->mutex = slock_new(); + + if (!semaphore->mutex) + goto error; + + semaphore->cond = scond_new(); + + if (!semaphore->cond) + goto error; + + return semaphore; + +error: + if (semaphore->mutex) + slock_free(semaphore->mutex); + semaphore->mutex = NULL; + if (semaphore) + free((void*)semaphore); + return NULL; +} + +void ssem_free(ssem_t *semaphore) +{ + if (!semaphore) + return; + + scond_free(semaphore->cond); + slock_free(semaphore->mutex); + free((void*)semaphore); +} + +void ssem_wait(ssem_t *semaphore) +{ + if (!semaphore) + return; + + slock_lock(semaphore->mutex); + semaphore->value--; + + if (semaphore->value < 0) + { + do + { + scond_wait(semaphore->cond, semaphore->mutex); + }while (semaphore->wakeups < 1); + + semaphore->wakeups--; + } + + slock_unlock(semaphore->mutex); +} + +void ssem_signal(ssem_t *semaphore) +{ + if (!semaphore) + return; + + slock_lock(semaphore->mutex); + semaphore->value++; + + if (semaphore->value <= 0) + { + semaphore->wakeups++; + scond_signal(semaphore->cond); + } + + slock_unlock(semaphore->mutex); +} diff --git a/libretro-common/vfs/vfs_implementation.c b/libretro-common/vfs/vfs_implementation.c index b791fa0d6f..6dfb9b83b5 100644 --- a/libretro-common/vfs/vfs_implementation.c +++ b/libretro-common/vfs/vfs_implementation.c @@ -52,6 +52,7 @@ # endif # if defined(PS2) # include +# include # endif # include # include @@ -1045,7 +1046,7 @@ libretro_vfs_implementation_dir *retro_vfs_opendir_impl(const char *name, bool i #elif defined(VITA) || defined(PSP) rdir->directory = sceIoDopen(name); #elif defined(PS2) - rdir->directory = fileXioDopen(name); + rdir->directory = ps2fileXioDopen(name); #elif defined(_3DS) rdir->directory = !string_is_empty(name) ? opendir(name) : NULL; rdir->entry = NULL; @@ -1088,7 +1089,7 @@ bool retro_vfs_readdir_impl(libretro_vfs_implementation_dir *rdir) return (sceIoDread(rdir->directory, &rdir->entry) > 0); #elif defined(PS2) iox_dirent_t record; - int ret = fileXioDread(rdir->directory, &record); + int ret = ps2fileXioDread(rdir->directory, &record); rdir->entry = record; return ( ret > 0); #elif defined(__CELLOS_LV2__) @@ -1186,7 +1187,7 @@ int retro_vfs_closedir_impl(libretro_vfs_implementation_dir *rdir) #elif defined(VITA) || defined(PSP) sceIoDclose(rdir->directory); #elif defined(PS2) - fileXioDclose(rdir->directory); + ps2fileXioDclose(rdir->directory); #elif defined(__CELLOS_LV2__) rdir->error = cellFsClosedir(rdir->directory); #elif defined(ORBIS) diff --git a/libretro-common/vfs/vfs_implementation_uwp.cpp b/libretro-common/vfs/vfs_implementation_uwp.cpp index 9487840659..86435ee14c 100644 --- a/libretro-common/vfs/vfs_implementation_uwp.cpp +++ b/libretro-common/vfs/vfs_implementation_uwp.cpp @@ -55,69 +55,63 @@ using namespace Windows::Storage::FileProperties; namespace { - /* Dear Microsoft - * I really appreciate all the effort you took to not provide any - * synchronous file APIs and block all attempts to synchronously - * wait for the results of async tasks for "smooth user experience", - * but I'm not going to run and rewrite all RetroArch cores for - * async I/O. I hope you like this hack I made instead. - */ template - T RunAsync(std::function()> func) - { - volatile bool finished = false; - volatile Platform::Exception^ exception = nullptr; - volatile T result; - func().then([&finished, &exception, &result](concurrency::task t) { - try - { - result = t.get(); - } - catch (Platform::Exception^ exception_) - { - exception = exception_; - } - finished = true; - }); - - /* Don't stall the UI thread - prevents a deadlock */ - Windows::UI::Core::CoreWindow^ corewindow = Windows::UI::Core::CoreWindow::GetForCurrentThread(); - while (!finished) - { - if (corewindow) - corewindow->Dispatcher->ProcessEvents(Windows::UI::Core::CoreProcessEventsOption::ProcessAllIfPresent); - } - - if (exception != nullptr) - throw exception; - return result; - } - - template - T RunAsyncAndCatchErrors(std::function()> func, T valueOnError) + static T RunAsyncAndCatchErrors(std::function()> func, T valueOnError) { try { - return RunAsync(func); + /* Dear Microsoft + * I really appreciate all the effort you took to not provide any + * synchronous file APIs and block all attempts to synchronously + * wait for the results of async tasks for "smooth user experience", + * but I'm not going to run and rewrite all RetroArch cores for + * async I/O. I hope you like this hack I made instead. + */ + volatile bool finished = false; + volatile Platform::Exception^ exception = nullptr; + volatile T result; + func().then([&finished, &exception, &result](concurrency::task t) { + try + { + result = t.get(); + } + catch (Platform::Exception^ exception_) + { + exception = exception_; + } + finished = true; + }); + + /* Don't stall the UI thread - prevents a deadlock */ + Windows::UI::Core::CoreWindow^ corewindow = Windows::UI::Core::CoreWindow::GetForCurrentThread(); + while (!finished) + { + if (corewindow) + corewindow->Dispatcher->ProcessEvents(Windows::UI::Core::CoreProcessEventsOption::ProcessAllIfPresent); + } + + if (exception != nullptr) + throw exception; + return result; } catch (Platform::Exception^ e) { return valueOnError; } } +} - void windowsize_path(wchar_t* path) +static void windowsize_path(wchar_t* path) +{ + /* UWP deals with paths containing / instead of \ way worse than normal Windows */ + /* and RetroArch may sometimes mix them (e.g. on archive extraction) */ + if (!path) + return; + while (*path) { - /* UWP deals with paths containing / instead of \ way worse than normal Windows */ - /* and RetroArch may sometimes mix them (e.g. on archive extraction) */ - if (!path) - return; - while (*path) - { - if (*path == '/') - *path = '\\'; - ++path; - } + if (*path == '/') + *path = '\\'; + ++path; } } @@ -125,35 +119,38 @@ namespace { /* Damn you, UWP, why no functions for that either */ template - concurrency::task GetItemFromPathAsync(Platform::String^ path) + static concurrency::task GetItemFromPathAsync(Platform::String^ path) { static_assert(false, "StorageFile and StorageFolder only"); } + template<> - concurrency::task GetItemFromPathAsync(Platform::String^ path) + static concurrency::task GetItemFromPathAsync(Platform::String^ path) { return concurrency::create_task(StorageFile::GetFileFromPathAsync(path)); } template<> - concurrency::task GetItemFromPathAsync(Platform::String^ path) + static concurrency::task GetItemFromPathAsync(Platform::String^ path) { return concurrency::create_task(StorageFolder::GetFolderFromPathAsync(path)); } template - concurrency::task GetItemInFolderFromPathAsync(StorageFolder^ folder, Platform::String^ path) + static concurrency::task GetItemInFolderFromPathAsync(StorageFolder^ folder, Platform::String^ path) { static_assert(false, "StorageFile and StorageFolder only"); } + template<> - concurrency::task GetItemInFolderFromPathAsync(StorageFolder^ folder, Platform::String^ path) + static concurrency::task GetItemInFolderFromPathAsync(StorageFolder^ folder, Platform::String^ path) { if (path->IsEmpty()) retro_assert(false); /* Attempt to read a folder as a file - this really should have been caught earlier */ return concurrency::create_task(folder->GetFileAsync(path)); } + template<> - concurrency::task GetItemInFolderFromPathAsync(StorageFolder^ folder, Platform::String^ path) + static concurrency::task GetItemInFolderFromPathAsync(StorageFolder^ folder, Platform::String^ path) { if (path->IsEmpty()) return concurrency::create_task(concurrency::create_async([folder]() { return folder; })); @@ -166,7 +163,7 @@ namespace /* A list of all StorageFolder objects returned using from the file picker */ Platform::Collections::Vector accessible_directories; - concurrency::task TriggerPickerAddDialog() + static concurrency::task TriggerPickerAddDialog() { auto folderPicker = ref new Windows::Storage::Pickers::FolderPicker(); folderPicker->SuggestedStartLocation = Windows::Storage::Pickers::PickerLocationId::Desktop; @@ -183,16 +180,18 @@ namespace } template - concurrency::task LocateStorageItem(Platform::String^ path) + static concurrency::task LocateStorageItem(Platform::String^ path) { /* Look for a matching directory we can use */ for each (StorageFolder^ folder in accessible_directories) { + std::wstring file_path; std::wstring folder_path = folder->Path->Data(); /* Could be C:\ or C:\Users\somebody - remove the trailing slash to unify them */ if (folder_path[folder_path.size() - 1] == '\\') folder_path.erase(folder_path.size() - 1); - std::wstring file_path = path->Data(); + file_path = path->Data(); + if (file_path.find(folder_path) == 0) { /* Found a match */ @@ -231,7 +230,7 @@ namespace }); } - IStorageItem^ LocateStorageFileOrFolder(Platform::String^ path) + static IStorageItem^ LocateStorageFileOrFolder(Platform::String^ path) { if (!path || path->IsEmpty()) return nullptr; @@ -246,8 +245,7 @@ namespace else { /* No final slash - probably a file (since RetroArch usually slash-terminates dirs), but there is still a chance it's a directory */ - IStorageItem^ item; - item = RunAsyncAndCatchErrors([=]() { + IStorageItem ^item = RunAsyncAndCatchErrors([=]() { return concurrency::create_task(LocateStorageItem(path)); }, nullptr); if (!item) @@ -271,8 +269,14 @@ struct libretro_vfs_implementation_file char* orig_path; }; -libretro_vfs_implementation_file *retro_vfs_file_open_impl(const char *path, unsigned mode, unsigned hints) +libretro_vfs_implementation_file *retro_vfs_file_open_impl( + const char *path, unsigned mode, unsigned hints) { + char *filename = NULL; + char *dirpath = NULL; + wchar_t *dirpath_wide = NULL; + wchar_t *filename_wide = NULL; + if (!path || !*path) return NULL; @@ -288,44 +292,56 @@ libretro_vfs_implementation_file *retro_vfs_file_open_impl(const char *path, uns return NULL; } - char* dirpath = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); - fill_pathname_basedir(dirpath, path, PATH_MAX_LENGTH); - wchar_t *dirpath_wide = utf8_to_utf16_string_alloc(dirpath); - windowsize_path(dirpath_wide); - Platform::String^ dirpath_str = ref new Platform::String(dirpath_wide); - free(dirpath_wide); - free(dirpath); + dirpath = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); - char* filename = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); + if (!dirpath) + return NULL; + + fill_pathname_basedir(dirpath, path, PATH_MAX_LENGTH); + + dirpath_wide = utf8_to_utf16_string_alloc(dirpath); + windowsize_path(dirpath_wide); + Platform::String^ dirpath_str = ref new Platform::String(dirpath_wide); + + filename = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); fill_pathname_base(filename, path, PATH_MAX_LENGTH); - wchar_t *filename_wide = utf8_to_utf16_string_alloc(filename); + filename_wide = utf8_to_utf16_string_alloc(filename); Platform::String^ filename_str = ref new Platform::String(filename_wide); + free(filename_wide); free(filename); + free(dirpath_wide); + free(dirpath); retro_assert(!dirpath_str->IsEmpty() && !filename_str->IsEmpty()); return RunAsyncAndCatchErrors([=]() { - return concurrency::create_task(LocateStorageItem(dirpath_str)).then([=](StorageFolder^ dir) { - if (mode == RETRO_VFS_FILE_ACCESS_READ) - return dir->GetFileAsync(filename_str); - else + return concurrency::create_task(LocateStorageItem(dirpath_str)). + then([=](StorageFolder^ dir) + { + if (mode == RETRO_VFS_FILE_ACCESS_READ) + return dir->GetFileAsync(filename_str); return dir->CreateFileAsync(filename_str, (mode & RETRO_VFS_FILE_ACCESS_UPDATE_EXISTING) != 0 ? CreationCollisionOption::OpenIfExists : CreationCollisionOption::ReplaceExisting); - }).then([=](StorageFile^ file) { - FileAccessMode accessMode = mode == RETRO_VFS_FILE_ACCESS_READ ? + } + ).then([=](StorageFile^ file) + { + FileAccessMode accessMode = mode == RETRO_VFS_FILE_ACCESS_READ ? FileAccessMode::Read : FileAccessMode::ReadWrite; - return file->OpenAsync(accessMode); - }).then([=](IRandomAccessStream^ fpstream) { - libretro_vfs_implementation_file *stream = (libretro_vfs_implementation_file*)calloc(1, sizeof(*stream)); - if (!stream) - return (libretro_vfs_implementation_file*)NULL; + return file->OpenAsync(accessMode); + } + ).then([=](IRandomAccessStream^ fpstream) + { + libretro_vfs_implementation_file *stream = (libretro_vfs_implementation_file*)calloc(1, sizeof(*stream)); + if (!stream) + return (libretro_vfs_implementation_file*)NULL; - stream->orig_path = strdup(path); - stream->fp = fpstream; - stream->fp->Seek(0); - return stream; - }); + stream->orig_path = strdup(path); + stream->fp = fpstream; + stream->fp->Seek(0); + return stream; + } + ); }, NULL); } @@ -406,9 +422,10 @@ public: HRESULT __stdcall RuntimeClassInitialize(byte *buffer, uint32_t capacity, uint32_t length) { - m_buffer = buffer; + m_buffer = buffer; m_capacity = capacity; - m_length = length; + m_length = length; + return S_OK; } @@ -451,7 +468,7 @@ IBuffer^ CreateNativeBuffer(void* buf, uint32_t capacity, uint32_t length) Microsoft::WRL::ComPtr nativeBuffer; Microsoft::WRL::Details::MakeAndInitialize(&nativeBuffer, (byte *)buf, capacity, length); auto iinspectable = (IInspectable *)reinterpret_cast(nativeBuffer.Get()); - IBuffer ^buffer = reinterpret_cast(iinspectable); + IBuffer ^buffer = reinterpret_cast(iinspectable); return buffer; } @@ -498,12 +515,13 @@ int retro_vfs_file_flush_impl(libretro_vfs_implementation_file *stream) int retro_vfs_file_remove_impl(const char *path) { + wchar_t *path_wide = NULL; if (!path || !*path) return -1; - wchar_t *path_wide = utf8_to_utf16_string_alloc(path); + path_wide = utf8_to_utf16_string_alloc(path); windowsize_path(path_wide); - Platform::String^ path_str = ref new Platform::String(path_wide); + Platform::String^ path_str = ref new Platform::String(path_wide); free(path_wide); return RunAsyncAndCatchErrors([=]() { @@ -518,29 +536,38 @@ int retro_vfs_file_remove_impl(const char *path) /* TODO: this may not work if trying to move a directory */ int retro_vfs_file_rename_impl(const char *old_path, const char *new_path) { + wchar_t *old_path_wide = NULL; + wchar_t *new_dir_path_wide = NULL; + wchar_t *new_file_name_wide = NULL; + char *new_dir_path = NULL; + char *new_file_name = NULL; + if (!old_path || !*old_path || !new_path || !*new_path) return -1; - wchar_t* old_path_wide = utf8_to_utf16_string_alloc(old_path); - Platform::String^ old_path_str = ref new Platform::String(old_path_wide); + old_path_wide = utf8_to_utf16_string_alloc(old_path); + Platform::String^ old_path_str = ref new Platform::String(old_path_wide); free(old_path_wide); - char* new_dir_path = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); + new_dir_path = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); fill_pathname_basedir(new_dir_path, new_path, PATH_MAX_LENGTH); - wchar_t *new_dir_path_wide = utf8_to_utf16_string_alloc(new_dir_path); + new_dir_path_wide = utf8_to_utf16_string_alloc(new_dir_path); windowsize_path(new_dir_path_wide); Platform::String^ new_dir_path_str = ref new Platform::String(new_dir_path_wide); free(new_dir_path_wide); free(new_dir_path); - char* new_file_name = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); + new_file_name = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); fill_pathname_base(new_file_name, new_path, PATH_MAX_LENGTH); - wchar_t *new_file_name_wide = utf8_to_utf16_string_alloc(new_file_name); + new_file_name_wide = utf8_to_utf16_string_alloc(new_file_name); Platform::String^ new_file_name_str = ref new Platform::String(new_file_name_wide); free(new_file_name_wide); free(new_file_name); - retro_assert(!old_path_str->IsEmpty() && !new_dir_path_str->IsEmpty() && !new_file_name_str->IsEmpty()); + retro_assert( + !old_path_str->IsEmpty() + && !new_dir_path_str->IsEmpty() + && !new_file_name_str->IsEmpty()); return RunAsyncAndCatchErrors([=]() { concurrency::task old_file_task = concurrency::create_task(LocateStorageItem(old_path_str)); @@ -570,11 +597,17 @@ const char *retro_vfs_file_get_path_impl(libretro_vfs_implementation_file *strea int retro_vfs_stat_impl(const char *path, int32_t *size) { + wchar_t *path_wide = NULL; if (!path || !*path) return 0; - wchar_t *path_wide = utf8_to_utf16_string_alloc(path); + path_wide = utf8_to_utf16_string_alloc(path); + + if (!path_wide) + return 0; + windowsize_path(path_wide); + Platform::String^ path_str = ref new Platform::String(path_wide); free(path_wide); @@ -593,25 +626,31 @@ int retro_vfs_stat_impl(const char *path, int32_t *size) int retro_vfs_mkdir_impl(const char *dir) { + char *dir_local = NULL; + char *tmp = NULL; + char *dir_name = NULL; + char *parent_path = NULL; + wchar_t *dir_name_wide = NULL; + wchar_t *parent_path_wide = NULL; if (!dir || !*dir) return -1; - char* dir_local = strdup(dir); + dir_local = strdup(dir); /* If the path ends with a slash, we have to remove it for basename to work */ - char* tmp = dir_local + strlen(dir_local) - 1; + tmp = dir_local + strlen(dir_local) - 1; if (path_char_is_slash(*tmp)) *tmp = 0; - char* dir_name = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); + dir_name = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); fill_pathname_base(dir_name, dir_local, PATH_MAX_LENGTH); - wchar_t *dir_name_wide = utf8_to_utf16_string_alloc(dir_name); - Platform::String^ dir_name_str = ref new Platform::String(dir_name_wide); + dir_name_wide = utf8_to_utf16_string_alloc(dir_name); + Platform::String^ dir_name_str = ref new Platform::String(dir_name_wide); free(dir_name_wide); free(dir_name); - char* parent_path = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); + parent_path = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); fill_pathname_parent_dir(parent_path, dir_local, PATH_MAX_LENGTH); - wchar_t *parent_path_wide = utf8_to_utf16_string_alloc(parent_path); + parent_path_wide = utf8_to_utf16_string_alloc(parent_path); windowsize_path(parent_path_wide); Platform::String^ parent_path_str = ref new Platform::String(parent_path_wide); free(parent_path_wide); @@ -653,7 +692,8 @@ struct libretro_vfs_implementation_dir libretro_vfs_implementation_dir *retro_vfs_opendir_impl(const char *name, bool include_hidden) { - libretro_vfs_implementation_dir *rdir; + libretro_vfs_implementation_dir *rdir = NULL; + wchar_t *name_wide = NULL; if (!name || !*name) return NULL; @@ -662,7 +702,7 @@ libretro_vfs_implementation_dir *retro_vfs_opendir_impl(const char *name, bool i if (!rdir) return NULL; - wchar_t *name_wide = utf8_to_utf16_string_alloc(name); + name_wide = utf8_to_utf16_string_alloc(name); windowsize_path(name_wide); Platform::String^ name_str = ref new Platform::String(name_wide); free(name_wide); @@ -687,10 +727,8 @@ bool retro_vfs_readdir_impl(libretro_vfs_implementation_dir *rdir) rdir->entry = rdir->directory->First(); return rdir->entry->HasCurrent; } - else - { - return rdir->entry->MoveNext(); - } + + return rdir->entry->MoveNext(); } const char *retro_vfs_dirent_get_name_impl(libretro_vfs_implementation_dir *rdir) @@ -713,7 +751,7 @@ int retro_vfs_closedir_impl(libretro_vfs_implementation_dir *rdir) if (rdir->entry_name) free(rdir->entry_name); - rdir->entry = nullptr; + rdir->entry = nullptr; rdir->directory = nullptr; free(rdir); @@ -722,10 +760,12 @@ int retro_vfs_closedir_impl(libretro_vfs_implementation_dir *rdir) bool uwp_is_path_accessible_using_standard_io(const char *path) { + bool result = false; char *relative_path_abbrev = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); + fill_pathname_abbreviate_special(relative_path_abbrev, path, PATH_MAX_LENGTH * sizeof(char)); - bool result = strlen(relative_path_abbrev) >= 2 && (relative_path_abbrev[0] == ':' || relative_path_abbrev[0] == '~') && path_char_is_slash(relative_path_abbrev[1]); + result = strlen(relative_path_abbrev) >= 2 && (relative_path_abbrev[0] == ':' || relative_path_abbrev[0] == '~') && path_char_is_slash(relative_path_abbrev[1]); free(relative_path_abbrev); return result; @@ -733,10 +773,11 @@ bool uwp_is_path_accessible_using_standard_io(const char *path) bool uwp_drive_exists(const char *path) { + wchar_t *path_wide = NULL; if (!path || !*path) return 0; - wchar_t *path_wide = utf8_to_utf16_string_alloc(path); + path_wide = utf8_to_utf16_string_alloc(path); Platform::String^ path_str = ref new Platform::String(path_wide); free(path_wide); diff --git a/list_special.c b/list_special.c index 4df9ed804d..2be08e3303 100644 --- a/list_special.c +++ b/list_special.c @@ -31,17 +31,13 @@ #include "menu/menu_driver.h" #endif -#ifdef HAVE_CAMERA #include "camera/camera_driver.h" -#endif #ifdef HAVE_WIFI #include "wifi/wifi_driver.h" #endif -#ifdef HAVE_LOCATION #include "location/location_driver.h" -#endif #include "list_special.h" #include "frontend/frontend_driver.h" @@ -187,7 +183,6 @@ struct string_list *string_list_new_special(enum string_list_type type, break; #endif case STRING_LIST_CAMERA_DRIVERS: -#ifdef HAVE_CAMERA for (i = 0; camera_driver_find_handle(i); i++) { const char *opt = camera_driver_find_ident(i); @@ -196,7 +191,6 @@ struct string_list *string_list_new_special(enum string_list_type type, string_list_append(s, opt, attr); } break; -#endif case STRING_LIST_WIFI_DRIVERS: #ifdef HAVE_WIFI for (i = 0; wifi_driver_find_handle(i); i++) @@ -209,15 +203,13 @@ struct string_list *string_list_new_special(enum string_list_type type, break; #endif case STRING_LIST_LOCATION_DRIVERS: -#ifdef HAVE_LOCATION for (i = 0; location_driver_find_handle(i); i++) { const char *opt = location_driver_find_ident(i); *len += strlen(opt) + 1; - string_list_append(options_l, opt, attr); + string_list_append(s, opt, attr); } break; -#endif case STRING_LIST_AUDIO_DRIVERS: for (i = 0; audio_driver_find_handle(i); i++) { diff --git a/managers/cheat_manager.c b/managers/cheat_manager.c index 7f14060c6a..334e558610 100644 --- a/managers/cheat_manager.c +++ b/managers/cheat_manager.c @@ -72,6 +72,7 @@ void cheat_manager_apply_cheats(void) /* RCHEEVOS TODO: remove settings init */ settings_t *settings = config_get_ptr(); bool data_bool = false; + #endif unsigned i, idx = 0; @@ -86,9 +87,9 @@ void cheat_manager_apply_cheats(void) { retro_ctx_cheat_info_t cheat_info; - cheat_info.index = idx++; + cheat_info.index = idx++; cheat_info.enabled = true; - cheat_info.code = cheat_manager_state.cheats[i].code; + cheat_info.code = cheat_manager_state.cheats[i].code; if (!string_is_empty(cheat_info.code)) core_set_cheat(&cheat_info); @@ -114,9 +115,9 @@ void cheat_manager_set_code(unsigned i, const char *str) return; if (!string_is_empty(str)) - strcpy(cheat_manager_state.cheats[i].code,str); + strcpy(cheat_manager_state.cheats[i].code, str); - cheat_manager_state.cheats[i].state = true; + cheat_manager_state.cheats[i].state = true; } /** @@ -133,30 +134,30 @@ bool cheat_manager_save(const char *path, const char *cheat_database, bool overw unsigned i; char buf[PATH_MAX_LENGTH]; char cheats_file[PATH_MAX_LENGTH]; - config_file_t *conf = NULL; + config_file_t *conf = NULL; unsigned int* data_ptrs[16] = { NULL}; - char* keys[16] = { - (char*)"cheat%u_handler", - (char*)"cheat%u_memory_search_size", - (char*)"cheat%u_cheat_type", - (char*)"cheat%u_value", - (char*)"cheat%u_address", - (char*)"cheat%u_address_bit_position", - (char*)"cheat%u_rumble_type", - (char*)"cheat%u_rumble_value", - (char*)"cheat%u_rumble_port", - (char*)"cheat%u_rumble_primary_strength", - (char*)"cheat%u_rumble_primary_duration", - (char*)"cheat%u_rumble_secondary_strength", - (char*)"cheat%u_rumble_secondary_duration", - (char*)"cheat%u_repeat_count", - (char*)"cheat%u_repeat_add_to_value", - (char*)"cheat%u_repeat_add_to_address" + char* keys[16] = { + (char*)"cheat%u_handler", + (char*)"cheat%u_memory_search_size", + (char*)"cheat%u_cheat_type", + (char*)"cheat%u_value", + (char*)"cheat%u_address", + (char*)"cheat%u_address_bit_position", + (char*)"cheat%u_rumble_type", + (char*)"cheat%u_rumble_value", + (char*)"cheat%u_rumble_port", + (char*)"cheat%u_rumble_primary_strength", + (char*)"cheat%u_rumble_primary_duration", + (char*)"cheat%u_rumble_secondary_strength", + (char*)"cheat%u_rumble_secondary_duration", + (char*)"cheat%u_repeat_count", + (char*)"cheat%u_repeat_add_to_value", + (char*)"cheat%u_repeat_add_to_address" }; buf[0] = cheats_file[0] = '\0'; - if ((!cheat_manager_state.cheats) || cheat_manager_state.size==0) + if ((!cheat_manager_state.cheats) || cheat_manager_state.size == 0) return false; if (!cheat_database) @@ -167,6 +168,7 @@ bool cheat_manager_save(const char *path, const char *cheat_database, bool overw fill_pathname_noext(cheats_file, buf, ".cht", sizeof(cheats_file)); } + if (!overwrite) conf = config_file_new(cheats_file); else @@ -193,19 +195,19 @@ bool cheat_manager_save(const char *path, const char *cheat_database, bool overw key[0] = endian_key[0] = desc_key[0] = code_key[0] = enable_key[0] = '\0'; - snprintf(endian_key, sizeof(endian_key), "cheat%u_big_endian", i); - snprintf(desc_key, sizeof(desc_key), "cheat%u_desc", i); - snprintf(code_key, sizeof(code_key), "cheat%u_code", i); + snprintf(endian_key, sizeof(endian_key), "cheat%u_big_endian", i); + snprintf(desc_key, sizeof(desc_key), "cheat%u_desc", i); + snprintf(code_key, sizeof(code_key), "cheat%u_code", i); snprintf(enable_key, sizeof(enable_key), "cheat%u_enable", i); if (!string_is_empty(cheat_manager_state.cheats[i].desc)) - config_set_string(conf, desc_key, cheat_manager_state.cheats[i].desc); + config_set_string(conf, desc_key, cheat_manager_state.cheats[i].desc); else - config_set_string(conf, desc_key, cheat_manager_state.cheats[i].code); + config_set_string(conf, desc_key, cheat_manager_state.cheats[i].code); - config_set_string(conf, code_key, cheat_manager_state.cheats[i].code); - config_set_bool(conf, enable_key, cheat_manager_state.cheats[i].state); - config_set_bool(conf, endian_key, cheat_manager_state.cheats[i].big_endian); + config_set_string(conf, code_key, cheat_manager_state.cheats[i].code); + config_set_bool(conf, enable_key, cheat_manager_state.cheats[i].state); + config_set_bool(conf, endian_key, cheat_manager_state.cheats[i].big_endian); data_ptrs[0] = &cheat_manager_state.cheats[i].handler; data_ptrs[1] = &cheat_manager_state.cheats[i].memory_search_size; @@ -241,10 +243,11 @@ bool cheat_manager_save(const char *path, const char *cheat_database, bool overw bool cheat_manager_copy_idx_to_working(unsigned idx) { - if ((!cheat_manager_state.cheats) || (cheat_manager_state.size < idx+1)) + if ((!cheat_manager_state.cheats) || (cheat_manager_state.size < idx + 1)) return false; memcpy(&(cheat_manager_state.working_cheat), &(cheat_manager_state.cheats[idx]), sizeof(struct item_cheat)); + if (cheat_manager_state.cheats[idx].desc) strlcpy(cheat_manager_state.working_desc, cheat_manager_state.cheats[idx].desc, CHEAT_DESC_SCRATCH_SIZE); else @@ -257,12 +260,14 @@ bool cheat_manager_copy_idx_to_working(unsigned idx) return true; } + bool cheat_manager_copy_working_to_idx(unsigned idx) { - if ((!cheat_manager_state.cheats) || (cheat_manager_state.size < idx+1)) + if ((!cheat_manager_state.cheats) || (cheat_manager_state.size < idx + 1)) return false; memcpy(&(cheat_manager_state.cheats[idx]), &(cheat_manager_state.working_cheat), sizeof(struct item_cheat)); + if (cheat_manager_state.cheats[idx].desc) free(cheat_manager_state.cheats[idx].desc); @@ -272,8 +277,10 @@ bool cheat_manager_copy_working_to_idx(unsigned idx) free(cheat_manager_state.cheats[idx].code); cheat_manager_state.cheats[idx].code = strdup(cheat_manager_state.working_code); + return true; } + static void cheat_manager_new(unsigned size) { unsigned i; @@ -281,10 +288,10 @@ static void cheat_manager_new(unsigned size) cheat_manager_free(); cheat_manager_state.buf_size = size; - cheat_manager_state.size = size; - cheat_manager_state.search_bit_size = 3; - cheat_manager_state.cheats = (struct item_cheat*) - calloc(cheat_manager_state.buf_size, sizeof(struct item_cheat)); + cheat_manager_state.size = size; + cheat_manager_state.search_bit_size = 3; + cheat_manager_state.cheats = (struct item_cheat*) + calloc(cheat_manager_state.buf_size, sizeof(struct item_cheat)); if (!cheat_manager_state.cheats) { @@ -298,7 +305,7 @@ static void cheat_manager_new(unsigned size) { cheat_manager_state.cheats[i].desc = NULL; cheat_manager_state.cheats[i].code = NULL; - cheat_manager_state.cheats[i].state = false; + cheat_manager_state.cheats[i].state = false; cheat_manager_state.cheats[i].repeat_count = 1; cheat_manager_state.cheats[i].repeat_add_to_value = 0; cheat_manager_state.cheats[i].repeat_add_to_address = 1; @@ -325,7 +332,7 @@ void cheat_manager_load_cb_second_pass(char *key, char *value) char cheat_num_str[20]; unsigned cheat_num; unsigned cheat_idx; - unsigned idx = 5; + unsigned idx = 5; size_t key_length = 0; errno = 0; @@ -334,29 +341,29 @@ void cheat_manager_load_cb_second_pass(char *key, char *value) key_length = strlen((const char*)key); - while (idx < key_length && key[idx] >= '0' && key[idx] <= '9' && idx < 24) + while (idx < key_length && key[idx] >= '0' && key[idx] <= '9' && idx < 24) { - cheat_num_str[idx-5] = key[idx]; + cheat_num_str[idx - 5] = key[idx]; idx++; } - cheat_num_str[idx-5] = '\0'; + cheat_num_str[idx - 5] = '\0'; cheat_num = (unsigned)strtoul(cheat_num_str, NULL, 0); - if (cheat_num+cheat_manager_state.loading_cheat_offset >= cheat_manager_state.size) + if (cheat_num + cheat_manager_state.loading_cheat_offset >= cheat_manager_state.size) return; - key = key+idx+1; + key = key + idx + 1; - cheat_idx = cheat_num+cheat_manager_state.loading_cheat_offset; + cheat_idx = cheat_num + cheat_manager_state.loading_cheat_offset; if (string_is_equal(key, "address")) cheat_manager_state.cheats[cheat_idx].address = (unsigned)strtoul(value, NULL, 0); else if (string_is_equal(key, "address_bit_position")) cheat_manager_state.cheats[cheat_idx].address_mask = (unsigned)strtoul(value, NULL, 0); else if (string_is_equal(key, "big_endian")) - cheat_manager_state.cheats[cheat_idx].big_endian = (string_is_equal(value,"true") || string_is_equal(value,"1")); + cheat_manager_state.cheats[cheat_idx].big_endian = (string_is_equal(value, "true") || string_is_equal(value, "1")); else if (string_is_equal(key, "cheat_type")) cheat_manager_state.cheats[cheat_idx].cheat_type = (unsigned)strtoul(value, NULL, 0); else if (string_is_equal(key, "code")) @@ -364,7 +371,7 @@ void cheat_manager_load_cb_second_pass(char *key, char *value) else if (string_is_equal(key, "desc")) cheat_manager_state.cheats[cheat_idx].desc = strdup(value); else if (string_is_equal(key, "enable")) - cheat_manager_state.cheats[cheat_idx].state = (string_is_equal(value,"true") || string_is_equal(value,"1")); + cheat_manager_state.cheats[cheat_idx].state = (string_is_equal(value, "true") || string_is_equal(value, "1")); else if (string_is_equal(key, "handler")) cheat_manager_state.cheats[cheat_idx].handler = (unsigned)strtoul(value, NULL, 0); else if (string_is_equal(key, "memory_search_size")) @@ -428,7 +435,9 @@ bool cheat_manager_load(const char *path, bool append) else { cheats = cheats + orig_size; - if (cheat_manager_realloc(cheats, CHEAT_HANDLER_TYPE_EMU)) { } + if (cheat_manager_realloc(cheats, CHEAT_HANDLER_TYPE_EMU)) + { + } } } else @@ -437,14 +446,14 @@ bool cheat_manager_load(const char *path, bool append) cheat_manager_new(cheats); } - for (i = orig_size; i < cheats; i++) + for (i = orig_size; cheat_manager_state.cheats && i < cheats; i++) { - cheat_manager_state.cheats[i].idx = i; - cheat_manager_state.cheats[i].desc = NULL; - cheat_manager_state.cheats[i].code = NULL; - cheat_manager_state.cheats[i].state = false; - cheat_manager_state.cheats[i].big_endian = false; - cheat_manager_state.cheats[i].cheat_type = CHEAT_TYPE_SET_TO_VALUE; + cheat_manager_state.cheats[i].idx = i; + cheat_manager_state.cheats[i].desc = NULL; + cheat_manager_state.cheats[i].code = NULL; + cheat_manager_state.cheats[i].state = false; + cheat_manager_state.cheats[i].big_endian = false; + cheat_manager_state.cheats[i].cheat_type = CHEAT_TYPE_SET_TO_VALUE; cheat_manager_state.cheats[i].memory_search_size = 3; } @@ -472,7 +481,7 @@ bool cheat_manager_realloc(unsigned new_size, unsigned default_handler) if (!cheat_manager_state.cheats) { cheat_manager_state.cheats = (struct item_cheat*) - calloc(new_size, sizeof(struct item_cheat)); + calloc(new_size, sizeof(struct item_cheat)); orig_size = 0; } else @@ -490,8 +499,8 @@ bool cheat_manager_realloc(unsigned new_size, unsigned default_handler) } val = (struct item_cheat*) - realloc(cheat_manager_state.cheats, - new_size * sizeof(struct item_cheat)); + realloc(cheat_manager_state.cheats, + new_size * sizeof(struct item_cheat)); cheat_manager_state.cheats = val ? val : NULL; } @@ -504,18 +513,18 @@ bool cheat_manager_realloc(unsigned new_size, unsigned default_handler) } cheat_manager_state.buf_size = new_size; - cheat_manager_state.size = new_size; + cheat_manager_state.size = new_size; for (i = orig_size; i < cheat_manager_state.size; i++) { memset(&(cheat_manager_state.cheats[i]), 0, sizeof(cheat_manager_state.cheats[i])); - cheat_manager_state.cheats[i].state = false; - cheat_manager_state.cheats[i].handler = default_handler; - cheat_manager_state.cheats[i].cheat_type = CHEAT_TYPE_SET_TO_VALUE; - cheat_manager_state.cheats[i].memory_search_size = 3; - cheat_manager_state.cheats[i].idx = i; - cheat_manager_state.cheats[i].repeat_count = 1; - cheat_manager_state.cheats[i].repeat_add_to_value = 0; + cheat_manager_state.cheats[i].state = false; + cheat_manager_state.cheats[i].handler = default_handler; + cheat_manager_state.cheats[i].cheat_type = CHEAT_TYPE_SET_TO_VALUE; + cheat_manager_state.cheats[i].memory_search_size = 3; + cheat_manager_state.cheats[i].idx = i; + cheat_manager_state.cheats[i].repeat_count = 1; + cheat_manager_state.cheats[i].repeat_add_to_value = 0; cheat_manager_state.cheats[i].repeat_add_to_address = 1; } @@ -551,17 +560,17 @@ void cheat_manager_free(void) if (cheat_manager_state.memory_size_list) free(cheat_manager_state.memory_size_list); - cheat_manager_state.cheats = NULL; - cheat_manager_state.size = 0; - cheat_manager_state.buf_size = 0; - cheat_manager_state.prev_memory_buf = NULL; - cheat_manager_state.curr_memory_buf = NULL; - cheat_manager_state.memory_buf_list = NULL; - cheat_manager_state.memory_size_list = NULL; - cheat_manager_state.matches = NULL; - cheat_manager_state.num_memory_buffers = 0; - cheat_manager_state.total_memory_size = 0; - cheat_manager_state.memory_initialized = false; + cheat_manager_state.cheats = NULL; + cheat_manager_state.size = 0; + cheat_manager_state.buf_size = 0; + cheat_manager_state.prev_memory_buf = NULL; + cheat_manager_state.curr_memory_buf = NULL; + cheat_manager_state.memory_buf_list = NULL; + cheat_manager_state.memory_size_list = NULL; + cheat_manager_state.matches = NULL; + cheat_manager_state.num_memory_buffers = 0; + cheat_manager_state.total_memory_size = 0; + cheat_manager_state.memory_initialized = false; cheat_manager_state.memory_search_initialized = false; } @@ -575,16 +584,16 @@ void cheat_manager_update(cheat_manager_t *handle, unsigned handle_idx) snprintf(msg, sizeof(msg), "Cheat: #%u [%s]: %s", handle_idx, handle->cheats[handle_idx].state ? "ON" : "OFF", - (handle->cheats[handle_idx].desc!=NULL) ? + (handle->cheats[handle_idx].desc != NULL) ? (handle->cheats[handle_idx].desc) : (handle->cheats[handle_idx].code) - ); + ); runloop_msg_queue_push(msg, 1, 180, true, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); RARCH_LOG("%s\n", msg); } void cheat_manager_toggle_index(unsigned i) { - settings_t *settings = config_get_ptr(); + settings_t *settings = config_get_ptr(); if (!cheat_manager_state.cheats || cheat_manager_state.size == 0) return; @@ -654,10 +663,10 @@ bool cheat_manager_get_code_state(unsigned i) bool cheat_manager_get_game_specific_filename(char * cheat_filename, size_t max_length) { - settings_t *settings = config_get_ptr(); - global_t *global = global_get_ptr(); - const char *core_name = NULL; - const char *game_name = NULL; + settings_t *settings = config_get_ptr(); + global_t *global = global_get_ptr(); + const char *core_name = NULL; + const char *game_name = NULL; struct retro_system_info system_info; if (!settings || !global || !cheat_filename) @@ -666,22 +675,22 @@ bool cheat_manager_get_game_specific_filename(char * cheat_filename, size_t max_ if (!core_get_system_info(&system_info)) return false; - core_name = system_info.library_name; - game_name = path_basename(global->name.cheatfile); + core_name = system_info.library_name; + game_name = path_basename(global->name.cheatfile); - if (string_is_empty(settings->paths.path_cheat_database) || - string_is_empty(core_name) || - string_is_empty(game_name)) + if (string_is_empty(settings->paths.path_cheat_database) || + string_is_empty(core_name) || + string_is_empty(game_name)) return false; cheat_filename[0] = '\0'; strlcat(cheat_filename, settings->paths.path_cheat_database, max_length); fill_pathname_slash(cheat_filename, max_length); - strlcat(cheat_filename, core_name, max_length); + strlcat(cheat_filename, core_name, max_length); fill_pathname_slash(cheat_filename, max_length); if (!filestream_exists(cheat_filename)) - path_mkdir(cheat_filename); + path_mkdir(cheat_filename); strlcat(cheat_filename, game_name, max_length); @@ -693,7 +702,7 @@ void cheat_manager_load_game_specific_cheats() char cheat_file[PATH_MAX_LENGTH]; if (cheat_manager_get_game_specific_filename(cheat_file, PATH_MAX_LENGTH)) - cheat_manager_load(cheat_file,true); + cheat_manager_load(cheat_file, true); } void cheat_manager_save_game_specific_cheats() @@ -722,14 +731,14 @@ int cheat_manager_initialize_memory(rarch_setting_t *setting, bool wraparound) { unsigned i; retro_ctx_memory_info_t meminfo; - bool refresh = false; - bool is_search_initialization = (setting != NULL); - rarch_system_info_t *system = runloop_get_system_info(); - unsigned offset = 0; + bool refresh = false; + bool is_search_initialization = (setting != NULL); + rarch_system_info_t *system = runloop_get_system_info(); + unsigned offset = 0; cheat_manager_state.num_memory_buffers = 0; - cheat_manager_state.total_memory_size = 0; - cheat_manager_state.curr_memory_buf = NULL; + cheat_manager_state.total_memory_size = 0; + cheat_manager_state.curr_memory_buf = NULL; if (cheat_manager_state.memory_buf_list) { @@ -771,8 +780,8 @@ int cheat_manager_initialize_memory(rarch_setting_t *setting, bool wraparound) cheat_manager_state.memory_size_list = val; } - cheat_manager_state.memory_buf_list[cheat_manager_state.num_memory_buffers-1] = (uint8_t*)system->mmaps.descriptors[i].core.ptr; - cheat_manager_state.memory_size_list[cheat_manager_state.num_memory_buffers-1] = system->mmaps.descriptors[i].core.len; + cheat_manager_state.memory_buf_list[cheat_manager_state.num_memory_buffers - 1] = (uint8_t*)system->mmaps.descriptors[i].core.ptr; + cheat_manager_state.memory_size_list[cheat_manager_state.num_memory_buffers - 1] = system->mmaps.descriptors[i].core.len; cheat_manager_state.total_memory_size += system->mmaps.descriptors[i].core.len; if (!cheat_manager_state.curr_memory_buf) @@ -793,24 +802,24 @@ int cheat_manager_initialize_memory(rarch_setting_t *setting, bool wraparound) if (meminfo.size == 0) return 0; - cheat_manager_state.memory_buf_list = (uint8_t**) - calloc(1, sizeof(uint8_t *)); - cheat_manager_state.memory_size_list = (unsigned*) - calloc(1, sizeof(unsigned)); - cheat_manager_state.num_memory_buffers = 1; - cheat_manager_state.memory_buf_list[0] = (uint8_t*)meminfo.data; + cheat_manager_state.memory_buf_list = (uint8_t**) + calloc(1, sizeof(uint8_t *)); + cheat_manager_state.memory_size_list = (unsigned*) + calloc(1, sizeof(unsigned)); + cheat_manager_state.num_memory_buffers = 1; + cheat_manager_state.memory_buf_list[0] = (uint8_t*)meminfo.data; cheat_manager_state.memory_size_list[0] = (unsigned)meminfo.size; - cheat_manager_state.total_memory_size = (unsigned)meminfo.size; - cheat_manager_state.curr_memory_buf = (uint8_t*)meminfo.data; + cheat_manager_state.total_memory_size = (unsigned)meminfo.size; + cheat_manager_state.curr_memory_buf = (uint8_t*)meminfo.data; } - cheat_manager_state.num_matches = (cheat_manager_state.total_memory_size*8)/((int)pow(2,cheat_manager_state.search_bit_size)); + cheat_manager_state.num_matches = (cheat_manager_state.total_memory_size * 8) / ((int)pow(2, cheat_manager_state.search_bit_size)); /* Ensure we're aligned on 4-byte boundary */ #if 0 if (meminfo.size % 4 > 0) - cheat_manager_state.total_memory_size = cheat_manager_state.total_memory_size + (4 - (meminfo.size%4)); + cheat_manager_state.total_memory_size = cheat_manager_state.total_memory_size + (4 - (meminfo.size % 4)); #endif if (is_search_initialization) @@ -818,10 +827,10 @@ int cheat_manager_initialize_memory(rarch_setting_t *setting, bool wraparound) if (cheat_manager_state.prev_memory_buf) { free(cheat_manager_state.prev_memory_buf); - cheat_manager_state.prev_memory_buf = NULL; + cheat_manager_state.prev_memory_buf = NULL; } - cheat_manager_state.prev_memory_buf = (uint8_t*) calloc(cheat_manager_state.total_memory_size, sizeof(uint8_t)); + cheat_manager_state.prev_memory_buf = (uint8_t*)calloc(cheat_manager_state.total_memory_size, sizeof(uint8_t)); if (!cheat_manager_state.prev_memory_buf) { runloop_msg_queue_push(msg_hash_to_str(MSG_CHEAT_INIT_FAIL), 1, 180, true, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); @@ -831,10 +840,10 @@ int cheat_manager_initialize_memory(rarch_setting_t *setting, bool wraparound) if (cheat_manager_state.matches) { free(cheat_manager_state.matches); - cheat_manager_state.matches = NULL; + cheat_manager_state.matches = NULL; } - cheat_manager_state.matches = (uint8_t*) calloc(cheat_manager_state.total_memory_size, sizeof(uint8_t)); + cheat_manager_state.matches = (uint8_t*)calloc(cheat_manager_state.total_memory_size, sizeof(uint8_t)); if (!cheat_manager_state.matches) { free(cheat_manager_state.prev_memory_buf); @@ -849,7 +858,7 @@ int cheat_manager_initialize_memory(rarch_setting_t *setting, bool wraparound) for (i = 0; i < cheat_manager_state.num_memory_buffers; i++) { - memcpy(cheat_manager_state.prev_memory_buf+offset, cheat_manager_state.memory_buf_list[i], cheat_manager_state.memory_size_list[i]); + memcpy(cheat_manager_state.prev_memory_buf + offset, cheat_manager_state.memory_buf_list[i], cheat_manager_state.memory_size_list[i]); offset += cheat_manager_state.memory_size_list[i]; } @@ -878,7 +887,7 @@ static unsigned translate_address(unsigned address, unsigned char **curr) for (i = 0; i < cheat_manager_state.num_memory_buffers; i++) { - if ((address >= offset) && (address < offset+cheat_manager_state.memory_size_list[i])) + if ((address >= offset) && (address < offset + cheat_manager_state.memory_size_list[i])) { *curr = cheat_manager_state.memory_buf_list[i]; break; @@ -892,38 +901,38 @@ static unsigned translate_address(unsigned address, unsigned char **curr) static void cheat_manager_setup_search_meta(unsigned int bitsize, unsigned int *bytes_per_item, unsigned int *mask, unsigned int *bits) { - switch( bitsize) + switch (bitsize) { - case 0 : - *bytes_per_item = 1; - *bits = 1; - *mask = 0x01; - break; - case 1 : - *bytes_per_item = 1; - *bits = 2; - *mask = 0x03; - break; - case 2 : - *bytes_per_item = 1; - *bits = 4; - *mask = 0x0F; - break; - case 3 : - *bytes_per_item = 1; - *bits = 8; - *mask = 0xFF; - break; - case 4 : - *bytes_per_item = 2; - *bits = 8; - *mask = 0xFFFF; - break; - case 5 : - *bytes_per_item = 4; - *bits = 8; - *mask = 0xFFFFFFFF; - break; + case 0: + *bytes_per_item = 1; + *bits = 1; + *mask = 0x01; + break; + case 1: + *bytes_per_item = 1; + *bits = 2; + *mask = 0x03; + break; + case 2: + *bytes_per_item = 1; + *bits = 4; + *mask = 0x0F; + break; + case 3: + *bytes_per_item = 1; + *bits = 8; + *mask = 0xFF; + break; + case 4: + *bytes_per_item = 2; + *bits = 8; + *mask = 0xFFFF; + break; + case 5: + *bytes_per_item = 4; + *bits = 8; + *mask = 0xFFFFFFFF; + break; } } @@ -967,17 +976,17 @@ int cheat_manager_search_eqminus(rarch_setting_t *setting, bool wraparound) int cheat_manager_search(enum cheat_search_type search_type) { char msg[100]; - unsigned char *curr = cheat_manager_state.curr_memory_buf; - unsigned char *prev = cheat_manager_state.prev_memory_buf; - unsigned int idx = 0; - unsigned int curr_val = 0; - unsigned int prev_val = 0; - unsigned int mask = 0; + unsigned char *curr = cheat_manager_state.curr_memory_buf; + unsigned char *prev = cheat_manager_state.prev_memory_buf; + unsigned int idx = 0; + unsigned int curr_val = 0; + unsigned int prev_val = 0; + unsigned int mask = 0; unsigned int bytes_per_item = 1; - unsigned int bits = 8; - unsigned int offset = 0; - unsigned int i = 0; - bool refresh = false; + unsigned int bits = 8; + unsigned int offset = 0; + unsigned int i = 0; + bool refresh = false; if (cheat_manager_state.num_memory_buffers == 0) { @@ -996,80 +1005,80 @@ int cheat_manager_search(enum cheat_search_type search_type) switch (bytes_per_item) { - case 2 : - curr_val = cheat_manager_state.big_endian ? - (*(curr+idx-offset)*256) + *(curr+idx+1-offset) : - *(curr+idx-offset) + (*(curr+idx+1-offset)*256); - prev_val = cheat_manager_state.big_endian ? - (*(prev+idx)*256) + *(prev+idx+1) : - *(prev+idx) + (*(prev+idx+1)*256); - break; - case 4 : - curr_val = cheat_manager_state.big_endian ? - (*(curr+idx-offset)*256*256*256) + (*(curr+idx+1-offset)*256*256) + (*(curr+idx+2-offset)*256) + *(curr+idx+3-offset) : - *(curr+idx-offset) + (*(curr+idx+1-offset)*256) + (*(curr+idx+2-offset)*256*256) + (*(curr+idx+3-offset)*256*256*256); - prev_val = cheat_manager_state.big_endian ? - (*(prev+idx)*256*256*256) + (*(prev+idx+1)*256*256) + (*(prev+idx+2)*256) + *(prev+idx+3) : - *(prev+idx) + (*(prev+idx+1)*256) + (*(prev+idx+2)*256*256) + (*(prev+idx+3)*256*256*256); - break; - case 1 : - default : - curr_val = *(curr-offset+idx); - prev_val = *(prev+idx); - break; + case 2: + curr_val = cheat_manager_state.big_endian ? + (*(curr + idx - offset) * 256) + *(curr + idx + 1 - offset) : + *(curr + idx - offset) + (*(curr + idx + 1 - offset) * 256); + prev_val = cheat_manager_state.big_endian ? + (*(prev + idx) * 256) + *(prev + idx + 1) : + *(prev + idx) + (*(prev + idx + 1) * 256); + break; + case 4: + curr_val = cheat_manager_state.big_endian ? + (*(curr + idx - offset) * 256 * 256 * 256) + (*(curr + idx + 1 - offset) * 256 * 256) + (*(curr + idx + 2 - offset) * 256) + *(curr + idx + 3 - offset) : + *(curr + idx - offset) + (*(curr + idx + 1 - offset) * 256) + (*(curr + idx + 2 - offset) * 256 * 256) + (*(curr + idx + 3 - offset) * 256 * 256 * 256); + prev_val = cheat_manager_state.big_endian ? + (*(prev + idx) * 256 * 256 * 256) + (*(prev + idx + 1) * 256 * 256) + (*(prev + idx + 2) * 256) + *(prev + idx + 3) : + *(prev + idx) + (*(prev + idx + 1) * 256) + (*(prev + idx + 2) * 256 * 256) + (*(prev + idx + 3) * 256 * 256 * 256); + break; + case 1: + default: + curr_val = *(curr - offset + idx); + prev_val = *(prev + idx); + break; } - for (byte_part = 0; byte_part < 8/bits; byte_part++) + for (byte_part = 0; byte_part < 8 / bits; byte_part++) { - unsigned int curr_subval = (curr_val >> (byte_part*bits)) & mask; - unsigned int prev_subval = (prev_val >> (byte_part*bits)) & mask; + unsigned int curr_subval = (curr_val >> (byte_part * bits)) & mask; + unsigned int prev_subval = (prev_val >> (byte_part * bits)) & mask; unsigned int prev_match; if (bits < 8) - prev_match = *(cheat_manager_state.matches+idx) & (mask << (byte_part*bits)); + prev_match = *(cheat_manager_state.matches + idx) & (mask << (byte_part * bits)); else - prev_match = *(cheat_manager_state.matches+idx); + prev_match = *(cheat_manager_state.matches + idx); if (prev_match > 0) { bool match = false; switch (search_type) { - case CHEAT_SEARCH_TYPE_EXACT : - match = (curr_subval == cheat_manager_state.search_exact_value); - break; - case CHEAT_SEARCH_TYPE_LT : - match = (curr_subval < prev_subval); - break; - case CHEAT_SEARCH_TYPE_GT : - match = (curr_subval > prev_subval); - break; - case CHEAT_SEARCH_TYPE_LTE : - match = (curr_subval <= prev_subval); - break; - case CHEAT_SEARCH_TYPE_GTE : - match = (curr_subval >= prev_subval); - break; - case CHEAT_SEARCH_TYPE_EQ : - match = (curr_subval == prev_subval); - break; - case CHEAT_SEARCH_TYPE_NEQ : - match = (curr_subval != prev_subval); - break; - case CHEAT_SEARCH_TYPE_EQPLUS : - match = (curr_subval == prev_subval+cheat_manager_state.search_eqplus_value); - break; - case CHEAT_SEARCH_TYPE_EQMINUS : - match = (curr_subval == prev_subval-cheat_manager_state.search_eqminus_value); - break; + case CHEAT_SEARCH_TYPE_EXACT: + match = (curr_subval == cheat_manager_state.search_exact_value); + break; + case CHEAT_SEARCH_TYPE_LT: + match = (curr_subval < prev_subval); + break; + case CHEAT_SEARCH_TYPE_GT: + match = (curr_subval > prev_subval); + break; + case CHEAT_SEARCH_TYPE_LTE: + match = (curr_subval <= prev_subval); + break; + case CHEAT_SEARCH_TYPE_GTE: + match = (curr_subval >= prev_subval); + break; + case CHEAT_SEARCH_TYPE_EQ: + match = (curr_subval == prev_subval); + break; + case CHEAT_SEARCH_TYPE_NEQ: + match = (curr_subval != prev_subval); + break; + case CHEAT_SEARCH_TYPE_EQPLUS: + match = (curr_subval == prev_subval + cheat_manager_state.search_eqplus_value); + break; + case CHEAT_SEARCH_TYPE_EQMINUS: + match = (curr_subval == prev_subval - cheat_manager_state.search_eqminus_value); + break; } if (!match) { if (bits < 8) - *(cheat_manager_state.matches+idx) = *(cheat_manager_state.matches+idx) & - (( ~(mask << (byte_part*bits))) & 0xFF); + *(cheat_manager_state.matches + idx) = *(cheat_manager_state.matches + idx) & + ((~(mask << (byte_part * bits))) & 0xFF); else - memset(cheat_manager_state.matches+idx,0,bytes_per_item); + memset(cheat_manager_state.matches + idx, 0, bytes_per_item); if (cheat_manager_state.num_matches > 0) cheat_manager_state.num_matches--; } @@ -1081,7 +1090,7 @@ int cheat_manager_search(enum cheat_search_type search_type) for (i = 0; i < cheat_manager_state.num_memory_buffers; i++) { - memcpy(cheat_manager_state.prev_memory_buf+offset, cheat_manager_state.memory_buf_list[i], cheat_manager_state.memory_size_list[i]); + memcpy(cheat_manager_state.prev_memory_buf + offset, cheat_manager_state.memory_buf_list[i], cheat_manager_state.memory_size_list[i]); offset += cheat_manager_state.memory_size_list[i]; } @@ -1105,11 +1114,11 @@ bool cheat_manager_add_new_code(unsigned int memory_search_size, unsigned int ad if (!cheat_manager_realloc(new_size, CHEAT_HANDLER_TYPE_RETRO)) return false; - cheat_manager_state.cheats[cheat_manager_state.size-1].address = address; - cheat_manager_state.cheats[cheat_manager_state.size-1].address_mask = address_mask; - cheat_manager_state.cheats[cheat_manager_state.size-1].memory_search_size = memory_search_size; - cheat_manager_state.cheats[cheat_manager_state.size-1].value = value; - cheat_manager_state.cheats[cheat_manager_state.size-1].big_endian = big_endian; + cheat_manager_state.cheats[cheat_manager_state.size - 1].address = address; + cheat_manager_state.cheats[cheat_manager_state.size - 1].address_mask = address_mask; + cheat_manager_state.cheats[cheat_manager_state.size - 1].memory_search_size = memory_search_size; + cheat_manager_state.cheats[cheat_manager_state.size - 1].value = value; + cheat_manager_state.cheats[cheat_manager_state.size - 1].big_endian = big_endian; return true; } @@ -1117,16 +1126,16 @@ int cheat_manager_add_matches(const char *path, const char *label, unsigned type, size_t menuidx, size_t entry_idx) { char msg[100]; - bool refresh = false; - unsigned byte_part = 0; - unsigned int idx = 0; - unsigned int mask = 0; + bool refresh = false; + unsigned byte_part = 0; + unsigned int idx = 0; + unsigned int mask = 0; unsigned int bytes_per_item = 1; - unsigned int bits = 8; - unsigned int curr_val = 0; - unsigned int num_added = 0; - unsigned int offset = 0; - unsigned char *curr = cheat_manager_state.curr_memory_buf; + unsigned int bits = 8; + unsigned int curr_val = 0; + unsigned int num_added = 0; + unsigned int offset = 0; + unsigned char *curr = cheat_manager_state.curr_memory_buf; if (cheat_manager_state.num_matches + cheat_manager_state.size > 100) { @@ -1141,31 +1150,31 @@ int cheat_manager_add_matches(const char *path, switch (bytes_per_item) { - case 2 : - curr_val = cheat_manager_state.big_endian ? - (*(curr+idx-offset)*256) + *(curr+idx+1-offset) : - *(curr+idx-offset) + (*(curr+idx+1-offset)*256); - break; - case 4 : - curr_val = cheat_manager_state.big_endian ? - (*(curr+idx-offset)*256*256*256) + (*(curr+idx+1-offset)*256*256) + (*(curr+idx+2-offset)*256) + *(curr+idx+3-offset) : - *(curr+idx-offset) + (*(curr+idx+1-offset)*256) + (*(curr+idx+2-offset)*256*256) + (*(curr+idx+3-offset)*256*256*256); - break; - case 1 : - default : - curr_val = *(curr-offset+idx); - break; + case 2: + curr_val = cheat_manager_state.big_endian ? + (*(curr + idx - offset) * 256) + *(curr + idx + 1 - offset) : + *(curr + idx - offset) + (*(curr + idx + 1 - offset) * 256); + break; + case 4: + curr_val = cheat_manager_state.big_endian ? + (*(curr + idx - offset) * 256 * 256 * 256) + (*(curr + idx + 1 - offset) * 256 * 256) + (*(curr + idx + 2 - offset) * 256) + *(curr + idx + 3 - offset) : + *(curr + idx - offset) + (*(curr + idx + 1 - offset) * 256) + (*(curr + idx + 2 - offset) * 256 * 256) + (*(curr + idx + 3 - offset) * 256 * 256 * 256); + break; + case 1: + default: + curr_val = *(curr - offset + idx); + break; } - for (byte_part = 0; byte_part < 8/bits; byte_part++) + for (byte_part = 0; byte_part < 8 / bits; byte_part++) { unsigned int prev_match; if (bits < 8) { - prev_match = *(cheat_manager_state.matches+idx) & (mask << (byte_part*bits)); + prev_match = *(cheat_manager_state.matches + idx) & (mask << (byte_part * bits)); if (prev_match) { - if (!cheat_manager_add_new_code(cheat_manager_state.search_bit_size, idx, (mask << (byte_part*bits)), + if (!cheat_manager_add_new_code(cheat_manager_state.search_bit_size, idx, (mask << (byte_part * bits)), cheat_manager_state.big_endian, curr_val)) { runloop_msg_queue_push(msg_hash_to_str(MSG_CHEAT_SEARCH_ADDED_MATCHES_FAIL), 1, 180, true, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); @@ -1176,7 +1185,7 @@ int cheat_manager_add_matches(const char *path, } else { - prev_match = *(cheat_manager_state.matches+idx); + prev_match = *(cheat_manager_state.matches + idx); if (prev_match) { if (!cheat_manager_add_new_code(cheat_manager_state.search_bit_size, idx, 0xFF, @@ -1211,38 +1220,38 @@ void cheat_manager_apply_rumble(struct item_cheat *cheat, unsigned int curr_valu switch (cheat->rumble_type) { - case RUMBLE_TYPE_DISABLED: - return; - case RUMBLE_TYPE_CHANGES: - rumble = (curr_value != cheat->rumble_prev_value); - break; - case RUMBLE_TYPE_DOES_NOT_CHANGE: - rumble = (curr_value == cheat->rumble_prev_value); - break; - case RUMBLE_TYPE_INCREASE: - rumble = (curr_value > cheat->rumble_prev_value); - break; - case RUMBLE_TYPE_DECREASE: - rumble = (curr_value < cheat->rumble_prev_value); - break; - case RUMBLE_TYPE_EQ_VALUE: - rumble = (curr_value == cheat->rumble_value); - break; - case RUMBLE_TYPE_NEQ_VALUE: - rumble = (curr_value != cheat->rumble_value); - break; - case RUMBLE_TYPE_LT_VALUE: - rumble = (curr_value < cheat->rumble_value); - break; - case RUMBLE_TYPE_GT_VALUE: - rumble = (curr_value > cheat->rumble_value); - break; - case RUMBLE_TYPE_INCREASE_BY_VALUE: - rumble = (curr_value == cheat->rumble_prev_value + cheat->rumble_value); - break; - case RUMBLE_TYPE_DECREASE_BY_VALUE: - rumble = (curr_value == cheat->rumble_prev_value - cheat->rumble_value); - break; + case RUMBLE_TYPE_DISABLED: + return; + case RUMBLE_TYPE_CHANGES: + rumble = (curr_value != cheat->rumble_prev_value); + break; + case RUMBLE_TYPE_DOES_NOT_CHANGE: + rumble = (curr_value == cheat->rumble_prev_value); + break; + case RUMBLE_TYPE_INCREASE: + rumble = (curr_value > cheat->rumble_prev_value); + break; + case RUMBLE_TYPE_DECREASE: + rumble = (curr_value < cheat->rumble_prev_value); + break; + case RUMBLE_TYPE_EQ_VALUE: + rumble = (curr_value == cheat->rumble_value); + break; + case RUMBLE_TYPE_NEQ_VALUE: + rumble = (curr_value != cheat->rumble_value); + break; + case RUMBLE_TYPE_LT_VALUE: + rumble = (curr_value < cheat->rumble_value); + break; + case RUMBLE_TYPE_GT_VALUE: + rumble = (curr_value > cheat->rumble_value); + break; + case RUMBLE_TYPE_INCREASE_BY_VALUE: + rumble = (curr_value == cheat->rumble_prev_value + cheat->rumble_value); + break; + case RUMBLE_TYPE_DECREASE_BY_VALUE: + rumble = (curr_value == cheat->rumble_prev_value - cheat->rumble_value); + break; } cheat->rumble_prev_value = curr_value; @@ -1253,8 +1262,8 @@ void cheat_manager_apply_rumble(struct item_cheat *cheat, unsigned int curr_valu { if (rumble) { - cheat->rumble_primary_end_time = cpu_features_get_time_usec() + (cheat->rumble_primary_duration*1000); - cheat->rumble_secondary_end_time = cpu_features_get_time_usec() + (cheat->rumble_secondary_duration*1000); + cheat->rumble_primary_end_time = cpu_features_get_time_usec() + (cheat->rumble_primary_duration * 1000); + cheat->rumble_secondary_end_time = cpu_features_get_time_usec() + (cheat->rumble_secondary_duration * 1000); input_driver_set_rumble_state(cheat->rumble_port, RETRO_RUMBLE_STRONG, cheat->rumble_primary_strength); input_driver_set_rumble_state(cheat->rumble_port, RETRO_RUMBLE_WEAK, cheat->rumble_secondary_strength); } @@ -1290,11 +1299,11 @@ void cheat_manager_apply_retro_cheats(void) { unsigned i; unsigned int offset; - unsigned int mask = 0; + unsigned int mask = 0; unsigned int bytes_per_item = 1; - unsigned int bits = 8; - unsigned int curr_val = 0; - bool run_cheat = true; + unsigned int bits = 8; + unsigned int curr_val = 0; + bool run_cheat = true; if ((!cheat_manager_state.cheats)) return; @@ -1302,10 +1311,10 @@ void cheat_manager_apply_retro_cheats(void) for (i = 0; i < cheat_manager_state.size; i++) { unsigned char *curr; - unsigned int idx; - bool set_value = false; + unsigned int idx; + bool set_value = false; unsigned int value_to_set = 0; - unsigned int repeat_iter = 0; + unsigned int repeat_iter = 0; unsigned int address_mask = cheat_manager_state.cheats[i].address_mask; if (cheat_manager_state.cheats[i].handler != CHEAT_HANDLER_TYPE_RETRO || !cheat_manager_state.cheats[i].state) @@ -1326,133 +1335,136 @@ void cheat_manager_apply_retro_cheats(void) cheat_manager_setup_search_meta(cheat_manager_state.cheats[i].memory_search_size, &bytes_per_item, &mask, &bits); curr = cheat_manager_state.curr_memory_buf; - idx = cheat_manager_state.cheats[i].address; + idx = cheat_manager_state.cheats[i].address; offset = translate_address(idx, &curr); switch (bytes_per_item) { - case 2 : - curr_val = cheat_manager_state.big_endian ? - (*(curr+idx-offset)*256) + *(curr+idx+1-offset) : - *(curr+idx-offset) + (*(curr+idx+1-offset)*256); - break; - case 4 : - curr_val = cheat_manager_state.big_endian ? - (*(curr+idx-offset)*256*256*256) + (*(curr+idx+1-offset)*256*256) + (*(curr+idx+2-offset)*256) + *(curr+idx+3-offset) : - *(curr+idx-offset) + (*(curr+idx+1-offset)*256) + (*(curr+idx+2-offset)*256*256) + (*(curr+idx+3-offset)*256*256*256); - break; - case 1 : - default : - curr_val = *(curr+idx-offset); - break; + case 2: + curr_val = cheat_manager_state.big_endian ? + (*(curr + idx - offset) * 256) + *(curr + idx + 1 - offset) : + *(curr + idx - offset) + (*(curr + idx + 1 - offset) * 256); + break; + case 4: + curr_val = cheat_manager_state.big_endian ? + (*(curr + idx - offset) * 256 * 256 * 256) + (*(curr + idx + 1 - offset) * 256 * 256) + (*(curr + idx + 2 - offset) * 256) + *(curr + idx + 3 - offset) : + *(curr + idx - offset) + (*(curr + idx + 1 - offset) * 256) + (*(curr + idx + 2 - offset) * 256 * 256) + (*(curr + idx + 3 - offset) * 256 * 256 * 256); + break; + case 1: + default: + curr_val = *(curr + idx - offset); + break; } cheat_manager_apply_rumble(&cheat_manager_state.cheats[i], curr_val); switch (cheat_manager_state.cheats[i].cheat_type) { - case CHEAT_TYPE_SET_TO_VALUE : - set_value = true; - value_to_set = cheat_manager_state.cheats[i].value; - break; - case CHEAT_TYPE_INCREASE_VALUE: - set_value = true; - value_to_set = curr_val + cheat_manager_state.cheats[i].value; - break; - case CHEAT_TYPE_DECREASE_VALUE: - set_value = true; - value_to_set = curr_val - cheat_manager_state.cheats[i].value; - break; - case CHEAT_TYPE_RUN_NEXT_IF_EQ: - if (!(curr_val == cheat_manager_state.cheats[i].value)) - run_cheat = false; - break; - case CHEAT_TYPE_RUN_NEXT_IF_NEQ: - if (!(curr_val != cheat_manager_state.cheats[i].value)) - run_cheat = false; - break; - case CHEAT_TYPE_RUN_NEXT_IF_LT: - if (!(cheat_manager_state.cheats[i].value < curr_val)) - run_cheat = false; - break; - case CHEAT_TYPE_RUN_NEXT_IF_GT: - if (!(cheat_manager_state.cheats[i].value > curr_val)) - run_cheat = false; - break; - + case CHEAT_TYPE_SET_TO_VALUE: + set_value = true; + value_to_set = cheat_manager_state.cheats[i].value; + break; + case CHEAT_TYPE_INCREASE_VALUE: + set_value = true; + value_to_set = curr_val + cheat_manager_state.cheats[i].value; + break; + case CHEAT_TYPE_DECREASE_VALUE: + set_value = true; + value_to_set = curr_val - cheat_manager_state.cheats[i].value; + break; + case CHEAT_TYPE_RUN_NEXT_IF_EQ: + if (!(curr_val == cheat_manager_state.cheats[i].value)) + run_cheat = false; + break; + case CHEAT_TYPE_RUN_NEXT_IF_NEQ: + if (!(curr_val != cheat_manager_state.cheats[i].value)) + run_cheat = false; + break; + case CHEAT_TYPE_RUN_NEXT_IF_LT: + if (!(cheat_manager_state.cheats[i].value < curr_val)) + run_cheat = false; + break; + case CHEAT_TYPE_RUN_NEXT_IF_GT: + if (!(cheat_manager_state.cheats[i].value > curr_val)) + run_cheat = false; + break; } + if (set_value) { for (repeat_iter = 1; repeat_iter <= cheat_manager_state.cheats[i].repeat_count; repeat_iter++) { switch (bytes_per_item) { - case 2 : - if (cheat_manager_state.cheats[i].big_endian) - { - *(curr+idx-offset) = (value_to_set >> 8) & 0xFF; - *(curr+idx+1-offset) = value_to_set & 0xFF; - } - else - { - *(curr+idx-offset) = value_to_set & 0xFF; - *(curr+idx+1-offset) = (value_to_set >> 8) & 0xFF; + case 2: + if (cheat_manager_state.cheats[i].big_endian) + { + *(curr + idx - offset) = (value_to_set >> 8) & 0xFF; + *(curr + idx + 1 - offset) = value_to_set & 0xFF; + } + else + { + *(curr + idx - offset) = value_to_set & 0xFF; + *(curr + idx + 1 - offset) = (value_to_set >> 8) & 0xFF; + } + break; + case 4: + if (cheat_manager_state.cheats[i].big_endian) + { + *(curr + idx - offset) = (value_to_set >> 24) & 0xFF; + *(curr + idx + 1 - offset) = (value_to_set >> 16) & 0xFF; + *(curr + idx + 2 - offset) = (value_to_set >> 8) & 0xFF; + *(curr + idx + 3 - offset) = value_to_set & 0xFF; + } + else + { + *(curr + idx - offset) = value_to_set & 0xFF; + *(curr + idx + 1 - offset) = (value_to_set >> 8) & 0xFF; + *(curr + idx + 2 - offset) = (value_to_set >> 16) & 0xFF; + *(curr + idx + 3 - offset) = (value_to_set >> 24) & 0xFF; + } + break; + case 1: + if (bits < 8) + { + unsigned bitpos; + unsigned char val = *(curr + idx - offset); - } - break; - case 4 : - if (cheat_manager_state.cheats[i].big_endian) + for (bitpos = 0; bitpos < 8; bitpos++) { - *(curr+idx-offset) = (value_to_set >> 24) & 0xFF; - *(curr+idx+1-offset) = (value_to_set >> 16) & 0xFF; - *(curr+idx+2-offset) = (value_to_set >> 8) & 0xFF; - *(curr+idx+3-offset) = value_to_set & 0xFF; - } - else - { - *(curr+idx-offset) = value_to_set & 0xFF; - *(curr+idx+1-offset) = (value_to_set >> 8) & 0xFF; - *(curr+idx+2-offset) = (value_to_set >> 16) & 0xFF; - *(curr+idx+3-offset) = (value_to_set >> 24) & 0xFF; - - } - break; - case 1 : - if (bits < 8) - { - unsigned bitpos; - unsigned char val = *(curr+idx-offset); - - for (bitpos = 0; bitpos < 8; bitpos++) + if ((address_mask >> bitpos) & 0x01) { - if ((address_mask>>bitpos)&0x01) - { - mask = (~(1<>bitpos)&0x01)<> bitpos) & 0x01) << bitpos); } - *(curr+idx-offset) = val; } - else - *(curr+idx-offset) = value_to_set & 0xFF; - break; - default : - *(curr+idx-offset) = value_to_set & 0xFF; - break; + + *(curr + idx - offset) = val; + } + else + *(curr + idx - offset) = value_to_set & 0xFF; + break; + default: + *(curr + idx - offset) = value_to_set & 0xFF; + break; } + value_to_set += cheat_manager_state.cheats[i].repeat_add_to_value; - value_to_set = value_to_set%mask; + + if (mask != 0) + value_to_set = value_to_set % mask; if (bits < 8) { unsigned int bit_iter; for (bit_iter = 0; bit_iter < cheat_manager_state.cheats[i].repeat_add_to_address; bit_iter++) { - address_mask = (address_mask< cheat_manager_state.num_matches-1) + if (target_match_idx > cheat_manager_state.num_matches - 1) return; if (cheat_manager_state.num_memory_buffers == 0) @@ -1505,30 +1517,30 @@ void cheat_manager_match_action(enum cheat_match_action_type match_action, unsig switch (bytes_per_item) { - case 2 : - curr_val = cheat_manager_state.big_endian ? - (*(curr+idx-offset)*256) + *(curr+idx+1-offset) : - *(curr+idx-offset) + (*(curr+idx+1-offset)*256); - if (prev) - prev_val = cheat_manager_state.big_endian ? - (*(prev+idx)*256) + *(prev+idx+1) : - *(prev+idx) + (*(prev+idx+1)*256); - break; - case 4 : - curr_val = cheat_manager_state.big_endian ? - (*(curr+idx-offset)*256*256*256) + (*(curr+idx+1-offset)*256*256) + (*(curr+idx+2-offset)*256) + *(curr+idx+3-offset) : - *(curr+idx-offset) + (*(curr+idx+1-offset)*256) + (*(curr+idx+2-offset)*256*256) + (*(curr+idx+3-offset)*256*256*256); - if (prev) - prev_val = cheat_manager_state.big_endian ? - (*(prev+idx)*256*256*256) + (*(prev+idx+1)*256*256) + (*(prev+idx+2)*256) + *(prev+idx+3) : - *(prev+idx) + (*(prev+idx+1)*256) + (*(prev+idx+2)*256*256) + (*(prev+idx+3)*256*256*256); - break; - case 1 : - default : - curr_val = *(curr+idx-offset); - if (prev) - prev_val = *(prev+idx); - break; + case 2: + curr_val = cheat_manager_state.big_endian ? + (*(curr + idx - offset) * 256) + *(curr + idx + 1 - offset) : + *(curr + idx - offset) + (*(curr + idx + 1 - offset) * 256); + if (prev) + prev_val = cheat_manager_state.big_endian ? + (*(prev + idx) * 256) + *(prev + idx + 1) : + *(prev + idx) + (*(prev + idx + 1) * 256); + break; + case 4: + curr_val = cheat_manager_state.big_endian ? + (*(curr + idx - offset) * 256 * 256 * 256) + (*(curr + idx + 1 - offset) * 256 * 256) + (*(curr + idx + 2 - offset) * 256) + *(curr + idx + 3 - offset) : + *(curr + idx - offset) + (*(curr + idx + 1 - offset) * 256) + (*(curr + idx + 2 - offset) * 256 * 256) + (*(curr + idx + 3 - offset) * 256 * 256 * 256); + if (prev) + prev_val = cheat_manager_state.big_endian ? + (*(prev + idx) * 256 * 256 * 256) + (*(prev + idx + 1) * 256 * 256) + (*(prev + idx + 2) * 256) + *(prev + idx + 3) : + *(prev + idx) + (*(prev + idx + 1) * 256) + (*(prev + idx + 2) * 256 * 256) + (*(prev + idx + 3) * 256 * 256 * 256); + break; + case 1: + default: + curr_val = *(curr + idx - offset); + if (prev) + prev_val = *(prev + idx); + break; } if (match_action == CHEAT_MATCH_ACTION_TYPE_BROWSE) @@ -1541,44 +1553,44 @@ void cheat_manager_match_action(enum cheat_match_action_type match_action, unsig if (!prev) return; - for (byte_part = 0; byte_part < 8/bits; byte_part++) + for (byte_part = 0; byte_part < 8 / bits; byte_part++) { unsigned int prev_match; if (bits < 8) { - prev_match = *(cheat_manager_state.matches+idx) & (mask << (byte_part*bits)); + prev_match = *(cheat_manager_state.matches + idx) & (mask << (byte_part * bits)); if (prev_match) { if (target_match_idx == curr_match_idx) { switch (match_action) { - case CHEAT_MATCH_ACTION_TYPE_BROWSE : - return; - case CHEAT_MATCH_ACTION_TYPE_VIEW : - *address = idx; - *address_mask = (mask << (byte_part*bits)); - *curr_value = curr_val; - *prev_value = prev_val; - return; - case CHEAT_MATCH_ACTION_TYPE_COPY : - if (!cheat_manager_add_new_code(cheat_manager_state.search_bit_size, idx, (mask << (byte_part*bits)), - cheat_manager_state.big_endian, curr_val)) - runloop_msg_queue_push(msg_hash_to_str(MSG_CHEAT_SEARCH_ADD_MATCH_FAIL), 1, 180, true, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); - else - runloop_msg_queue_push(msg_hash_to_str(MSG_CHEAT_SEARCH_ADD_MATCH_SUCCESS), 1, 180, true, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); - return; - case CHEAT_MATCH_ACTION_TYPE_DELETE : - if (bits < 8) - *(cheat_manager_state.matches+idx) = *(cheat_manager_state.matches+idx) & - (( ~(mask << (byte_part*bits))) & 0xFF); - else - memset(cheat_manager_state.matches+idx,0,bytes_per_item); - if (cheat_manager_state.num_matches > 0) - cheat_manager_state.num_matches--; - runloop_msg_queue_push(msg_hash_to_str(MSG_CHEAT_SEARCH_DELETE_MATCH_SUCCESS), 1, 180, true, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); - return; + case CHEAT_MATCH_ACTION_TYPE_BROWSE: + return; + case CHEAT_MATCH_ACTION_TYPE_VIEW: + *address = idx; + *address_mask = (mask << (byte_part * bits)); + *curr_value = curr_val; + *prev_value = prev_val; + return; + case CHEAT_MATCH_ACTION_TYPE_COPY: + if (!cheat_manager_add_new_code(cheat_manager_state.search_bit_size, idx, (mask << (byte_part * bits)), + cheat_manager_state.big_endian, curr_val)) + runloop_msg_queue_push(msg_hash_to_str(MSG_CHEAT_SEARCH_ADD_MATCH_FAIL), 1, 180, true, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); + else + runloop_msg_queue_push(msg_hash_to_str(MSG_CHEAT_SEARCH_ADD_MATCH_SUCCESS), 1, 180, true, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); + return; + case CHEAT_MATCH_ACTION_TYPE_DELETE: + if (bits < 8) + *(cheat_manager_state.matches + idx) = *(cheat_manager_state.matches + idx) & + ((~(mask << (byte_part * bits))) & 0xFF); + else + memset(cheat_manager_state.matches + idx, 0, bytes_per_item); + if (cheat_manager_state.num_matches > 0) + cheat_manager_state.num_matches--; + runloop_msg_queue_push(msg_hash_to_str(MSG_CHEAT_SEARCH_DELETE_MATCH_SUCCESS), 1, 180, true, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); + return; } return; } @@ -1587,51 +1599,52 @@ void cheat_manager_match_action(enum cheat_match_action_type match_action, unsig } else { - prev_match = *(cheat_manager_state.matches+idx); + prev_match = *(cheat_manager_state.matches + idx); if (prev_match) { if (target_match_idx == curr_match_idx) { switch (match_action) { - case CHEAT_MATCH_ACTION_TYPE_BROWSE : - return; - case CHEAT_MATCH_ACTION_TYPE_VIEW : - *address = idx; - *address_mask = 0xFF; - *curr_value = curr_val; - *prev_value = prev_val; - return; - case CHEAT_MATCH_ACTION_TYPE_COPY : - if (!cheat_manager_add_new_code(cheat_manager_state.search_bit_size, idx, 0xFF, - cheat_manager_state.big_endian, curr_val)) - runloop_msg_queue_push(msg_hash_to_str(MSG_CHEAT_SEARCH_ADD_MATCH_FAIL), 1, 180, true, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); - else - runloop_msg_queue_push(msg_hash_to_str(MSG_CHEAT_SEARCH_ADD_MATCH_SUCCESS), 1, 180, true, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); - return; - case CHEAT_MATCH_ACTION_TYPE_DELETE : - if (bits < 8) - *(cheat_manager_state.matches+idx) = *(cheat_manager_state.matches+idx) & - (( ~(mask << (byte_part*bits))) & 0xFF); - else - memset(cheat_manager_state.matches+idx,0,bytes_per_item); - if (cheat_manager_state.num_matches > 0) - cheat_manager_state.num_matches--; - runloop_msg_queue_push(msg_hash_to_str(MSG_CHEAT_SEARCH_DELETE_MATCH_SUCCESS), 1, 180, true, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); - return; + case CHEAT_MATCH_ACTION_TYPE_BROWSE: + return; + case CHEAT_MATCH_ACTION_TYPE_VIEW: + *address = idx; + *address_mask = 0xFF; + *curr_value = curr_val; + *prev_value = prev_val; + return; + case CHEAT_MATCH_ACTION_TYPE_COPY: + if (!cheat_manager_add_new_code(cheat_manager_state.search_bit_size, idx, 0xFF, + cheat_manager_state.big_endian, curr_val)) + runloop_msg_queue_push(msg_hash_to_str(MSG_CHEAT_SEARCH_ADD_MATCH_FAIL), 1, 180, true, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); + else + runloop_msg_queue_push(msg_hash_to_str(MSG_CHEAT_SEARCH_ADD_MATCH_SUCCESS), 1, 180, true, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); + return; + case CHEAT_MATCH_ACTION_TYPE_DELETE: + if (bits < 8) + *(cheat_manager_state.matches + idx) = *(cheat_manager_state.matches + idx) & + ((~(mask << (byte_part * bits))) & 0xFF); + else + memset(cheat_manager_state.matches + idx, 0, bytes_per_item); + if (cheat_manager_state.num_matches > 0) + cheat_manager_state.num_matches--; + runloop_msg_queue_push(msg_hash_to_str(MSG_CHEAT_SEARCH_DELETE_MATCH_SUCCESS), 1, 180, true, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); + return; } } + curr_match_idx++; } } - } } + } int cheat_manager_copy_match(rarch_setting_t *setting, bool wraparound) { cheat_manager_match_action(CHEAT_MATCH_ACTION_TYPE_COPY, - cheat_manager_state.match_idx, NULL, NULL, NULL, NULL); + cheat_manager_state.match_idx, NULL, NULL, NULL, NULL); return 0; } @@ -1639,7 +1652,7 @@ int cheat_manager_delete_match(rarch_setting_t *setting, bool wraparound) { bool refresh = false; cheat_manager_match_action(CHEAT_MATCH_ACTION_TYPE_DELETE, - cheat_manager_state.match_idx, NULL, NULL, NULL, NULL); + cheat_manager_state.match_idx, NULL, NULL, NULL, NULL); #ifdef HAVE_MENU menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh); menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL); diff --git a/menu/cbs/menu_cbs_cancel.c b/menu/cbs/menu_cbs_cancel.c index c06aefaf47..0f4076b4fb 100644 --- a/menu/cbs/menu_cbs_cancel.c +++ b/menu/cbs/menu_cbs_cancel.c @@ -53,7 +53,7 @@ int action_cancel_pop_default(const char *path, { if ( string_is_equal(menu_label, - msg_hash_to_str(MENU_ENUM_LABEL_CONTENT_COLLECTION_LIST) + msg_hash_to_str(MENU_ENUM_LABEL_PLAYLISTS_TAB) ) || string_is_equal(menu_label, msg_hash_to_str(MENU_ENUM_LABEL_MENU_WALLPAPER) diff --git a/menu/cbs/menu_cbs_deferred_push.c b/menu/cbs/menu_cbs_deferred_push.c index 8029d8c254..76434fcce2 100644 --- a/menu/cbs/menu_cbs_deferred_push.c +++ b/menu/cbs/menu_cbs_deferred_push.c @@ -418,8 +418,9 @@ static int general_push(menu_displaylist_info_t *info, } else { - strlcpy(newstring2, system->valid_extensions, - PATH_MAX_LENGTH * sizeof(char)); + if (system) + strlcpy(newstring2, system->valid_extensions, + PATH_MAX_LENGTH * sizeof(char)); } } break; @@ -442,7 +443,7 @@ static int general_push(menu_displaylist_info_t *info, } else { - if (!string_is_empty(system->valid_extensions)) + if (system && !string_is_empty(system->valid_extensions)) { new_exts = strdup(system->valid_extensions); new_exts_allocated = true; @@ -473,7 +474,12 @@ static int general_push(menu_displaylist_info_t *info, } if (new_exts_allocated) + { free(new_exts); + + if (new_exts == info->exts) + info->exts = NULL; + } } break; case PUSH_ARCHIVE_OPEN_DETECT_CORE: @@ -1238,7 +1244,7 @@ static int menu_cbs_init_bind_deferred_push_compare_label( case MENU_ENUM_LABEL_CORE_LIST: BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_core_list); break; - case MENU_ENUM_LABEL_CONTENT_COLLECTION_LIST: + case MENU_ENUM_LABEL_PLAYLISTS_TAB: BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_content_collection_list); break; case MENU_ENUM_LABEL_CONFIGURATIONS: @@ -1476,7 +1482,7 @@ static int menu_cbs_init_bind_deferred_push_compare_label( case MENU_LABEL_CORE_INPUT_REMAPPING_OPTIONS: BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_core_input_remapping_options); break; - case MENU_LABEL_CONTENT_COLLECTION_LIST: + case MENU_LABEL_PLAYLISTS_TAB: BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_content_collection_list); break; case MENU_LABEL_CONFIGURATIONS: diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index 624aedf633..c826845d29 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -1362,7 +1362,7 @@ static int menu_cbs_init_bind_get_string_representation_compare_label( BIND_ACTION_GET_VALUE(cbs, menu_action_setting_disp_set_label_menu_video_resolution); break; - case MENU_ENUM_LABEL_CONTENT_COLLECTION_LIST: + case MENU_ENUM_LABEL_PLAYLISTS_TAB: case MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY: case MENU_ENUM_LABEL_DOWNLOADED_FILE_DETECT_CORE_LIST: case MENU_ENUM_LABEL_FAVORITES: diff --git a/menu/cbs/menu_cbs_left.c b/menu/cbs/menu_cbs_left.c index 19704f5320..69955af267 100644 --- a/menu/cbs/menu_cbs_left.c +++ b/menu/cbs/menu_cbs_left.c @@ -341,7 +341,7 @@ static int action_left_shader_num_passes(unsigned type, const char *label, return menu_cbs_exit(); if (pass_count > 0) - menu_shader_manager_decrement_amount_passes(); + shader->passes--; menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh); menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL); diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 4cf1ec542c..11885d02c0 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -279,7 +279,7 @@ int generic_action_ok_displaylist_push(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx, unsigned action_type) { - menu_displaylist_info_t info; + menu_displaylist_info_t info = {0}; char tmp[PATH_MAX_LENGTH]; char parent_dir[PATH_MAX_LENGTH]; enum menu_displaylist_ctl_state dl_type = DISPLAYLIST_NONE; @@ -305,7 +305,7 @@ int generic_action_ok_displaylist_push(const char *path, string_is_equal(menu_driver, "null")) goto end; - tmp[0] = '\0'; + tmp[0] = parent_dir[0] = '\0'; menu_entries_get_last_stack(&menu_path, &menu_label, NULL, &enum_idx, NULL); @@ -543,27 +543,25 @@ int generic_action_ok_displaylist_push(const char *path, break; case ACTION_OK_DL_DISK_IMAGE_APPEND_LIST: { - char game_dir[PATH_MAX_LENGTH]; filebrowser_clear_type(); - strlcpy(game_dir, path_get(RARCH_PATH_CONTENT), sizeof(game_dir)); - path_basedir(game_dir); + strlcpy(tmp, path_get(RARCH_PATH_CONTENT), sizeof(tmp)); + path_basedir(tmp); info.type = type; info.directory_ptr = idx; - info_path = !string_is_empty(game_dir) ? game_dir : settings->paths.directory_menu_content; + info_path = !string_is_empty(tmp) ? tmp : settings->paths.directory_menu_content; info_label = label; dl_type = DISPLAYLIST_FILE_BROWSER_SELECT_FILE; } break; case ACTION_OK_DL_SUBSYSTEM_ADD_LIST: { - char game_dir[PATH_MAX_LENGTH]; filebrowser_clear_type(); if (content_get_subsystem_rom_id() > 0) - strlcpy(game_dir, content_get_subsystem_rom(content_get_subsystem_rom_id() - 1), sizeof(game_dir)); + strlcpy(tmp, content_get_subsystem_rom(content_get_subsystem_rom_id() - 1), sizeof(tmp)); else - strlcpy(game_dir, path_get(RARCH_PATH_CONTENT), sizeof(game_dir)); - path_basedir(game_dir); + strlcpy(tmp, path_get(RARCH_PATH_CONTENT), sizeof(tmp)); + path_basedir(tmp); if (content_get_subsystem() != type - MENU_SETTINGS_SUBSYSTEM_ADD) content_clear_subsystem(); @@ -571,7 +569,7 @@ int generic_action_ok_displaylist_push(const char *path, filebrowser_set_type(FILEBROWSER_SELECT_FILE_SUBSYSTEM); info.type = type; info.directory_ptr = idx; - info_path = !string_is_empty(game_dir) ? game_dir : settings->paths.directory_menu_content; + info_path = !string_is_empty(tmp) ? tmp : settings->paths.directory_menu_content; info_label = label; dl_type = DISPLAYLIST_FILE_BROWSER_SELECT_FILE; } @@ -968,9 +966,11 @@ end: static bool menu_content_playlist_load(playlist_t *playlist, size_t idx) { const char *path = NULL; + const struct playlist_entry *entry = NULL; - playlist_get_index(playlist, - idx, &path, NULL, NULL, NULL, NULL, NULL); + playlist_get_index(playlist, idx, &entry); + + path = entry->path; if (!string_is_empty(path)) { @@ -1280,11 +1280,9 @@ static int generic_action_ok_command(enum event_command cmd) /* TO-DO: Localization for errors */ static bool file_copy(const char *src_path, const char *dst_path, char *msg, size_t size) { - RFILE *src, *dst; - int numr, numw; - bool ret = true; - - src = filestream_open(src_path, + RFILE *dst = NULL; + bool ret = true; + RFILE *src = filestream_open(src_path, RETRO_VFS_FILE_ACCESS_READ, RETRO_VFS_FILE_ACCESS_HINT_NONE); @@ -1306,8 +1304,9 @@ static bool file_copy(const char *src_path, const char *dst_path, char *msg, siz while (!filestream_eof(src)) { + int64_t numw; char buffer[100] = {0}; - numr = filestream_read(src, buffer, sizeof(buffer)); + int64_t numr = filestream_read(src, buffer, sizeof(buffer)); if (filestream_error(dst) != 0) { @@ -1712,12 +1711,10 @@ static int action_ok_playlist_entry_collection(const char *path, size_t selection_ptr = 0; bool playlist_initialized = false; playlist_t *playlist = NULL; - const char *entry_path = NULL; - const char *entry_label = NULL; - const char *core_path = NULL; - const char *core_name = NULL; playlist_t *tmp_playlist = NULL; menu_handle_t *menu = NULL; + const struct playlist_entry *entry = NULL; + unsigned i = 0; if (!menu_driver_ctl(RARCH_MENU_CTL_DRIVER_DATA_GET, &menu)) return menu_cbs_exit(); @@ -1732,18 +1729,45 @@ static int action_ok_playlist_entry_collection(const char *path, if (!tmp_playlist) return menu_cbs_exit(); + playlist_initialized = true; } playlist = tmp_playlist; selection_ptr = entry_idx; - playlist_get_index(playlist, selection_ptr, - &entry_path, &entry_label, &core_path, &core_name, NULL, NULL); + playlist_get_index(playlist, selection_ptr, &entry); + + /* Subsystem codepath */ + if (!string_is_empty(entry->subsystem_ident)) + { + content_ctx_info_t content_info = {0}; + + task_push_load_new_core(entry->core_path, NULL, + &content_info, CORE_TYPE_PLAIN, NULL, NULL); + + content_clear_subsystem(); + + if (!content_set_subsystem_by_name(entry->subsystem_ident)) + { + RARCH_LOG("[playlist] subsystem not found in implementation\n"); + /* TODO: Add OSD message telling users that content can't be loaded */ + return 0; + } + + for (i = 0; i < entry->subsystem_roms->size; i++) + content_add_subsystem(entry->subsystem_roms->elems[i].data); + + task_push_load_subsystem_with_core_from_menu( + NULL, &content_info, + CORE_TYPE_PLAIN, NULL, NULL); + /* TODO: update playlist entry? move to first position I guess? */ + return 1; + } /* Is the core path / name of the playlist entry not yet filled in? */ - if ( string_is_equal(core_path, file_path_str(FILE_PATH_DETECT)) - && string_is_equal(core_name, file_path_str(FILE_PATH_DETECT))) + if ( string_is_equal(entry->core_path, file_path_str(FILE_PATH_DETECT)) + && string_is_equal(entry->core_name, file_path_str(FILE_PATH_DETECT))) { core_info_ctx_find_t core_info; const char *entry_path = NULL; @@ -1773,18 +1797,20 @@ static int action_ok_playlist_entry_collection(const char *path, tmp_playlist = playlist_get_cached(); if (tmp_playlist) + { + struct playlist_entry entry = {0}; + + entry.core_path = new_core_path; + entry.core_name = core_info.inf->display_name; + command_playlist_update_write( tmp_playlist, selection_ptr, - NULL, - NULL, - new_core_path, - core_info.inf->display_name, - NULL, - NULL); + &entry); + } } else - strlcpy(new_core_path, core_path, sizeof(new_core_path)); + strlcpy(new_core_path, entry->core_path, sizeof(new_core_path)); if (!playlist || !menu_content_playlist_load(playlist, selection_ptr)) { @@ -1797,11 +1823,10 @@ static int action_ok_playlist_entry_collection(const char *path, return menu_cbs_exit(); } - playlist_get_index(playlist, - selection_ptr, &path, NULL, NULL, NULL, NULL, NULL); + playlist_get_index(playlist, selection_ptr, &entry); return default_action_ok_load_content_from_playlist_from_menu( - new_core_path, path, entry_label); + new_core_path, entry->path, entry->label); } static int action_ok_playlist_entry(const char *path, @@ -1810,11 +1835,9 @@ static int action_ok_playlist_entry(const char *path, char new_core_path[PATH_MAX_LENGTH]; size_t selection_ptr = 0; playlist_t *playlist = g_defaults.content_history; - const char *entry_path = NULL; - const char *entry_label = NULL; - const char *core_path = NULL; - const char *core_name = NULL; menu_handle_t *menu = NULL; + const struct playlist_entry *entry = NULL; + const char *entry_label = NULL; new_core_path[0] = '\0'; @@ -1823,11 +1846,12 @@ static int action_ok_playlist_entry(const char *path, selection_ptr = entry_idx; - playlist_get_index(playlist, selection_ptr, - &entry_path, &entry_label, &core_path, &core_name, NULL, NULL); + playlist_get_index(playlist, selection_ptr, &entry); - if ( string_is_equal(core_path, file_path_str(FILE_PATH_DETECT)) - && string_is_equal(core_name, file_path_str(FILE_PATH_DETECT))) + entry_label = entry->label; + + if ( string_is_equal(entry->core_path, file_path_str(FILE_PATH_DETECT)) + && string_is_equal(entry->core_name, file_path_str(FILE_PATH_DETECT))) { core_info_ctx_find_t core_info; const char *entry_path = NULL; @@ -1846,21 +1870,23 @@ static int action_ok_playlist_entry(const char *path, if (!found_associated_core) /* TODO: figure out if this should refer to the inner or outer entry_path */ /* TODO: make sure there's only one entry_path in this function */ - return action_ok_file_load_with_detect_core(entry_path, + return action_ok_file_load_with_detect_core(entry->path, label, type, selection_ptr, entry_idx); - command_playlist_update_write(NULL, - selection_ptr, - NULL, - NULL, - new_core_path, - core_info.inf->display_name, - NULL, - NULL); + { + struct playlist_entry entry = {0}; + + entry.core_path = new_core_path; + entry.core_name = core_info.inf->display_name; + + command_playlist_update_write(NULL, + selection_ptr, + &entry); + } } - else if (!string_is_empty(core_path)) - strlcpy(new_core_path, core_path, sizeof(new_core_path)); + else if (!string_is_empty(entry->core_path)) + strlcpy(new_core_path, entry->core_path, sizeof(new_core_path)); if (!playlist || !menu_content_playlist_load(playlist, selection_ptr)) { @@ -1872,23 +1898,19 @@ static int action_ok_playlist_entry(const char *path, } playlist_get_index(playlist, - selection_ptr, &path, NULL, NULL, NULL, - NULL, NULL); + selection_ptr, &entry); return default_action_ok_load_content_from_playlist_from_menu( - new_core_path, path, entry_label); + new_core_path, entry->path, entry_label); } static int action_ok_playlist_entry_start_content(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { size_t selection_ptr = 0; - const char *entry_path = NULL; - const char *entry_label = NULL; - const char *core_path = NULL; - const char *core_name = NULL; menu_handle_t *menu = NULL; playlist_t *playlist = playlist_get_cached(); + const struct playlist_entry *entry = NULL; if ( !playlist || !menu_driver_ctl(RARCH_MENU_CTL_DRIVER_DATA_GET, &menu)) @@ -1896,11 +1918,10 @@ static int action_ok_playlist_entry_start_content(const char *path, selection_ptr = menu->scratchpad.unsigned_var; - playlist_get_index(playlist, selection_ptr, - &entry_path, &entry_label, &core_path, &core_name, NULL, NULL); + playlist_get_index(playlist, selection_ptr, &entry); - if ( string_is_equal(core_path, file_path_str(FILE_PATH_DETECT)) - && string_is_equal(core_name, file_path_str(FILE_PATH_DETECT))) + if ( string_is_equal(entry->core_path, file_path_str(FILE_PATH_DETECT)) + && string_is_equal(entry->core_name, file_path_str(FILE_PATH_DETECT))) { core_info_ctx_find_t core_info; char new_core_path[PATH_MAX_LENGTH]; @@ -1929,15 +1950,17 @@ static int action_ok_playlist_entry_start_content(const char *path, return action_ok_file_load_with_detect_core(entry_path, label, type, selection_ptr, entry_idx); - command_playlist_update_write( - playlist, - selection_ptr, - NULL, - NULL, - new_core_path, - core_info.inf->display_name, - NULL, - NULL); + { + struct playlist_entry entry = {0}; + + entry.core_path = new_core_path; + entry.core_name = core_info.inf->display_name; + + command_playlist_update_write( + playlist, + selection_ptr, + &entry); + } } if (!menu_content_playlist_load(playlist, selection_ptr)) @@ -1946,10 +1969,9 @@ static int action_ok_playlist_entry_start_content(const char *path, goto error; } - playlist_get_index(playlist, - selection_ptr, &path, NULL, NULL, NULL, NULL, NULL); + playlist_get_index(playlist, selection_ptr, &entry); - return default_action_ok_load_content_from_playlist_from_menu(core_path, path, entry_label); + return default_action_ok_load_content_from_playlist_from_menu(entry->core_path, entry->path, entry->label); error: return menu_cbs_exit(); @@ -2066,15 +2088,15 @@ static int action_ok_audio_add_to_mixer(const char *path, { const char *entry_path = NULL; playlist_t *tmp_playlist = playlist_get_cached(); + const struct playlist_entry *entry = NULL; if (!tmp_playlist) return -1; - playlist_get_index(tmp_playlist, entry_idx, - &entry_path, NULL, NULL, NULL, NULL, NULL); + playlist_get_index(tmp_playlist, entry_idx, &entry); - if (filestream_exists(entry_path)) - task_push_audio_mixer_load(entry_path, + if (filestream_exists(entry->path)) + task_push_audio_mixer_load(entry->path, NULL, NULL, false, AUDIO_MIXER_SLOT_SELECTION_AUTOMATIC, 0 @@ -2088,15 +2110,15 @@ static int action_ok_audio_add_to_mixer_and_play(const char *path, { const char *entry_path = NULL; playlist_t *tmp_playlist = playlist_get_cached(); + const struct playlist_entry *entry = NULL; if (!tmp_playlist) return -1; - playlist_get_index(tmp_playlist, entry_idx, - &entry_path, NULL, NULL, NULL, NULL, NULL); + playlist_get_index(tmp_playlist, entry_idx, &entry); - if (filestream_exists(entry_path)) - task_push_audio_mixer_load_and_play(entry_path, + if (filestream_exists(entry->path)) + task_push_audio_mixer_load_and_play(entry->path, NULL, NULL, false, AUDIO_MIXER_SLOT_SELECTION_AUTOMATIC, 0); @@ -2109,6 +2131,7 @@ static int action_ok_audio_add_to_mixer_and_collection(const char *path, { char combined_path[PATH_MAX_LENGTH]; menu_handle_t *menu = NULL; + struct playlist_entry entry = {0}; combined_path[0] = '\0'; @@ -2118,14 +2141,12 @@ static int action_ok_audio_add_to_mixer_and_collection(const char *path, fill_pathname_join(combined_path, menu->scratch2_buf, menu->scratch_buf, sizeof(combined_path)); - command_playlist_push_write( - g_defaults.music_history, - combined_path, - NULL, - "builtin", - "musicplayer", - NULL, - NULL); + /* the push function reads our entry as const, so these casts are safe */ + entry.path = combined_path; + entry.core_path = (char*)"builtin"; + entry.core_name = (char*)"musicplayer"; + + command_playlist_push_write(g_defaults.music_history, &entry); if (filestream_exists(combined_path)) task_push_audio_mixer_load(combined_path, @@ -2141,6 +2162,7 @@ static int action_ok_audio_add_to_mixer_and_collection_and_play(const char *path { char combined_path[PATH_MAX_LENGTH]; menu_handle_t *menu = NULL; + struct playlist_entry entry = {0}; combined_path[0] = '\0'; @@ -2150,14 +2172,12 @@ static int action_ok_audio_add_to_mixer_and_collection_and_play(const char *path fill_pathname_join(combined_path, menu->scratch2_buf, menu->scratch_buf, sizeof(combined_path)); - command_playlist_push_write( - g_defaults.music_history, - combined_path, - NULL, - "builtin", - "musicplayer", - NULL, - NULL); + /* the push function reads our entry as const, so these casts are safe */ + entry.path = combined_path; + entry.core_path = (char*)"builtin"; + entry.core_name = (char*)"musicplayer"; + + command_playlist_push_write(g_defaults.music_history, &entry); if (filestream_exists(combined_path)) task_push_audio_mixer_load_and_play(combined_path, @@ -2221,14 +2241,16 @@ static void menu_input_st_string_cb_rename_entry(void *userdata, const char *label = menu_input_dialog_get_buffer(); if (!string_is_empty(label)) + { + struct playlist_entry entry = {0}; + + /* the update function reads our entry as const, so these casts are safe */ + entry.label = (char*)label; + command_playlist_update_write(NULL, menu_input_dialog_get_kb_idx(), - NULL, - label, - NULL, - NULL, - NULL, - NULL); + &entry); + } } menu_input_dialog_end(); @@ -2679,15 +2701,20 @@ static int action_ok_core_deferred_set(const char *new_core_path, ext_name, settings->bools.show_hidden_files, true); - command_playlist_update_write( - NULL, - menu->scratchpad.unsigned_var, - NULL, - content_label, - new_core_path, - core_display_name, - NULL, - NULL); + + { + struct playlist_entry entry = {0}; + + /* the update function reads our entry as const, so these casts are safe */ + entry.label = (char*)content_label; + entry.core_path = (char*)new_core_path; + entry.core_name = core_display_name; + + command_playlist_update_write( + NULL, + menu->scratchpad.unsigned_var, + &entry); + } menu_entries_pop_stack(&selection, 0, 1); menu_navigation_set_selection(selection); @@ -3585,7 +3612,7 @@ finish: (transf ? transf->path: "unknown"), err); } #ifdef HAVE_DISCORD - else if (transf->enum_idx == MENU_ENUM_LABEL_CB_DISCORD_AVATAR) + else if (transf && transf->enum_idx == MENU_ENUM_LABEL_CB_DISCORD_AVATAR) discord_avatar_set_ready(true); #endif @@ -3805,10 +3832,6 @@ static int action_ok_reset_core_association(const char *path, if (!menu_driver_ctl(RARCH_MENU_CTL_DRIVER_DATA_GET, &menu)) return menu_cbs_exit(); - playlist_get_index(tmp_playlist, - menu->rpl_entry_selection_ptr, - &tmp_path, NULL, NULL, NULL, NULL, NULL); - if (!command_event(CMD_EVENT_RESET_CORE_ASSOCIATION, (void *)&menu->rpl_entry_selection_ptr)) return menu_cbs_exit(); @@ -3933,14 +3956,9 @@ static int action_ok_add_to_favorites(const char *path, static int action_ok_add_to_favorites_playlist(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { - const char *content_path = NULL; - const char *content_label = NULL; - const char *core_path = NULL; - const char *core_name = NULL; - const char *crc32 = NULL; - const char *db_name = NULL; menu_handle_t *menu = NULL; playlist_t *playlist_curr = playlist_get_cached(); + const struct playlist_entry *entry = NULL; int ret = 0; if (!playlist_curr) @@ -3949,13 +3967,11 @@ static int action_ok_add_to_favorites_playlist(const char *path, return menu_cbs_exit(); /* Read current playlist parameters */ - playlist_get_index(playlist_curr, menu->rpl_entry_selection_ptr, - &content_path, &content_label, &core_path, &core_name, - &crc32, NULL); + playlist_get_index(playlist_curr, menu->rpl_entry_selection_ptr, &entry); /* Error checking * > If content path is empty, cannot do anything... */ - if (!string_is_empty(content_path)) + if (!string_is_empty(entry->path)) { struct string_list *str_list = NULL; union string_list_elem_attr attr; @@ -3978,43 +3994,43 @@ static int action_ok_add_to_favorites_playlist(const char *path, * [5]: db_name */ /* > content_path */ - string_list_append(str_list, content_path, attr); + string_list_append(str_list, entry->path, attr); /* > content_label */ - if (!string_is_empty(content_label)) + if (!string_is_empty(entry->label)) { - string_list_append(str_list, content_label, attr); + string_list_append(str_list, entry->label, attr); } else { /* Label is empty - use file name instead */ char fallback_content_label[PATH_MAX_LENGTH]; fallback_content_label[0] = '\0'; - fill_short_pathname_representation(fallback_content_label, content_path, sizeof(fallback_content_label)); + fill_short_pathname_representation(fallback_content_label, entry->path, sizeof(fallback_content_label)); string_list_append(str_list, fallback_content_label, attr); } /* > core_path + core_name */ - if (!string_is_empty(core_path) && !string_is_empty(core_name)) + if (!string_is_empty(entry->core_path) && !string_is_empty(entry->core_name)) { core_info_ctx_find_t core_info; /* >> core_path */ - string_list_append(str_list, core_path, attr); + string_list_append(str_list, entry->core_path, attr); /* >> core_name * (always use display name, if available) */ core_info.inf = NULL; - core_info.path = core_path; + core_info.path = entry->core_path; - if (core_info_find(&core_info, core_path)) + if (core_info_find(&core_info, entry->core_path)) if (!string_is_empty(core_info.inf->display_name)) strlcpy(core_display_name, core_info.inf->display_name, sizeof(core_display_name)); if (!string_is_empty(core_display_name)) string_list_append(str_list, core_display_name, attr); else - string_list_append(str_list, core_name, attr); + string_list_append(str_list, entry->core_name, attr); } else { @@ -4023,11 +4039,10 @@ static int action_ok_add_to_favorites_playlist(const char *path, } /* crc32 */ - string_list_append(str_list, !string_is_empty(crc32) ? crc32 : "", attr); + string_list_append(str_list, !string_is_empty(entry->crc32) ? entry->crc32 : "", attr); /* db_name */ - playlist_get_db_name(playlist_curr, menu->rpl_entry_selection_ptr, &db_name); - string_list_append(str_list, !string_is_empty(db_name) ? db_name : "", attr); + string_list_append(str_list, !string_is_empty(entry->db_name) ? entry->db_name : "", attr); /* Trigger 'ADD_TO_FAVORITES' event */ if (!command_event(CMD_EVENT_ADD_TO_FAVORITES, (void*)str_list)) @@ -4942,7 +4957,7 @@ static int action_ok_push_dropdown_item(const char *path, return 0; } -static int action_ok_push_dropdown_item_resolution(const char *path, +int action_cb_push_dropdown_item_resolution(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { char str[100]; @@ -4951,17 +4966,22 @@ static int action_ok_push_dropdown_item_resolution(const char *path, unsigned height = 0; unsigned refreshrate = 0; + (void)label; + (void)type; + (void)idx; + (void)entry_idx; + snprintf(str, sizeof(str), "%s", path); pch = strtok(str, "x"); if (pch) - width = strtoul(pch, NULL, 0); + width = (unsigned)strtoul(pch, NULL, 0); pch = strtok(NULL, " "); if (pch) - height = strtoul(pch, NULL, 0); + height = (unsigned)strtoul(pch, NULL, 0); pch = strtok(NULL, "("); if (pch) - refreshrate = strtoul(pch, NULL, 0); + refreshrate = (unsigned)strtoul(pch, NULL, 0); if (video_display_server_set_resolution(width, height, refreshrate, (float)refreshrate, 0, 0, 0)) @@ -4973,11 +4993,22 @@ static int action_ok_push_dropdown_item_resolution(const char *path, settings->uints.video_fullscreen_x = width; settings->uints.video_fullscreen_y = height; + return 1; + } + + return 0; +} + +static int action_ok_push_dropdown_item_resolution(const char *path, + const char *label, unsigned type, size_t idx, size_t entry_idx) +{ + if (action_cb_push_dropdown_item_resolution(path, + label, type, idx, entry_idx) == 1) + { /* TODO/FIXME - menu drivers like XMB don't rescale * automatically */ return menu_cbs_exit(); } - return 0; } @@ -5733,7 +5764,7 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_REMAP_FILE_REMOVE_GAME: BIND_ACTION_OK(cbs, action_ok_remap_file_remove_game); break; - case MENU_ENUM_LABEL_CONTENT_COLLECTION_LIST: + case MENU_ENUM_LABEL_PLAYLISTS_TAB: BIND_ACTION_OK(cbs, action_ok_content_collection_list); break; case MENU_ENUM_LABEL_BROWSE_URL_LIST: @@ -6104,7 +6135,7 @@ static int menu_cbs_init_bind_ok_compare_type(menu_file_list_cbs_t *cbs, BIND_ACTION_OK(cbs, action_ok_push_default); break; case FILE_TYPE_PLAYLIST_ENTRY: - if (label_hash == MENU_LABEL_COLLECTION) + if (label_hash == MENU_LABEL_PLAYLISTS_TAB) { BIND_ACTION_OK(cbs, action_ok_playlist_entry_collection); } @@ -6190,7 +6221,11 @@ static int menu_cbs_init_bind_ok_compare_type(menu_file_list_cbs_t *cbs, case FILE_TYPE_DIRECTORY: if (cbs->enum_idx != MSG_UNKNOWN || menu_label_hash == MENU_LABEL_DISK_IMAGE_APPEND - || menu_label_hash == MENU_LABEL_SUBSYSTEM_ADD) + || menu_label_hash == MENU_LABEL_SUBSYSTEM_ADD + || menu_label_hash == MENU_LABEL_VIDEO_FONT_PATH + || menu_label_hash == MENU_LABEL_XMB_FONT + || menu_label_hash == MENU_LABEL_AUDIO_DSP_PLUGIN + || menu_label_hash == MENU_LABEL_VIDEO_FILTER) BIND_ACTION_OK(cbs, action_ok_directory_push); else BIND_ACTION_OK(cbs, action_ok_push_random_dir); diff --git a/menu/cbs/menu_cbs_right.c b/menu/cbs/menu_cbs_right.c index 40a258c712..82850b9058 100644 --- a/menu/cbs/menu_cbs_right.c +++ b/menu/cbs/menu_cbs_right.c @@ -362,7 +362,7 @@ static int action_right_shader_num_passes(unsigned type, const char *label, return menu_cbs_exit(); if (pass_count < GFX_MAX_SHADERS) - menu_shader_manager_increment_amount_passes(); + shader->passes++; menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh); menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL); diff --git a/menu/cbs/menu_cbs_scan.c b/menu/cbs/menu_cbs_scan.c index 9376a99a00..ae6ce51091 100644 --- a/menu/cbs/menu_cbs_scan.c +++ b/menu/cbs/menu_cbs_scan.c @@ -111,11 +111,17 @@ int action_switch_thumbnail(const char *path, if (settings->uints.menu_thumbnails == 0) { - settings->uints.menu_left_thumbnails++; - if (settings->uints.menu_left_thumbnails > 3) - settings->uints.menu_left_thumbnails = 1; - menu_driver_ctl(RARCH_MENU_CTL_UPDATE_THUMBNAIL_PATH, NULL); - menu_driver_ctl(RARCH_MENU_CTL_UPDATE_THUMBNAIL_IMAGE, NULL); + /* RGUI is a special case where thumbnail 'switch' corresponds to + * toggling thumbnail view on/off. For other menu drivers, we + * cycle through available thumbnail types. */ + if(!string_is_equal(settings->arrays.menu_driver, "rgui")) + { + settings->uints.menu_left_thumbnails++; + if (settings->uints.menu_left_thumbnails > 3) + settings->uints.menu_left_thumbnails = 1; + menu_driver_ctl(RARCH_MENU_CTL_UPDATE_THUMBNAIL_PATH, NULL); + menu_driver_ctl(RARCH_MENU_CTL_UPDATE_THUMBNAIL_IMAGE, NULL); + } } else { diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 9b446e85a3..06ebd27a3b 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -144,6 +144,9 @@ default_sublabel_macro(action_bind_sublabel_systeminfo_cpu_cores, MENU_ default_sublabel_macro(action_bind_sublabel_toggle_gamepad_combo, MENU_ENUM_SUBLABEL_INPUT_MENU_ENUM_TOGGLE_GAMEPAD_COMBO) default_sublabel_macro(action_bind_sublabel_show_hidden_files, MENU_ENUM_SUBLABEL_SHOW_HIDDEN_FILES) default_sublabel_macro(action_bind_sublabel_log_verbosity, MENU_ENUM_SUBLABEL_LOG_VERBOSITY) +default_sublabel_macro(action_bind_sublabel_log_to_file, MENU_ENUM_SUBLABEL_LOG_TO_FILE) +default_sublabel_macro(action_bind_sublabel_log_to_file_timestamp, MENU_ENUM_SUBLABEL_LOG_TO_FILE_TIMESTAMP) +default_sublabel_macro(action_bind_sublabel_log_dir, MENU_ENUM_SUBLABEL_LOG_DIR) default_sublabel_macro(action_bind_sublabel_video_monitor_index, MENU_ENUM_SUBLABEL_VIDEO_MONITOR_INDEX) default_sublabel_macro(action_bind_sublabel_video_refresh_rate_auto, MENU_ENUM_SUBLABEL_VIDEO_REFRESH_RATE_AUTO) default_sublabel_macro(action_bind_sublabel_video_hard_sync, MENU_ENUM_SUBLABEL_VIDEO_HARD_SYNC) @@ -167,7 +170,7 @@ default_sublabel_macro(action_bind_sublabel_input_bind_hold, MENU_ default_sublabel_macro(action_bind_sublabel_audio_volume, MENU_ENUM_SUBLABEL_AUDIO_VOLUME) default_sublabel_macro(action_bind_sublabel_audio_mixer_volume, MENU_ENUM_SUBLABEL_AUDIO_MIXER_VOLUME) default_sublabel_macro(action_bind_sublabel_audio_sync, MENU_ENUM_SUBLABEL_AUDIO_SYNC) -default_sublabel_macro(action_bind_sublabel_axis_threshold, MENU_ENUM_SUBLABEL_INPUT_AXIS_THRESHOLD) +default_sublabel_macro(action_bind_sublabel_axis_threshold, MENU_ENUM_SUBLABEL_INPUT_BUTTON_AXIS_THRESHOLD) default_sublabel_macro(action_bind_sublabel_input_turbo_period, MENU_ENUM_SUBLABEL_INPUT_TURBO_PERIOD) default_sublabel_macro(action_bind_sublabel_input_duty_cycle, MENU_ENUM_SUBLABEL_INPUT_DUTY_CYCLE) default_sublabel_macro(action_bind_sublabel_video_vertical_sync, MENU_ENUM_SUBLABEL_VIDEO_VSYNC) @@ -212,7 +215,7 @@ default_sublabel_macro(action_bind_sublabel_video_message_pos_x, MENU_ default_sublabel_macro(action_bind_sublabel_video_message_pos_y, MENU_ENUM_SUBLABEL_VIDEO_MESSAGE_POS_Y) default_sublabel_macro(action_bind_sublabel_video_font_size, MENU_ENUM_SUBLABEL_VIDEO_FONT_SIZE) default_sublabel_macro(action_bind_sublabel_input_overlay_hide_in_menu, MENU_ENUM_SUBLABEL_INPUT_OVERLAY_HIDE_IN_MENU) -default_sublabel_macro(action_bind_sublabel_content_collection_list, MENU_ENUM_SUBLABEL_CONTENT_COLLECTION_LIST) +default_sublabel_macro(action_bind_sublabel_content_collection_list, MENU_ENUM_SUBLABEL_PLAYLISTS_TAB) default_sublabel_macro(action_bind_sublabel_video_scale_integer, MENU_ENUM_SUBLABEL_VIDEO_SCALE_INTEGER) default_sublabel_macro(action_bind_sublabel_video_gpu_screenshot, MENU_ENUM_SUBLABEL_VIDEO_GPU_SCREENSHOT) default_sublabel_macro(action_bind_sublabel_video_rotation, MENU_ENUM_SUBLABEL_VIDEO_ROTATION) @@ -310,7 +313,9 @@ default_sublabel_macro(action_bind_sublabel_stdin_cmd_enable, MENU_ default_sublabel_macro(action_bind_sublabel_mouse_enable, MENU_ENUM_SUBLABEL_MOUSE_ENABLE) default_sublabel_macro(action_bind_sublabel_pointer_enable, MENU_ENUM_SUBLABEL_POINTER_ENABLE) default_sublabel_macro(action_bind_sublabel_thumbnails, MENU_ENUM_SUBLABEL_THUMBNAILS) +default_sublabel_macro(action_bind_sublabel_thumbnails_rgui, MENU_ENUM_SUBLABEL_THUMBNAILS_RGUI) default_sublabel_macro(action_bind_sublabel_left_thumbnails, MENU_ENUM_SUBLABEL_LEFT_THUMBNAILS) +default_sublabel_macro(action_bind_sublabel_left_thumbnails_rgui, MENU_ENUM_SUBLABEL_LEFT_THUMBNAILS_RGUI) default_sublabel_macro(action_bind_sublabel_left_thumbnails_ozone, MENU_ENUM_SUBLABEL_LEFT_THUMBNAILS_OZONE) default_sublabel_macro(action_bind_sublabel_timedate_enable, MENU_ENUM_SUBLABEL_TIMEDATE_ENABLE) default_sublabel_macro(action_bind_sublabel_timedate_style, MENU_ENUM_SUBLABEL_TIMEDATE_STYLE) @@ -516,24 +521,35 @@ default_sublabel_macro(action_bind_sublabel_switch_gpu_profile, MENU default_sublabel_macro(action_bind_sublabel_switch_backlight_control, MENU_ENUM_SUBLABEL_SWITCH_BACKLIGHT_CONTROL) #endif +#if defined(_3DS) +default_sublabel_macro(action_bind_sublabel_video_3ds_lcd_bottom, MENU_ENUM_SUBLABEL_VIDEO_3DS_LCD_BOTTOM) +default_sublabel_macro(action_bind_sublabel_video_3ds_display_mode, MENU_ENUM_SUBLABEL_VIDEO_3DS_DISPLAY_MODE) +#endif + default_sublabel_macro(action_bind_sublabel_playlist_show_sublabels, MENU_ENUM_SUBLABEL_PLAYLIST_SHOW_SUBLABELS) default_sublabel_macro(action_bind_sublabel_menu_rgui_border_filler_enable, MENU_ENUM_SUBLABEL_MENU_RGUI_BORDER_FILLER_ENABLE) default_sublabel_macro(action_bind_sublabel_menu_rgui_border_filler_thickness_enable, MENU_ENUM_SUBLABEL_MENU_RGUI_BORDER_FILLER_THICKNESS_ENABLE) default_sublabel_macro(action_bind_sublabel_menu_rgui_background_filler_thickness_enable, MENU_ENUM_SUBLABEL_MENU_RGUI_BACKGROUND_FILLER_THICKNESS_ENABLE) default_sublabel_macro(action_bind_sublabel_menu_linear_filter, MENU_ENUM_SUBLABEL_MENU_LINEAR_FILTER) -default_sublabel_macro(action_bind_sublabel_menu_rgui_lock_aspect, MENU_ENUM_SUBLABEL_MENU_RGUI_LOCK_ASPECT) +default_sublabel_macro(action_bind_sublabel_menu_rgui_aspect_ratio_lock, MENU_ENUM_SUBLABEL_MENU_RGUI_ASPECT_RATIO_LOCK) default_sublabel_macro(action_bind_sublabel_rgui_menu_color_theme, MENU_ENUM_SUBLABEL_RGUI_MENU_COLOR_THEME) default_sublabel_macro(action_bind_sublabel_rgui_menu_theme_preset, MENU_ENUM_SUBLABEL_RGUI_MENU_THEME_PRESET) +default_sublabel_macro(action_bind_sublabel_menu_rgui_shadows, MENU_ENUM_SUBLABEL_MENU_RGUI_SHADOWS) +default_sublabel_macro(action_bind_sublabel_menu_rgui_inline_thumbnails, MENU_ENUM_SUBLABEL_MENU_RGUI_INLINE_THUMBNAILS) +default_sublabel_macro(action_bind_sublabel_menu_rgui_swap_thumbnails, MENU_ENUM_SUBLABEL_MENU_RGUI_SWAP_THUMBNAILS) default_sublabel_macro(action_bind_sublabel_menu_rgui_thumbnail_downscaler, MENU_ENUM_SUBLABEL_MENU_RGUI_THUMBNAIL_DOWNSCALER) +default_sublabel_macro(action_bind_sublabel_menu_rgui_thumbnail_delay, MENU_ENUM_SUBLABEL_MENU_RGUI_THUMBNAIL_DELAY) default_sublabel_macro(action_bind_sublabel_content_runtime_log, MENU_ENUM_SUBLABEL_CONTENT_RUNTIME_LOG) default_sublabel_macro(action_bind_sublabel_content_runtime_log_aggregate, MENU_ENUM_SUBLABEL_CONTENT_RUNTIME_LOG_AGGREGATE) default_sublabel_macro(action_bind_sublabel_playlist_sublabel_runtime_type, MENU_ENUM_SUBLABEL_PLAYLIST_SUBLABEL_RUNTIME_TYPE) default_sublabel_macro(action_bind_sublabel_menu_rgui_internal_upscale_level, MENU_ENUM_SUBLABEL_MENU_RGUI_INTERNAL_UPSCALE_LEVEL) +default_sublabel_macro(action_bind_sublabel_menu_rgui_aspect_ratio, MENU_ENUM_SUBLABEL_MENU_RGUI_ASPECT_RATIO) default_sublabel_macro(action_bind_sublabel_menu_ticker_type, MENU_ENUM_SUBLABEL_MENU_TICKER_TYPE) default_sublabel_macro(action_bind_sublabel_menu_ticker_speed, MENU_ENUM_SUBLABEL_MENU_TICKER_SPEED) default_sublabel_macro(action_bind_sublabel_playlist_show_inline_core_name, MENU_ENUM_SUBLABEL_PLAYLIST_SHOW_INLINE_CORE_NAME) default_sublabel_macro(action_bind_sublabel_playlist_sort_alphabetical, MENU_ENUM_SUBLABEL_PLAYLIST_SORT_ALPHABETICAL) default_sublabel_macro(action_bind_sublabel_menu_rgui_full_width_layout, MENU_ENUM_SUBLABEL_MENU_RGUI_FULL_WIDTH_LAYOUT) +default_sublabel_macro(action_bind_sublabel_menu_rgui_extended_ascii, MENU_ENUM_SUBLABEL_MENU_RGUI_EXTENDED_ASCII) default_sublabel_macro(action_bind_sublabel_help_send_debug_info, MENU_ENUM_SUBLABEL_HELP_SEND_DEBUG_INFO) static int action_bind_sublabel_systeminfo_controller_entry( @@ -831,6 +847,7 @@ static int action_bind_sublabel_playlist_entry( { settings_t *settings = config_get_ptr(); playlist_t *playlist = NULL; + const struct playlist_entry *entry = NULL; const char *core_name = NULL; unsigned runtime_hours = 0; unsigned runtime_minutes = 0; @@ -847,13 +864,17 @@ static int action_bind_sublabel_playlist_entry( /* Get current playlist */ playlist = playlist_get_cached(); + if (!playlist) return 0; + if (i >= playlist_get_size(playlist)) return 0; /* Read playlist entry */ - playlist_get_index(playlist, i, NULL, NULL, NULL, &core_name, NULL, NULL); + playlist_get_index(playlist, i, &entry); + + core_name = entry->core_name; /* Only add sublabel if a core is currently assigned */ if (string_is_empty(core_name) || string_is_equal(core_name, file_path_str(FILE_PATH_DETECT))) @@ -1598,11 +1619,23 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_timedate_style); break; case MENU_ENUM_LABEL_THUMBNAILS: - BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_thumbnails); + settings = config_get_ptr(); + if (string_is_equal(settings->arrays.menu_driver, "rgui")) + { + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_thumbnails_rgui); + } + else + { + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_thumbnails); + } break; case MENU_ENUM_LABEL_LEFT_THUMBNAILS: settings = config_get_ptr(); - if (string_is_equal(settings->arrays.menu_driver, "ozone")) + if (string_is_equal(settings->arrays.menu_driver, "rgui")) + { + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_left_thumbnails_rgui); + } + else if (string_is_equal(settings->arrays.menu_driver, "ozone")) { BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_left_thumbnails_ozone); } @@ -1896,7 +1929,7 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_VIDEO_SCALE_INTEGER: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_scale_integer); break; - case MENU_ENUM_LABEL_CONTENT_COLLECTION_LIST: + case MENU_ENUM_LABEL_PLAYLISTS_TAB: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_content_collection_list); break; case MENU_ENUM_LABEL_INPUT_OVERLAY_HIDE_IN_MENU: @@ -2028,7 +2061,7 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_INPUT_BIND_HOLD: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_input_bind_hold); break; - case MENU_ENUM_LABEL_INPUT_AXIS_THRESHOLD: + case MENU_ENUM_LABEL_INPUT_BUTTON_AXIS_THRESHOLD: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_axis_threshold); break; case MENU_ENUM_LABEL_AUDIO_SYNC: @@ -2131,6 +2164,15 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_LOG_VERBOSITY: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_log_verbosity); break; + case MENU_ENUM_LABEL_LOG_TO_FILE: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_log_to_file); + break; + case MENU_ENUM_LABEL_LOG_TO_FILE_TIMESTAMP: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_log_to_file_timestamp); + break; + case MENU_ENUM_LABEL_LOG_DIR: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_log_dir); + break; case MENU_ENUM_LABEL_SHOW_HIDDEN_FILES: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_show_hidden_files); break; @@ -2364,6 +2406,14 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_SWITCH_BACKLIGHT_CONTROL: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_switch_backlight_control); break; +#endif +#if defined(_3DS) + case MENU_ENUM_LABEL_VIDEO_3DS_LCD_BOTTOM: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_3ds_lcd_bottom); + break; + case MENU_ENUM_LABEL_VIDEO_3DS_DISPLAY_MODE: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_3ds_display_mode); + break; #endif case MENU_ENUM_LABEL_CHEAT_APPLY_AFTER_LOAD: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_cheat_apply_after_load); @@ -2389,8 +2439,8 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_MENU_LINEAR_FILTER: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_menu_linear_filter); break; - case MENU_ENUM_LABEL_MENU_RGUI_LOCK_ASPECT: - BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_menu_rgui_lock_aspect); + case MENU_ENUM_LABEL_MENU_RGUI_ASPECT_RATIO_LOCK: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_menu_rgui_aspect_ratio_lock); break; case MENU_ENUM_LABEL_RGUI_MENU_COLOR_THEME: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_rgui_menu_color_theme); @@ -2398,9 +2448,21 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_RGUI_MENU_THEME_PRESET: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_rgui_menu_theme_preset); break; + case MENU_ENUM_LABEL_MENU_RGUI_SHADOWS: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_menu_rgui_shadows); + break; + case MENU_ENUM_LABEL_MENU_RGUI_INLINE_THUMBNAILS: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_menu_rgui_inline_thumbnails); + break; + case MENU_ENUM_LABEL_MENU_RGUI_SWAP_THUMBNAILS: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_menu_rgui_swap_thumbnails); + break; case MENU_ENUM_LABEL_MENU_RGUI_THUMBNAIL_DOWNSCALER: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_menu_rgui_thumbnail_downscaler); break; + case MENU_ENUM_LABEL_MENU_RGUI_THUMBNAIL_DELAY: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_menu_rgui_thumbnail_delay); + break; case MENU_ENUM_LABEL_CONTENT_RUNTIME_LOG: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_content_runtime_log); break; @@ -2413,6 +2475,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_MENU_RGUI_INTERNAL_UPSCALE_LEVEL: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_menu_rgui_internal_upscale_level); break; + case MENU_ENUM_LABEL_MENU_RGUI_ASPECT_RATIO: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_menu_rgui_aspect_ratio); + break; case MENU_ENUM_LABEL_MENU_TICKER_TYPE: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_menu_ticker_type); break; @@ -2428,6 +2493,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_MENU_RGUI_FULL_WIDTH_LAYOUT: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_menu_rgui_full_width_layout); break; + case MENU_ENUM_LABEL_MENU_RGUI_EXTENDED_ASCII: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_menu_rgui_extended_ascii); + break; case MENU_ENUM_LABEL_HELP_SEND_DEBUG_INFO: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_help_send_debug_info); break; diff --git a/menu/cbs/menu_cbs_title.c b/menu/cbs/menu_cbs_title.c index 0274020a6c..57cbd97320 100644 --- a/menu/cbs/menu_cbs_title.c +++ b/menu/cbs/menu_cbs_title.c @@ -172,7 +172,7 @@ default_title_macro(action_get_title_goto_favorites, MENU_ENUM_LABEL_ default_title_macro(action_get_title_goto_image, MENU_ENUM_LABEL_VALUE_GOTO_IMAGES) default_title_macro(action_get_title_goto_music, MENU_ENUM_LABEL_VALUE_GOTO_MUSIC) default_title_macro(action_get_title_goto_video, MENU_ENUM_LABEL_VALUE_GOTO_VIDEO) -default_title_macro(action_get_title_collection, MENU_ENUM_LABEL_VALUE_CONTENT_COLLECTION_LIST) +default_title_macro(action_get_title_collection, MENU_ENUM_LABEL_VALUE_PLAYLISTS_TAB) default_fill_title_macro(action_get_title_disk_image_append, MENU_ENUM_LABEL_VALUE_DISK_IMAGE_APPEND) default_fill_title_macro(action_get_title_cheat_file_load, MENU_ENUM_LABEL_VALUE_CHEAT_FILE) @@ -213,6 +213,7 @@ default_fill_title_macro(action_get_title_assets_directory, MENU_ENUM_LABE default_fill_title_macro(action_get_title_extraction_directory, MENU_ENUM_LABEL_VALUE_CACHE_DIRECTORY) default_fill_title_macro(action_get_title_menu, MENU_ENUM_LABEL_VALUE_MENU_SETTINGS) default_fill_title_macro(action_get_title_font_path, MENU_ENUM_LABEL_VALUE_XMB_FONT) +default_fill_title_macro(action_get_title_log_dir, MENU_ENUM_LABEL_VALUE_LOG_DIR) default_title_copy_macro(action_get_title_help, MENU_ENUM_LABEL_VALUE_HELP_LIST) default_title_copy_macro(action_get_title_input_settings, MENU_ENUM_LABEL_VALUE_INPUT_SETTINGS) @@ -715,6 +716,9 @@ static int menu_cbs_init_bind_title_compare_label(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_RGUI_CONFIG_DIRECTORY: BIND_ACTION_GET_TITLE(cbs, action_get_title_config_directory); break; + case MENU_ENUM_LABEL_LOG_DIR: + BIND_ACTION_GET_TITLE(cbs, action_get_title_log_dir); + break; case MENU_ENUM_LABEL_INFORMATION_LIST: BIND_ACTION_GET_TITLE(cbs, action_get_title_information_list); break; @@ -840,7 +844,7 @@ static int menu_cbs_init_bind_title_compare_label(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_ACHIEVEMENT_LIST_HARDCORE: case MENU_ENUM_LABEL_VIDEO_SHADER_PARAMETERS: case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_PARAMETERS: - case MENU_ENUM_LABEL_CONTENT_COLLECTION_LIST: + case MENU_ENUM_LABEL_PLAYLISTS_TAB: BIND_ACTION_GET_TITLE(cbs, action_get_title_action_generic); break; case MENU_ENUM_LABEL_DISK_IMAGE_APPEND: @@ -1047,6 +1051,9 @@ static int menu_cbs_init_bind_title_compare_label(menu_file_list_cbs_t *cbs, case MENU_LABEL_RGUI_CONFIG_DIRECTORY: BIND_ACTION_GET_TITLE(cbs, action_get_title_config_directory); break; + case MENU_LABEL_LOG_DIR: + BIND_ACTION_GET_TITLE(cbs, action_get_title_log_dir); + break; case MENU_LABEL_INFORMATION_LIST: BIND_ACTION_GET_TITLE(cbs, action_get_title_information_list); break; @@ -1137,7 +1144,7 @@ static int menu_cbs_init_bind_title_compare_label(menu_file_list_cbs_t *cbs, case MENU_LABEL_DEFERRED_PLAYLIST_SETTINGS_LIST: BIND_ACTION_GET_TITLE(cbs, action_get_playlist_settings_list); break; - case MENU_LABEL_CONTENT_COLLECTION_LIST: + case MENU_LABEL_PLAYLISTS_TAB: BIND_ACTION_GET_TITLE(cbs, action_get_title_collection); break; case MENU_LABEL_ACHIEVEMENT_LIST: diff --git a/menu/drivers/ozone/ozone.c b/menu/drivers/ozone/ozone.c index 7cb6f53659..906d1d76ad 100644 --- a/menu/drivers/ozone/ozone.c +++ b/menu/drivers/ozone/ozone.c @@ -56,32 +56,6 @@ #include "../../../tasks/tasks_internal.h" #include "../../../dynamic.h" -const char *ozone_thumbnails_ident(char pos) -{ - char folder = 0; - settings_t *settings = config_get_ptr(); - - if (pos == 'R') - folder = settings->uints.menu_thumbnails; - if (pos == 'L') - folder = settings->uints.menu_left_thumbnails; - - switch (folder) - { - case 1: - return "Named_Snaps"; - case 2: - return "Named_Titles"; - case 3: - return "Named_Boxarts"; - case 0: - default: - break; - } - - return msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF); -} - ozone_node_t *ozone_alloc_node(void) { ozone_node_t *node = (ozone_node_t*)malloc(sizeof(*node)); @@ -199,6 +173,10 @@ static void *ozone_init(void **userdata, bool video_is_threaded) ozone->show_thumbnail_bar = false; ozone->dimensions.sidebar_width = 0.0f; + ozone->thumbnail_path_data = menu_thumbnail_path_init(); + if (!ozone->thumbnail_path_data) + goto error; + ozone_sidebar_update_collapse(ozone, false); ozone->system_tab_end = 0; @@ -323,19 +301,23 @@ static void *ozone_init(void **userdata, bool video_is_threaded) return menu; error: - if (ozone->horizontal_list) + if (ozone) { - ozone_free_list_nodes(ozone->horizontal_list, false); - file_list_free(ozone->horizontal_list); - } + if (ozone->horizontal_list) + { + ozone_free_list_nodes(ozone->horizontal_list, false); + file_list_free(ozone->horizontal_list); + } - if (ozone->selection_buf_old) - { - ozone_free_list_nodes(ozone->selection_buf_old, false); - file_list_free(ozone->selection_buf_old); + if (ozone->selection_buf_old) + { + ozone_free_list_nodes(ozone->selection_buf_old, false); + file_list_free(ozone->selection_buf_old); + } + + ozone->selection_buf_old = NULL; + ozone->horizontal_list = NULL; } - ozone->selection_buf_old = NULL; - ozone->horizontal_list = NULL; if (menu) free(menu); @@ -376,17 +358,8 @@ static void ozone_free(void *data) if (!string_is_empty(ozone->pending_message)) free(ozone->pending_message); - if (!string_is_empty(ozone->thumbnail_content)) - free(ozone->thumbnail_content); - - if (!string_is_empty(ozone->thumbnail_system)) - free(ozone->thumbnail_system); - - if (!string_is_empty(ozone->thumbnail_file_path)) - free(ozone->thumbnail_file_path); - - if (!string_is_empty(ozone->left_thumbnail_file_path)) - free(ozone->left_thumbnail_file_path); + if (ozone->thumbnail_path_data) + free(ozone->thumbnail_path_data); } } @@ -402,240 +375,48 @@ unsigned ozone_count_lines(const char *str) static void ozone_update_thumbnail_path(void *data, unsigned i, char pos) { - menu_entry_t entry; - unsigned entry_type = 0; - char new_path[PATH_MAX_LENGTH] = {0}; - settings_t *settings = config_get_ptr(); ozone_handle_t *ozone = (ozone_handle_t*)data; - playlist_t *playlist = NULL; - const char *dir_thumbnails = settings->paths.directory_thumbnails; + const char *core_name = NULL; - menu_entry_init(&entry); + if (!ozone) + return; - if (!ozone || string_is_empty(dir_thumbnails)) - goto end; - - menu_entry_get(&entry, 0, i, NULL, true); - - entry_type = menu_entry_get_type_new(&entry); - - if (entry_type == FILE_TYPE_IMAGEVIEWER || entry_type == FILE_TYPE_IMAGE) + /* imageviewer content requires special treatment... */ + menu_thumbnail_get_core_name(ozone->thumbnail_path_data, &core_name); + if (string_is_equal(core_name, "imageviewer")) { - file_list_t *selection_buf = menu_entries_get_selection_buf_ptr(0); - ozone_node_t *node = (ozone_node_t*) - file_list_get_userdata_at_offset(selection_buf, i); - - if (node && !string_is_empty(node->fullpath) && - (pos == 'R' || (pos == 'L' && string_is_equal(ozone_thumbnails_ident('R'), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))))) - { - if (!string_is_empty(entry.path)) - fill_pathname_join( - new_path, - node->fullpath, - entry.path, - sizeof(new_path)); - - goto end; - } + if ((pos == 'R') || (pos == 'L' && !menu_thumbnail_is_enabled(MENU_THUMBNAIL_RIGHT))) + menu_thumbnail_update_path(ozone->thumbnail_path_data, pos == 'R' ? MENU_THUMBNAIL_RIGHT : MENU_THUMBNAIL_LEFT); } - else if (filebrowser_get_type() != FILEBROWSER_NONE) - { - video_driver_texture_unload(&ozone->thumbnail); - goto end; - } - - playlist = playlist_get_cached(); - - if (playlist) - { - const char *core_name = NULL; - const char *core_label = NULL; - playlist_get_index(playlist, i, - NULL, NULL, NULL, &core_name, NULL, NULL); - - /* Fill core name */ - if (!core_name || string_is_equal(core_name, "DETECT")) - core_label = msg_hash_to_str(MSG_AUTODETECT); - else - core_label = core_name; - - snprintf(ozone->selection_core_name, sizeof(ozone->selection_core_name), - "%s", core_label); - - word_wrap(ozone->selection_core_name, ozone->selection_core_name, (unsigned)((float)ozone->dimensions.thumbnail_bar_width * (float)0.66) / ozone->footer_font_glyph_width, false); - ozone->selection_core_name_lines = ozone_count_lines(ozone->selection_core_name); - - /* Fill play time if applicable */ - if (settings->bools.content_runtime_log || settings->bools.content_runtime_log_aggregate) - { - unsigned runtime_hours = 0; - unsigned runtime_minutes = 0; - unsigned runtime_seconds = 0; - - unsigned last_played_year = 0; - unsigned last_played_month = 0; - unsigned last_played_day = 0; - unsigned last_played_hour = 0; - unsigned last_played_minute = 0; - unsigned last_played_second = 0; - - playlist_get_runtime_index(playlist, i, NULL, NULL, - &runtime_hours, &runtime_minutes, &runtime_seconds, - &last_played_year, &last_played_month, &last_played_day, - &last_played_hour, &last_played_minute, &last_played_second); - - snprintf(ozone->selection_playtime, sizeof(ozone->selection_playtime), "%02u:%02u:%02u", - runtime_hours, runtime_minutes, runtime_seconds); - - if (last_played_year == 0 && last_played_month == 0 && last_played_day == 0 - && last_played_hour == 0 && last_played_minute == 0 && last_played_second == 0) - { - snprintf(ozone->selection_lastplayed, sizeof(ozone->selection_lastplayed), "%s", - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLIST_INLINE_CORE_DISPLAY_NEVER)); - } - else - { - snprintf(ozone->selection_lastplayed, sizeof(ozone->selection_lastplayed), "%04u/%02u/%02u - %02u:%02u:%02u", - last_played_year, last_played_month, last_played_day, - last_played_hour, last_played_minute, last_played_second); - } - } - else - { - snprintf(ozone->selection_playtime, sizeof(ozone->selection_playtime), "%s", - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DISABLED)); - - snprintf(ozone->selection_lastplayed, sizeof(ozone->selection_lastplayed), "%s", - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DISABLED)); - } - - if (string_is_equal(core_name, "imageviewer")) - { - if ( - (pos == 'R') || - ( - pos == 'L' && - string_is_equal(ozone_thumbnails_ident('R'), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF)) - ) - ) - { - if (!string_is_empty(entry.label)) - strlcpy(new_path, entry.label, - sizeof(new_path)); - } - else - video_driver_texture_unload(&ozone->left_thumbnail); - goto end; - } - } - - /* Append thumbnail system directory */ - if (!string_is_empty(ozone->thumbnail_system)) - fill_pathname_join( - new_path, - dir_thumbnails, - ozone->thumbnail_system, - sizeof(new_path)); - - if (!string_is_empty(new_path)) - { - char *tmp_new2 = (char*) - malloc(PATH_MAX_LENGTH * sizeof(char)); - - tmp_new2[0] = '\0'; - - /* Append Named_Snaps/Named_Boxarts/Named_Titles */ - if (pos == 'R') - fill_pathname_join(tmp_new2, new_path, - ozone_thumbnails_ident('R'), PATH_MAX_LENGTH * sizeof(char)); - if (pos == 'L') - fill_pathname_join(tmp_new2, new_path, - ozone_thumbnails_ident('L'), PATH_MAX_LENGTH * sizeof(char)); - - strlcpy(new_path, tmp_new2, - PATH_MAX_LENGTH * sizeof(char)); - free(tmp_new2); - } - - /* Scrub characters that are not cross-platform and/or violate the - * No-Intro filename standard: - * http://datomatic.no-intro.org/stuff/The%20Official%20No-Intro%20Convention%20(20071030).zip - * Replace these characters in the entry name with underscores. - */ - if (!string_is_empty(ozone->thumbnail_content)) - { - char *scrub_char_pointer = NULL; - char *tmp_new = (char*) - malloc(PATH_MAX_LENGTH * sizeof(char)); - char *tmp = strdup(ozone->thumbnail_content); - - tmp_new[0] = '\0'; - - while((scrub_char_pointer = strpbrk(tmp, "&*/:`\"<>?\\|"))) - *scrub_char_pointer = '_'; - - /* Look for thumbnail file with this scrubbed filename */ - - fill_pathname_join(tmp_new, - new_path, - tmp, PATH_MAX_LENGTH * sizeof(char)); - - if (!string_is_empty(tmp_new)) - strlcpy(new_path, - tmp_new, sizeof(new_path)); - - free(tmp_new); - free(tmp); - } - - /* Append png extension */ - if (!string_is_empty(new_path)) - strlcat(new_path, - file_path_str(FILE_PATH_PNG_EXTENSION), - sizeof(new_path)); - -end: - if (ozone && !string_is_empty(new_path)) - { - if (pos == 'R') - ozone->thumbnail_file_path = strdup(new_path); - if (pos == 'L') - ozone->left_thumbnail_file_path = strdup(new_path); - } - - menu_entry_free(&entry); + else + menu_thumbnail_update_path(ozone->thumbnail_path_data, pos == 'R' ? MENU_THUMBNAIL_RIGHT : MENU_THUMBNAIL_LEFT); } static void ozone_update_thumbnail_image(void *data) { - ozone_handle_t *ozone = (ozone_handle_t*)data; + ozone_handle_t *ozone = (ozone_handle_t*)data; + const char *right_thumbnail_path = NULL; + const char *left_thumbnail_path = NULL; + if (!ozone) return; - if (!(string_is_empty(ozone->thumbnail_file_path))) + if (menu_thumbnail_get_path(ozone->thumbnail_path_data, MENU_THUMBNAIL_RIGHT, &right_thumbnail_path)) { - if (filestream_exists(ozone->thumbnail_file_path)) - task_push_image_load(ozone->thumbnail_file_path, + if (filestream_exists(right_thumbnail_path)) + task_push_image_load(right_thumbnail_path, menu_display_handle_thumbnail_upload, NULL); else video_driver_texture_unload(&ozone->thumbnail); - - free(ozone->thumbnail_file_path); - ozone->thumbnail_file_path = NULL; } - if (!(string_is_empty(ozone->left_thumbnail_file_path))) + if (menu_thumbnail_get_path(ozone->thumbnail_path_data, MENU_THUMBNAIL_LEFT, &left_thumbnail_path)) { - if (filestream_exists(ozone->left_thumbnail_file_path)) - task_push_image_load(ozone->left_thumbnail_file_path, + if (filestream_exists(left_thumbnail_path)) + task_push_image_load(left_thumbnail_path, menu_display_handle_left_thumbnail_upload, NULL); else video_driver_texture_unload(&ozone->left_thumbnail); - - free(ozone->left_thumbnail_file_path); - ozone->left_thumbnail_file_path = NULL; } } @@ -827,18 +608,13 @@ static void ozone_context_reset(void *data, bool is_threaded) } /* Thumbnails */ - if (!string_is_equal(ozone_thumbnails_ident('R'), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) - { + if (menu_thumbnail_is_enabled(MENU_THUMBNAIL_RIGHT)) ozone_update_thumbnail_path(ozone, 0, 'R'); - ozone_update_thumbnail_image(ozone); - } - if (!string_is_equal(ozone_thumbnails_ident('L'), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) - { + + if (menu_thumbnail_is_enabled(MENU_THUMBNAIL_LEFT)) ozone_update_thumbnail_path(ozone, 0, 'L'); - ozone_update_thumbnail_image(ozone); - } + + ozone_update_thumbnail_image(ozone); /* TODO: update savestate thumbnail image */ @@ -967,9 +743,9 @@ static int ozone_list_push(void *data, void *userdata, #ifdef HAVE_LIBRETRODB menu_entries_append_enum(info->list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CONTENT_COLLECTION_LIST), - msg_hash_to_str(MENU_ENUM_LABEL_CONTENT_COLLECTION_LIST), - MENU_ENUM_LABEL_CONTENT_COLLECTION_LIST, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLISTS_TAB), + msg_hash_to_str(MENU_ENUM_LABEL_PLAYLISTS_TAB), + MENU_ENUM_LABEL_PLAYLISTS_TAB, MENU_SETTING_ACTION, 0, 0); #endif @@ -1299,7 +1075,9 @@ static void ozone_draw_footer(ozone_handle_t *ozone, video_frame_info_t *video_i unsigned ok_width = 96; unsigned search_width = 343; unsigned thumb_width = 343 + 188 + 80; - bool do_swap = video_info->input_menu_swap_ok_cancel_buttons; + unsigned icon_size = 35; + unsigned icon_offset = icon_size / 2; + bool do_swap = video_info->input_menu_swap_ok_cancel_buttons; if (do_swap) { @@ -1309,21 +1087,23 @@ static void ozone_draw_footer(ozone_handle_t *ozone, video_frame_info_t *video_i menu_display_blend_begin(video_info); + menu_display_set_alpha(ozone->theme_dynamic.entries_icon, 1.0f); + if (do_swap) { - ozone_draw_icon(video_info, 25, 25, ozone->theme->textures[OZONE_THEME_TEXTURE_BUTTON_B], video_info->width - 133, video_info->height - ozone->dimensions.footer_height / 2 - 12, video_info->width,video_info->height, 0, 1, NULL); - ozone_draw_icon(video_info, 25, 25, ozone->theme->textures[OZONE_THEME_TEXTURE_BUTTON_A], video_info->width - 251, video_info->height - ozone->dimensions.footer_height / 2 - 12, video_info->width,video_info->height, 0, 1, NULL); + ozone_draw_icon(video_info, icon_size, icon_size, ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_INPUT_BTN_R], video_info->width - 138, video_info->height - ozone->dimensions.footer_height / 2 - icon_offset, video_info->width,video_info->height, 0, 1, ozone->theme_dynamic.entries_icon); + ozone_draw_icon(video_info, icon_size, icon_size, ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_INPUT_BTN_D], video_info->width - 256, video_info->height - ozone->dimensions.footer_height / 2 - icon_offset, video_info->width,video_info->height, 0, 1, ozone->theme_dynamic.entries_icon); } else { - ozone_draw_icon(video_info, 25, 25, ozone->theme->textures[OZONE_THEME_TEXTURE_BUTTON_B], video_info->width - 251, video_info->height - ozone->dimensions.footer_height / 2 - 12, video_info->width,video_info->height, 0, 1, NULL); - ozone_draw_icon(video_info, 25, 25, ozone->theme->textures[OZONE_THEME_TEXTURE_BUTTON_A], video_info->width - 133, video_info->height - ozone->dimensions.footer_height / 2 - 12, video_info->width,video_info->height, 0, 1, NULL); + ozone_draw_icon(video_info, icon_size, icon_size, ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_INPUT_BTN_D], video_info->width - 256, video_info->height - ozone->dimensions.footer_height / 2 - icon_offset, video_info->width,video_info->height, 0, 1, ozone->theme_dynamic.entries_icon); + ozone_draw_icon(video_info, icon_size, icon_size, ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_INPUT_BTN_R], video_info->width - 138, video_info->height - ozone->dimensions.footer_height / 2 - icon_offset, video_info->width,video_info->height, 0, 1, ozone->theme_dynamic.entries_icon); } - ozone_draw_icon(video_info, 26, 26, ozone->theme->textures[OZONE_THEME_TEXTURE_BUTTON_X], video_info->width - 379, video_info->height - ozone->dimensions.footer_height / 2 - 12, video_info->width,video_info->height, 0, 1, NULL); + ozone_draw_icon(video_info, icon_size, icon_size, ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_INPUT_BTN_U], video_info->width - 384, video_info->height - ozone->dimensions.footer_height / 2 - icon_offset, video_info->width,video_info->height, 0, 1, ozone->theme_dynamic.entries_icon); if (ozone->is_playlist && !ozone->cursor_in_sidebar) - ozone_draw_icon(video_info, 26, 26, ozone->theme->textures[OZONE_THEME_TEXTURE_BUTTON_Y], video_info->width - 379 - 118 - 100 - 50, video_info->height - ozone->dimensions.footer_height / 2 - 12, video_info->width,video_info->height, 0, 1, NULL); + ozone_draw_icon(video_info, icon_size, icon_size, ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_INPUT_BTN_L], video_info->width - 384 - 118 - 100 - 50, video_info->height - ozone->dimensions.footer_height / 2 - icon_offset, video_info->width,video_info->height, 0, 1, ozone->theme_dynamic.entries_icon); menu_display_blend_end(video_info); @@ -1352,25 +1132,160 @@ static void ozone_draw_footer(ozone_handle_t *ozone, video_frame_info_t *video_i menu_display_blend_end(video_info); } - -static void ozone_set_thumbnail_content(void *data, char *s, size_t len) +void ozone_update_content_metadata(ozone_handle_t *ozone) { - ozone_handle_t *ozone = (ozone_handle_t*)data; - if (!ozone) - return; - if (!string_is_empty(ozone->thumbnail_content)) - free(ozone->thumbnail_content); - ozone->thumbnail_content = strdup(s); + size_t selection = menu_navigation_get_selection(); + playlist_t *playlist = playlist_get_cached(); + const struct playlist_entry *entry = NULL; + const char *core_name = NULL; + settings_t *settings = config_get_ptr(); + + menu_thumbnail_get_core_name(ozone->thumbnail_path_data, &core_name); + + if (ozone->is_playlist && playlist) + { + const char *core_label = NULL; + playlist_get_index(playlist, selection, &entry); + + core_name = entry->core_name; + + /* Fill core name */ + if (!core_name || string_is_equal(core_name, "DETECT")) + core_label = msg_hash_to_str(MSG_AUTODETECT); + else + core_label = core_name; + + snprintf(ozone->selection_core_name, sizeof(ozone->selection_core_name), + "%s %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLIST_SUBLABEL_CORE), core_label); + + ozone->selection_core_is_viewer = string_is_equal(core_label, "imageviewer") + || string_is_equal(core_label, "musicplayer") + || string_is_equal(core_label, "movieplayer"); + + word_wrap(ozone->selection_core_name, ozone->selection_core_name, (unsigned)((float)ozone->dimensions.thumbnail_bar_width * (float)0.85) / ozone->footer_font_glyph_width, false); + ozone->selection_core_name_lines = ozone_count_lines(ozone->selection_core_name); + + /* Fill play time if applicable */ + if (settings->bools.content_runtime_log || settings->bools.content_runtime_log_aggregate) + { + unsigned runtime_hours = 0; + unsigned runtime_minutes = 0; + unsigned runtime_seconds = 0; + + unsigned last_played_year = 0; + unsigned last_played_month = 0; + unsigned last_played_day = 0; + unsigned last_played_hour = 0; + unsigned last_played_minute = 0; + unsigned last_played_second = 0; + + playlist_get_runtime_index(playlist, selection, NULL, NULL, + &runtime_hours, &runtime_minutes, &runtime_seconds, + &last_played_year, &last_played_month, &last_played_day, + &last_played_hour, &last_played_minute, &last_played_second); + + snprintf(ozone->selection_playtime, sizeof(ozone->selection_playtime), "%s %02u:%02u:%02u", + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLIST_SUBLABEL_RUNTIME), runtime_hours, runtime_minutes, runtime_seconds); + + if (last_played_year == 0 && last_played_month == 0 && last_played_day == 0 + && last_played_hour == 0 && last_played_minute == 0 && last_played_second == 0) + { + snprintf(ozone->selection_lastplayed, sizeof(ozone->selection_lastplayed), "%s %s", + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLIST_SUBLABEL_LAST_PLAYED), + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLIST_INLINE_CORE_DISPLAY_NEVER)); + } + else + { + snprintf(ozone->selection_lastplayed, sizeof(ozone->selection_lastplayed), "%s %04u/%02u/%02u -\n%02u:%02u:%02u", + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLIST_SUBLABEL_LAST_PLAYED), + last_played_year, last_played_month, last_played_day, + last_played_hour, last_played_minute, last_played_second); + } + } + else + { + snprintf(ozone->selection_playtime, sizeof(ozone->selection_playtime), "%s %s", + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLIST_SUBLABEL_RUNTIME), + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DISABLED)); + + snprintf(ozone->selection_lastplayed, sizeof(ozone->selection_lastplayed), "%s %s", + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLIST_SUBLABEL_LAST_PLAYED), + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DISABLED)); + } + } } -static void ozone_reset_thumbnail_content(void *data) +static void ozone_set_thumbnail_content(void *data, const char *s) +{ + size_t selection = menu_navigation_get_selection(); + ozone_handle_t *ozone = (ozone_handle_t*)data; + + if (!ozone) + return; + + if (ozone->is_playlist) + { + /* Playlist content */ + if (string_is_empty(s)) + menu_thumbnail_set_content_playlist(ozone->thumbnail_path_data, + playlist_get_cached(), selection); + } + else if (ozone->is_db_manager_list) + { + /* Database list content */ + if (string_is_empty(s)) + { + menu_entry_t entry; + + menu_entry_init(&entry); + menu_entry_get(&entry, 0, selection, NULL, true); + + if (!string_is_empty(entry.path)) + menu_thumbnail_set_content(ozone->thumbnail_path_data, entry.path); + + menu_entry_free(&entry); + } + } + else if (string_is_equal(s, "imageviewer")) + { + /* Filebrowser image updates */ + menu_entry_t entry; + file_list_t *selection_buf = menu_entries_get_selection_buf_ptr(0); + ozone_node_t *node = (ozone_node_t*)file_list_get_userdata_at_offset(selection_buf, selection); + + menu_entry_init(&entry); + menu_entry_get(&entry, 0, selection, NULL, true); + + if (node) + if (!string_is_empty(entry.path) && !string_is_empty(node->fullpath)) + menu_thumbnail_set_content_image(ozone->thumbnail_path_data, node->fullpath, entry.path); + + menu_entry_free(&entry); + } + else if (!string_is_empty(s)) + { + /* Annoying leftovers... + * This is required to ensure that thumbnails are + * updated correctly when navigating deeply through + * the sublevels of database manager lists. + * Showing thumbnails on database entries is a + * pointless nuisance and a waste of CPU cycles, IMHO... */ + menu_thumbnail_set_content(ozone->thumbnail_path_data, s); + } + + ozone_update_content_metadata(ozone); +} + +static void ozone_unload_thumbnail_textures(void *data) { ozone_handle_t *ozone = (ozone_handle_t*)data; if (!ozone) return; - if (!string_is_empty(ozone->thumbnail_content)) - free(ozone->thumbnail_content); - ozone->thumbnail_content = NULL; + + if (ozone->thumbnail) + video_driver_texture_unload(&ozone->thumbnail); + if (ozone->left_thumbnail) + video_driver_texture_unload(&ozone->left_thumbnail); } static void ozone_set_thumbnail_system(void *data, char*s, size_t len) @@ -1379,32 +1294,33 @@ static void ozone_set_thumbnail_system(void *data, char*s, size_t len) if (!ozone) return; - if (!string_is_empty(ozone->thumbnail_system)) - free(ozone->thumbnail_system); - /* There is only one mame thumbnail repo */ - if (strncmp("MAME", s, 4) == 0) - strcpy(s, "MAME"); - ozone->thumbnail_system = strdup(s); + menu_thumbnail_set_system(ozone->thumbnail_path_data, s); } static void ozone_selection_changed(ozone_handle_t *ozone, bool allow_animation) { + menu_entry_t entry; + file_list_t *selection_buf = menu_entries_get_selection_buf_ptr(0); menu_animation_ctx_tag tag = (uintptr_t) selection_buf; + size_t selection = menu_navigation_get_selection(); size_t new_selection = menu_navigation_get_selection(); - ozone_node_t *node = (ozone_node_t*) file_list_get_userdata_at_offset(selection_buf, new_selection); + ozone_node_t *node = (ozone_node_t*) file_list_get_userdata_at_offset(selection_buf, new_selection); - const char *thumb_ident = ozone_thumbnails_ident('R'); - const char *left_thumb_ident = ozone_thumbnails_ident('L'); + menu_entry_init(&entry); if (!node) return; + menu_entry_get(&entry, 0, selection, NULL, true); + if (ozone->selection != new_selection) { - ozone->selection_old = ozone->selection; - ozone->selection = new_selection; + unsigned entry_type = menu_entry_get_type_new(&entry); + + ozone->selection_old = ozone->selection; + ozone->selection = new_selection; ozone->cursor_in_sidebar_old = ozone->cursor_in_sidebar; @@ -1412,80 +1328,46 @@ static void ozone_selection_changed(ozone_handle_t *ozone, bool allow_animation) ozone_update_scroll(ozone, allow_animation, node); /* Update thumbnail */ - ozone_node_t *node = (ozone_node_t*) - file_list_get_userdata_at_offset(selection_buf, ozone->selection); - - if (node) + if (menu_thumbnail_is_enabled(MENU_THUMBNAIL_RIGHT) || menu_thumbnail_is_enabled(MENU_THUMBNAIL_LEFT)) { - if (!string_is_equal(thumb_ident, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF)) || !string_is_equal(left_thumb_ident, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) + bool update_thumbnails = false; + + /* Playlist updates */ + if (ozone->is_playlist && ozone->depth == 1) { - menu_entry_t entry; - unsigned entry_type; - unsigned i = ozone->selection; - - menu_entry_init(&entry); - menu_entry_get(&entry, 0, (unsigned)i, NULL, true); - entry_type = menu_entry_get_type_new(&entry); - - if (ozone->is_playlist && ozone->depth == 1) - { - if (!string_is_empty(entry.path)) - ozone_set_thumbnail_content(ozone, entry.path, 0 /* will be ignored */); - if (!string_is_equal(thumb_ident, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) - { - ozone_update_thumbnail_path(ozone, i, 'R'); - ozone_update_thumbnail_image(ozone); - } - if (!string_is_equal(left_thumb_ident, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) - { - ozone_update_thumbnail_path(ozone, i, 'L'); - ozone_update_thumbnail_image(ozone); - } - } - else if (((entry_type == FILE_TYPE_IMAGE || entry_type == FILE_TYPE_IMAGEVIEWER || - entry_type == FILE_TYPE_RDB || entry_type == FILE_TYPE_RDB_ENTRY) - && ozone->tabs[ozone->categories_selection_ptr] <= OZONE_SYSTEM_TAB_SETTINGS)) - { - if (!string_is_empty(entry.path)) - ozone_set_thumbnail_content(ozone, entry.path, 0 /* will be ignored */); - if (!string_is_equal(thumb_ident, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) - { - ozone_update_thumbnail_path(ozone, i, 'R'); - ozone_update_thumbnail_image(ozone); - } - else if (!string_is_equal(left_thumb_ident, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) - { - ozone_update_thumbnail_path(ozone, i, 'L'); - ozone_update_thumbnail_image(ozone); - } - } - else if (filebrowser_get_type() != FILEBROWSER_NONE) - { - ozone_reset_thumbnail_content(ozone); - if (!string_is_equal(thumb_ident, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) - { - ozone_update_thumbnail_path(ozone, i, 'R'); - ozone_update_thumbnail_image(ozone); - } - else if (!string_is_equal(left_thumb_ident, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) - { - ozone_update_thumbnail_path(ozone, i, 'L'); - ozone_update_thumbnail_image(ozone); - } - } - menu_entry_free(&entry); + ozone_set_thumbnail_content( ozone, ""); + update_thumbnails = true; + } + /* Database list updates + * (pointless nuisance...) */ + else if (ozone->depth == 4 && ozone->is_db_manager_list) + { + ozone_set_thumbnail_content(ozone, ""); + update_thumbnails = true; + } + /* Filebrowser image updates */ + else if (entry_type == FILE_TYPE_IMAGEVIEWER || entry_type == FILE_TYPE_IMAGE) + { + ozone_set_thumbnail_content(ozone, "imageviewer"); + update_thumbnails = true; + } + + if (update_thumbnails) + { + if (menu_thumbnail_is_enabled(MENU_THUMBNAIL_RIGHT)) + ozone_update_thumbnail_path(ozone, 0 /* will be ignored */, 'R'); + + if (menu_thumbnail_is_enabled(MENU_THUMBNAIL_LEFT)) + ozone_update_thumbnail_path(ozone, 0 /* will be ignored */, 'L'); + + ozone_update_thumbnail_image(ozone); } - /* TODO: Update savestate thumbnail */ } + + /* TODO: update savestate thumbnail and path */ } + + menu_entry_free(&entry); } static void ozone_navigation_clear(void *data, bool pending_push) @@ -1807,6 +1689,7 @@ static void ozone_populate_entries(void *data, const char *path, const char *lab ozone_handle_t *ozone = (ozone_handle_t*) data; int new_depth; + bool animate; if (!ozone) return; @@ -1816,22 +1699,6 @@ static void ozone_populate_entries(void *data, const char *path, const char *lab if (menu_driver_ctl(RARCH_MENU_CTL_IS_PREVENT_POPULATE, NULL)) { menu_driver_ctl(RARCH_MENU_CTL_UNSET_PREVENT_POPULATE, NULL); - - /* Thumbnails */ - if (!string_is_equal(ozone_thumbnails_ident('R'), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) - { - ozone_update_thumbnail_path(ozone, 0, 'R'); - ozone_update_thumbnail_image(ozone); - } - /* TODO: update savestate thumbnail image */ - if (!string_is_equal(ozone_thumbnails_ident('L'), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) - { - ozone_update_thumbnail_path(ozone, 0, 'L'); - ozone_update_thumbnail_image(ozone); - } - ozone_selection_changed(ozone, false); return; } @@ -1840,47 +1707,33 @@ static void ozone_populate_entries(void *data, const char *path, const char *lab new_depth = (int)ozone_list_get_size(ozone, MENU_LIST_PLAIN); - ozone->fade_direction = new_depth <= ozone->depth; - ozone->depth = new_depth; - ozone->is_playlist = ozone_is_playlist(ozone, true); + animate = new_depth != ozone->depth; + ozone->fade_direction = new_depth <= ozone->depth; + ozone->depth = new_depth; + ozone->is_playlist = ozone_is_playlist(ozone, true); + ozone->is_db_manager_list = string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_DATABASE_MANAGER_LIST)); if (ozone->categories_selection_ptr == ozone->categories_active_idx_old) { - ozone_list_open(ozone); + if (animate) + ozone_list_open(ozone); } - else + + /* Thumbnails */ + if (menu_thumbnail_is_enabled(MENU_THUMBNAIL_RIGHT) || menu_thumbnail_is_enabled(MENU_THUMBNAIL_LEFT)) { - /* Thumbnails */ - if (!string_is_equal(ozone_thumbnails_ident('R'), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) + ozone_unload_thumbnail_textures(ozone); + + if (ozone->is_playlist) { - menu_entry_t entry; + ozone_set_thumbnail_content(ozone, ""); - menu_entry_init(&entry); - menu_entry_get(&entry, 0, ozone->selection, NULL, true); + if (menu_thumbnail_is_enabled(MENU_THUMBNAIL_RIGHT)) + ozone_update_thumbnail_path(ozone, 0 /* will be ignored */, 'R'); - if (!string_is_empty(entry.path)) - ozone_set_thumbnail_content(ozone, entry.path, 0 /* will be ignored */); + if (menu_thumbnail_is_enabled(MENU_THUMBNAIL_LEFT)) + ozone_update_thumbnail_path(ozone, 0 /* will be ignored */, 'L'); - menu_entry_free(&entry); - - ozone_update_thumbnail_path(ozone, 0, 'R'); - ozone_update_thumbnail_image(ozone); - } - if (!string_is_equal(ozone_thumbnails_ident('L'), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) - { - menu_entry_t entry; - - menu_entry_init(&entry); - menu_entry_get(&entry, 0, ozone->selection, NULL, true); - - if (!string_is_empty(entry.path)) - ozone_set_thumbnail_content(ozone, entry.path, 0 /* will be ignored */); - - menu_entry_free(&entry); - - ozone_update_thumbnail_path(ozone, 0, 'L'); ozone_update_thumbnail_image(ozone); } } @@ -2320,8 +2173,6 @@ static int ozone_pointer_tap(void *userdata, menu_file_list_cbs_t *cbs, menu_entry_t *entry, unsigned action) { - ozone_handle_t *ozone = (ozone_handle_t*) userdata; - size_t selection = menu_navigation_get_selection(); if (ptr == selection && cbs && cbs->action_select) return (unsigned)menu_entry_action(entry, (unsigned)selection, MENU_ACTION_SELECT); @@ -2337,7 +2188,8 @@ static bool ozone_load_image(void *userdata, void *data, enum menu_image_type ty ozone_handle_t *ozone = (ozone_handle_t*) userdata; unsigned sidebar_height; unsigned height; - unsigned maximum_height; + unsigned maximum_height, maximum_width; + float display_aspect_ratio; if (!ozone || !data) return false; @@ -2346,42 +2198,76 @@ static bool ozone_load_image(void *userdata, void *data, enum menu_image_type ty sidebar_height = height - ozone->dimensions.header_height - 55 - ozone->dimensions.footer_height; maximum_height = sidebar_height / 2; + maximum_width = ozone->dimensions.thumbnail_bar_width - ozone->dimensions.sidebar_entry_icon_padding * 2; + if (maximum_height > 0) + display_aspect_ratio = (float)maximum_width / (float)maximum_height; + else + display_aspect_ratio = 0.0f; switch (type) { case MENU_IMAGE_THUMBNAIL: { - struct texture_image *img = (struct texture_image*)data; - ozone->dimensions.thumbnail_height = ozone->dimensions.thumbnail_width - * (float)img->height / (float)img->width; + struct texture_image *img = (struct texture_image*)data; - if (ozone->dimensions.thumbnail_height > maximum_height) + if (img->width > 0 && img->height > 0 && display_aspect_ratio > 0.0001f) { - float scale_down = (float) maximum_height / (float) ozone->dimensions.thumbnail_height; - ozone->dimensions.thumbnail_height *= scale_down; - ozone->dimensions.thumbnail_width *= scale_down; + float thumb_aspect_ratio = (float)img->width / (float)img->height; + + if (thumb_aspect_ratio > display_aspect_ratio) + { + ozone->dimensions.thumbnail_width = (float)maximum_width; + ozone->dimensions.thumbnail_height = (float)img->height * (float)maximum_width / (float)img->width; + } + else + { + ozone->dimensions.thumbnail_height = (float)maximum_height; + ozone->dimensions.thumbnail_width = (float)img->width * (float)maximum_height / (float)img->height; + } + + video_driver_texture_unload(&ozone->thumbnail); + video_driver_texture_load(data, + TEXTURE_FILTER_MIPMAP_LINEAR, &ozone->thumbnail); + } + else + { + ozone->dimensions.thumbnail_width = 0.0f; + ozone->dimensions.thumbnail_height = 0.0f; + video_driver_texture_unload(&ozone->thumbnail); } - video_driver_texture_unload(&ozone->thumbnail); - video_driver_texture_load(data, - TEXTURE_FILTER_MIPMAP_LINEAR, &ozone->thumbnail); break; } case MENU_IMAGE_LEFT_THUMBNAIL: { - struct texture_image *img = (struct texture_image*)data; - ozone->dimensions.left_thumbnail_height = ozone->dimensions.left_thumbnail_width - * (float)img->height / (float)img->width; + struct texture_image *img = (struct texture_image*)data; - if (ozone->dimensions.left_thumbnail_height > maximum_height) + if (img->width > 0 && img->height > 0 && display_aspect_ratio > 0.0001f) { - float scale_down = (float) maximum_height / (float) ozone->dimensions.left_thumbnail_height; - ozone->dimensions.left_thumbnail_height *= scale_down; - ozone->dimensions.left_thumbnail_width *= scale_down; + float thumb_aspect_ratio = (float)img->width / (float)img->height; + + if (thumb_aspect_ratio > display_aspect_ratio) + { + ozone->dimensions.left_thumbnail_width = (float)maximum_width; + ozone->dimensions.left_thumbnail_height = (float)img->height * (float)maximum_width / (float)img->width; + } + else + { + ozone->dimensions.left_thumbnail_height = (float)maximum_height; + ozone->dimensions.left_thumbnail_width = (float)img->width * (float)maximum_height / (float)img->height; + } + + video_driver_texture_unload(&ozone->left_thumbnail); + video_driver_texture_load(data, + TEXTURE_FILTER_MIPMAP_LINEAR, &ozone->left_thumbnail); } - video_driver_texture_unload(&ozone->left_thumbnail); - video_driver_texture_load(data, - TEXTURE_FILTER_MIPMAP_LINEAR, &ozone->left_thumbnail); + else + { + ozone->dimensions.left_thumbnail_width = 0.0f; + ozone->dimensions.left_thumbnail_height = 0.0f; + video_driver_texture_unload(&ozone->left_thumbnail); + } + break; } default: @@ -2404,8 +2290,8 @@ menu_ctx_driver_t menu_ctx_ozone = { ozone_populate_entries, ozone_toggle, ozone_navigation_clear, - ozone_navigation_pointer_changed, - ozone_navigation_pointer_changed, + NULL, + NULL, ozone_navigation_set, ozone_navigation_pointer_changed, ozone_navigation_alphabet, diff --git a/menu/drivers/ozone/ozone.h b/menu/drivers/ozone/ozone.h index 0f931e9857..3448669d9b 100644 --- a/menu/drivers/ozone/ozone.h +++ b/menu/drivers/ozone/ozone.h @@ -24,7 +24,9 @@ typedef struct ozone_handle ozone_handle_t; #include +#include "../../menu_thumbnail_path.h" #include "../../menu_driver.h" + #include "../../../retroarch.h" #define ANIMATION_PUSH_ENTRY_DURATION 166 @@ -229,18 +231,18 @@ struct ozone_handle /* Thumbnails data */ bool show_thumbnail_bar; - char *thumbnail_content; - char *thumbnail_system; - char *thumbnail_file_path; - char *left_thumbnail_file_path; /* name taken from xmb for consistency but not actually on the left */ - uintptr_t thumbnail; uintptr_t left_thumbnail; + menu_thumbnail_path_data_t *thumbnail_path_data; + char selection_core_name[255]; - char selection_playtime[64]; - char selection_lastplayed[64]; + char selection_playtime[255]; + char selection_lastplayed[255]; unsigned selection_core_name_lines; + bool selection_core_is_viewer; + + bool is_db_manager_list; }; /* If you change this struct, also @@ -307,8 +309,8 @@ void ozone_entries_update_thumbnail_bar(ozone_handle_t *ozone, bool is_playlist, void ozone_draw_thumbnail_bar(ozone_handle_t *ozone, video_frame_info_t *video_info); -const char *ozone_thumbnails_ident(char pos); - unsigned ozone_count_lines(const char *str); +void ozone_update_content_metadata(ozone_handle_t *ozone); + #endif diff --git a/menu/drivers/ozone/ozone_entries.c b/menu/drivers/ozone/ozone_entries.c index c4a79eb4c8..d908ffa48b 100644 --- a/menu/drivers/ozone/ozone_entries.c +++ b/menu/drivers/ozone/ozone_entries.c @@ -138,7 +138,13 @@ void ozone_update_scroll(ozone_handle_t *ozone, bool allow_animation, ozone_node video_driver_get_size(NULL, &video_info_height); - current_selection_middle_onscreen = ozone->dimensions.header_height + ozone->dimensions.entry_padding_vertical + ozone->animations.scroll_y + node->position_y + node->height / 2; + current_selection_middle_onscreen = + ozone->dimensions.header_height + + ozone->dimensions.entry_padding_vertical + + ozone->animations.scroll_y + + node->position_y + + node->height / 2; + bottom_boundary = video_info_height - ozone->dimensions.header_height - 1 - ozone->dimensions.footer_height; entries_middle = video_info_height/2; @@ -435,7 +441,8 @@ void ozone_draw_entries(ozone_handle_t *ozone, video_frame_info_t *video_info, } border_iterate: - y += node->height; + if (node) + y += node->height; } /* Cursor(s) layer - current */ @@ -639,12 +646,12 @@ static void ozone_draw_no_thumbnail_available(ozone_handle_t *ozone, } static void ozone_content_metadata_line(video_frame_info_t *video_info, ozone_handle_t *ozone, - unsigned *y, unsigned title_column_x, unsigned data_column_x, - const char *title, const char *data, unsigned lines_count) + unsigned *y, unsigned column_x, + const char *text, unsigned lines_count) { ozone_draw_text(video_info, ozone, - title, - title_column_x, + text, + column_x, *y + FONT_SIZE_FOOTER, TEXT_ALIGN_LEFT, video_info->width, video_info->height, @@ -653,20 +660,6 @@ static void ozone_content_metadata_line(video_frame_info_t *video_info, ozone_ha true ); - if (font_driver_get_message_width(ozone->fonts.footer, data, strlen(data), 1) > ozone->dimensions.thumbnail_bar_width / 2) - *y += font_driver_get_line_height(ozone->fonts.footer, 1); - - ozone_draw_text(video_info, ozone, - data, - data_column_x, - *y + FONT_SIZE_FOOTER, - TEXT_ALIGN_RIGHT, - video_info->width, video_info->height, - ozone->fonts.footer, - ozone->theme->text_rgba, - true - ); - *y += (font_driver_get_line_height(ozone->fonts.footer, 1) * 1.5) * lines_count; } @@ -690,11 +683,9 @@ void ozone_draw_thumbnail_bar(ozone_handle_t *ozone, video_frame_info_t *video_i /* Thumbnails */ thumbnail = ozone->thumbnail && - !string_is_equal(ozone_thumbnails_ident('R'), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF)); + menu_thumbnail_is_enabled(MENU_THUMBNAIL_RIGHT); left_thumbnail = ozone->left_thumbnail && - !string_is_equal(ozone_thumbnails_ident('L'), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF)); + menu_thumbnail_is_enabled(MENU_THUMBNAIL_LEFT); /* If user requested "left" thumbnail instead of content metadata * and no thumbnails are available, show a centered message and @@ -708,7 +699,7 @@ void ozone_draw_thumbnail_bar(ozone_handle_t *ozone, video_frame_info_t *video_i /* Top row : thumbnail or no thumbnail available message */ if (thumbnail) { - unsigned thumb_x_position = x_position + sidebar_width/2 - (ozone->dimensions.thumbnail_width + ozone->dimensions.sidebar_entry_icon_padding) / 2; + unsigned thumb_x_position = x_position + sidebar_width/2 - ozone->dimensions.thumbnail_width / 2; unsigned thumb_y_position = video_info->height / 2 - ozone->dimensions.thumbnail_height / 2; if (!string_is_equal(ozone->selection_core_name, "imageviewer")) @@ -739,7 +730,7 @@ void ozone_draw_thumbnail_bar(ozone_handle_t *ozone, video_frame_info_t *video_i /* Bottom row : "left" thumbnail or content metadata */ if (thumbnail && left_thumbnail) { - unsigned thumb_x_position = x_position + sidebar_width/2 - (ozone->dimensions.left_thumbnail_width + ozone->dimensions.sidebar_entry_icon_padding) / 2; + unsigned thumb_x_position = x_position + sidebar_width/2 - ozone->dimensions.left_thumbnail_width / 2; unsigned thumb_y_position = video_info->height / 2 + ozone->dimensions.sidebar_entry_icon_padding / 2; ozone_draw_icon(video_info, @@ -753,13 +744,12 @@ void ozone_draw_thumbnail_bar(ozone_handle_t *ozone, video_frame_info_t *video_i ozone_pure_white ); } - else if (!string_is_equal(ozone->selection_core_name, "imageviewer")) + else if (!ozone->selection_core_is_viewer) { unsigned y = video_info->height / 2 + ozone->dimensions.sidebar_entry_icon_padding / 2; unsigned content_metadata_padding = ozone->dimensions.sidebar_entry_icon_padding*3; unsigned separator_padding = ozone->dimensions.sidebar_entry_icon_padding*2; - unsigned title_column_x = x_position + content_metadata_padding; - unsigned data_column_x = x_position + sidebar_width - content_metadata_padding; + unsigned column_x = x_position + content_metadata_padding; /* Content metadata */ y += 10; @@ -775,26 +765,23 @@ void ozone_draw_thumbnail_bar(ozone_handle_t *ozone, video_frame_info_t *video_i /* Core association */ ozone_content_metadata_line(video_info, ozone, - &y, title_column_x, data_column_x, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLIST_SUBLABEL_CORE), + &y, column_x, ozone->selection_core_name, ozone->selection_core_name_lines ); /* Playtime */ ozone_content_metadata_line(video_info, ozone, - &y, title_column_x, data_column_x, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLIST_SUBLABEL_RUNTIME), + &y, column_x, ozone->selection_playtime, 1 ); /* Last played */ ozone_content_metadata_line(video_info, ozone, - &y, title_column_x, data_column_x, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLIST_SUBLABEL_LAST_PLAYED), + &y, column_x, ozone->selection_lastplayed, - 1 + 2 ); } } diff --git a/menu/drivers/ozone/ozone_sidebar.c b/menu/drivers/ozone/ozone_sidebar.c index b3309681c9..44ebf68223 100644 --- a/menu/drivers/ozone/ozone_sidebar.c +++ b/menu/drivers/ozone/ozone_sidebar.c @@ -116,15 +116,13 @@ void ozone_draw_sidebar(ozone_handle_t *ozone, video_frame_info_t *video_info) uint32_t text_alpha = ozone->animations.sidebar_text_alpha * 255.0f; /* Initial ticker configuration */ - ticker.type_enum = (enum menu_animation_ticker_type)settings->uints.menu_ticker_type; - ticker.spacer = ticker_spacer; + ticker.type_enum = (enum menu_animation_ticker_type)settings->uints.menu_ticker_type; + ticker.spacer = ticker_spacer; selection_y = 0; selection_old_y = 0; horizontal_list_size = 0; - entry_width = 0; - if (!ozone->draw_sidebar) return; @@ -150,14 +148,14 @@ void ozone_draw_sidebar(ozone_handle_t *ozone, video_frame_info_t *video_info) { if (i == ozone->categories_selection_ptr) { - selection_y = y; + selection_y = (unsigned)y; if (ozone->categories_selection_ptr > ozone->system_tab_end) selection_y += ozone->dimensions.sidebar_entry_padding_vertical + 1; } if (i == ozone->categories_active_idx_old) { - selection_old_y = y; + selection_old_y = (unsigned)y; if (ozone->categories_active_idx_old > ozone->system_tab_end) selection_old_y += ozone->dimensions.sidebar_entry_padding_vertical + 1; } @@ -292,6 +290,8 @@ void ozone_leave_sidebar(ozone_handle_t *ozone, uintptr_t tag) if (ozone->empty_playlist) return; + ozone_update_content_metadata(ozone); + ozone->categories_active_idx_old = ozone->categories_selection_ptr; ozone->cursor_in_sidebar_old = ozone->cursor_in_sidebar; ozone->cursor_in_sidebar = false; @@ -530,11 +530,11 @@ void ozone_init_horizontal_list(ozone_handle_t *ozone) info.path = strdup( settings->paths.directory_playlist); info.label = strdup( - msg_hash_to_str(MENU_ENUM_LABEL_CONTENT_COLLECTION_LIST)); + msg_hash_to_str(MENU_ENUM_LABEL_PLAYLISTS_TAB)); info.exts = strdup( file_path_str(FILE_PATH_LPL_EXTENSION_NO_DOT)); info.type_default = FILE_TYPE_PLAIN; - info.enum_idx = MENU_ENUM_LABEL_CONTENT_COLLECTION_LIST; + info.enum_idx = MENU_ENUM_LABEL_PLAYLISTS_TAB; if (settings->bools.menu_content_show_playlists && !string_is_empty(info.path)) { diff --git a/menu/drivers/ozone/ozone_texture.c b/menu/drivers/ozone/ozone_texture.c index 529ae51301..1aa3d39533 100644 --- a/menu/drivers/ozone/ozone_texture.c +++ b/menu/drivers/ozone/ozone_texture.c @@ -81,7 +81,7 @@ menu_texture_item ozone_entries_icon_get_texture(ozone_handle_t *ozone, return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_RDB]; /* Menu collection submenus*/ - case MENU_ENUM_LABEL_CONTENT_COLLECTION_LIST: + case MENU_ENUM_LABEL_PLAYLISTS_TAB: return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_ZIP]; case MENU_ENUM_LABEL_GOTO_FAVORITES: return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_FAVORITE]; diff --git a/menu/drivers/ozone/ozone_texture.h b/menu/drivers/ozone/ozone_texture.h index 237c8e25a9..1c5e832c76 100644 --- a/menu/drivers/ozone/ozone_texture.h +++ b/menu/drivers/ozone/ozone_texture.h @@ -40,11 +40,7 @@ static const char *OZONE_TEXTURES_FILES[OZONE_TEXTURE_LAST] = { }; enum OZONE_THEME_TEXTURES { - OZONE_THEME_TEXTURE_BUTTON_A = 0, - OZONE_THEME_TEXTURE_BUTTON_B, - OZONE_THEME_TEXTURE_BUTTON_X, - OZONE_THEME_TEXTURE_BUTTON_Y, - OZONE_THEME_TEXTURE_SWITCH, + OZONE_THEME_TEXTURE_SWITCH = 0, OZONE_THEME_TEXTURE_CHECK, OZONE_THEME_TEXTURE_CURSOR_NO_BORDER, @@ -54,10 +50,6 @@ enum OZONE_THEME_TEXTURES { }; static const char *OZONE_THEME_TEXTURES_FILES[OZONE_THEME_TEXTURE_LAST] = { - "button_a", - "button_b", - "button_x", - "button_y", "switch", "check", diff --git a/menu/drivers/rgui.c b/menu/drivers/rgui.c index b25dfc9bd8..3ec24529e7 100644 --- a/menu/drivers/rgui.c +++ b/menu/drivers/rgui.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -46,6 +47,7 @@ #include "../menu_animation.h" #include "../widgets/menu_input_dialog.h" +#include "../widgets/menu_osk.h" #include "../../configuration.h" #include "../../gfx/drivers_font_renderer/bitmap.h" @@ -53,19 +55,42 @@ #include /* Thumbnail additions */ +#include "../menu_thumbnail_path.h" #include #include "../../tasks/tasks_internal.h" #include +#include -#define RGUI_TERM_START_X(width) (width / 21) -#define RGUI_TERM_START_Y(height) (height / 9) -#define RGUI_TERM_WIDTH(width) (((width - RGUI_TERM_START_X(width) - RGUI_TERM_START_X(width)) / (FONT_WIDTH_STRIDE))) -#define RGUI_TERM_HEIGHT(width, height) (((height - RGUI_TERM_START_Y(height) - RGUI_TERM_START_X(width)) / (FONT_HEIGHT_STRIDE)) - 1) +#if defined(GEKKO) +#define RGUI_TERM_START_X(fb_width) (fb_width / 21) +#define RGUI_TERM_START_Y(fb_height) (fb_height / 9) +#define RGUI_TERM_WIDTH(fb_width) (((fb_width - RGUI_TERM_START_X(fb_width) - RGUI_TERM_START_X(fb_width)) / (FONT_WIDTH_STRIDE))) +#define RGUI_TERM_HEIGHT(fb_height) (((fb_height - RGUI_TERM_START_Y(fb_height) - RGUI_TERM_START_Y(fb_height)) / (FONT_HEIGHT_STRIDE))) +#else +#define RGUI_TERM_START_X(fb_width) rgui_term_layout.start_x +#define RGUI_TERM_START_Y(fb_height) rgui_term_layout.start_y +#define RGUI_TERM_WIDTH(fb_width) rgui_term_layout.width +#define RGUI_TERM_HEIGHT(fb_height) rgui_term_layout.height +#endif #define RGUI_ENTRY_VALUE_MAXLEN 19 #define RGUI_TICKER_SPACER " | " +#define NUM_FONT_GLYPHS_REGULAR 128 +#define NUM_FONT_GLYPHS_EXTENDED 256 + +typedef struct +{ + unsigned start_x; + unsigned start_y; + unsigned width; + unsigned height; + unsigned value_maxlen; +} rgui_term_layout_t; + +static rgui_term_layout_t rgui_term_layout = {0}; + typedef struct { uint32_t hover_color; @@ -75,6 +100,7 @@ typedef struct uint32_t bg_light_color; uint32_t border_dark_color; uint32_t border_light_color; + uint32_t shadow_color; } rgui_theme_t; static const rgui_theme_t rgui_theme_classic_red = { @@ -84,7 +110,8 @@ static const rgui_theme_t rgui_theme_classic_red = { 0xC0202020, /* bg_dark_color */ 0xC0404040, /* bg_light_color */ 0xC08C0000, /* border_dark_color */ - 0xC0CC0E03 /* border_light_color */ + 0xC0CC0E03, /* border_light_color */ + 0xC0000000 /* shadow_color */ }; static const rgui_theme_t rgui_theme_classic_orange = { @@ -94,7 +121,8 @@ static const rgui_theme_t rgui_theme_classic_orange = { 0xC0202020, /* bg_dark_color */ 0xC0404040, /* bg_light_color */ 0xC0962800, /* border_dark_color */ - 0xC0E46C03 /* border_light_color */ + 0xC0E46C03, /* border_light_color */ + 0xC0000000 /* shadow_color */ }; static const rgui_theme_t rgui_theme_classic_yellow = { @@ -104,7 +132,8 @@ static const rgui_theme_t rgui_theme_classic_yellow = { 0xC0202020, /* bg_dark_color */ 0xC0404040, /* bg_light_color */ 0xC0AC7800, /* border_dark_color */ - 0xC0F3C60D /* border_light_color */ + 0xC0F3C60D, /* border_light_color */ + 0xC0000000 /* shadow_color */ }; static const rgui_theme_t rgui_theme_classic_green = { @@ -114,7 +143,8 @@ static const rgui_theme_t rgui_theme_classic_green = { 0xC0202020, /* bg_dark_color */ 0xC0404040, /* bg_light_color */ 0xC0204020, /* border_dark_color */ - 0xC0408040 /* border_light_color */ + 0xC0408040, /* border_light_color */ + 0xC0000000 /* shadow_color */ }; static const rgui_theme_t rgui_theme_classic_blue = { @@ -124,7 +154,8 @@ static const rgui_theme_t rgui_theme_classic_blue = { 0xC0202020, /* bg_dark_color */ 0xC0404040, /* bg_light_color */ 0xC0005BA6, /* border_dark_color */ - 0xC02E94E2 /* border_light_color */ + 0xC02E94E2, /* border_light_color */ + 0xC0000000 /* shadow_color */ }; static const rgui_theme_t rgui_theme_classic_violet = { @@ -134,7 +165,8 @@ static const rgui_theme_t rgui_theme_classic_violet = { 0xC0202020, /* bg_dark_color */ 0xC0404040, /* bg_light_color */ 0xC04C0A60, /* border_dark_color */ - 0xC0842DCE /* border_light_color */ + 0xC0842DCE, /* border_light_color */ + 0xC0000000 /* shadow_color */ }; static const rgui_theme_t rgui_theme_classic_grey = { @@ -144,7 +176,8 @@ static const rgui_theme_t rgui_theme_classic_grey = { 0xC0202020, /* bg_dark_color */ 0xC0404040, /* bg_light_color */ 0xC0505050, /* border_dark_color */ - 0xC0798A99 /* border_light_color */ + 0xC0798A99, /* border_light_color */ + 0xC0000000 /* shadow_color */ }; static const rgui_theme_t rgui_theme_legacy_red = { @@ -154,7 +187,8 @@ static const rgui_theme_t rgui_theme_legacy_red = { 0xC09E4137, /* bg_dark_color */ 0xC0B34B41, /* bg_light_color */ 0xC0BF5E58, /* border_dark_color */ - 0xC0F27A6F /* border_light_color */ + 0xC0F27A6F, /* border_light_color */ + 0xC01F0C0A /* shadow_color */ }; static const rgui_theme_t rgui_theme_dark_purple = { @@ -164,7 +198,8 @@ static const rgui_theme_t rgui_theme_dark_purple = { 0xC0562D56, /* bg_dark_color */ 0xC0663A66, /* bg_light_color */ 0xC0885783, /* border_dark_color */ - 0xC0A675A1 /* border_light_color */ + 0xC0A675A1, /* border_light_color */ + 0xC0140A14 /* shadow_color */ }; static const rgui_theme_t rgui_theme_midnight_blue = { @@ -174,7 +209,8 @@ static const rgui_theme_t rgui_theme_midnight_blue = { 0xC024374A, /* bg_dark_color */ 0xC03C4D5E, /* bg_light_color */ 0xC046586A, /* border_dark_color */ - 0xC06D7F91 /* border_light_color */ + 0xC06D7F91, /* border_light_color */ + 0xC00A0F14 /* shadow_color */ }; static const rgui_theme_t rgui_theme_golden = { @@ -184,7 +220,8 @@ static const rgui_theme_t rgui_theme_golden = { 0xC0B88D0B, /* bg_dark_color */ 0xC0BF962B, /* bg_light_color */ 0xC0e1ad21, /* border_dark_color */ - 0xC0FCC717 /* border_light_color */ + 0xC0FCC717, /* border_light_color */ + 0xC0382B03 /* shadow_color */ }; static const rgui_theme_t rgui_theme_electric_blue = { @@ -194,7 +231,8 @@ static const rgui_theme_t rgui_theme_electric_blue = { 0xC02E69C6, /* bg_dark_color */ 0xC0007FFF, /* bg_light_color */ 0xC034A5D8, /* border_dark_color */ - 0xC070C9FF /* border_light_color */ + 0xC070C9FF, /* border_light_color */ + 0xC012294D /* shadow_color */ }; static const rgui_theme_t rgui_theme_apple_green = { @@ -204,7 +242,8 @@ static const rgui_theme_t rgui_theme_apple_green = { 0xC04F7942, /* bg_dark_color */ 0xC0688539, /* bg_light_color */ 0xC0608E3A, /* border_dark_color */ - 0xC09AB973 /* border_light_color */ + 0xC09AB973, /* border_light_color */ + 0xC01F2E19 /* shadow_color */ }; static const rgui_theme_t rgui_theme_volcanic_red = { @@ -214,7 +253,8 @@ static const rgui_theme_t rgui_theme_volcanic_red = { 0xC0922724, /* bg_dark_color */ 0xC0BD0F1E, /* bg_light_color */ 0xC0CE2029, /* border_dark_color */ - 0xC0FF0000 /* border_light_color */ + 0xC0FF0000, /* border_light_color */ + 0xC0330D0D /* shadow_color */ }; static const rgui_theme_t rgui_theme_lagoon = { @@ -224,7 +264,8 @@ static const rgui_theme_t rgui_theme_lagoon = { 0xC0495C6B, /* bg_dark_color */ 0xC0526778, /* bg_light_color */ 0xC058848F, /* border_dark_color */ - 0xC060909C /* border_light_color */ + 0xC060909C, /* border_light_color */ + 0xC01C2329 /* shadow_color */ }; static const rgui_theme_t rgui_theme_brogrammer = { @@ -234,7 +275,8 @@ static const rgui_theme_t rgui_theme_brogrammer = { 0xC0242424, /* bg_dark_color */ 0xC0242424, /* bg_light_color */ 0xC0E74C3C, /* border_dark_color */ - 0xC0E74C3C /* border_light_color */ + 0xC0E74C3C, /* border_light_color */ + 0xC0000000 /* shadow_color */ }; static const rgui_theme_t rgui_theme_dracula = { @@ -244,7 +286,8 @@ static const rgui_theme_t rgui_theme_dracula = { 0xC02F3240, /* bg_dark_color */ 0xC02F3240, /* bg_light_color */ 0xC06272A4, /* border_dark_color */ - 0xC06272A4 /* border_light_color */ + 0xC06272A4, /* border_light_color */ + 0xC00F0F0F /* shadow_color */ }; static const rgui_theme_t rgui_theme_fairyfloss = { @@ -254,7 +297,8 @@ static const rgui_theme_t rgui_theme_fairyfloss = { 0xC0675F87, /* bg_dark_color */ 0xC0675F87, /* bg_light_color */ 0xC08077A8, /* border_dark_color */ - 0xC08077A8 /* border_light_color */ + 0xC08077A8, /* border_light_color */ + 0xC0262433 /* shadow_color */ }; static const rgui_theme_t rgui_theme_flatui = { @@ -264,7 +308,8 @@ static const rgui_theme_t rgui_theme_flatui = { 0xE0ECF0F1, /* bg_dark_color */ 0xE0ECF0F1, /* bg_light_color */ 0xE095A5A6, /* border_dark_color */ - 0xE095A5A6 /* border_light_color */ + 0xE095A5A6, /* border_light_color */ + 0xE0C3DBDE /* shadow_color */ }; static const rgui_theme_t rgui_theme_gruvbox_dark = { @@ -274,7 +319,8 @@ static const rgui_theme_t rgui_theme_gruvbox_dark = { 0xC03D3D3D, /* bg_dark_color */ 0xC03D3D3D, /* bg_light_color */ 0xC099897A, /* border_dark_color */ - 0xC099897A /* border_light_color */ + 0xC099897A, /* border_light_color */ + 0xC0000000 /* shadow_color */ }; static const rgui_theme_t rgui_theme_gruvbox_light = { @@ -284,7 +330,8 @@ static const rgui_theme_t rgui_theme_gruvbox_light = { 0xE0FBEBC7, /* bg_dark_color */ 0xE0FBEBC7, /* bg_light_color */ 0xE0928374, /* border_dark_color */ - 0xE0928374 /* border_light_color */ + 0xE0928374, /* border_light_color */ + 0xE0D5C4A1 /* shadow_color */ }; static const rgui_theme_t rgui_theme_hacking_the_kernel = { @@ -294,7 +341,8 @@ static const rgui_theme_t rgui_theme_hacking_the_kernel = { 0xC0000000, /* bg_dark_color */ 0xC0000000, /* bg_light_color */ 0xC0036303, /* border_dark_color */ - 0xC0036303 /* border_light_color */ + 0xC0036303, /* border_light_color */ + 0xC0154D2B /* shadow_color */ }; static const rgui_theme_t rgui_theme_nord = { @@ -304,7 +352,8 @@ static const rgui_theme_t rgui_theme_nord = { 0xC0363C4F, /* bg_dark_color */ 0xC0363C4F, /* bg_light_color */ 0xC04E596E, /* border_dark_color */ - 0xC04E596E /* border_light_color */ + 0xC04E596E, /* border_light_color */ + 0xC0040505 /* shadow_color */ }; static const rgui_theme_t rgui_theme_nova = { @@ -314,7 +363,8 @@ static const rgui_theme_t rgui_theme_nova = { 0xC0485B66, /* bg_dark_color */ 0xC0485B66, /* bg_light_color */ 0xC0627985, /* border_dark_color */ - 0xC0627985 /* border_light_color */ + 0xC0627985, /* border_light_color */ + 0xC01E272C /* shadow_color */ }; static const rgui_theme_t rgui_theme_one_dark = { @@ -324,7 +374,8 @@ static const rgui_theme_t rgui_theme_one_dark = { 0xC02D323B, /* bg_dark_color */ 0xC02D323B, /* bg_light_color */ 0xC0495162, /* border_dark_color */ - 0xC0495162 /* border_light_color */ + 0xC0495162, /* border_light_color */ + 0xC007080A /* shadow_color */ }; static const rgui_theme_t rgui_theme_palenight = { @@ -334,7 +385,8 @@ static const rgui_theme_t rgui_theme_palenight = { 0xC02F3347, /* bg_dark_color */ 0xC02F3347, /* bg_light_color */ 0xC0697098, /* border_dark_color */ - 0xC0697098 /* border_light_color */ + 0xC0697098, /* border_light_color */ + 0xC00D0E14 /* shadow_color */ }; static const rgui_theme_t rgui_theme_solarized_dark = { @@ -344,7 +396,8 @@ static const rgui_theme_t rgui_theme_solarized_dark = { 0xC0003542, /* bg_dark_color */ 0xC0003542, /* bg_light_color */ 0xC093A1A1, /* border_dark_color */ - 0xC093A1A1 /* border_light_color */ + 0xC093A1A1, /* border_light_color */ + 0xC000141A /* shadow_color */ }; static const rgui_theme_t rgui_theme_solarized_light = { @@ -354,7 +407,8 @@ static const rgui_theme_t rgui_theme_solarized_light = { 0xE0FDEDDF, /* bg_dark_color */ 0xE0FDEDDF, /* bg_light_color */ 0xE093A1A1, /* border_dark_color */ - 0xE093A1A1 /* border_light_color */ + 0xE093A1A1, /* border_light_color */ + 0xE0E0DBC9 /* shadow_color */ }; static const rgui_theme_t rgui_theme_tango_dark = { @@ -364,7 +418,8 @@ static const rgui_theme_t rgui_theme_tango_dark = { 0xC0384042, /* bg_dark_color */ 0xC0384042, /* bg_light_color */ 0xC06A767A, /* border_dark_color */ - 0xC06A767A /* border_light_color */ + 0xC06A767A, /* border_light_color */ + 0xC01A1A1A /* shadow_color */ }; static const rgui_theme_t rgui_theme_tango_light = { @@ -374,7 +429,8 @@ static const rgui_theme_t rgui_theme_tango_light = { 0xE0EEEEEC, /* bg_dark_color */ 0xE0EEEEEC, /* bg_light_color */ 0xE0C7C7C7, /* border_dark_color */ - 0xE0C7C7C7 /* border_light_color */ + 0xE0C7C7C7, /* border_light_color */ + 0xE0D3D7CF /* shadow_color */ }; static const rgui_theme_t rgui_theme_zenburn = { @@ -384,7 +440,8 @@ static const rgui_theme_t rgui_theme_zenburn = { 0xC04F4F4F, /* bg_dark_color */ 0xC04F4F4F, /* bg_light_color */ 0xC0636363, /* border_dark_color */ - 0xC0636363 /* border_light_color */ + 0xC0636363, /* border_light_color */ + 0xC01F1F1F /* shadow_color */ }; static const rgui_theme_t rgui_theme_anti_zenburn = { @@ -394,7 +451,8 @@ static const rgui_theme_t rgui_theme_anti_zenburn = { 0xE0C0C0C0, /* bg_dark_color */ 0xE0C0C0C0, /* bg_light_color */ 0xE0A0A0A0, /* border_dark_color */ - 0xE0A0A0A0 /* border_light_color */ + 0xE0A0A0A0, /* border_light_color */ + 0xE0B0B0B0 /* shadow_color */ }; typedef struct @@ -406,8 +464,15 @@ typedef struct uint16_t bg_light_color; uint16_t border_dark_color; uint16_t border_light_color; + uint16_t shadow_color; } rgui_colors_t; +typedef struct +{ + unsigned aspect_ratio_idx; + video_viewport_t viewport; +} rgui_video_settings_t; + typedef struct { bool bg_modified; @@ -417,61 +482,173 @@ typedef struct unsigned last_height; bool bg_thickness; bool border_thickness; + bool border_enable; + bool shadow_enable; + bool extended_ascii_enable; float scroll_y; char *msgbox; unsigned color_theme; rgui_colors_t colors; bool is_playlist; bool entry_has_thumbnail; - bool show_thumbnail; - char *thumbnail_system; - char *thumbnail_content; - char *thumbnail_path; + bool entry_has_left_thumbnail; + bool show_fs_thumbnail; + menu_thumbnail_path_data_t *thumbnail_path_data; uint32_t thumbnail_queue_size; + uint32_t left_thumbnail_queue_size; + bool thumbnail_load_pending; + retro_time_t thumbnail_load_trigger_time; bool show_wallpaper; char theme_preset_path[PATH_MAX_LENGTH]; /* Must be a fixed length array... */ char menu_title[255]; /* Must be a fixed length array... */ char menu_sublabel[255]; /* Must be a fixed length array... */ - unsigned content_aspect_ratio; + unsigned menu_aspect_ratio; + unsigned menu_aspect_ratio_lock; + bool aspect_update_pending; + rgui_video_settings_t menu_video_settings; + rgui_video_settings_t content_video_settings; +#if defined(HAVE_MENU_WIDGETS) + bool widgets_supported; +#endif struct scaler_ctx image_scaler; } rgui_t; -#define THUMB_MAX_WIDTH 320 -#define THUMB_MAX_HEIGHT 240 +static unsigned mini_thumbnail_max_width = 0; +static unsigned mini_thumbnail_max_height = 0; + +static bool font_lut[NUM_FONT_GLYPHS_EXTENDED][FONT_WIDTH * FONT_HEIGHT]; + +/* ============================== + * Custom Symbols (glyphs) START + * ============================== */ + +enum rgui_symbol_type +{ + RGUI_SYMBOL_BACKSPACE = 0, + RGUI_SYMBOL_ENTER, + RGUI_SYMBOL_SHIFT_UP, + RGUI_SYMBOL_SHIFT_DOWN, + RGUI_SYMBOL_NEXT, + RGUI_SYMBOL_TEXT_CURSOR +}; + +/* All custom symbols must have dimensions + * of exactly FONT_WIDTH * FONT_HEIGHT */ +static const uint8_t rgui_symbol_data_backspace[FONT_WIDTH * FONT_HEIGHT] = { + 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, + 0, 1, 0, 0, 0, + 1, 1, 1, 1, 1, + 0, 1, 0, 0, 0, + 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, /* Baseline */ + 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0}; + +static const uint8_t rgui_symbol_data_enter[FONT_WIDTH * FONT_HEIGHT] = { + 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, + 0, 0, 0, 0, 1, + 0, 0, 0, 0, 1, + 0, 0, 1, 0, 1, + 0, 1, 0, 0, 1, + 1, 1, 1, 1, 1, + 0, 1, 0, 0, 0, /* Baseline */ + 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0}; + +static const uint8_t rgui_symbol_data_shift_up[FONT_WIDTH * FONT_HEIGHT] = { + 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, + 0, 1, 1, 1, 0, + 1, 1, 0, 1, 1, + 0, 1, 0, 1, 0, + 0, 1, 0, 1, 0, + 0, 1, 0, 1, 0, + 0, 1, 1, 1, 0, /* Baseline */ + 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0}; + +static const uint8_t rgui_symbol_data_shift_down[FONT_WIDTH * FONT_HEIGHT] = { + 0, 0, 0, 0, 0, + 0, 1, 1, 1, 0, + 0, 1, 0, 1, 0, + 0, 1, 0, 1, 0, + 0, 1, 0, 1, 0, + 1, 1, 0, 1, 1, + 0, 1, 1, 1, 0, + 0, 0, 1, 0, 0, /* Baseline */ + 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0}; + +static const uint8_t rgui_symbol_data_next[FONT_WIDTH * FONT_HEIGHT] = { + 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, + 0, 1, 1, 1, 0, + 1, 0, 1, 0, 1, + 1, 1, 1, 1, 1, + 1, 0, 1, 0, 1, + 0, 1, 1, 1, 0, + 0, 0, 0, 0, 0, /* Baseline */ + 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0}; + +static const uint8_t rgui_symbol_data_text_cursor[FONT_WIDTH * FONT_HEIGHT] = { + 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, /* Baseline */ + 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1}; + +/* ============================== + * Custom Symbols (glyphs) END + * ============================== */ typedef struct { + unsigned max_width; + unsigned max_height; unsigned width; unsigned height; bool is_valid; char *path; - uint16_t data[THUMB_MAX_WIDTH * THUMB_MAX_HEIGHT]; + uint16_t *data; } thumbnail_t; -static thumbnail_t thumbnail = { +static thumbnail_t fs_thumbnail = { + 0, + 0, 0, 0, false, NULL, - {0} + NULL }; -/* Identical to thumbnail max width/height, but cannot - * assume this will always be the case... */ -#define WALLPAPER_WIDTH 320 -#define WALLPAPER_HEIGHT 240 - -typedef struct -{ - bool is_valid; - char *path; - uint16_t data[WALLPAPER_WIDTH * WALLPAPER_HEIGHT]; -} wallpaper_t; - -static wallpaper_t wallpaper = { +static thumbnail_t mini_thumbnail = { + 0, + 0, + 0, + 0, false, NULL, - {0} + NULL +}; + +static thumbnail_t mini_left_thumbnail = { + 0, + 0, + 0, + 0, + false, + NULL, + NULL }; typedef struct @@ -479,15 +656,25 @@ typedef struct unsigned width; unsigned height; uint16_t *data; -} upscale_buf_t; +} frame_buf_t; -static upscale_buf_t upscale_buf = { +static frame_buf_t rgui_frame_buf = { 0, 0, NULL }; -static uint16_t *rgui_framebuf_data = NULL; +static frame_buf_t rgui_background_buf = { + 0, + 0, + NULL +}; + +static frame_buf_t rgui_upscale_buf = { + 0, + 0, + NULL +}; #if defined(PS2) @@ -600,35 +787,64 @@ static uint16_t argb32_to_rgba4444(uint32_t col) #endif -static bool request_wallpaper(const char *path) +static uint16_t INLINE rgui_bg_filler(rgui_t *rgui, unsigned x, unsigned y) { - /* Do nothing if current wallpaper path hasn't changed */ - if (!string_is_empty(path) && !string_is_empty(wallpaper.path)) - { - if (string_is_equal(wallpaper.path, path)) - return true; - } + unsigned shift = (rgui->bg_thickness ? 1 : 0); + unsigned select = ((x >> shift) + (y >> shift)) & 1; + return (select == 0) ? rgui->colors.bg_dark_color : rgui->colors.bg_light_color; +} - /* 'Reset' current wallpaper */ - wallpaper.is_valid = false; - free(wallpaper.path); - wallpaper.path = NULL; +static uint16_t INLINE rgui_border_filler(rgui_t *rgui, unsigned x, unsigned y) +{ + unsigned shift = (rgui->border_thickness ? 1 : 0); + unsigned select = ((x >> shift) + (y >> shift)) & 1; + return (select == 0) ? rgui->colors.border_dark_color : rgui->colors.border_light_color; +} - /* Ensure that new path is valid... */ +static void rgui_fill_rect( + rgui_t *rgui, + uint16_t *data, + size_t pitch, + unsigned x, unsigned y, + unsigned width, unsigned height, + uint16_t (*col)(rgui_t *rgui, unsigned x, unsigned y)) +{ + unsigned i, j; + + for (j = y; j < y + height; j++) + for (i = x; i < x + width; i++) + data[j * (pitch >> 1) + i] = col(rgui, i, j); +} + +static void rgui_color_rect( + uint16_t *data, + size_t pitch, + unsigned fb_width, unsigned fb_height, + unsigned x, unsigned y, + unsigned width, unsigned height, + uint16_t color) +{ + unsigned i, j; + + for (j = y; j < y + height; j++) + for (i = x; i < x + width; i++) + if (i < fb_width && j < fb_height) + data[j * (pitch >> 1) + i] = color; +} + +static void request_wallpaper(const char *path) +{ + /* Ensure that path is valid... */ if (!string_is_empty(path)) { - wallpaper.path = strdup(path); if (filestream_exists(path)) { /* Unlike thumbnails, we don't worry about queued images * here - in general, wallpaper is loaded once per session * and then forgotten, so performance issues are not a concern */ - task_push_image_load(wallpaper.path, menu_display_handle_wallpaper_upload, NULL); - return true; + task_push_image_load(path, menu_display_handle_wallpaper_upload, NULL); } } - - return false; } static void process_wallpaper(rgui_t *rgui, struct texture_image *image) @@ -636,52 +852,56 @@ static void process_wallpaper(rgui_t *rgui, struct texture_image *image) unsigned x, y; /* Sanity check */ - if (!image->pixels || (image->width != WALLPAPER_WIDTH) || (image->height != WALLPAPER_HEIGHT)) + if (!image->pixels || + (image->width != rgui_background_buf.width) || + (image->height != rgui_background_buf.height) || + !rgui_background_buf.data) return; /* Copy image to wallpaper buffer, performing pixel format conversion */ - for (x = 0; x < WALLPAPER_WIDTH; x++) + for (x = 0; x < rgui_background_buf.width; x++) { - for (y = 0; y < WALLPAPER_HEIGHT; y++) + for (y = 0; y < rgui_background_buf.height; y++) { - wallpaper.data[x + (y * WALLPAPER_WIDTH)] = - argb32_to_pixel_platform_format(image->pixels[x + (y * WALLPAPER_WIDTH)]); + rgui_background_buf.data[x + (y * rgui_background_buf.width)] = + argb32_to_pixel_platform_format(image->pixels[x + (y * rgui_background_buf.width)]); } } - wallpaper.is_valid = true; + rgui->show_wallpaper = true; /* Tell menu that a display update is required */ rgui->force_redraw = true; } -static bool request_thumbnail(rgui_t *rgui, const char *path) +static bool request_thumbnail(thumbnail_t *thumbnail, enum menu_thumbnail_id thumbnail_id, uint32_t *queue_size, const char *path) { /* Do nothing if current thumbnail path hasn't changed */ - if (!string_is_empty(path) && !string_is_empty(thumbnail.path)) + if (!string_is_empty(path) && !string_is_empty(thumbnail->path)) { - if (string_is_equal(thumbnail.path, path)) + if (string_is_equal(thumbnail->path, path)) return true; } /* 'Reset' current thumbnail */ - thumbnail.width = 0; - thumbnail.height = 0; - thumbnail.is_valid = false; - free(thumbnail.path); - thumbnail.path = NULL; + thumbnail->width = 0; + thumbnail->height = 0; + thumbnail->is_valid = false; + free(thumbnail->path); + thumbnail->path = NULL; /* Ensure that new path is valid... */ if (!string_is_empty(path)) { - thumbnail.path = strdup(path); + thumbnail->path = strdup(path); if (filestream_exists(path)) { /* Would like to cancel any existing image load tasks * here, but can't see how to do it... */ - if(task_push_image_load(thumbnail.path, menu_display_handle_thumbnail_upload, NULL)) + if(task_push_image_load(thumbnail->path, (thumbnail_id == MENU_THUMBNAIL_LEFT) ? + menu_display_handle_left_thumbnail_upload : menu_display_handle_thumbnail_upload, NULL)) { - rgui->thumbnail_queue_size++; + *queue_size = *queue_size + 1; return true; } } @@ -690,28 +910,29 @@ static bool request_thumbnail(rgui_t *rgui, const char *path) return false; } -static bool downscale_thumbnail(rgui_t *rgui, struct texture_image *image_src, struct texture_image *image_dst) +static bool downscale_thumbnail(rgui_t *rgui, unsigned max_width, unsigned max_height, + struct texture_image *image_src, struct texture_image *image_dst) { settings_t *settings = config_get_ptr(); /* Determine output dimensions */ - static const float display_aspect_ratio = (float)THUMB_MAX_WIDTH / (float)THUMB_MAX_HEIGHT; + float display_aspect_ratio = (float)max_width / (float)max_height; float aspect_ratio = (float)image_src->width / (float)image_src->height; if (aspect_ratio > display_aspect_ratio) { - image_dst->width = THUMB_MAX_WIDTH; - image_dst->height = image_src->height * THUMB_MAX_WIDTH / image_src->width; + image_dst->width = max_width; + image_dst->height = image_src->height * max_width / image_src->width; /* Account for any possible rounding errors... */ image_dst->height = (image_dst->height < 1) ? 1 : image_dst->height; - image_dst->height = (image_dst->height > THUMB_MAX_HEIGHT) ? THUMB_MAX_HEIGHT : image_dst->height; + image_dst->height = (image_dst->height > max_height) ? max_height : image_dst->height; } else { - image_dst->height = THUMB_MAX_HEIGHT; - image_dst->width = image_src->width * THUMB_MAX_HEIGHT / image_src->height; + image_dst->height = max_height; + image_dst->width = image_src->width * max_height / image_src->height; /* Account for any possible rounding errors... */ image_dst->width = (image_dst->width < 1) ? 1 : image_dst->width; - image_dst->width = (image_dst->width > THUMB_MAX_WIDTH) ? THUMB_MAX_WIDTH : image_dst->width; + image_dst->width = (image_dst->width > max_width) ? max_width : image_dst->width; } /* Allocate pixel buffer */ @@ -782,7 +1003,7 @@ static bool downscale_thumbnail(rgui_t *rgui, struct texture_image *image_src, s return true; } -static void process_thumbnail(rgui_t *rgui, struct texture_image *image_src) +static void process_thumbnail(rgui_t *rgui, thumbnail_t *thumbnail, uint32_t *queue_size, struct texture_image *image_src) { unsigned x, y; struct texture_image *image = NULL; @@ -795,25 +1016,20 @@ static void process_thumbnail(rgui_t *rgui, struct texture_image *image_src) /* Ensure that we only process the most recently loaded * thumbnail image (i.e. don't waste CPU cycles processing - * old images if we have a backlog) - * > NB: After some testing, cannot seem to ever trigger a - * situation where rgui->thumbnail_queue_size is greater - * than 1, so perhaps image loading is synchronous after all. - * This probably makes the check redundant, but we'll leave - * it here for now... */ - if (rgui->thumbnail_queue_size > 0) - rgui->thumbnail_queue_size--; - if (rgui->thumbnail_queue_size > 0) + * old images if we have a backlog) */ + if (*queue_size > 0) + *queue_size = *queue_size - 1; + if (*queue_size > 0) return; /* Sanity check */ - if (!image_src->pixels || (image_src->width < 1) || (image_src->height < 1)) + if (!image_src->pixels || (image_src->width < 1) || (image_src->height < 1) || !thumbnail->data) return; /* Downscale thumbnail if it exceeds maximum size limits */ - if ((image_src->width > THUMB_MAX_WIDTH) || (image_src->height > THUMB_MAX_HEIGHT)) + if ((image_src->width > thumbnail->max_width) || (image_src->height > thumbnail->max_height)) { - if (!downscale_thumbnail(rgui, image_src, &image_resampled)) + if (!downscale_thumbnail(rgui, thumbnail->max_width, thumbnail->max_height, image_src, &image_resampled)) return; image = &image_resampled; } @@ -822,20 +1038,20 @@ static void process_thumbnail(rgui_t *rgui, struct texture_image *image_src) image = image_src; } - thumbnail.width = image->width; - thumbnail.height = image->height; + thumbnail->width = image->width; + thumbnail->height = image->height; /* Copy image to thumbnail buffer, performing pixel format conversion */ - for (x = 0; x < thumbnail.width; x++) + for (x = 0; x < thumbnail->width; x++) { - for (y = 0; y < thumbnail.height; y++) + for (y = 0; y < thumbnail->height; y++) { - thumbnail.data[x + (y * thumbnail.width)] = - argb32_to_pixel_platform_format(image->pixels[x + (y * thumbnail.width)]); + thumbnail->data[x + (y * thumbnail->width)] = + argb32_to_pixel_platform_format(image->pixels[x + (y * thumbnail->width)]); } } - thumbnail.is_valid = true; + thumbnail->is_valid = true; /* Tell menu that a display update is required */ rgui->force_redraw = true; @@ -849,9 +1065,10 @@ static void process_thumbnail(rgui_t *rgui, struct texture_image *image_src) static bool rgui_load_image(void *userdata, void *data, enum menu_image_type type) { - rgui_t *rgui = (rgui_t*)userdata; + rgui_t *rgui = (rgui_t*)userdata; + settings_t *settings = config_get_ptr(); - if (!rgui || !data) + if (!rgui || !data || !settings) return false; switch (type) @@ -865,7 +1082,27 @@ static bool rgui_load_image(void *userdata, void *data, enum menu_image_type typ case MENU_IMAGE_THUMBNAIL: { struct texture_image *image = (struct texture_image*)data; - process_thumbnail(rgui, image); + + if (rgui->show_fs_thumbnail) + process_thumbnail(rgui, &fs_thumbnail, &rgui->thumbnail_queue_size, image); + else if (settings->bools.menu_rgui_inline_thumbnails) + process_thumbnail(rgui, &mini_thumbnail, &rgui->thumbnail_queue_size, image); + else + { + /* If user toggles settings rapidly on very slow systems, + * it is possible for a thumbnail to be requested without + * it ever being processed. In this case, we still have to + * decrement the thumbnail queue (otherwise image updates + * will get 'stuck') */ + if (rgui->thumbnail_queue_size > 0) + rgui->thumbnail_queue_size--; + } + } + break; + case MENU_IMAGE_LEFT_THUMBNAIL: + { + struct texture_image *image = (struct texture_image*)data; + process_thumbnail(rgui, &mini_left_thumbnail, &rgui->left_thumbnail_queue_size, image); } break; default: @@ -875,39 +1112,37 @@ static bool rgui_load_image(void *userdata, void *data, enum menu_image_type typ return true; } -static bool rgui_render_wallpaper(void) +static void rgui_render_background(void) { size_t fb_pitch; unsigned fb_width, fb_height; - if (wallpaper.is_valid && rgui_framebuf_data) + if (rgui_frame_buf.data && rgui_background_buf.data) { menu_display_get_fb_size(&fb_width, &fb_height, &fb_pitch); /* Sanity check */ - if ((fb_width != WALLPAPER_WIDTH) || (fb_height != WALLPAPER_HEIGHT) || (fb_pitch != WALLPAPER_WIDTH << 1)) - return false; + if ((fb_width != rgui_frame_buf.width) || (fb_height != rgui_frame_buf.height) || (fb_pitch != rgui_frame_buf.width << 1)) + return; - /* Copy wallpaper to framebuffer */ - memcpy(rgui_framebuf_data, wallpaper.data, WALLPAPER_WIDTH * WALLPAPER_HEIGHT * sizeof(uint16_t)); - - return true; + /* Copy background to framebuffer */ + memcpy(rgui_frame_buf.data, rgui_background_buf.data, rgui_frame_buf.width * rgui_frame_buf.height * sizeof(uint16_t)); } - - return false; } -static void rgui_render_thumbnail(void) +static void rgui_render_fs_thumbnail(rgui_t *rgui) { - size_t fb_pitch; - unsigned fb_width, fb_height; - unsigned x, y; - unsigned fb_x_offset, fb_y_offset; - unsigned thumb_x_offset, thumb_y_offset; - unsigned width, height; - - if (thumbnail.is_valid && rgui_framebuf_data) + if (fs_thumbnail.is_valid && rgui_frame_buf.data && fs_thumbnail.data) { + size_t fb_pitch; + unsigned fb_width, fb_height; + unsigned y; + unsigned fb_x_offset, fb_y_offset; + unsigned thumb_x_offset, thumb_y_offset; + unsigned width, height; + uint16_t *src = NULL; + uint16_t *dst = NULL; + menu_display_get_fb_size(&fb_width, &fb_height, &fb_pitch); /* Ensure that thumbnail is centred @@ -915,27 +1150,27 @@ static void rgui_render_thumbnail(void) * cannot assume fb_width and fb_height are constant and * >= thumbnail.width and thumbnail.height (even though * they are...) */ - if (thumbnail.width <= fb_width) + if (fs_thumbnail.width <= fb_width) { thumb_x_offset = 0; - fb_x_offset = (fb_width - thumbnail.width) >> 1; - width = thumbnail.width; + fb_x_offset = (fb_width - fs_thumbnail.width) >> 1; + width = fs_thumbnail.width; } else { - thumb_x_offset = (thumbnail.width - fb_width) >> 1; + thumb_x_offset = (fs_thumbnail.width - fb_width) >> 1; fb_x_offset = 0; width = fb_width; } - if (thumbnail.height <= fb_height) + if (fs_thumbnail.height <= fb_height) { thumb_y_offset = 0; - fb_y_offset = (fb_height - thumbnail.height) >> 1; - height = thumbnail.height; + fb_y_offset = (fb_height - fs_thumbnail.height) >> 1; + height = fs_thumbnail.height; } else { - thumb_y_offset = (thumbnail.height - fb_height) >> 1; + thumb_y_offset = (fs_thumbnail.height - fb_height) >> 1; fb_y_offset = 0; height = fb_height; } @@ -943,11 +1178,126 @@ static void rgui_render_thumbnail(void) /* Copy thumbnail to framebuffer */ for (y = 0; y < height; y++) { - for (x = 0; x < width; x++) + src = fs_thumbnail.data + thumb_x_offset + ((y + thumb_y_offset) * fs_thumbnail.width); + dst = rgui_frame_buf.data + (y + fb_y_offset) * (fb_pitch >> 1) + fb_x_offset; + + memcpy(dst, src, width * sizeof(uint16_t)); + } + + /* Draw drop shadow, if required */ + if (rgui->shadow_enable) + { + unsigned shadow_x; + unsigned shadow_y; + unsigned shadow_width; + unsigned shadow_height; + + /* Vertical component */ + if (fs_thumbnail.width < fb_width) { - rgui_framebuf_data[(y + fb_y_offset) * (fb_pitch >> 1) + (x + fb_x_offset)] = - thumbnail.data[(x + thumb_x_offset) + ((y + thumb_y_offset) * thumbnail.width)]; + shadow_width = fb_width - fs_thumbnail.width; + shadow_width = shadow_width > 2 ? 2 : shadow_width; + shadow_height = fs_thumbnail.height + 2 < fb_height ? fs_thumbnail.height : fb_height - 2; + + shadow_x = fb_x_offset + fs_thumbnail.width; + shadow_y = fb_y_offset + 2; + + /* Super paranoid safety check... + * (This is not required at all, but terrible things + * will happen if we ever go out of bounds...) */ + if (((shadow_x + shadow_width) <= fb_width) && + ((shadow_y + shadow_height) <= fb_height)) + rgui_color_rect(rgui_frame_buf.data, fb_pitch, fb_width, fb_height, + shadow_x, shadow_y, shadow_width, shadow_height, rgui->colors.shadow_color); } + + /* Horizontal component */ + if (fs_thumbnail.height < fb_height) + { + shadow_height = fb_height - fs_thumbnail.height; + shadow_height = shadow_height > 2 ? 2 : shadow_height; + shadow_width = fs_thumbnail.width + 2 < fb_width ? fs_thumbnail.width : fb_width - 2; + + shadow_x = fb_x_offset + 2; + shadow_y = fb_y_offset + fs_thumbnail.height; + + /* Super paranoid safety check... + * (This is not required at all, but terrible things + * will happen if we ever go out of bounds...) */ + if (((shadow_x + shadow_width) <= fb_width) && + ((shadow_y + shadow_height) <= fb_height)) + rgui_color_rect(rgui_frame_buf.data, fb_pitch, fb_width, fb_height, + shadow_x, shadow_y, shadow_width, shadow_height, rgui->colors.shadow_color); + } + } + } +} + +static unsigned INLINE rgui_get_mini_thumbnail_fullwidth(void) +{ + unsigned width = mini_thumbnail.is_valid ? mini_thumbnail.width : 0; + unsigned left_width = mini_left_thumbnail.is_valid ? mini_left_thumbnail.width : 0; + return width >= left_width ? width : left_width; +} + +static void rgui_render_mini_thumbnail(rgui_t *rgui, thumbnail_t *thumbnail, enum menu_thumbnail_id thumbnail_id) +{ + settings_t *settings = config_get_ptr(); + + if (!thumbnail || !settings) + return; + + if (thumbnail->is_valid && rgui_frame_buf.data && thumbnail->data) + { + size_t fb_pitch; + unsigned fb_width, fb_height; + unsigned term_width, term_height; + unsigned y; + unsigned fb_x_offset, fb_y_offset; + unsigned thumbnail_fullwidth = rgui_get_mini_thumbnail_fullwidth(); + uint16_t *src = NULL; + uint16_t *dst = NULL; + + menu_display_get_fb_size(&fb_width, &fb_height, &fb_pitch); + + term_width = RGUI_TERM_WIDTH(fb_width) * FONT_WIDTH_STRIDE; + term_height = RGUI_TERM_HEIGHT(fb_height) * FONT_HEIGHT_STRIDE; + + /* Sanity check (this can never, ever happen, so just return + * instead of trying to crop the thumbnail image...) */ + if ((thumbnail_fullwidth > term_width) || (thumbnail->height > term_height)) + return; + + fb_x_offset = (RGUI_TERM_START_X(fb_width) + term_width) - + (thumbnail->width + ((thumbnail_fullwidth - thumbnail->width) >> 1)); + + if (((thumbnail_id == MENU_THUMBNAIL_RIGHT) && !settings->bools.menu_rgui_swap_thumbnails) || + ((thumbnail_id == MENU_THUMBNAIL_LEFT) && settings->bools.menu_rgui_swap_thumbnails)) + { + fb_y_offset = RGUI_TERM_START_Y(fb_height) + ((thumbnail->max_height - thumbnail->height) >> 1); + } + else + { + fb_y_offset = (RGUI_TERM_START_Y(fb_height) + term_height) - + (thumbnail->height + ((thumbnail->max_height - thumbnail->height) >> 1)); + } + + /* Copy thumbnail to framebuffer */ + for (y = 0; y < thumbnail->height; y++) + { + src = thumbnail->data + (y * thumbnail->width); + dst = rgui_frame_buf.data + (y + fb_y_offset) * (fb_pitch >> 1) + fb_x_offset; + + memcpy(dst, src, thumbnail->width * sizeof(uint16_t)); + } + + /* Draw drop shadow, if required */ + if (rgui->shadow_enable) + { + rgui_color_rect(rgui_frame_buf.data, fb_pitch, fb_width, fb_height, + fb_x_offset + thumbnail->width, fb_y_offset + 1, 1, thumbnail->height, rgui->colors.shadow_color); + rgui_color_rect(rgui_frame_buf.data, fb_pitch, fb_width, fb_height, + fb_x_offset + 1, fb_y_offset + thumbnail->height, thumbnail->width, 1, rgui->colors.shadow_color); } } } @@ -1029,13 +1379,33 @@ static const rgui_theme_t *get_theme(rgui_t *rgui) static void load_custom_theme(rgui_t *rgui, rgui_theme_t *theme_colors, const char *theme_path) { + settings_t *settings = config_get_ptr(); config_file_t *conf = NULL; + char *wallpaper_key = NULL; unsigned normal_color, hover_color, title_color, bg_dark_color, bg_light_color, - border_dark_color, border_light_color; + border_dark_color, border_light_color, + shadow_color; char wallpaper_file[PATH_MAX_LENGTH]; bool success = false; + /* Determine which type of wallpaper to load */ + switch (settings->uints.menu_rgui_aspect_ratio) + { + case RGUI_ASPECT_RATIO_16_9: + case RGUI_ASPECT_RATIO_16_9_CENTRE: + wallpaper_key = "rgui_wallpaper_16_9"; + break; + case RGUI_ASPECT_RATIO_16_10: + case RGUI_ASPECT_RATIO_16_10_CENTRE: + wallpaper_key = "rgui_wallpaper_16_10"; + break; + default: + /* 4:3 */ + wallpaper_key = "rgui_wallpaper"; + break; + } + wallpaper_file[0] = '\0'; /* Sanity check */ @@ -1071,7 +1441,13 @@ static void load_custom_theme(rgui_t *rgui, rgui_theme_t *theme_colors, const ch if(!config_get_hex(conf, "rgui_border_light_color", &border_light_color)) goto end; - config_get_array(conf, "rgui_wallpaper", wallpaper_file, sizeof(wallpaper_file)); + /* Make shadow colour optional (fallback to fully opaque black) + * - i.e. if user has no intention of enabling shadows, they + * should not have to include this entry */ + if(!config_get_hex(conf, "rgui_shadow_color", &shadow_color)) + shadow_color = 0xFF000000; + + config_get_array(conf, wallpaper_key, wallpaper_file, sizeof(wallpaper_file)); success = true; @@ -1086,6 +1462,7 @@ end: theme_colors->bg_light_color = (uint32_t)bg_light_color; theme_colors->border_dark_color = (uint32_t)border_dark_color; theme_colors->border_light_color = (uint32_t)border_light_color; + theme_colors->shadow_color = (uint32_t)shadow_color; /* Load wallpaper, if required */ if (!string_is_empty(wallpaper_file)) @@ -1094,7 +1471,7 @@ end: wallpaper_path[0] = '\0'; fill_pathname_resolve_relative(wallpaper_path, theme_path, wallpaper_file, sizeof(wallpaper_path)); - rgui->show_wallpaper = request_wallpaper(wallpaper_path); + request_wallpaper(wallpaper_path); } } else @@ -1107,6 +1484,7 @@ end: theme_colors->bg_light_color = rgui_theme_classic_green.bg_light_color; theme_colors->border_dark_color = rgui_theme_classic_green.border_dark_color; theme_colors->border_light_color = rgui_theme_classic_green.border_light_color; + theme_colors->shadow_color = rgui_theme_classic_green.shadow_color; } if (conf) @@ -1114,6 +1492,68 @@ end: conf = NULL; } +static void rgui_cache_background(rgui_t *rgui) +{ + size_t pitch_in_pixels, size; + size_t fb_pitch; + unsigned fb_width, fb_height; + uint16_t *src = NULL; + uint16_t *dst = NULL; + + /* Only regenerate the background if we are *not* + * currently showing a wallpaper image */ + if (rgui->show_wallpaper) + return; + + menu_display_get_fb_size(&fb_width, &fb_height, + &fb_pitch); + + /* Sanity check */ + if ((fb_width != rgui_background_buf.width) || + (fb_height != rgui_background_buf.height) || + (fb_pitch != rgui_background_buf.width << 1) || + !rgui_background_buf.data) + return; + + /* Fill last 4 lines of background buffer with standard + * chequer pattern */ + rgui_fill_rect(rgui, rgui_background_buf.data, fb_pitch, 0, fb_height, fb_width, 4, rgui_bg_filler); + + /* Copy chequer pattern to rest of background buffer */ + pitch_in_pixels = fb_pitch >> 1; + size = fb_pitch * 4; + src = rgui_background_buf.data + pitch_in_pixels * fb_height; + dst = rgui_background_buf.data; + + while (dst < src) + { + memcpy(dst, src, size); + dst += pitch_in_pixels * 4; + } + + if (rgui->border_enable) + { + /* Draw border */ + rgui_fill_rect(rgui, rgui_background_buf.data, fb_pitch, 5, 5, fb_width - 10, 5, rgui_border_filler); + rgui_fill_rect(rgui, rgui_background_buf.data, fb_pitch, 5, fb_height - 10, fb_width - 10, 5, rgui_border_filler); + rgui_fill_rect(rgui, rgui_background_buf.data, fb_pitch, 5, 5, 5, fb_height - 10, rgui_border_filler); + rgui_fill_rect(rgui, rgui_background_buf.data, fb_pitch, fb_width - 10, 5, 5, fb_height - 10, rgui_border_filler); + + /* Draw drop shadow, if required */ + if (rgui->shadow_enable) + { + rgui_color_rect(rgui_background_buf.data, fb_pitch, fb_width, fb_height, + 10, 10, 1, fb_height - 20, rgui->colors.shadow_color); + rgui_color_rect(rgui_background_buf.data, fb_pitch, fb_width, fb_height, + 10, 10, fb_width - 20, 1, rgui->colors.shadow_color); + rgui_color_rect(rgui_background_buf.data, fb_pitch, fb_width, fb_height, + fb_width - 5, 6, 1, fb_height - 10, rgui->colors.shadow_color); + rgui_color_rect(rgui_background_buf.data, fb_pitch, fb_width, fb_height, + 6, fb_height - 5, fb_width - 10, 1, rgui->colors.shadow_color); + } + } +} + static void prepare_rgui_colors(rgui_t *rgui, settings_t *settings) { rgui_theme_t theme_colors; @@ -1135,6 +1575,7 @@ static void prepare_rgui_colors(rgui_t *rgui, settings_t *settings) theme_colors.bg_light_color = current_theme->bg_light_color; theme_colors.border_dark_color = current_theme->border_dark_color; theme_colors.border_light_color = current_theme->border_light_color; + theme_colors.shadow_color = current_theme->shadow_color; } rgui->colors.hover_color = argb32_to_pixel_platform_format(theme_colors.hover_color); rgui->colors.normal_color = argb32_to_pixel_platform_format(theme_colors.normal_color); @@ -1143,193 +1584,343 @@ static void prepare_rgui_colors(rgui_t *rgui, settings_t *settings) rgui->colors.bg_light_color = argb32_to_pixel_platform_format(theme_colors.bg_light_color); rgui->colors.border_dark_color = argb32_to_pixel_platform_format(theme_colors.border_dark_color); rgui->colors.border_light_color = argb32_to_pixel_platform_format(theme_colors.border_light_color); + rgui->colors.shadow_color = argb32_to_pixel_platform_format(theme_colors.shadow_color); rgui->bg_modified = true; rgui->force_redraw = true; } -static uint16_t rgui_bg_filler(rgui_t *rgui, unsigned x, unsigned y) +/* ============================== + * blit_line/symbol() START + * ============================== */ + +/* NOTE: These functions are WET (Write Everything Twice). + * This is bad design and difficult to maintain, but we have + * no other choice here. blit_line() is so performance + * critical that we simply cannot afford to check user + * settings internally. */ + +/* blit_line() */ + +static void blit_line_regular(int x, int y, + const char *message, uint16_t color, uint16_t shadow_color) { - unsigned shift = (rgui->bg_thickness ? 1 : 0); - unsigned select = ((x >> shift) + (y >> shift)) & 1; - return (select == 0) ? rgui->colors.bg_dark_color : rgui->colors.bg_light_color; -} + unsigned fb_width = rgui_frame_buf.width; + uint16_t *frame_buf_data = rgui_frame_buf.data; -static uint16_t rgui_border_filler(rgui_t *rgui, unsigned x, unsigned y) -{ - unsigned shift = (rgui->border_thickness ? 1 : 0); - unsigned select = ((x >> shift) + (y >> shift)) & 1; - return (select == 0) ? rgui->colors.border_dark_color : rgui->colors.border_light_color; -} - -static void rgui_fill_rect( - rgui_t *rgui, - uint16_t *data, - size_t pitch, - unsigned x, unsigned y, - unsigned width, unsigned height, - uint16_t (*col)(rgui_t *rgui, unsigned x, unsigned y)) -{ - unsigned i, j; - - for (j = y; j < y + height; j++) - for (i = x; i < x + width; i++) - data[j * (pitch >> 1) + i] = col(rgui, i, j); -} - -static void rgui_color_rect( - uint16_t *data, - size_t pitch, - unsigned fb_width, unsigned fb_height, - unsigned x, unsigned y, - unsigned width, unsigned height, - uint16_t color) -{ - unsigned i, j; - - for (j = y; j < y + height; j++) - for (i = x; i < x + width; i++) - if (i < fb_width && j < fb_height) - data[j * (pitch >> 1) + i] = color; -} - -static void blit_line(int x, int y, - const char *message, uint16_t color) -{ - size_t pitch = menu_display_get_framebuffer_pitch(); - const uint8_t *font_fb = menu_display_get_font_framebuffer(); - - if (font_fb) + while (!string_is_empty(message)) { - while (!string_is_empty(message)) + unsigned i, j; + uint8_t symbol = (uint8_t)*message++; + + if (symbol >= NUM_FONT_GLYPHS_REGULAR) + continue; + + if (symbol != ' ') + { + for (j = 0; j < FONT_HEIGHT; j++) + { + unsigned buff_offset = ((y + j) * fb_width) + x; + + for (i = 0; i < FONT_WIDTH; i++) + { + if (font_lut[symbol][i + (j * FONT_WIDTH)]) + *(frame_buf_data + buff_offset + i) = color; + } + } + } + + x += FONT_WIDTH_STRIDE; + } +} + +static void blit_line_regular_shadow(int x, int y, + const char *message, uint16_t color, uint16_t shadow_color) +{ + unsigned fb_width = rgui_frame_buf.width; + uint16_t *frame_buf_data = rgui_frame_buf.data; + uint32_t shadow_colour_32 = shadow_color; + + /* Small performance hack... */ + shadow_colour_32 |= shadow_colour_32 << 16; + + while (!string_is_empty(message)) + { + unsigned i, j; + uint8_t symbol = (uint8_t)*message++; + + if (symbol >= NUM_FONT_GLYPHS_REGULAR) + continue; + + if (symbol != ' ') + { + for (j = 0; j < FONT_HEIGHT; j++) + { + unsigned buff_offset = ((y + j) * fb_width) + x; + + for (i = 0; i < FONT_WIDTH; i++) + { + if (font_lut[symbol][i + (j * FONT_WIDTH)]) + { + uint16_t *frame_buf_ptr = frame_buf_data + buff_offset + i; + + /* Text pixel */ + *frame_buf_ptr = color; + + /* Shadow pixels */ + frame_buf_ptr++; + *frame_buf_ptr = shadow_color; + frame_buf_ptr += fb_width - 1; + /* Small performance hack... */ + *(uint32_t *)frame_buf_ptr = shadow_colour_32; + } + } + } + } + + x += FONT_WIDTH_STRIDE; + } +} + +static void blit_line_extended(int x, int y, + const char *message, uint16_t color, uint16_t shadow_color) +{ + unsigned fb_width = rgui_frame_buf.width; + uint16_t *frame_buf_data = rgui_frame_buf.data; + + while (!string_is_empty(message)) + { + /* Deal with spaces first, for efficiency */ + if (*message == ' ') + message++; + else { unsigned i, j; - char symbol = *message++; + uint32_t symbol = utf8_walk(&message); + + /* Stupid cretinous hack: 'oe' ligatures are not + * really standard extended ASCII, so we have to + * waste CPU cycles performing a conversion from + * the unicode values... + * (Note: This is only really required for msg_hash_fr.h) */ + if (symbol == 339) /* Latin small ligature oe */ + symbol = 156; + if (symbol == 338) /* Latin capital ligature oe */ + symbol = 140; + + if (symbol >= NUM_FONT_GLYPHS_EXTENDED) + continue; for (j = 0; j < FONT_HEIGHT; j++) { + unsigned buff_offset = ((y + j) * fb_width) + x; + for (i = 0; i < FONT_WIDTH; i++) { - uint8_t rem = 1 << ((i + j * FONT_WIDTH) & 7); - int offset = (i + j * FONT_WIDTH) >> 3; - bool col = (font_fb[FONT_OFFSET(symbol) + offset] & rem); - - if (col) - rgui_framebuf_data[(y + j) * (pitch >> 1) + (x + i)] = color; + if (font_lut[symbol][i + (j * FONT_WIDTH)]) + *(frame_buf_data + buff_offset + i) = color; } } - - x += FONT_WIDTH_STRIDE; } + + x += FONT_WIDTH_STRIDE; } } -#if 0 -static void rgui_copy_glyph(uint8_t *glyph, const uint8_t *buf) +static void blit_line_extended_shadow(int x, int y, + const char *message, uint16_t color, uint16_t shadow_color) { - int x, y; + unsigned fb_width = rgui_frame_buf.width; + uint16_t *frame_buf_data = rgui_frame_buf.data; + uint32_t shadow_colour_32 = shadow_color; - if (!glyph) + /* Small performance hack... */ + shadow_colour_32 |= shadow_colour_32 << 16; + + while (!string_is_empty(message)) + { + /* Deal with spaces first, for efficiency */ + if (*message == ' ') + message++; + else + { + unsigned i, j; + uint32_t symbol = utf8_walk(&message); + + /* Stupid cretinous hack: 'oe' ligatures are not + * really standard extended ASCII, so we have to + * waste CPU cycles performing a conversion from + * the unicode values... + * (Note: This is only really required for msg_hash_fr.h) */ + if (symbol == 339) /* Latin small ligature oe */ + symbol = 156; + if (symbol == 338) /* Latin capital ligature oe */ + symbol = 140; + + if (symbol >= NUM_FONT_GLYPHS_EXTENDED) + continue; + + for (j = 0; j < FONT_HEIGHT; j++) + { + unsigned buff_offset = ((y + j) * fb_width) + x; + + for (i = 0; i < FONT_WIDTH; i++) + { + if (font_lut[symbol][i + (j * FONT_WIDTH)]) + { + uint16_t *frame_buf_ptr = frame_buf_data + buff_offset + i; + + /* Text pixel */ + *frame_buf_ptr = color; + + /* Shadow pixels */ + frame_buf_ptr++; + *frame_buf_ptr = shadow_color; + frame_buf_ptr += fb_width - 1; + /* Small performance hack... */ + *(uint32_t *)frame_buf_ptr = shadow_colour_32; + } + } + } + } + + x += FONT_WIDTH_STRIDE; + } +} + +static void (*blit_line)(int x, int y, + const char *message, uint16_t color, uint16_t shadow_color) = blit_line_regular; + +/* blit_symbol() */ + +static const uint8_t *rgui_get_symbol_data(enum rgui_symbol_type symbol) +{ + switch (symbol) + { + case RGUI_SYMBOL_BACKSPACE: + return rgui_symbol_data_backspace; + case RGUI_SYMBOL_ENTER: + return rgui_symbol_data_enter; + case RGUI_SYMBOL_SHIFT_UP: + return rgui_symbol_data_shift_up; + case RGUI_SYMBOL_SHIFT_DOWN: + return rgui_symbol_data_shift_down; + case RGUI_SYMBOL_NEXT: + return rgui_symbol_data_next; + case RGUI_SYMBOL_TEXT_CURSOR: + return rgui_symbol_data_text_cursor; + default: + return NULL; + } +} + +static void blit_symbol_regular(int x, int y, + enum rgui_symbol_type symbol, uint16_t color, uint16_t shadow_color) +{ + unsigned i, j; + unsigned fb_width = rgui_frame_buf.width; + uint16_t *frame_buf_data = rgui_frame_buf.data; + const uint8_t *symbol_data = rgui_get_symbol_data(symbol); + + if (!symbol_data) return; - for (y = 0; y < FONT_HEIGHT; y++) + for (j = 0; j < FONT_HEIGHT; j++) { - for (x = 0; x < FONT_WIDTH; x++) + unsigned buff_offset = ((y + j) * fb_width) + x; + + for (i = 0; i < FONT_WIDTH; i++) { - uint32_t col = - ((uint32_t)buf[3 * (-y * 256 + x) + 0] << 0) | - ((uint32_t)buf[3 * (-y * 256 + x) + 1] << 8) | - ((uint32_t)buf[3 * (-y * 256 + x) + 2] << 16); - - uint8_t rem = 1 << ((x + y * FONT_WIDTH) & 7); - unsigned offset = (x + y * FONT_WIDTH) >> 3; - - if (col != 0xff) - glyph[offset] |= rem; + if (*symbol_data++ == 1) + *(frame_buf_data + buff_offset + i) = color; } } } -static bool init_font(menu_handle_t *menu, const uint8_t *font_bmp_buf) +static void blit_symbol_shadow(int x, int y, + enum rgui_symbol_type symbol, uint16_t color, uint16_t shadow_color) { - unsigned i; - bool fb_font_inited = true; - uint8_t *font = (uint8_t *)calloc(1, FONT_OFFSET(256)); + unsigned i, j; + unsigned fb_width = rgui_frame_buf.width; + uint16_t *frame_buf_data = rgui_frame_buf.data; + uint32_t shadow_colour_32 = shadow_color; + const uint8_t *symbol_data = rgui_get_symbol_data(symbol); - if (!font) - return false; + if (!symbol_data) + return; - menu_display_set_font_data_init(fb_font_inited); + /* Small performance hack... */ + shadow_colour_32 |= shadow_colour_32 << 16; - for (i = 0; i < 256; i++) + for (j = 0; j < FONT_HEIGHT; j++) { - unsigned y = i / 16; - unsigned x = i % 16; - rgui_copy_glyph(&font[FONT_OFFSET(i)], - font_bmp_buf + 54 + 3 * (256 * (255 - 16 * y) + 16 * x)); - } + unsigned buff_offset = ((y + j) * fb_width) + x; - menu_display_set_font_framebuffer(font); - - return true; -} -#endif - -static bool rguidisp_init_font(menu_handle_t *menu) -{ -#if 0 - const uint8_t *font_bmp_buf = NULL; -#endif - const uint8_t *font_bin_buf = bitmap_bin; - - if (!menu) - return false; - -#if 0 - if (font_bmp_buf) - return init_font(menu, font_bmp_buf); -#endif - - menu_display_set_font_framebuffer(font_bin_buf); - - return true; -} - -static void rgui_render_background(rgui_t *rgui) -{ - size_t pitch_in_pixels, size; - size_t fb_pitch; - unsigned fb_width, fb_height; - uint16_t *src = NULL; - uint16_t *dst = NULL; - - menu_display_get_fb_size(&fb_width, &fb_height, - &fb_pitch); - - pitch_in_pixels = fb_pitch >> 1; - size = fb_pitch * 4; - src = rgui_framebuf_data + pitch_in_pixels * fb_height; - dst = rgui_framebuf_data; - - while (dst < src) - { - memcpy(dst, src, size); - dst += pitch_in_pixels * 4; - } - - /* Skip drawing border if we are currently showing a thumbnail */ - if (!(rgui->show_thumbnail && rgui->entry_has_thumbnail && (thumbnail.is_valid || (rgui->thumbnail_queue_size > 0)))) - { - if (rgui_framebuf_data) + for (i = 0; i < FONT_WIDTH; i++) { - settings_t *settings = config_get_ptr(); - - if (settings->bools.menu_rgui_border_filler_enable) + if (*symbol_data++ == 1) { - rgui_fill_rect(rgui, rgui_framebuf_data, fb_pitch, 5, 5, fb_width - 10, 5, rgui_border_filler); - rgui_fill_rect(rgui, rgui_framebuf_data, fb_pitch, 5, fb_height - 10, fb_width - 10, 5, rgui_border_filler); - rgui_fill_rect(rgui, rgui_framebuf_data, fb_pitch, 5, 5, 5, fb_height - 10, rgui_border_filler); - rgui_fill_rect(rgui, rgui_framebuf_data, fb_pitch, fb_width - 10, 5, 5, fb_height - 10, rgui_border_filler); + uint16_t *frame_buf_ptr = frame_buf_data + buff_offset + i; + + /* Symbol pixel */ + *frame_buf_ptr = color; + + /* Shadow pixels */ + frame_buf_ptr++; + *frame_buf_ptr = shadow_color; + frame_buf_ptr += fb_width - 1; + /* Small performance hack... */ + *(uint32_t *)frame_buf_ptr = shadow_colour_32; + } + } + } +} + +static void (*blit_symbol)(int x, int y, + enum rgui_symbol_type symbol, uint16_t color, uint16_t shadow_color) = blit_symbol_regular; + +static void rgui_set_blit_functions(bool draw_shadow, bool extended_ascii) +{ + if (draw_shadow) + { + if (extended_ascii) + blit_line = blit_line_extended_shadow; + else + blit_line = blit_line_regular_shadow; + + blit_symbol = blit_symbol_shadow; + } + else + { + if (extended_ascii) + blit_line = blit_line_extended; + else + blit_line = blit_line_regular; + + blit_symbol = blit_symbol_regular; + } +} + +/* ============================== + * blit_line/symbol() END + * ============================== */ + +static void rgui_init_font_lut(void) +{ + unsigned symbol_index, i, j; + + /* Loop over all possible characters */ + for (symbol_index = 0; symbol_index < NUM_FONT_GLYPHS_EXTENDED; symbol_index++) + { + for (j = 0; j < FONT_HEIGHT; j++) + { + for (i = 0; i < FONT_WIDTH; i++) + { + uint8_t rem = 1 << ((i + j * FONT_WIDTH) & 7); + unsigned offset = (i + j * FONT_WIDTH) >> 3; + + /* LUT value is 'true' if specified glyph position contains a pixel */ + font_lut[symbol_index][i + (j * FONT_WIDTH)] = (bitmap_bin[FONT_OFFSET(symbol_index) + offset] & rem) > 0; } } } @@ -1355,9 +1946,6 @@ static void rgui_render_messagebox(rgui_t *rgui, const char *message) unsigned fb_width, fb_height; unsigned width, glyphs_width, height; struct string_list *list = NULL; - settings_t *settings = config_get_ptr(); - - (void)settings; if (!message || !*message) return; @@ -1398,16 +1986,43 @@ static void rgui_render_messagebox(rgui_t *rgui, const char *message) x = (fb_width - width) / 2; y = (fb_height - height) / 2; - if (rgui_framebuf_data) + if (rgui_frame_buf.data) { - rgui_fill_rect(rgui, rgui_framebuf_data, fb_pitch, x + 5, y + 5, width - 10, height - 10, rgui_bg_filler); + rgui_fill_rect(rgui, rgui_frame_buf.data, fb_pitch, x + 5, y + 5, width - 10, height - 10, rgui_bg_filler); - if (settings->bools.menu_rgui_border_filler_enable) + if (rgui->border_enable) { - rgui_fill_rect(rgui, rgui_framebuf_data, fb_pitch, x, y, width - 5, 5, rgui_border_filler); - rgui_fill_rect(rgui, rgui_framebuf_data, fb_pitch, x + width - 5, y, 5, height - 5, rgui_border_filler); - rgui_fill_rect(rgui, rgui_framebuf_data, fb_pitch, x + 5, y + height - 5, width - 5, 5, rgui_border_filler); - rgui_fill_rect(rgui, rgui_framebuf_data, fb_pitch, x, y + 5, 5, height - 5, rgui_border_filler); + /* Draw drop shadow, if required */ + if (rgui->shadow_enable) + { + rgui_color_rect(rgui_frame_buf.data, fb_pitch, fb_width, fb_height, + x + 5, y + 5, 1, height - 5, rgui->colors.shadow_color); + rgui_color_rect(rgui_frame_buf.data, fb_pitch, fb_width, fb_height, + x + 5, y + 5, width - 5, 1, rgui->colors.shadow_color); + rgui_color_rect(rgui_frame_buf.data, fb_pitch, fb_width, fb_height, + x + width, y + 1, 1, height, rgui->colors.shadow_color); + rgui_color_rect(rgui_frame_buf.data, fb_pitch, fb_width, fb_height, + x + 1, y + height, width, 1, rgui->colors.shadow_color); + } + + /* Draw border */ + rgui_fill_rect(rgui, rgui_frame_buf.data, fb_pitch, x, y, width - 5, 5, rgui_border_filler); + rgui_fill_rect(rgui, rgui_frame_buf.data, fb_pitch, x + width - 5, y, 5, height - 5, rgui_border_filler); + rgui_fill_rect(rgui, rgui_frame_buf.data, fb_pitch, x + 5, y + height - 5, width - 5, 5, rgui_border_filler); + rgui_fill_rect(rgui, rgui_frame_buf.data, fb_pitch, x, y + 5, 5, height - 5, rgui_border_filler); + } + else if (rgui->shadow_enable) + { + /* Without a border, this is a bit silly... + * All we can do is draw a sort of frame... */ + rgui_color_rect(rgui_frame_buf.data, fb_pitch, fb_width, fb_height, + x + 4, y + 4, 1, height - 8, rgui->colors.shadow_color); + rgui_color_rect(rgui_frame_buf.data, fb_pitch, fb_width, fb_height, + x + 5, y + 4, width - 10, 1, rgui->colors.shadow_color); + rgui_color_rect(rgui_frame_buf.data, fb_pitch, fb_width, fb_height, + x + width - 5, y + 4, 1, height - 8, rgui->colors.shadow_color); + rgui_color_rect(rgui_frame_buf.data, fb_pitch, fb_width, fb_height, + x + 5, y + height - 5, width - 10, 1, rgui->colors.shadow_color); } } @@ -1417,8 +2032,9 @@ static void rgui_render_messagebox(rgui_t *rgui, const char *message) int offset_x = (int)(FONT_WIDTH_STRIDE * (glyphs_width - utf8len(msg)) / 2); int offset_y = (int)(FONT_HEIGHT_STRIDE * i); - if (rgui_framebuf_data) - blit_line(x + 8 + offset_x, y + 8 + offset_y, msg, rgui->colors.normal_color); + if (rgui_frame_buf.data) + blit_line(x + 8 + offset_x, y + 8 + offset_y, msg, + rgui->colors.normal_color, rgui->colors.shadow_color); } end: @@ -1435,35 +2051,253 @@ static void rgui_blit_cursor(void) menu_display_get_fb_size(&fb_width, &fb_height, &fb_pitch); - if (rgui_framebuf_data) + if (rgui_frame_buf.data) { - rgui_color_rect(rgui_framebuf_data, fb_pitch, fb_width, fb_height, x, y - 5, 1, 11, 0xFFFF); - rgui_color_rect(rgui_framebuf_data, fb_pitch, fb_width, fb_height, x - 5, y, 11, 1, 0xFFFF); + rgui_color_rect(rgui_frame_buf.data, fb_pitch, fb_width, fb_height, x, y - 5, 1, 11, 0xFFFF); + rgui_color_rect(rgui_frame_buf.data, fb_pitch, fb_width, fb_height, x - 5, y, 11, 1, 0xFFFF); } } -static void rgui_frame(void *data, video_frame_info_t *video_info) +static void rgui_render_osk(rgui_t *rgui, menu_animation_ctx_ticker_t *ticker) { - rgui_t *rgui = (rgui_t*)data; - settings_t *settings = config_get_ptr(); - - if ((settings->bools.menu_rgui_background_filler_thickness_enable != rgui->bg_thickness) || - (settings->bools.menu_rgui_border_filler_thickness_enable != rgui->border_thickness) - ) - rgui->bg_modified = true; - - rgui->bg_thickness = settings->bools.menu_rgui_background_filler_thickness_enable; - rgui->border_thickness = settings->bools.menu_rgui_border_filler_thickness_enable; - - if (settings->uints.menu_rgui_color_theme != rgui->color_theme) + size_t fb_pitch; + unsigned fb_width, fb_height; + size_t key_index; + + unsigned input_label_max_length; + unsigned input_str_max_length; + unsigned input_offset_x, input_offset_y; + + unsigned key_width, key_height; + unsigned key_text_offset_x, key_text_offset_y; + unsigned ptr_width, ptr_height; + unsigned ptr_offset_x, ptr_offset_y; + + unsigned keyboard_width, keyboard_height; + unsigned keyboard_offset_x, keyboard_offset_y; + + unsigned osk_width, osk_height; + unsigned osk_x, osk_y; + + int osk_ptr = menu_event_get_osk_ptr(); + char **osk_grid = menu_event_get_osk_grid(); + const char *input_str = menu_input_dialog_get_buffer(); + const char *input_label = menu_input_dialog_get_label_buffer(); + + /* Sanity check 1 */ + if (!rgui_frame_buf.data || osk_ptr < 0 || osk_ptr >= 44 || !osk_grid[0]) + return; + + /* Get dimensions/layout */ + menu_display_get_fb_size(&fb_width, &fb_height, &fb_pitch); + + key_text_offset_x = 8; + key_text_offset_y = 6; + key_width = FONT_WIDTH + (key_text_offset_x * 2); + key_height = FONT_HEIGHT + (key_text_offset_y * 2); + ptr_offset_x = 2; + ptr_offset_y = 2; + ptr_width = key_width - (ptr_offset_x * 2); + ptr_height = key_height - (ptr_offset_y * 2); + keyboard_width = key_width * OSK_CHARS_PER_LINE; + keyboard_height = key_height * 4; + keyboard_offset_x = 10; + keyboard_offset_y = 10 + 15 + (2 * FONT_HEIGHT_STRIDE); + input_label_max_length = (keyboard_width / FONT_WIDTH_STRIDE); + input_str_max_length = input_label_max_length - 1; + input_offset_x = 10 + (keyboard_width - (input_label_max_length * FONT_WIDTH_STRIDE)) / 2; + input_offset_y = 10; + osk_width = keyboard_width + 20; + osk_height = keyboard_offset_y + keyboard_height + 10; + osk_x = (fb_width - osk_width) / 2; + osk_y = (fb_height - osk_height) / 2; + + /* Sanity check 2 */ + if ((osk_width + 2 > fb_width) || (osk_height + 2 > fb_height)) { - prepare_rgui_colors(rgui, settings); + /* This can never happen, but have to make sure... + * If OSK cannot physically fit on the screen, + * fallback to old style 'message box' implementation */ + char msg[255]; + msg[0] = '\0'; + + snprintf(msg, sizeof(msg), "%s\n%s", input_label, input_str); + rgui_render_messagebox(rgui, msg); + + return; } - else if (settings->uints.menu_rgui_color_theme == RGUI_THEME_CUSTOM) + + /* Draw background */ + rgui_fill_rect(rgui, rgui_frame_buf.data, fb_pitch, + osk_x + 5, osk_y + 5, osk_width - 10, osk_height - 10, rgui_bg_filler); + + /* Draw border */ + if (rgui->border_enable) { - if (string_is_not_equal_fast(settings->paths.path_rgui_theme_preset, rgui->theme_preset_path, sizeof(rgui->theme_preset_path))) + /* Draw drop shadow, if required */ + if (rgui->shadow_enable) { - prepare_rgui_colors(rgui, settings); + /* Frame */ + rgui_color_rect(rgui_frame_buf.data, fb_pitch, fb_width, fb_height, + osk_x + 5, osk_y + 5, osk_width - 10, 1, rgui->colors.shadow_color); + rgui_color_rect(rgui_frame_buf.data, fb_pitch, fb_width, fb_height, + osk_x + osk_width, osk_y + 1, 1, osk_height, rgui->colors.shadow_color); + rgui_color_rect(rgui_frame_buf.data, fb_pitch, fb_width, fb_height, + osk_x + 1, osk_y + osk_height, osk_width, 1, rgui->colors.shadow_color); + rgui_color_rect(rgui_frame_buf.data, fb_pitch, fb_width, fb_height, + osk_x + 5, osk_y + 5, 1, osk_height - 10, rgui->colors.shadow_color); + /* Divider */ + rgui_color_rect(rgui_frame_buf.data, fb_pitch, fb_width, fb_height, + osk_x + 5, osk_y + keyboard_offset_y - 5, osk_width - 10, 1, rgui->colors.shadow_color); + } + + /* Frame */ + rgui_fill_rect(rgui, rgui_frame_buf.data, fb_pitch, + osk_x, osk_y, osk_width - 5, 5, rgui_border_filler); + rgui_fill_rect(rgui, rgui_frame_buf.data, fb_pitch, + osk_x + osk_width - 5, osk_y, 5, osk_height - 5, rgui_border_filler); + rgui_fill_rect(rgui, rgui_frame_buf.data, fb_pitch, + osk_x + 5, osk_y + osk_height - 5, osk_width - 5, 5, rgui_border_filler); + rgui_fill_rect(rgui, rgui_frame_buf.data, fb_pitch, + osk_x, osk_y + 5, 5, osk_height - 5, rgui_border_filler); + /* Divider */ + rgui_fill_rect(rgui, rgui_frame_buf.data, fb_pitch, + osk_x + 5, osk_y + keyboard_offset_y - 10, osk_width - 10, 5, rgui_border_filler); + } + + /* Draw input label text */ + if (!string_is_empty(input_label)) + { + char input_label_buf[255]; + unsigned input_label_length; + int input_label_x, input_label_y; + + input_label_buf[0] = '\0'; + + ticker->s = input_label_buf; + ticker->len = input_label_max_length; + ticker->str = input_label; + ticker->selected = true; + menu_animation_ticker(ticker); + + input_label_length = (unsigned)(utf8len(input_label_buf) * FONT_WIDTH_STRIDE); + input_label_x = osk_x + input_offset_x + ((input_label_max_length * FONT_WIDTH_STRIDE) - input_label_length) / 2; + input_label_y = osk_y + input_offset_y; + + blit_line(input_label_x, input_label_y, input_label_buf, + rgui->colors.normal_color, rgui->colors.shadow_color); + } + + /* Draw input buffer text */ + { + unsigned input_str_length; + unsigned input_str_char_offset; + int input_str_x, input_str_y; + int text_cursor_x; + + input_str_length = strlen(input_str); + if (input_str_length > input_str_max_length) + { + input_str_char_offset = input_str_length - input_str_max_length; + input_str_length = input_str_max_length; + } + else + input_str_char_offset = 0; + + input_str_x = osk_x + input_offset_x; + input_str_y = osk_y + input_offset_y + FONT_HEIGHT_STRIDE; + + if (!string_is_empty(input_str + input_str_char_offset)) + blit_line(input_str_x, input_str_y, input_str + input_str_char_offset, + rgui->colors.hover_color, rgui->colors.shadow_color); + + /* Draw text cursor */ + text_cursor_x = osk_x + input_offset_x + (input_str_length * FONT_WIDTH_STRIDE); + + blit_symbol(text_cursor_x, input_str_y, RGUI_SYMBOL_TEXT_CURSOR, + rgui->colors.normal_color, rgui->colors.shadow_color); + } + + /* Draw keyboard 'keys' */ + for (key_index = 0; key_index < 44; key_index++) + { + unsigned key_row = key_index / OSK_CHARS_PER_LINE; + unsigned key_column = key_index - (key_row * OSK_CHARS_PER_LINE); + + int key_text_x = osk_x + keyboard_offset_x + key_text_offset_x + (key_column * key_width); + int key_text_y = osk_y + keyboard_offset_y + key_text_offset_y + (key_row * key_height); + + const char *key_text = osk_grid[key_index]; + + /* 'Command' keys use custom symbols - have to + * detect them and use blit_symbol(). Everything + * else is plain text, and can be drawn directly + * using blit_line(). */ +#ifdef HAVE_LANGEXTRA + if ( string_is_equal(key_text, "\xe2\x87\xa6")) /* backspace character */ + blit_symbol(key_text_x, key_text_y, RGUI_SYMBOL_BACKSPACE, + rgui->colors.normal_color, rgui->colors.shadow_color); + else if (string_is_equal(key_text, "\xe2\x8f\x8e")) /* return character */ + blit_symbol(key_text_x, key_text_y, RGUI_SYMBOL_ENTER, + rgui->colors.normal_color, rgui->colors.shadow_color); + else if (string_is_equal(key_text, "\xe2\x87\xa7")) /* up arrow */ + blit_symbol(key_text_x, key_text_y, RGUI_SYMBOL_SHIFT_UP, + rgui->colors.normal_color, rgui->colors.shadow_color); + else if (string_is_equal(key_text, "\xe2\x87\xa9")) /* down arrow */ + blit_symbol(key_text_x, key_text_y, RGUI_SYMBOL_SHIFT_DOWN, + rgui->colors.normal_color, rgui->colors.shadow_color); + else if (string_is_equal(key_text, "\xe2\x8a\x95")) /* plus sign (next button) */ + blit_symbol(key_text_x, key_text_y, RGUI_SYMBOL_NEXT, + rgui->colors.normal_color, rgui->colors.shadow_color); +#else + if ( string_is_equal(key_text, "Bksp")) + blit_symbol(key_text_x, key_text_y, RGUI_SYMBOL_BACKSPACE, + rgui->colors.normal_color, rgui->colors.shadow_color); + else if (string_is_equal(key_text, "Enter")) + blit_symbol(key_text_x, key_text_y, RGUI_SYMBOL_ENTER, + rgui->colors.normal_color, rgui->colors.shadow_color); + else if (string_is_equal(key_text, "Upper")) + blit_symbol(key_text_x, key_text_y, RGUI_SYMBOL_SHIFT_UP, + rgui->colors.normal_color, rgui->colors.shadow_color); + else if (string_is_equal(key_text, "Lower")) + blit_symbol(key_text_x, key_text_y, RGUI_SYMBOL_SHIFT_DOWN, + rgui->colors.normal_color, rgui->colors.shadow_color); + else if (string_is_equal(key_text, "Next")) + blit_symbol(key_text_x, key_text_y, RGUI_SYMBOL_NEXT, + rgui->colors.normal_color, rgui->colors.shadow_color); +#endif + else + blit_line(key_text_x, key_text_y, key_text, + rgui->colors.normal_color, rgui->colors.shadow_color); + + /* Draw selection pointer */ + if (key_index == osk_ptr) + { + unsigned osk_ptr_x = osk_x + keyboard_offset_x + ptr_offset_x + (key_column * key_width); + unsigned osk_ptr_y = osk_y + keyboard_offset_y + ptr_offset_y + (key_row * key_height); + + /* Draw drop shadow, if required */ + if (rgui->shadow_enable) + { + rgui_color_rect(rgui_frame_buf.data, fb_pitch, fb_width, fb_height, + osk_ptr_x + 1, osk_ptr_y + 1, 1, ptr_height, rgui->colors.shadow_color); + rgui_color_rect(rgui_frame_buf.data, fb_pitch, fb_width, fb_height, + osk_ptr_x + 1, osk_ptr_y + 1, ptr_width, 1, rgui->colors.shadow_color); + rgui_color_rect(rgui_frame_buf.data, fb_pitch, fb_width, fb_height, + osk_ptr_x + ptr_width, osk_ptr_y + 1, 1, ptr_height, rgui->colors.shadow_color); + rgui_color_rect(rgui_frame_buf.data, fb_pitch, fb_width, fb_height, + osk_ptr_x + 1, osk_ptr_y + ptr_height, ptr_width, 1, rgui->colors.shadow_color); + } + + /* Draw selection rectangle */ + rgui_color_rect(rgui_frame_buf.data, fb_pitch, fb_width, fb_height, + osk_ptr_x, osk_ptr_y, 1, ptr_height, rgui->colors.hover_color); + rgui_color_rect(rgui_frame_buf.data, fb_pitch, fb_width, fb_height, + osk_ptr_x, osk_ptr_y, ptr_width, 1, rgui->colors.hover_color); + rgui_color_rect(rgui_frame_buf.data, fb_pitch, fb_width, fb_height, + osk_ptr_x + ptr_width - 1, osk_ptr_y, 1, ptr_height, rgui->colors.hover_color); + rgui_color_rect(rgui_frame_buf.data, fb_pitch, fb_width, fb_height, + osk_ptr_x, osk_ptr_y + ptr_height - 1, ptr_width, 1, rgui->colors.hover_color); } } } @@ -1473,7 +2307,7 @@ static void rgui_render(void *data, bool is_idle) menu_animation_ctx_ticker_t ticker; static const char* const ticker_spacer = RGUI_TICKER_SPACER; unsigned x, y; - size_t i, end, fb_pitch, old_start; + size_t i, end, fb_pitch, old_start, new_start; unsigned fb_width, fb_height; int bottom; size_t entries_end = 0; @@ -1484,6 +2318,17 @@ static void rgui_render(void *data, bool is_idle) static bool display_kb = false; bool current_display_cb = false; + /* Sanity check */ + if (!rgui || !rgui_frame_buf.data || !settings) + return; + + /* Apply pending aspect ratio update */ + if (rgui->aspect_update_pending) + { + command_event(CMD_EVENT_VIDEO_SET_ASPECT_RATIO, NULL); + rgui->aspect_update_pending = false; + } + current_display_cb = menu_input_dialog_get_display_kb(); if (!rgui->force_redraw) @@ -1506,10 +2351,7 @@ static void rgui_render(void *data, bool is_idle) /* if the framebuffer changed size, recache the background */ if (rgui->bg_modified || rgui->last_width != fb_width || rgui->last_height != fb_height) { - if (rgui_framebuf_data) - { - rgui_fill_rect(rgui, rgui_framebuf_data, fb_pitch, 0, fb_height, fb_width, 4, rgui_bg_filler); - } + rgui_cache_background(rgui); rgui->last_width = fb_width; rgui->last_height = fb_height; } @@ -1561,13 +2403,13 @@ static void rgui_render(void *data, bool is_idle) } /* Do not scroll if all items are visible. */ - if (menu_entries_get_size() <= RGUI_TERM_HEIGHT(fb_width, fb_height)) + if (menu_entries_get_size() <= RGUI_TERM_HEIGHT(fb_height)) { size_t start = 0; menu_entries_ctl(MENU_ENTRIES_CTL_SET_START, &start); } - bottom = (int)(menu_entries_get_size() - RGUI_TERM_HEIGHT(fb_width, fb_height)); + bottom = (int)(menu_entries_get_size() - RGUI_TERM_HEIGHT(fb_height)); menu_entries_ctl(MENU_ENTRIES_CTL_START_GET, &old_start); if (old_start > (unsigned)bottom) @@ -1577,21 +2419,11 @@ static void rgui_render(void *data, bool is_idle) entries_end = menu_entries_get_size(); - end = ((old_start + RGUI_TERM_HEIGHT(fb_width, fb_height)) <= (entries_end)) ? - old_start + RGUI_TERM_HEIGHT(fb_width, fb_height) : entries_end; + end = ((old_start + RGUI_TERM_HEIGHT(fb_height)) <= (entries_end)) ? + old_start + RGUI_TERM_HEIGHT(fb_height) : entries_end; - /* Render wallpaper or 'normal' background */ - if (rgui->show_wallpaper && wallpaper.is_valid) - { - /* If rgui_render_wallpaper() fails (can't actually happen...) - * then use 'normal' background fallback */ - if (!rgui_render_wallpaper()) - rgui_render_background(rgui); - } - else - { - rgui_render_background(rgui); - } + /* Render background */ + rgui_render_background(); /* We use a single ticker for all text animations, * with the following configuration: */ @@ -1599,48 +2431,86 @@ static void rgui_render(void *data, bool is_idle) ticker.type_enum = (enum menu_animation_ticker_type)settings->uints.menu_ticker_type; ticker.spacer = ticker_spacer; - /* If thumbnails are enabled and we are viewing a playlist, - * switch to thumbnail view mode if either current thumbnail - * is valid or we are waiting for current thumbnail to load - * (if load is pending we'll get a blank screen + title, but - * this is better than switching back to the text playlist - * view, which causes ugly flickering when scrolling quickly - * through a list...) */ - if (rgui->show_thumbnail && rgui->entry_has_thumbnail && (thumbnail.is_valid || (rgui->thumbnail_queue_size > 0))) + /* Note: On-screen keyboard takes precedence over + * normal menu thumbnail/text list display modes */ + if (current_display_cb) + rgui_render_osk(rgui, &ticker); + else if (rgui->show_fs_thumbnail && rgui->entry_has_thumbnail && (fs_thumbnail.is_valid || (rgui->thumbnail_queue_size > 0))) { + /* If fullscreen thumbnails are enabled and we are viewing a playlist, + * switch to fullscreen thumbnail view mode if either current thumbnail + * is valid or we are waiting for current thumbnail to load + * (if load is pending we'll get a blank screen + title, but + * this is better than switching back to the text playlist + * view, which causes ugly flickering when scrolling quickly + * through a list...) */ + const char *thumbnail_title = NULL; char thumbnail_title_buf[255]; unsigned title_x, title_width; thumbnail_title_buf[0] = '\0'; /* Draw thumbnail */ - rgui_render_thumbnail(); + rgui_render_fs_thumbnail(rgui); - /* Format thumbnail title */ - ticker.s = thumbnail_title_buf; - ticker.len = RGUI_TERM_WIDTH(fb_width) - 10; - ticker.str = rgui->thumbnail_content; - ticker.selected = true; - menu_animation_ticker(&ticker); - - title_width = utf8len(thumbnail_title_buf) * FONT_WIDTH_STRIDE; - title_x = RGUI_TERM_START_X(fb_width) + ((RGUI_TERM_WIDTH(fb_width) * FONT_WIDTH_STRIDE) - title_width) / 2; - - if (rgui_framebuf_data) + /* Get thumbnail title */ + if (menu_thumbnail_get_label(rgui->thumbnail_path_data, &thumbnail_title)) { + /* Format thumbnail title */ + ticker.s = thumbnail_title_buf; + ticker.len = RGUI_TERM_WIDTH(fb_width) - 10; + ticker.str = thumbnail_title; + ticker.selected = true; + menu_animation_ticker(&ticker); + + title_width = (unsigned)(utf8len(thumbnail_title_buf) * FONT_WIDTH_STRIDE); + title_x = RGUI_TERM_START_X(fb_width) + ((RGUI_TERM_WIDTH(fb_width) * FONT_WIDTH_STRIDE) - title_width) / 2; + /* Draw thumbnail title background */ - rgui_fill_rect(rgui, rgui_framebuf_data, fb_pitch, + rgui_fill_rect(rgui, rgui_frame_buf.data, fb_pitch, title_x - 5, 0, title_width + 10, FONT_HEIGHT_STRIDE, rgui_bg_filler); /* Draw thumbnail title */ - blit_line((int)title_x, 0, thumbnail_title_buf, rgui->colors.hover_color); + blit_line((int)title_x, 0, thumbnail_title_buf, + rgui->colors.hover_color, rgui->colors.shadow_color); } } else { - /* No thumbnail - render usual text */ + /* Render usual text */ + size_t selection = menu_navigation_get_selection(); char title_buf[255]; - unsigned timedate_x = RGUI_TERM_WIDTH(fb_width) * FONT_WIDTH_STRIDE - RGUI_TERM_START_X(fb_width); + unsigned timedate_x = (RGUI_TERM_START_X(fb_width) + (RGUI_TERM_WIDTH(fb_width) * FONT_WIDTH_STRIDE)) - + (5 * FONT_WIDTH_STRIDE); unsigned core_name_len = ((timedate_x - RGUI_TERM_START_X(fb_width)) / FONT_WIDTH_STRIDE) - 3; + bool show_mini_thumbnails = rgui->is_playlist && settings->bools.menu_rgui_inline_thumbnails; + bool show_thumbnail = false; + bool show_left_thumbnail = false; + unsigned thumbnail_panel_width = 0; + unsigned term_mid_point = 0; + + /* Cache mini thumbnail related parameters, if required */ + if (show_mini_thumbnails) + { + /* Get whether each thumbnail type is enabled */ + show_thumbnail = rgui->entry_has_thumbnail && + (mini_thumbnail.is_valid || (rgui->thumbnail_queue_size > 0)); + show_left_thumbnail = rgui->entry_has_left_thumbnail && + (mini_left_thumbnail.is_valid || (rgui->left_thumbnail_queue_size > 0)); + + /* Get maximum width of thumbnail 'panel' on right side + * of screen */ + thumbnail_panel_width = rgui_get_mini_thumbnail_fullwidth(); + + if ((rgui->entry_has_thumbnail && rgui->thumbnail_queue_size > 0) || + (rgui->entry_has_left_thumbnail && rgui->left_thumbnail_queue_size > 0)) + thumbnail_panel_width = mini_thumbnail_max_width; + + /* Index (relative to first displayed menu entry) of + * the vertical centre of RGUI's 'terminal' + * (required to determine whether a particular entry + * is adjacent to the 'right' or 'left' thumbnail) */ + term_mid_point = (unsigned)((RGUI_TERM_HEIGHT(fb_height) * 0.5f) + 0.5f) - 1; + } /* Print title */ title_buf[0] = '\0'; @@ -1654,33 +2524,30 @@ static void rgui_render(void *data, bool is_idle) string_to_upper(title_buf); - if (rgui_framebuf_data) - blit_line( - (int)(RGUI_TERM_START_X(fb_width) + (RGUI_TERM_WIDTH(fb_width) - - utf8len(title_buf)) * FONT_WIDTH_STRIDE / 2), - RGUI_TERM_START_X(fb_width), - title_buf, rgui->colors.title_color); + blit_line( + (int)(RGUI_TERM_START_X(fb_width) + (RGUI_TERM_WIDTH(fb_width) + - utf8len(title_buf)) * FONT_WIDTH_STRIDE / 2), + RGUI_TERM_START_Y(fb_height) - FONT_HEIGHT_STRIDE, + title_buf, rgui->colors.title_color, rgui->colors.shadow_color); /* Print menu entries */ x = RGUI_TERM_START_X(fb_width); y = RGUI_TERM_START_Y(fb_height); - menu_entries_ctl(MENU_ENTRIES_CTL_START_GET, &i); + menu_entries_ctl(MENU_ENTRIES_CTL_START_GET, &new_start); - for (; i < end; i++, y += FONT_HEIGHT_STRIDE) + for (i = new_start; i < end; i++, y += FONT_HEIGHT_STRIDE) { char entry_value[255]; char message[255]; char entry_title_buf[255]; char type_str_buf[255]; menu_entry_t entry; - char *entry_path = NULL; size_t entry_title_max_len = 0; size_t entry_title_buf_utf8len = 0; size_t entry_title_buf_len = 0; unsigned entry_value_len = 0; - bool entry_selected = menu_entry_is_currently_selected((unsigned)i); - size_t selection = menu_navigation_get_selection(); + bool entry_selected = (i == selection); if (i > (selection + 100)) continue; @@ -1694,13 +2561,51 @@ static void rgui_render(void *data, bool is_idle) menu_entry_init(&entry); menu_entry_get(&entry, 0, (unsigned)i, NULL, true); - /* Read entry parameters */ - entry_path = menu_entry_get_rich_label(&entry); + /* Read entry parameters + * Note: can use entry.path/entry.rich_label directly, + * but have to use menu_entry_get_value() for the value + * since this function handles password entries... */ menu_entry_get_value(&entry, entry_value, sizeof(entry_value)); - /* Get base width of entry title field */ + /* Get base length of entry title field */ entry_title_max_len = RGUI_TERM_WIDTH(fb_width) - (1 + 2); + /* If showing mini thumbnails, reduce title field length accordingly */ + if (show_mini_thumbnails) + { + unsigned term_offset = settings->bools.menu_rgui_swap_thumbnails ? + (RGUI_TERM_HEIGHT(fb_height) - (i - new_start) - 1) : (i - new_start); + unsigned thumbnail_width = 0; + + /* Note: + * - 'Right' thumbnail is drawn at the top + * - 'Left' thumbnail is drawn at the bottom + * ...unless thumbnail postions are swapped. + * (legacy naming, unfortunately...) */ + + /* An annoyance - cannot assume terminal will have a + * standard layout (even though it always will...), + * so have to check whether there are an odd or even + * number of entries... */ + if((RGUI_TERM_HEIGHT(fb_height) & 1) == 0) + { + /* Even number of entries */ + if ((show_thumbnail && (term_offset <= term_mid_point)) || + (show_left_thumbnail && (term_offset > term_mid_point))) + thumbnail_width = thumbnail_panel_width; + } + else + { + /* Odd number of entries (will always be the case) */ + if ((show_thumbnail && (term_offset < term_mid_point)) || + (show_left_thumbnail && (term_offset > term_mid_point)) || + ((show_thumbnail || show_left_thumbnail) && (term_offset == term_mid_point))) + thumbnail_width = thumbnail_panel_width; + } + + entry_title_max_len -= (thumbnail_width / FONT_WIDTH_STRIDE) + 1; + } + /* Determine whether entry has a value component */ if (!string_is_empty(entry_value)) { @@ -1708,7 +2613,8 @@ static void rgui_render(void *data, bool is_idle) { /* Resize fields according to actual length of value string */ entry_value_len = strlen(entry_value); - entry_value_len = entry_value_len > RGUI_ENTRY_VALUE_MAXLEN ? RGUI_ENTRY_VALUE_MAXLEN : entry_value_len; + entry_value_len = entry_value_len > rgui_term_layout.value_maxlen ? + rgui_term_layout.value_maxlen : entry_value_len; } else { @@ -1720,12 +2626,10 @@ static void rgui_render(void *data, bool is_idle) entry_title_max_len -= entry_value_len + 2; } - menu_entry_free(&entry); - /* Format entry title string */ ticker.s = entry_title_buf; ticker.len = entry_title_max_len; - ticker.str = entry_path; + ticker.str = string_is_empty(entry.rich_label) ? entry.path : entry.rich_label; ticker.selected = entry_selected; menu_animation_ticker(&ticker); @@ -1761,12 +2665,21 @@ static void rgui_render(void *data, bool is_idle) entry_title_buf); } - if (rgui_framebuf_data) - blit_line(x, y, message, - entry_selected ? rgui->colors.hover_color : rgui->colors.normal_color); + blit_line(x, y, message, + entry_selected ? rgui->colors.hover_color : rgui->colors.normal_color, + rgui->colors.shadow_color); - if (!string_is_empty(entry_path)) - free(entry_path); + menu_entry_free(&entry); + } + + /* Draw mini thumbnails, if required */ + if (show_mini_thumbnails) + { + if (show_thumbnail) + rgui_render_mini_thumbnail(rgui, &mini_thumbnail, MENU_THUMBNAIL_RIGHT); + + if (show_left_thumbnail) + rgui_render_mini_thumbnail(rgui, &mini_left_thumbnail, MENU_THUMBNAIL_LEFT); } /* Print menu sublabel/core name (if required) */ @@ -1782,11 +2695,11 @@ static void rgui_render(void *data, bool is_idle) menu_animation_ticker(&ticker); - if (rgui_framebuf_data) - blit_line( - RGUI_TERM_START_X(fb_width) + FONT_WIDTH_STRIDE, - (RGUI_TERM_HEIGHT(fb_width, fb_height) * FONT_HEIGHT_STRIDE) + - RGUI_TERM_START_Y(fb_height) + 2, sublabel_buf, rgui->colors.hover_color); + blit_line( + RGUI_TERM_START_X(fb_width) + FONT_WIDTH_STRIDE, + (RGUI_TERM_HEIGHT(fb_height) * FONT_HEIGHT_STRIDE) + + RGUI_TERM_START_Y(fb_height) + 2, sublabel_buf, + rgui->colors.hover_color, rgui->colors.shadow_color); } else if (settings->bools.menu_core_enable) { @@ -1803,47 +2716,44 @@ static void rgui_render(void *data, bool is_idle) menu_animation_ticker(&ticker); - if (rgui_framebuf_data) - blit_line( - RGUI_TERM_START_X(fb_width) + FONT_WIDTH_STRIDE, - (RGUI_TERM_HEIGHT(fb_width, fb_height) * FONT_HEIGHT_STRIDE) + - RGUI_TERM_START_Y(fb_height) + 2, core_title_buf, rgui->colors.hover_color); + blit_line( + RGUI_TERM_START_X(fb_width) + FONT_WIDTH_STRIDE, + (RGUI_TERM_HEIGHT(fb_height) * FONT_HEIGHT_STRIDE) + + RGUI_TERM_START_Y(fb_height) + 2, core_title_buf, + rgui->colors.hover_color, rgui->colors.shadow_color); } } /* Print clock (if required) */ if (settings->bools.menu_timedate_enable) { - menu_display_ctx_datetime_t datetime; - char timedate[255]; + time_t current_time; + struct tm * time_info; + char timedate[16]; - timedate[0] = '\0'; + timedate[0] = '\0'; - datetime.s = timedate; - datetime.len = sizeof(timedate); - datetime.time_mode = 4; + /* menu_display_timedate() is incredibly slow + * -> do this the old fashioned way... */ - menu_display_timedate(&datetime); + /* Get current time */ + time(¤t_time); + time_info = localtime(¤t_time); + + if (time_info) + { + snprintf(timedate, sizeof(timedate), "%02u:%02u", + (unsigned)time_info->tm_hour, (unsigned)time_info->tm_min); - if (rgui_framebuf_data) blit_line( timedate_x, - (RGUI_TERM_HEIGHT(fb_width, fb_height) * FONT_HEIGHT_STRIDE) + - RGUI_TERM_START_Y(fb_height) + 2, timedate, rgui->colors.hover_color); + (RGUI_TERM_HEIGHT(fb_height) * FONT_HEIGHT_STRIDE) + + RGUI_TERM_START_Y(fb_height) + 2, timedate, + rgui->colors.hover_color, rgui->colors.shadow_color); + } } } - if (current_display_cb) - { - char msg[255]; - const char *str = menu_input_dialog_get_buffer(); - const char *label = menu_input_dialog_get_label_buffer(); - msg[0] = '\0'; - - snprintf(msg, sizeof(msg), "%s\n%s", label, str); - rgui_render_messagebox(rgui, msg); - } - if (!string_is_empty(rgui->msgbox)) { rgui_render_messagebox(rgui, rgui->msgbox); @@ -1864,17 +2774,308 @@ static void rgui_render(void *data, bool is_idle) static void rgui_framebuffer_free(void) { - if (rgui_framebuf_data) - free(rgui_framebuf_data); - rgui_framebuf_data = NULL; + rgui_frame_buf.width = 0; + rgui_frame_buf.height = 0; + + if (rgui_frame_buf.data) + free(rgui_frame_buf.data); + rgui_frame_buf.data = NULL; +} + +static void rgui_background_free(void) +{ + rgui_background_buf.width = 0; + rgui_background_buf.height = 0; + + if (rgui_background_buf.data) + free(rgui_background_buf.data); + rgui_background_buf.data = NULL; +} + +static void rgui_thumbnail_free(thumbnail_t *thumbnail) +{ + if (!thumbnail) + return; + + thumbnail->max_width = 0; + thumbnail->max_height = 0; + thumbnail->width = 0; + thumbnail->height = 0; + thumbnail->is_valid = false; + + if (!string_is_empty(thumbnail->path)) + free(thumbnail->path); + thumbnail->path = NULL; + + if (thumbnail->data) + free(thumbnail->data); + thumbnail->data = NULL; +} + +bool rgui_is_video_config_equal(rgui_video_settings_t *config_a, rgui_video_settings_t *config_b) +{ + return (config_a->aspect_ratio_idx == config_b->aspect_ratio_idx) && + (config_a->viewport.width == config_b->viewport.width) && + (config_a->viewport.height == config_b->viewport.height) && + (config_a->viewport.x == config_b->viewport.x) && + (config_a->viewport.y == config_b->viewport.y); +} + +static void rgui_get_video_config(rgui_video_settings_t *video_settings) +{ + settings_t *settings = config_get_ptr(); + /* Could use settings->video_viewport_custom directly, + * but this seems to be the standard way of doing it... */ + video_viewport_t *custom_vp = video_viewport_get_custom(); + + if (!settings) + return; + + video_settings->aspect_ratio_idx = settings->uints.video_aspect_ratio_idx; + video_settings->viewport.width = custom_vp->width; + video_settings->viewport.height = custom_vp->height; + video_settings->viewport.x = custom_vp->x; + video_settings->viewport.y = custom_vp->y; +} + +static void rgui_set_video_config(rgui_t *rgui, rgui_video_settings_t *video_settings, bool delay_update) +{ + settings_t *settings = config_get_ptr(); + /* Could use settings->video_viewport_custom directly, + * but this seems to be the standard way of doing it... */ + video_viewport_t *custom_vp = video_viewport_get_custom(); + + if (!settings) + return; + + settings->uints.video_aspect_ratio_idx = video_settings->aspect_ratio_idx; + custom_vp->width = video_settings->viewport.width; + custom_vp->height = video_settings->viewport.height; + custom_vp->x = video_settings->viewport.x; + custom_vp->y = video_settings->viewport.y; + + aspectratio_lut[ASPECT_RATIO_CUSTOM].value = + (float)custom_vp->width / custom_vp->height; + + if (delay_update) + rgui->aspect_update_pending = true; + else + { + command_event(CMD_EVENT_VIDEO_SET_ASPECT_RATIO, NULL); + rgui->aspect_update_pending = false; + } +} + +/* Note: This function is only called when aspect ratio + * lock is enabled */ +static void rgui_update_menu_viewport(rgui_t *rgui) +{ + settings_t *settings = config_get_ptr(); + size_t fb_pitch; + unsigned fb_width, fb_height; + struct video_viewport vp; + + if (!settings) + return; + + menu_display_get_fb_size(&fb_width, &fb_height, &fb_pitch); + video_driver_get_viewport_info(&vp); + + /* Could do this once in rgui_init(), but seems cleaner to + * handle all video config in one place... */ + rgui->menu_video_settings.aspect_ratio_idx = ASPECT_RATIO_CUSTOM; + + /* Determine custom viewport layout */ + if (fb_width > 0 && fb_height > 0 && vp.full_width > 0 && vp.full_height > 0) + { + /* Check whether we need to perform integer scaling */ + bool do_integer_scaling = (settings->uints.menu_rgui_aspect_ratio_lock == RGUI_ASPECT_RATIO_LOCK_INTEGER); + + if (do_integer_scaling) + { + unsigned width_scale = (vp.full_width / fb_width); + unsigned height_scale = (vp.full_height / fb_height); + unsigned scale = (width_scale <= height_scale) ? width_scale : height_scale; + + if (scale > 0) + { + rgui->menu_video_settings.viewport.width = scale * fb_width; + rgui->menu_video_settings.viewport.height = scale * fb_height; + } + else + do_integer_scaling = false; + } + + if (!do_integer_scaling) + { + float display_aspect_ratio = (float)vp.full_width / (float)vp.full_height; + float aspect_ratio = (float)fb_width / (float)fb_height; + + if (aspect_ratio > display_aspect_ratio) + { + rgui->menu_video_settings.viewport.width = vp.full_width; + rgui->menu_video_settings.viewport.height = fb_height * vp.full_width / fb_width; + } + else + { + rgui->menu_video_settings.viewport.height = vp.full_height; + rgui->menu_video_settings.viewport.width = fb_width * vp.full_height / fb_height; + } + } + + /* Sanity check */ + rgui->menu_video_settings.viewport.width = (rgui->menu_video_settings.viewport.width < 1) ? + 1 : rgui->menu_video_settings.viewport.width; + rgui->menu_video_settings.viewport.height = (rgui->menu_video_settings.viewport.height < 1) ? + 1 : rgui->menu_video_settings.viewport.height; + } + else + { + rgui->menu_video_settings.viewport.width = 1; + rgui->menu_video_settings.viewport.height = 1; + } + + rgui->menu_video_settings.viewport.x = (vp.full_width - rgui->menu_video_settings.viewport.width) / 2; + rgui->menu_video_settings.viewport.y = (vp.full_height - rgui->menu_video_settings.viewport.height) / 2; +} + +static bool rgui_set_aspect_ratio(rgui_t *rgui, bool delay_update) +{ + unsigned base_term_width; + settings_t *settings = config_get_ptr(); + + rgui_framebuffer_free(); + rgui_background_free(); + rgui_thumbnail_free(&fs_thumbnail); + rgui_thumbnail_free(&mini_thumbnail); + rgui_thumbnail_free(&mini_left_thumbnail); + + /* Cache new aspect ratio */ + rgui->menu_aspect_ratio = settings->uints.menu_rgui_aspect_ratio; + +#if defined(GEKKO) + /* Set frame buffer dimensions + * and update menu aspect index */ + rgui_frame_buf.height = 240; + rgui_frame_buf.width = 320; + base_term_width = rgui_frame_buf.width; + + /* Allocate frame buffer */ + rgui_frame_buf.data = (uint16_t*)calloc( + 400 * rgui_frame_buf.height, sizeof(uint16_t)); + +#else + + /* Set frame buffer dimensions + * and update menu aspect index */ + rgui_frame_buf.height = 240; + switch (settings->uints.menu_rgui_aspect_ratio) + { + case RGUI_ASPECT_RATIO_16_9: + rgui_frame_buf.width = 426; + base_term_width = rgui_frame_buf.width; + break; + case RGUI_ASPECT_RATIO_16_9_CENTRE: + rgui_frame_buf.width = 426; + base_term_width = 320; + break; + case RGUI_ASPECT_RATIO_16_10: + rgui_frame_buf.width = 384; + base_term_width = rgui_frame_buf.width; + break; + case RGUI_ASPECT_RATIO_16_10_CENTRE: + rgui_frame_buf.width = 384; + base_term_width = 320; + break; + default: + /* 4:3 */ + rgui_frame_buf.width = 320; + base_term_width = rgui_frame_buf.width; + break; + } + + /* Allocate frame buffer */ + rgui_frame_buf.data = (uint16_t*)calloc( + rgui_frame_buf.width * rgui_frame_buf.height, sizeof(uint16_t)); + +#endif + + if (!rgui_frame_buf.data) + return false; + + /* Configure 'menu display' settings */ + menu_display_set_width(rgui_frame_buf.width); + menu_display_set_height(rgui_frame_buf.height); + menu_display_set_framebuffer_pitch(rgui_frame_buf.width * sizeof(uint16_t)); + + /* Determine terminal layout */ + rgui_term_layout.start_x = (3 * 5) + 1; + rgui_term_layout.start_y = (3 * 5) + FONT_HEIGHT_STRIDE; + rgui_term_layout.width = (base_term_width - (2 * rgui_term_layout.start_x)) / FONT_WIDTH_STRIDE; + rgui_term_layout.height = (rgui_frame_buf.height - (2 * rgui_term_layout.start_y)) / FONT_HEIGHT_STRIDE; + rgui_term_layout.value_maxlen = (unsigned)(((float)RGUI_ENTRY_VALUE_MAXLEN * (float)base_term_width / 320.0f) + 0.5); + + /* > 'Start X/Y' adjustments */ + rgui_term_layout.start_x = (rgui_frame_buf.width - (rgui_term_layout.width * FONT_WIDTH_STRIDE)) / 2; + rgui_term_layout.start_y = (rgui_frame_buf.height - (rgui_term_layout.height * FONT_HEIGHT_STRIDE)) / 2; + + /* Allocate background buffer + * (4 extra lines to store a copy of the chequered background) */ + rgui_background_buf.width = rgui_frame_buf.width; + rgui_background_buf.height = rgui_frame_buf.height; + rgui_background_buf.data = (uint16_t*)calloc( + rgui_background_buf.width * (rgui_background_buf.height + 4), sizeof(uint16_t)); + + if (!rgui_background_buf.data) + return false; + + /* Allocate thumbnail buffer */ + fs_thumbnail.max_width = rgui_frame_buf.width; + fs_thumbnail.max_height = rgui_frame_buf.height; + fs_thumbnail.data = (uint16_t*)calloc( + fs_thumbnail.max_width * fs_thumbnail.max_height, sizeof(uint16_t)); + if (!fs_thumbnail.data) + return false; + + /* Allocate mini thumbnail buffers */ + mini_thumbnail_max_width = ((rgui_term_layout.width - 4) > 19 ? 19 : (rgui_term_layout.width - 4)) * FONT_WIDTH_STRIDE; + mini_thumbnail_max_height = (unsigned)((rgui_term_layout.height * FONT_HEIGHT_STRIDE) * 0.5f) - 2; + + mini_thumbnail.max_width = mini_thumbnail_max_width; + mini_thumbnail.max_height = mini_thumbnail_max_height; + mini_thumbnail.data = (uint16_t*)calloc( + mini_thumbnail.max_width * mini_thumbnail.max_height, sizeof(uint16_t)); + if (!mini_thumbnail.data) + return false; + + mini_left_thumbnail.max_width = mini_thumbnail_max_width; + mini_left_thumbnail.max_height = mini_thumbnail_max_height; + mini_left_thumbnail.data = (uint16_t*)calloc( + mini_left_thumbnail.max_width * mini_left_thumbnail.max_height, sizeof(uint16_t)); + if (!mini_left_thumbnail.data) + return false; + + /* Trigger background/display update */ + rgui->theme_preset_path[0] = '\0'; + rgui->bg_modified = true; + rgui->force_redraw = true; + + /* If aspect ratio lock is enabled, notify + * video driver of change */ + if (settings->uints.menu_rgui_aspect_ratio_lock != RGUI_ASPECT_RATIO_LOCK_NONE) + { + rgui_update_menu_viewport(rgui); + rgui_set_video_config(rgui, &rgui->menu_video_settings, delay_update); + } + + return true; } static void *rgui_init(void **userdata, bool video_is_threaded) { - size_t fb_pitch, start; - unsigned fb_width, fb_height, new_font_height; + unsigned new_font_height; + size_t start; rgui_t *rgui = NULL; - bool ret = false; settings_t *settings = config_get_ptr(); menu_handle_t *menu = (menu_handle_t*)calloc(1, sizeof(*menu)); @@ -1888,53 +3089,84 @@ static void *rgui_init(void **userdata, bool video_is_threaded) *userdata = rgui; +#if defined(HAVE_MENU_WIDGETS) + /* We have to be somewhat careful here, since some + * platforms do not like video_driver_texture-related + * operations (e.g. 3DS). We would hope that these + * platforms will always have HAVE_MENU_WIDGETS disabled, + * but for extra safety we will only permit menu widget + * additions when the current gfx driver reports that it + * has widget support */ + rgui->widgets_supported = video_driver_has_widgets(); + + if (rgui->widgets_supported) + { + if (!menu_display_init_first_driver(video_is_threaded)) + goto error; + + menu_display_allocate_white_texture(); + } +#endif + rgui->menu_title[0] = '\0'; rgui->menu_sublabel[0] = '\0'; + /* Cache initial video settings */ + rgui_get_video_config(&rgui->content_video_settings); + + /* Set aspect ratio + * - Allocates frame buffer + * - Configures variable 'menu display' settings */ + rgui->menu_aspect_ratio_lock = settings->uints.menu_rgui_aspect_ratio_lock; + rgui->aspect_update_pending = false; + if (!rgui_set_aspect_ratio(rgui, false)) + goto error; + + /* Fixed 'menu display' settings */ + new_font_height = FONT_HEIGHT_STRIDE * 2; + menu_display_set_header_height(new_font_height); + /* Prepare RGUI colors, to improve performance */ rgui->theme_preset_path[0] = '\0'; prepare_rgui_colors(rgui, settings); - /* 4 extra lines to cache the checked background */ - rgui_framebuf_data = (uint16_t*) - calloc(400 * (240 + 4), sizeof(uint16_t)); - - if (!rgui_framebuf_data) - goto error; - - fb_width = 320; - fb_height = 240; - fb_pitch = fb_width * sizeof(uint16_t); - new_font_height = FONT_HEIGHT_STRIDE * 2; - - menu_display_set_width(fb_width); - menu_display_set_height(fb_height); - menu_display_set_header_height(new_font_height); - menu_display_set_framebuffer_pitch(fb_pitch); - start = 0; menu_entries_ctl(MENU_ENTRIES_CTL_SET_START, &start); - ret = rguidisp_init_font(menu); + rgui_init_font_lut(); - if (!ret) + rgui->bg_thickness = settings->bools.menu_rgui_background_filler_thickness_enable; + rgui->border_thickness = settings->bools.menu_rgui_border_filler_thickness_enable; + rgui->border_enable = settings->bools.menu_rgui_border_filler_enable; + rgui->shadow_enable = settings->bools.menu_rgui_shadows; + rgui->extended_ascii_enable = settings->bools.menu_rgui_extended_ascii; + + rgui->last_width = rgui_frame_buf.width; + rgui->last_height = rgui_frame_buf.height; + + /* Set initial 'blit_line/symbol' functions */ + rgui_set_blit_functions( + settings->bools.menu_rgui_shadows, settings->bools.menu_rgui_extended_ascii); + + rgui->thumbnail_path_data = menu_thumbnail_path_init(); + if (!rgui->thumbnail_path_data) goto error; - rgui->bg_thickness = settings->bools.menu_rgui_background_filler_thickness_enable; - rgui->border_thickness = settings->bools.menu_rgui_border_filler_thickness_enable; - rgui->bg_modified = true; - - rgui->last_width = fb_width; - rgui->last_height = fb_height; - rgui->thumbnail_queue_size = 0; - /* Ensure that we start with thumbnails disabled */ - rgui->show_thumbnail = false; + rgui->left_thumbnail_queue_size = 0; + rgui->thumbnail_load_pending = false; + rgui->thumbnail_load_trigger_time = 0; + /* Ensure that we start with fullscreen thumbnails disabled */ + rgui->show_fs_thumbnail = false; return menu; error: rgui_framebuffer_free(); + rgui_background_free(); + rgui_thumbnail_free(&fs_thumbnail); + rgui_thumbnail_free(&mini_thumbnail); + rgui_thumbnail_free(&mini_left_thumbnail); if (menu) free(menu); return NULL; @@ -1942,41 +3174,24 @@ error: static void rgui_free(void *data) { - const uint8_t *font_fb; - bool fb_font_inited = false; rgui_t *rgui = (rgui_t*)data; if (rgui) { - if (!string_is_empty(rgui->thumbnail_system)) - free(rgui->thumbnail_system); - if (!string_is_empty(rgui->thumbnail_content)) - free(rgui->thumbnail_content); - if (!string_is_empty(rgui->thumbnail_path)) - free(rgui->thumbnail_path); + if (rgui->thumbnail_path_data) + free(rgui->thumbnail_path_data); } - fb_font_inited = menu_display_get_font_data_init(); - font_fb = menu_display_get_font_framebuffer(); - - if (fb_font_inited) - free((void*)font_fb); - - fb_font_inited = false; - menu_display_set_font_data_init(fb_font_inited); - rgui_framebuffer_free(); + rgui_background_free(); + rgui_thumbnail_free(&fs_thumbnail); + rgui_thumbnail_free(&mini_thumbnail); + rgui_thumbnail_free(&mini_left_thumbnail); - if (!string_is_empty(thumbnail.path)) - free(thumbnail.path); - - if (!string_is_empty(wallpaper.path)) - free(wallpaper.path); - - if (upscale_buf.data) + if (rgui_upscale_buf.data) { - free(upscale_buf.data); - upscale_buf.data = NULL; + free(rgui_upscale_buf.data); + rgui_upscale_buf.data = NULL; } } @@ -1996,7 +3211,7 @@ static void rgui_set_texture(void) if (settings->uints.menu_rgui_internal_upscale_level == RGUI_UPSCALE_NONE) { - video_driver_set_texture_frame(rgui_framebuf_data, + video_driver_set_texture_frame(rgui_frame_buf.data, false, fb_width, fb_height, 1.0f); } else @@ -2009,7 +3224,7 @@ static void rgui_set_texture(void) * than the menu framebuffer, no scaling is required */ if ((vp.width <= fb_width) && (vp.height <= fb_height)) { - video_driver_set_texture_frame(rgui_framebuf_data, + video_driver_set_texture_frame(rgui_frame_buf.data, false, fb_width, fb_height, 1.0f); } else @@ -2033,25 +3248,25 @@ static void rgui_set_texture(void) } /* Allocate upscaling buffer, if required */ - if ((upscale_buf.width != out_width) || (upscale_buf.height != out_height) || !upscale_buf.data) + if ((rgui_upscale_buf.width != out_width) || (rgui_upscale_buf.height != out_height) || !rgui_upscale_buf.data) { - upscale_buf.width = out_width; - upscale_buf.height = out_height; + rgui_upscale_buf.width = out_width; + rgui_upscale_buf.height = out_height; - if (upscale_buf.data) + if (rgui_upscale_buf.data) { - free(upscale_buf.data); - upscale_buf.data = NULL; + free(rgui_upscale_buf.data); + rgui_upscale_buf.data = NULL; } - upscale_buf.data = (uint16_t*)calloc(out_width * out_height, sizeof(uint16_t)); - if (!upscale_buf.data) + rgui_upscale_buf.data = (uint16_t*)calloc(out_width * out_height, sizeof(uint16_t)); + if (!rgui_upscale_buf.data) { /* Uh oh... This could mean we don't have enough * memory, so disable upscaling and draw the usual * framebuffer... */ settings->uints.menu_rgui_internal_upscale_level = RGUI_UPSCALE_NONE; - video_driver_set_texture_frame(rgui_framebuf_data, + video_driver_set_texture_frame(rgui_frame_buf.data, false, fb_width, fb_height, 1.0f); return; } @@ -2069,12 +3284,12 @@ static void rgui_set_texture(void) for (x_dst = 0; x_dst < out_width; x_dst++) { x_src = (x_dst * x_ratio) >> 16; - upscale_buf.data[(y_dst * out_width) + x_dst] = rgui_framebuf_data[(y_src * fb_width) + x_src]; + rgui_upscale_buf.data[(y_dst * out_width) + x_dst] = rgui_frame_buf.data[(y_src * fb_width) + x_src]; } } /* Draw upscaled texture */ - video_driver_set_texture_frame(upscale_buf.data, + video_driver_set_texture_frame(rgui_upscale_buf.data, false, out_width, out_height, 1.0f); } } @@ -2092,178 +3307,130 @@ static void rgui_navigation_clear(void *data, bool pending_push) rgui->scroll_y = 0; } -static const char *rgui_thumbnail_ident(void) -{ - char folder = 0; - settings_t *settings = config_get_ptr(); - - folder = settings->uints.menu_thumbnails; - - switch (folder) - { - case 1: - return "Named_Snaps"; - case 2: - return "Named_Titles"; - case 3: - return "Named_Boxarts"; - case 0: - default: - break; - } - - return msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF); -} - -static bool rgui_update_thumbnail_path(void *userdata) -{ - rgui_t *rgui = (rgui_t*)userdata; - settings_t *settings = config_get_ptr(); - char new_path[PATH_MAX_LENGTH] = {0}; - const char *thumbnail_base_dir = settings->paths.directory_thumbnails; - const char *thumb_ident = rgui_thumbnail_ident(); - - if (!string_is_empty(rgui->thumbnail_path)) - { - free(rgui->thumbnail_path); - rgui->thumbnail_path = NULL; - } - - /* NB: The following is copied directly from xmb.c (xmb_update_thumbnail_path()) */ - if (!string_is_equal(thumb_ident, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF)) && - !string_is_empty(thumbnail_base_dir) && - !string_is_empty(rgui->thumbnail_system) && - !string_is_empty(rgui->thumbnail_content)) - { - /* Append thumbnail system directory */ - fill_pathname_join(new_path, thumbnail_base_dir, rgui->thumbnail_system, sizeof(new_path)); - - if (!string_is_empty(new_path)) - { - char *tmp_new2 = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); - tmp_new2[0] = '\0'; - - /* Append Named_Snaps/Named_Boxarts/Named_Titles */ - fill_pathname_join(tmp_new2, new_path, thumb_ident, PATH_MAX_LENGTH * sizeof(char)); - - strlcpy(new_path, tmp_new2, PATH_MAX_LENGTH * sizeof(char)); - free(tmp_new2); - tmp_new2 = NULL; - - if (!string_is_empty(new_path)) - { - /* Scrub characters that are not cross-platform and/or violate the - * No-Intro filename standard: - * http://datomatic.no-intro.org/stuff/The%20Official%20No-Intro%20Convention%20(20071030).zip - * Replace these characters in the entry name with underscores. - */ - char *scrub_char_pointer = NULL; - char *tmp_new = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); - char *tmp = strdup(rgui->thumbnail_content); - - tmp_new[0] = '\0'; - - while((scrub_char_pointer = strpbrk(tmp, "&*/:`\"<>?\\|"))) - *scrub_char_pointer = '_'; - - fill_pathname_join(tmp_new, new_path, tmp, PATH_MAX_LENGTH * sizeof(char)); - - if (!string_is_empty(tmp_new)) - strlcpy(new_path, tmp_new, sizeof(new_path)); - - free(tmp_new); - tmp_new = NULL; - free(tmp); - tmp = NULL; - - /* Append png extension */ - if (!string_is_empty(new_path)) - { - strlcat(new_path, file_path_str(FILE_PATH_PNG_EXTENSION), sizeof(new_path)); - - if (!string_is_empty(new_path)) - { - rgui->thumbnail_path = strdup(new_path); - return true; - } - } - } - } - } - - return false; -} - static void rgui_set_thumbnail_system(void *userdata, char *s, size_t len) { rgui_t *rgui = (rgui_t*)userdata; if (!rgui) return; - if (!string_is_empty(rgui->thumbnail_system)) - free(rgui->thumbnail_system); - rgui->thumbnail_system = strdup(s); + menu_thumbnail_set_system(rgui->thumbnail_path_data, s); } -static bool rgui_update_thumbnail_content(void *userdata) +static void rgui_load_current_thumbnails(rgui_t *rgui) { - rgui_t *rgui = (rgui_t*)userdata; - playlist_t *playlist = NULL; - size_t selection = menu_navigation_get_selection(); - - if (!rgui) - return false; - - /* Get label of currently selected playlist entry */ - playlist = playlist_get_cached(); - if (playlist) + const char *thumbnail_path = NULL; + const char *left_thumbnail_path = NULL; + + /* Right (or fullscreen) thumbnail */ + if (menu_thumbnail_get_path(rgui->thumbnail_path_data, + MENU_THUMBNAIL_RIGHT, &thumbnail_path)) { - if (selection < playlist_get_size(playlist)) + rgui->entry_has_thumbnail = request_thumbnail( + rgui->show_fs_thumbnail ? &fs_thumbnail : &mini_thumbnail, + MENU_THUMBNAIL_RIGHT, &rgui->thumbnail_queue_size, thumbnail_path); + } + + /* Left thumbnail + * (Note: there is no need to load this when viewing + * fullscreen thumbnails) */ + if (!rgui->show_fs_thumbnail) + { + if (menu_thumbnail_get_path(rgui->thumbnail_path_data, + MENU_THUMBNAIL_LEFT, &left_thumbnail_path)) { - const char *label = NULL; - playlist_get_index(playlist, selection, NULL, &label, NULL, NULL, NULL, NULL); - - if (!string_is_empty(rgui->thumbnail_content)) - { - free(rgui->thumbnail_content); - rgui->thumbnail_content = NULL; - } - - if (!string_is_empty(label)) - { - rgui->thumbnail_content = strdup(label); - return true; - } + rgui->entry_has_left_thumbnail = request_thumbnail( + &mini_left_thumbnail, MENU_THUMBNAIL_LEFT, &rgui->left_thumbnail_queue_size, left_thumbnail_path); } } - return false; + /* Reset 'load pending' state */ + rgui->thumbnail_load_pending = false; + + /* Force a redraw (so 'entry_has_thumbnail' values are + * applied immediately) */ + rgui->force_redraw = true; } -static void rgui_scan_selected_entry_thumbnail(rgui_t *rgui) +static void rgui_scan_selected_entry_thumbnail(rgui_t *rgui, bool force_load) { - rgui->entry_has_thumbnail = false; + bool has_thumbnail = false; + settings_t *settings = config_get_ptr(); - if (rgui->show_thumbnail && rgui->is_playlist) + if (!settings) + return; + + rgui->entry_has_thumbnail = false; + rgui->entry_has_left_thumbnail = false; + rgui->thumbnail_load_pending = false; + + /* Update thumbnail content/path */ + if ((rgui->show_fs_thumbnail || settings->bools.menu_rgui_inline_thumbnails) && rgui->is_playlist) { - if (rgui_update_thumbnail_content(rgui)) + if (menu_thumbnail_set_content_playlist(rgui->thumbnail_path_data, + playlist_get_cached(), menu_navigation_get_selection())) { - if (rgui_update_thumbnail_path(rgui)) - { - rgui->entry_has_thumbnail = request_thumbnail(rgui, rgui->thumbnail_path); - } + if (menu_thumbnail_is_enabled(MENU_THUMBNAIL_RIGHT)) + has_thumbnail = menu_thumbnail_update_path(rgui->thumbnail_path_data, MENU_THUMBNAIL_RIGHT); + + if (settings->bools.menu_rgui_inline_thumbnails && menu_thumbnail_is_enabled(MENU_THUMBNAIL_LEFT)) + has_thumbnail = menu_thumbnail_update_path(rgui->thumbnail_path_data, MENU_THUMBNAIL_LEFT) || + has_thumbnail; + } + } + + /* Check whether thumbnails should be loaded */ + if (has_thumbnail) + { + /* Check whether thumbnails should be loaded immediately */ + if ((settings->uints.menu_rgui_thumbnail_delay == 0) || force_load) + rgui_load_current_thumbnails(rgui); + else + { + /* Schedule a delayed load */ + rgui->thumbnail_load_pending = true; + rgui->thumbnail_load_trigger_time = cpu_features_get_time_usec(); } } } static void rgui_update_thumbnail_image(void *userdata) { - rgui_t *rgui = (rgui_t*)userdata; - if (!rgui) + rgui_t *rgui = (rgui_t*)userdata; + settings_t *settings = config_get_ptr(); + if (!rgui || !settings) return; - rgui->show_thumbnail = !rgui->show_thumbnail; + rgui->show_fs_thumbnail = !rgui->show_fs_thumbnail; - rgui_scan_selected_entry_thumbnail(rgui); + /* It is possible that we are waiting for a 'right' thumbnail + * image to load at this point. If so, and we are displaying + * inline thumbnails, then 'fs_thumbnail' and 'mini_thumbnail' + * can get mixed up. To avoid this, we simply 'reset' the + * currently inactive right thumbnail. */ + if (settings->bools.menu_rgui_inline_thumbnails) + { + if (rgui->show_fs_thumbnail) + { + mini_thumbnail.width = 0; + mini_thumbnail.height = 0; + mini_thumbnail.is_valid = false; + free(mini_thumbnail.path); + mini_thumbnail.path = NULL; + } + else + { + fs_thumbnail.width = 0; + fs_thumbnail.height = 0; + fs_thumbnail.is_valid = false; + free(fs_thumbnail.path); + fs_thumbnail.path = NULL; + } + } + + /* Note that we always load thumbnails immediately + * when toggling via the 'scan' button (scheduling a + * delayed load here would make for a poor user + * experience...) */ + rgui_scan_selected_entry_thumbnail(rgui, true); } static void rgui_update_menu_sublabel(rgui_t *rgui) @@ -2324,7 +3491,7 @@ static void rgui_navigation_set(void *data, bool scroll) if (!rgui) return; - rgui_scan_selected_entry_thumbnail(rgui); + rgui_scan_selected_entry_thumbnail(rgui, false); rgui_update_menu_sublabel(rgui); if (!scroll) @@ -2333,20 +3500,20 @@ static void rgui_navigation_set(void *data, bool scroll) menu_display_get_fb_size(&fb_width, &fb_height, &fb_pitch); - if (selection < RGUI_TERM_HEIGHT(fb_width, fb_height) /2) + if (selection < RGUI_TERM_HEIGHT(fb_height) /2) { start = 0; do_set_start = true; } - else if (selection >= (RGUI_TERM_HEIGHT(fb_width, fb_height) /2) - && selection < (end - RGUI_TERM_HEIGHT(fb_width, fb_height) /2)) + else if (selection >= (RGUI_TERM_HEIGHT(fb_height) /2) + && selection < (end - RGUI_TERM_HEIGHT(fb_height) /2)) { - start = selection - RGUI_TERM_HEIGHT(fb_width, fb_height) /2; + start = selection - RGUI_TERM_HEIGHT(fb_height) /2; do_set_start = true; } - else if (selection >= (end - RGUI_TERM_HEIGHT(fb_width, fb_height) /2)) + else if (selection >= (end - RGUI_TERM_HEIGHT(fb_height) /2)) { - start = end - RGUI_TERM_HEIGHT(fb_width, fb_height); + start = end - RGUI_TERM_HEIGHT(fb_height); do_set_start = true; } @@ -2373,18 +3540,40 @@ static void rgui_populate_entries(void *data, const char *path, const char *label, unsigned k) { - rgui_t *rgui = (rgui_t*)data; + rgui_t *rgui = (rgui_t*)data; + settings_t *settings = config_get_ptr(); - if (!rgui) + if (!rgui || !settings) return; /* Check whether we are currently viewing a playlist */ - rgui->is_playlist = string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_PLAYLIST_LIST)); + rgui->is_playlist = string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_PLAYLIST_LIST)) || + string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY)) || + string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_FAVORITES_LIST)); /* Set menu title */ menu_entries_get_title(rgui->menu_title, sizeof(rgui->menu_title)); + /* Cancel any pending thumbnail load operations */ + rgui->thumbnail_load_pending = false; + rgui_navigation_set(data, true); + + /* If aspect ratio lock is enabled, must restore + * content video settings when accessing the video + * settings menu... */ + if (settings->uints.menu_rgui_aspect_ratio_lock != RGUI_ASPECT_RATIO_LOCK_NONE) + { + if (string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_VIDEO_SETTINGS_LIST))) + { + /* Make sure that any changes made while accessing + * the video settings menu are preserved */ + rgui_video_settings_t current_video_settings = {0}; + rgui_get_video_config(¤t_video_settings); + if (rgui_is_video_config_equal(¤t_video_settings, &rgui->menu_video_settings)) + rgui_set_video_config(rgui, &rgui->content_video_settings, false); + } + } } static int rgui_environ(enum menu_environ_cb type, @@ -2440,6 +3629,101 @@ static int rgui_pointer_tap(void *data, return 0; } +static void rgui_frame(void *data, video_frame_info_t *video_info) +{ + rgui_t *rgui = (rgui_t*)data; + settings_t *settings = config_get_ptr(); + + if (settings->bools.menu_rgui_background_filler_thickness_enable != rgui->bg_thickness) + { + rgui->bg_thickness = settings->bools.menu_rgui_background_filler_thickness_enable; + rgui->bg_modified = true; + rgui->force_redraw = true; + } + + if (settings->bools.menu_rgui_border_filler_thickness_enable != rgui->border_thickness) + { + rgui->border_thickness = settings->bools.menu_rgui_border_filler_thickness_enable; + rgui->bg_modified = true; + rgui->force_redraw = true; + } + + if (settings->bools.menu_rgui_border_filler_enable != rgui->border_enable) + { + rgui->border_enable = settings->bools.menu_rgui_border_filler_enable; + rgui->bg_modified = true; + rgui->force_redraw = true; + } + + if (settings->bools.menu_rgui_shadows != rgui->shadow_enable) + { + rgui_set_blit_functions( + settings->bools.menu_rgui_shadows, settings->bools.menu_rgui_extended_ascii); + + rgui->shadow_enable = settings->bools.menu_rgui_shadows; + rgui->bg_modified = true; + rgui->force_redraw = true; + } + + if (settings->bools.menu_rgui_extended_ascii != rgui->extended_ascii_enable) + { + rgui_set_blit_functions( + settings->bools.menu_rgui_shadows, settings->bools.menu_rgui_extended_ascii); + + rgui->extended_ascii_enable = settings->bools.menu_rgui_extended_ascii; + rgui->force_redraw = true; + } + + if (settings->uints.menu_rgui_color_theme != rgui->color_theme) + { + prepare_rgui_colors(rgui, settings); + } + else if (settings->uints.menu_rgui_color_theme == RGUI_THEME_CUSTOM) + { + if (string_is_not_equal_fast(settings->paths.path_rgui_theme_preset, rgui->theme_preset_path, sizeof(rgui->theme_preset_path))) + { + prepare_rgui_colors(rgui, settings); + } + } + + /* Note: both rgui_set_aspect_ratio() and rgui_set_video_config() + * normally call command_event(CMD_EVENT_VIDEO_SET_ASPECT_RATIO, NULL) + * ## THIS CANNOT BE DONE INSIDE rgui_frame() IF THREADED VIDEO IS ENABLED ## + * Attempting to do so creates a deadlock, and causes RetroArch to hang. + * We therefore have to set the 'delay_update' argument, which causes + * command_event(CMD_EVENT_VIDEO_SET_ASPECT_RATIO, NULL) to be called at + * the next instance of rgui_render() */ + if (settings->uints.menu_rgui_aspect_ratio != rgui->menu_aspect_ratio) + rgui_set_aspect_ratio(rgui, true); + + if (settings->uints.menu_rgui_aspect_ratio_lock != rgui->menu_aspect_ratio_lock) + { + rgui->menu_aspect_ratio_lock = settings->uints.menu_rgui_aspect_ratio_lock; + + if (settings->uints.menu_rgui_aspect_ratio_lock == RGUI_ASPECT_RATIO_LOCK_NONE) + { + rgui_set_video_config(rgui, &rgui->content_video_settings, true); + } + else + { + rgui_update_menu_viewport(rgui); + rgui_set_video_config(rgui, &rgui->menu_video_settings, true); + } + } + + /* Handle pending thumbnail load operations */ + if (rgui->thumbnail_load_pending) + { + /* Check whether current 'load delay' duration has elapsed + * Note: Delay is increased when viewing fullscreen thumbnails, + * since the flicker when switching between playlist view and + * fullscreen thumbnail view is incredibly jarring...) */ + if ((cpu_features_get_time_usec() - rgui->thumbnail_load_trigger_time) >= + (settings->uints.menu_rgui_thumbnail_delay * 1000 * (rgui->show_fs_thumbnail ? 1.5f : 1.0f))) + rgui_load_current_thumbnails(rgui); + } +} + static void rgui_toggle(void *userdata, bool menu_on) { rgui_t *rgui = (rgui_t*)userdata; @@ -2452,49 +3736,66 @@ static void rgui_toggle(void *userdata, bool menu_on) if (!rgui || !settings) return; - if (settings->bools.menu_rgui_lock_aspect) + if (settings->uints.menu_rgui_aspect_ratio_lock != RGUI_ASPECT_RATIO_LOCK_NONE) { if (menu_on) { - /* Cache last used content aspect ratio */ - rgui->content_aspect_ratio = settings->uints.video_aspect_ratio_idx; + /* Cache content video settings */ + rgui_get_video_config(&rgui->content_video_settings); - /* Check if aspect ratio needs to change */ - if (rgui->content_aspect_ratio != ASPECT_RATIO_4_3) - { - settings->uints.video_aspect_ratio_idx = ASPECT_RATIO_4_3; - video_driver_set_aspect_ratio(); - - /* If content is using a custom aspect ratio, we - * have to stop here - otherwise, restore content - * aspect ratio setting */ - if (rgui->content_aspect_ratio != ASPECT_RATIO_CUSTOM) - settings->uints.video_aspect_ratio_idx = rgui->content_aspect_ratio; - } + /* Update menu viewport */ + rgui_update_menu_viewport(rgui); + + /* Apply menu video settings */ + rgui_set_video_config(rgui, &rgui->menu_video_settings, false); } else { - /* If content is using a custom aspect ratio, this - * must be restored */ - if (rgui->content_aspect_ratio == ASPECT_RATIO_CUSTOM - && settings->uints.video_aspect_ratio_idx == ASPECT_RATIO_4_3) - settings->uints.video_aspect_ratio_idx = rgui->content_aspect_ratio; + /* Restore content video settings *if* user + * has not changed video settings since menu was + * last toggled on */ + rgui_video_settings_t current_video_settings = {0}; + rgui_get_video_config(¤t_video_settings); - if (settings->uints.video_aspect_ratio_idx != ASPECT_RATIO_4_3) - video_driver_set_aspect_ratio(); + if (rgui_is_video_config_equal(¤t_video_settings, &rgui->menu_video_settings)) + rgui_set_video_config(rgui, &rgui->content_video_settings, false); } } /* Upscaling buffer is only required while menu is on. Save * memory by freeing it whenever we switch back to the current * content */ - if (!menu_on && upscale_buf.data) + if (!menu_on && rgui_upscale_buf.data) { - free(upscale_buf.data); - upscale_buf.data = NULL; + free(rgui_upscale_buf.data); + rgui_upscale_buf.data = NULL; } } +#if defined(HAVE_MENU_WIDGETS) +static void rgui_context_reset(void *data, bool is_threaded) +{ + rgui_t *rgui = (rgui_t*)data; + + if (!rgui) + return; + + if (rgui->widgets_supported) + menu_display_allocate_white_texture(); +} + +static void rgui_context_destroy(void *data) +{ + rgui_t *rgui = (rgui_t*)data; + + if (!rgui) + return; + + if (rgui->widgets_supported) + video_driver_texture_unload(&menu_display_white_texture); +} +#endif + menu_ctx_driver_t menu_ctx_rgui = { rgui_set_texture, rgui_set_message, @@ -2503,8 +3804,13 @@ menu_ctx_driver_t menu_ctx_rgui = { rgui_frame, rgui_init, rgui_free, +#if defined(HAVE_MENU_WIDGETS) + rgui_context_reset, + rgui_context_destroy, +#else NULL, NULL, +#endif rgui_populate_entries, rgui_toggle, rgui_navigation_clear, diff --git a/menu/drivers/stripes.c b/menu/drivers/stripes.c index 7d6338c9f2..9515008558 100644 --- a/menu/drivers/stripes.c +++ b/menu/drivers/stripes.c @@ -903,11 +903,10 @@ static void stripes_update_thumbnail_path(void *data, unsigned i, char pos) if (playlist) { - const char *core_name = NULL; - playlist_get_index(playlist, i, - NULL, NULL, NULL, &core_name, NULL, NULL); + const struct playlist_entry *entry = NULL; + playlist_get_index(playlist, i, &entry); - if (string_is_equal(core_name, "imageviewer")) + if (string_is_equal(entry->core_name, "imageviewer")) { if (pos == 'R' || (pos == 'L' && string_is_equal(stripes_thumbnails_ident('R'), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF)))) diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index 362dbcead8..152425ed84 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -45,6 +45,7 @@ #include "../menu_animation.h" #include "../menu_entries.h" #include "../menu_input.h" +#include "../menu_thumbnail_path.h" #include "../../core_info.h" #include "../../core.h" @@ -245,6 +246,8 @@ typedef struct xmb_handle bool mouse_show; bool use_ps3_layout; bool assets_missing; + bool is_playlist; + bool is_db_manager_list; uint8_t system_tab_end; uint8_t tabs[XMB_SYSTEM_TAB_MAX_LENGTH]; @@ -306,11 +309,7 @@ typedef struct xmb_handle char title_name[255]; char *box_message; - char *thumbnail_system; - char *thumbnail_content; char *savestate_thumbnail_file_path; - char *thumbnail_file_path; - char *left_thumbnail_file_path; char *bg_file_path; file_list_t *selection_buf_old; @@ -340,6 +339,8 @@ typedef struct xmb_handle font_data_t *font2; video_font_raster_block_t raster_block; video_font_raster_block_t raster_block2; + + menu_thumbnail_path_data_t *thumbnail_path_data; } xmb_handle_t; float scale_mod[8] = { @@ -559,32 +560,6 @@ static xmb_node_t *xmb_copy_node(const xmb_node_t *old_node) return new_node; } -static const char *xmb_thumbnails_ident(char pos) -{ - char folder = 0; - settings_t *settings = config_get_ptr(); - - if (pos == 'R') - folder = settings->uints.menu_thumbnails; - if (pos == 'L') - folder = settings->uints.menu_left_thumbnails; - - switch (folder) - { - case 1: - return "Named_Snaps"; - case 2: - return "Named_Titles"; - case 3: - return "Named_Boxarts"; - case 0: - default: - break; - } - - return msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF); -} - static float *xmb_gradient_ident(video_frame_info_t *video_info) { switch (video_info->xmb_color_theme) @@ -952,153 +927,21 @@ end: static void xmb_update_thumbnail_path(void *data, unsigned i, char pos) { - menu_entry_t entry; - unsigned entry_type = 0; - char new_path[PATH_MAX_LENGTH] = {0}; - settings_t *settings = config_get_ptr(); - xmb_handle_t *xmb = (xmb_handle_t*)data; - playlist_t *playlist = NULL; - const char *dir_thumbnails = settings->paths.directory_thumbnails; + xmb_handle_t *xmb = (xmb_handle_t*)data; + const char *core_name = NULL; - menu_entry_init(&entry); + if (!xmb) + return; - if (!xmb || string_is_empty(dir_thumbnails)) - goto end; - - menu_entry_get(&entry, 0, i, NULL, true); - - entry_type = menu_entry_get_type_new(&entry); - - if (entry_type == FILE_TYPE_IMAGEVIEWER || entry_type == FILE_TYPE_IMAGE) + /* imageviewer content requires special treatment... */ + menu_thumbnail_get_core_name(xmb->thumbnail_path_data, &core_name); + if (string_is_equal(core_name, "imageviewer")) { - file_list_t *selection_buf = menu_entries_get_selection_buf_ptr(0); - xmb_node_t *node = (xmb_node_t*) - file_list_get_userdata_at_offset(selection_buf, i); - - if (node && !string_is_empty(node->fullpath) && - (pos == 'R' || (pos == 'L' && string_is_equal(xmb_thumbnails_ident('R'), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))))) - { - if (!string_is_empty(entry.path)) - fill_pathname_join( - new_path, - node->fullpath, - entry.path, - sizeof(new_path)); - - goto end; - } + if ((pos == 'R') || (pos == 'L' && !menu_thumbnail_is_enabled(MENU_THUMBNAIL_RIGHT))) + menu_thumbnail_update_path(xmb->thumbnail_path_data, pos == 'R' ? MENU_THUMBNAIL_RIGHT : MENU_THUMBNAIL_LEFT); } - else if (filebrowser_get_type() != FILEBROWSER_NONE) - { - video_driver_texture_unload(&xmb->thumbnail); - goto end; - } - - playlist = playlist_get_cached(); - - if (playlist) - { - const char *core_name = NULL; - playlist_get_index(playlist, i, - NULL, NULL, NULL, &core_name, NULL, NULL); - - if (string_is_equal(core_name, "imageviewer")) - { - if ( - (pos == 'R') || - ( - pos == 'L' && - string_is_equal(xmb_thumbnails_ident('R'), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF)) - ) - ) - { - if (!string_is_empty(entry.label)) - strlcpy(new_path, entry.label, - sizeof(new_path)); - } - else - video_driver_texture_unload(&xmb->left_thumbnail); - goto end; - } - } - - /* Append thumbnail system directory */ - if (!string_is_empty(xmb->thumbnail_system)) - fill_pathname_join( - new_path, - dir_thumbnails, - xmb->thumbnail_system, - sizeof(new_path)); - - if (!string_is_empty(new_path)) - { - char *tmp_new2 = (char*) - malloc(PATH_MAX_LENGTH * sizeof(char)); - - tmp_new2[0] = '\0'; - - /* Append Named_Snaps/Named_Boxarts/Named_Titles */ - if (pos == 'R') - fill_pathname_join(tmp_new2, new_path, - xmb_thumbnails_ident('R'), PATH_MAX_LENGTH * sizeof(char)); - if (pos == 'L') - fill_pathname_join(tmp_new2, new_path, - xmb_thumbnails_ident('L'), PATH_MAX_LENGTH * sizeof(char)); - - strlcpy(new_path, tmp_new2, - PATH_MAX_LENGTH * sizeof(char)); - free(tmp_new2); - } - - /* Scrub characters that are not cross-platform and/or violate the - * No-Intro filename standard: - * http://datomatic.no-intro.org/stuff/The%20Official%20No-Intro%20Convention%20(20071030).zip - * Replace these characters in the entry name with underscores. - */ - if (!string_is_empty(xmb->thumbnail_content)) - { - char *scrub_char_pointer = NULL; - char *tmp_new = (char*) - malloc(PATH_MAX_LENGTH * sizeof(char)); - char *tmp = strdup(xmb->thumbnail_content); - - tmp_new[0] = '\0'; - - while((scrub_char_pointer = strpbrk(tmp, "&*/:`\"<>?\\|"))) - *scrub_char_pointer = '_'; - - /* Look for thumbnail file with this scrubbed filename */ - - fill_pathname_join(tmp_new, - new_path, - tmp, PATH_MAX_LENGTH * sizeof(char)); - - if (!string_is_empty(tmp_new)) - strlcpy(new_path, - tmp_new, sizeof(new_path)); - - free(tmp_new); - free(tmp); - } - - /* Append png extension */ - if (!string_is_empty(new_path)) - strlcat(new_path, - file_path_str(FILE_PATH_PNG_EXTENSION), - sizeof(new_path)); - -end: - if (xmb && !string_is_empty(new_path)) - { - if (pos == 'R') - xmb->thumbnail_file_path = strdup(new_path); - if (pos == 'L') - xmb->left_thumbnail_file_path = strdup(new_path); - } - - menu_entry_free(&entry); + else + menu_thumbnail_update_path(xmb->thumbnail_path_data, pos == 'R' ? MENU_THUMBNAIL_RIGHT : MENU_THUMBNAIL_LEFT); } static void xmb_update_savestate_thumbnail_path(void *data, unsigned i) @@ -1162,32 +1005,29 @@ static void xmb_update_savestate_thumbnail_path(void *data, unsigned i) static void xmb_update_thumbnail_image(void *data) { - xmb_handle_t *xmb = (xmb_handle_t*)data; + xmb_handle_t *xmb = (xmb_handle_t*)data; + const char *right_thumbnail_path = NULL; + const char *left_thumbnail_path = NULL; + if (!xmb) return; - if (!(string_is_empty(xmb->thumbnail_file_path))) + if (menu_thumbnail_get_path(xmb->thumbnail_path_data, MENU_THUMBNAIL_RIGHT, &right_thumbnail_path)) { - if (filestream_exists(xmb->thumbnail_file_path)) - task_push_image_load(xmb->thumbnail_file_path, + if (filestream_exists(right_thumbnail_path)) + task_push_image_load(right_thumbnail_path, menu_display_handle_thumbnail_upload, NULL); else video_driver_texture_unload(&xmb->thumbnail); - - free(xmb->thumbnail_file_path); - xmb->thumbnail_file_path = NULL; } - if (!(string_is_empty(xmb->left_thumbnail_file_path))) + if (menu_thumbnail_get_path(xmb->thumbnail_path_data, MENU_THUMBNAIL_LEFT, &left_thumbnail_path)) { - if (filestream_exists(xmb->left_thumbnail_file_path)) - task_push_image_load(xmb->left_thumbnail_file_path, + if (filestream_exists(left_thumbnail_path)) + task_push_image_load(left_thumbnail_path, menu_display_handle_left_thumbnail_upload, NULL); else video_driver_texture_unload(&xmb->left_thumbnail); - - free(xmb->left_thumbnail_file_path); - xmb->left_thumbnail_file_path = NULL; } } @@ -1197,32 +1037,77 @@ static void xmb_set_thumbnail_system(void *data, char*s, size_t len) if (!xmb) return; - if (!string_is_empty(xmb->thumbnail_system)) - free(xmb->thumbnail_system); - /* There is only one mame thumbnail repo */ - if (strncmp("MAME", s, 4) == 0) - strcpy(s, "MAME"); - xmb->thumbnail_system = strdup(s); + menu_thumbnail_set_system(xmb->thumbnail_path_data, s); } -static void xmb_reset_thumbnail_content(void *data) +static void xmb_unload_thumbnail_textures(void *data) { xmb_handle_t *xmb = (xmb_handle_t*)data; if (!xmb) return; - if (!string_is_empty(xmb->thumbnail_content)) - free(xmb->thumbnail_content); - xmb->thumbnail_content = NULL; + + if (xmb->thumbnail) + video_driver_texture_unload(&xmb->thumbnail); + if (xmb->left_thumbnail) + video_driver_texture_unload(&xmb->left_thumbnail); } -static void xmb_set_thumbnail_content(void *data, char *s, size_t len) +static void xmb_set_thumbnail_content(void *data, const char *s) { + size_t selection = menu_navigation_get_selection(); xmb_handle_t *xmb = (xmb_handle_t*)data; if (!xmb) return; - if (!string_is_empty(xmb->thumbnail_content)) - free(xmb->thumbnail_content); - xmb->thumbnail_content = strdup(s); + + if (xmb->is_playlist) + { + /* Playlist content */ + if (string_is_empty(s)) + menu_thumbnail_set_content_playlist(xmb->thumbnail_path_data, + playlist_get_cached(), selection); + } + else if (xmb->is_db_manager_list) + { + /* Database list content */ + if (string_is_empty(s)) + { + menu_entry_t entry; + + menu_entry_init(&entry); + menu_entry_get(&entry, 0, selection, NULL, true); + + if (!string_is_empty(entry.path)) + menu_thumbnail_set_content(xmb->thumbnail_path_data, entry.path); + + menu_entry_free(&entry); + } + } + else if (string_is_equal(s, "imageviewer")) + { + /* Filebrowser image updates */ + menu_entry_t entry; + file_list_t *selection_buf = menu_entries_get_selection_buf_ptr(0); + xmb_node_t *node = (xmb_node_t*)file_list_get_userdata_at_offset(selection_buf, selection); + + menu_entry_init(&entry); + menu_entry_get(&entry, 0, selection, NULL, true); + + if (node) + if (!string_is_empty(entry.path) && !string_is_empty(node->fullpath)) + menu_thumbnail_set_content_image(xmb->thumbnail_path_data, node->fullpath, entry.path); + + menu_entry_free(&entry); + } + else if (!string_is_empty(s)) + { + /* Annoying leftovers... + * This is required to ensure that thumbnails are + * updated correctly when navigating deeply through + * the sublevels of database manager lists. + * Showing thumbnails on database entries is a + * pointless nuisance and a waste of CPU cycles, IMHO... */ + menu_thumbnail_set_content(xmb->thumbnail_path_data, s); + } } static void xmb_update_savestate_thumbnail_image(void *data) @@ -1259,8 +1144,6 @@ static void xmb_selection_pointer_changed( menu_list_t *menu_list = NULL; file_list_t *selection_buf = menu_entries_get_selection_buf_ptr(0); size_t selection = menu_navigation_get_selection(); - const char *thumb_ident = xmb_thumbnails_ident('R'); - const char *lft_thumb_ident= xmb_thumbnails_ident('L'); menu_entries_ctl(MENU_ENTRIES_CTL_LIST_GET, &menu_list); menu_entry_init(&entry); @@ -1302,64 +1185,44 @@ static void xmb_selection_pointer_changed( ia = xmb->items_active_alpha; iz = xmb->items_active_zoom; - if (!string_is_equal(thumb_ident, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF)) || !string_is_equal(lft_thumb_ident, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) + if (menu_thumbnail_is_enabled(MENU_THUMBNAIL_RIGHT) || menu_thumbnail_is_enabled(MENU_THUMBNAIL_LEFT)) { - if ((xmb_system_tab > XMB_SYSTEM_TAB_SETTINGS && depth == 1) || - (xmb_system_tab < XMB_SYSTEM_TAB_SETTINGS && depth == 4)) + bool update_thumbnails = false; + + /* Playlist updates */ + if (((xmb_system_tab > XMB_SYSTEM_TAB_SETTINGS && depth == 1) || + (xmb_system_tab < XMB_SYSTEM_TAB_SETTINGS && depth == 4)) && + xmb->is_playlist) { - if (!string_is_empty(entry.path)) - xmb_set_thumbnail_content(xmb, entry.path, 0 /* will be ignored */); - if (!string_is_equal(thumb_ident, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) - { - xmb_update_thumbnail_path(xmb, i, 'R'); - xmb_update_thumbnail_image(xmb); - } - if (!string_is_equal(lft_thumb_ident, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) - { - xmb_update_thumbnail_path(xmb, i, 'L'); - xmb_update_thumbnail_image(xmb); - } + xmb_set_thumbnail_content(xmb, NULL); + update_thumbnails = true; } - else if (((entry_type == FILE_TYPE_IMAGE || entry_type == FILE_TYPE_IMAGEVIEWER || - entry_type == FILE_TYPE_RDB || entry_type == FILE_TYPE_RDB_ENTRY) - && xmb_system_tab <= XMB_SYSTEM_TAB_SETTINGS)) + /* Database list updates + * (pointless nuisance...) */ + else if (depth == 4 && xmb->is_db_manager_list) { - if (!string_is_empty(entry.path)) - xmb_set_thumbnail_content(xmb, entry.path, 0 /* will be ignored */); - if (!string_is_equal(thumb_ident, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) - { - xmb_update_thumbnail_path(xmb, i, 'R'); - xmb_update_thumbnail_image(xmb); - } - else if (!string_is_equal(lft_thumb_ident, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) - { - xmb_update_thumbnail_path(xmb, i, 'L'); - xmb_update_thumbnail_image(xmb); - } + xmb_set_thumbnail_content(xmb, NULL); + update_thumbnails = true; } - else if (filebrowser_get_type() != FILEBROWSER_NONE) + /* Filebrowser image updates */ + else if (entry_type == FILE_TYPE_IMAGEVIEWER || entry_type == FILE_TYPE_IMAGE) { - xmb_reset_thumbnail_content(xmb); - if (!string_is_equal(thumb_ident, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) - { - xmb_update_thumbnail_path(xmb, i, 'R'); - xmb_update_thumbnail_image(xmb); - } - else if (!string_is_equal(lft_thumb_ident, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) - { - xmb_update_thumbnail_path(xmb, i, 'L'); - xmb_update_thumbnail_image(xmb); - } + xmb_set_thumbnail_content(xmb, "imageviewer"); + update_thumbnails = true; + } + + if (update_thumbnails) + { + if (menu_thumbnail_is_enabled(MENU_THUMBNAIL_RIGHT)) + xmb_update_thumbnail_path(xmb, i /* will be ignored */, 'R'); + + if (menu_thumbnail_is_enabled(MENU_THUMBNAIL_LEFT)) + xmb_update_thumbnail_path(xmb, i /* will be ignored */, 'L'); + + xmb_update_thumbnail_image(xmb); } } + xmb_update_savestate_thumbnail_path(xmb, i); xmb_update_savestate_thumbnail_image(xmb); } @@ -1542,12 +1405,28 @@ static void xmb_list_open_new(xmb_handle_t *xmb, if (xmb_system_tab <= XMB_SYSTEM_TAB_SETTINGS) { - if (xmb->depth < 4) - xmb_reset_thumbnail_content(xmb); - xmb_update_thumbnail_path(xmb, 0, 'R'); - xmb_update_thumbnail_image(xmb); - xmb_update_thumbnail_path(xmb, 0, 'L'); - xmb_update_thumbnail_image(xmb); + if (menu_thumbnail_is_enabled(MENU_THUMBNAIL_RIGHT) || menu_thumbnail_is_enabled(MENU_THUMBNAIL_LEFT)) + { + /* This code is horrible, full of hacks... + * This hack ensures that thumbnails are not cleared + * when selecting an entry from a collection via + * 'load content'... */ + if (xmb->depth != 5) + xmb_unload_thumbnail_textures(xmb); + + if (xmb->is_playlist || xmb->is_db_manager_list) + { + xmb_set_thumbnail_content(xmb, NULL); + + if (menu_thumbnail_is_enabled(MENU_THUMBNAIL_RIGHT)) + xmb_update_thumbnail_path(xmb, 0 /* will be ignored */, 'R'); + + if (menu_thumbnail_is_enabled(MENU_THUMBNAIL_LEFT)) + xmb_update_thumbnail_path(xmb, 0 /* will be ignored */, 'L'); + + xmb_update_thumbnail_image(xmb); + } + } } } @@ -1861,37 +1740,22 @@ static void xmb_list_switch(xmb_handle_t *xmb) xmb_list_switch_new(xmb, selection_buf, dir, selection); xmb->categories_active_idx_old = (unsigned)xmb->categories_selection_ptr; - if (!string_is_equal(xmb_thumbnails_ident('R'), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) + if (menu_thumbnail_is_enabled(MENU_THUMBNAIL_RIGHT) || menu_thumbnail_is_enabled(MENU_THUMBNAIL_LEFT)) { - menu_entry_t entry; + xmb_unload_thumbnail_textures(xmb); - menu_entry_init(&entry); - menu_entry_get(&entry, 0, selection, NULL, true); + if (xmb->is_playlist) + { + xmb_set_thumbnail_content(xmb, NULL); - if (!string_is_empty(entry.path)) - xmb_set_thumbnail_content(xmb, entry.path, 0 /* will be ignored */); + if (menu_thumbnail_is_enabled(MENU_THUMBNAIL_RIGHT)) + xmb_update_thumbnail_path(xmb, 0 /* will be ignored */, 'R'); - menu_entry_free(&entry); + if (menu_thumbnail_is_enabled(MENU_THUMBNAIL_LEFT)) + xmb_update_thumbnail_path(xmb, 0 /* will be ignored */, 'L'); - xmb_update_thumbnail_path(xmb, 0, 'R'); - xmb_update_thumbnail_image(xmb); - } - if (!string_is_equal(xmb_thumbnails_ident('L'), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) - { - menu_entry_t entry; - - menu_entry_init(&entry); - menu_entry_get(&entry, 0, selection, NULL, true); - - if (!string_is_empty(entry.path)) - xmb_set_thumbnail_content(xmb, entry.path, 0 /* will be ignored */); - - menu_entry_free(&entry); - - xmb_update_thumbnail_path(xmb, 0, 'L'); - xmb_update_thumbnail_image(xmb); + xmb_update_thumbnail_image(xmb); + } } } @@ -1963,11 +1827,11 @@ static void xmb_init_horizontal_list(xmb_handle_t *xmb) info.path = strdup( settings->paths.directory_playlist); info.label = strdup( - msg_hash_to_str(MENU_ENUM_LABEL_CONTENT_COLLECTION_LIST)); + msg_hash_to_str(MENU_ENUM_LABEL_PLAYLISTS_TAB)); info.exts = strdup( file_path_str(FILE_PATH_LPL_EXTENSION_NO_DOT)); info.type_default = FILE_TYPE_PLAIN; - info.enum_idx = MENU_ENUM_LABEL_CONTENT_COLLECTION_LIST; + info.enum_idx = MENU_ENUM_LABEL_PLAYLISTS_TAB; if (settings->bools.menu_content_show_playlists && !string_is_empty(info.path)) { @@ -2197,6 +2061,8 @@ static void xmb_list_open(xmb_handle_t *xmb) dir = 1; else if (xmb->depth < xmb->old_depth) dir = -1; + else + return; /* If menu hasn't changed, do nothing */ xmb_list_open_horizontal_list(xmb); @@ -2241,27 +2107,31 @@ static void xmb_populate_entries(void *data, const char *label, unsigned k) { xmb_handle_t *xmb = (xmb_handle_t*)data; + unsigned xmb_system_tab; if (!xmb) return; + /* Determine whether this is a playlist */ + xmb_system_tab = xmb_get_system_tab(xmb, (unsigned)xmb->categories_selection_ptr); + xmb->is_playlist = (xmb_system_tab == XMB_SYSTEM_TAB_FAVORITES) || + (xmb_system_tab == XMB_SYSTEM_TAB_HISTORY) || +#ifdef HAVE_IMAGEVIEWER + (xmb_system_tab == XMB_SYSTEM_TAB_IMAGES) || +#endif + string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_HORIZONTAL_MENU)) || + string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_PLAYLIST_LIST)) || + string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_FAVORITES_LIST)) || + string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_IMAGES_LIST)); + xmb->is_playlist = xmb->is_playlist && !string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_RDB_ENTRY_DETAIL)); + + /* Determine whether this is a database manager list */ + xmb->is_db_manager_list = string_is_equal(label, msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_DATABASE_MANAGER_LIST)); + if (menu_driver_ctl(RARCH_MENU_CTL_IS_PREVENT_POPULATE, NULL)) { xmb_selection_pointer_changed(xmb, false); menu_driver_ctl(RARCH_MENU_CTL_UNSET_PREVENT_POPULATE, NULL); - if (!string_is_equal(xmb_thumbnails_ident('R'), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) - { - xmb_update_thumbnail_path(xmb, 0, 'R'); - xmb_update_thumbnail_image(xmb); - } - xmb_update_savestate_thumbnail_image(xmb); - if (!string_is_equal(xmb_thumbnails_ident('L'), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) - { - xmb_update_thumbnail_path(xmb, 0, 'L'); - xmb_update_thumbnail_image(xmb); - } return; } @@ -2346,7 +2216,7 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb, return xmb->textures.list[XMB_TEXTURE_RDB]; /* Menu collection submenus */ - case MENU_ENUM_LABEL_CONTENT_COLLECTION_LIST: + case MENU_ENUM_LABEL_PLAYLISTS_TAB: return xmb->textures.list[XMB_TEXTURE_ZIP]; case MENU_ENUM_LABEL_GOTO_FAVORITES: return xmb->textures.list[XMB_TEXTURE_FAVORITE]; @@ -2793,8 +2663,6 @@ static int xmb_draw_item( xmb_node_t *core_node, file_list_t *list, float *color, - const char *thumb_ident, - const char *left_thumb_ident, size_t i, size_t current, unsigned width, @@ -2908,13 +2776,9 @@ static int xmb_draw_item( { if (xmb->savestate_thumbnail || !xmb->use_ps3_layout || - (!string_is_equal - (thumb_ident, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF)) + (menu_thumbnail_is_enabled(MENU_THUMBNAIL_RIGHT) && xmb->thumbnail) || - (!string_is_equal - (left_thumb_ident, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF)) + (menu_thumbnail_is_enabled(MENU_THUMBNAIL_LEFT) && xmb->left_thumbnail && settings->bools.menu_xmb_vertical_thumbnails) ) @@ -3075,8 +2939,6 @@ static void xmb_draw_items( menu_display_ctx_rotate_draw_t rotate_draw; xmb_node_t *core_node = NULL; size_t end = 0; - const char *thumb_ident = xmb_thumbnails_ident('R'); - const char *left_thumb_ident= xmb_thumbnails_ident('L'); if (!list || !list->size || !xmb) return; @@ -3126,7 +2988,7 @@ static void xmb_draw_items( &entry, &mymat, xmb, core_node, - list, color, thumb_ident, left_thumb_ident, + list, color, i, current, width, height); menu_entry_free(&entry); @@ -3493,9 +3355,7 @@ static void xmb_frame(void *data, video_frame_info_t *video_info) xmb->icon_spacing_horizontal + pseudo_font_length + min_thumb_size) <= width)) { - if (xmb->thumbnail - && !string_is_equal(xmb_thumbnails_ident('R'), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) + if (xmb->thumbnail && menu_thumbnail_is_enabled(MENU_THUMBNAIL_RIGHT)) { /* Limit thumbnail width */ @@ -3560,9 +3420,7 @@ static void xmb_frame(void *data, video_frame_info_t *video_info) { /* Left Thumbnail in the left margin */ - if (xmb->left_thumbnail - && !string_is_equal(xmb_thumbnails_ident('L'), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) + if (xmb->left_thumbnail && menu_thumbnail_is_enabled(MENU_THUMBNAIL_LEFT)) { /* Limit left thumbnail width */ @@ -3631,9 +3489,7 @@ static void xmb_frame(void *data, video_frame_info_t *video_info) xmb->icon_spacing_horizontal + pseudo_font_length + min_thumb_size) <= width)) { - if (xmb->left_thumbnail - && !string_is_equal(xmb_thumbnails_ident('L'), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) + if (xmb->left_thumbnail && menu_thumbnail_is_enabled(MENU_THUMBNAIL_LEFT)) { /* Limit left thumbnail width */ @@ -3696,9 +3552,7 @@ static void xmb_frame(void *data, video_frame_info_t *video_info) { /* Left Thumbnail in the left margin */ - if (xmb->left_thumbnail - && !string_is_equal(xmb_thumbnails_ident('L'), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) + if (xmb->left_thumbnail && menu_thumbnail_is_enabled(MENU_THUMBNAIL_LEFT)) { /* Limit left thumbnail width */ @@ -3943,9 +3797,7 @@ static void xmb_frame(void *data, video_frame_info_t *video_info) xmb->icon_spacing_horizontal + pseudo_font_length + min_thumb_size) <= width)) { - if (xmb->thumbnail && - !string_is_equal(xmb_thumbnails_ident('R'), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) + if (xmb->thumbnail && menu_thumbnail_is_enabled(MENU_THUMBNAIL_RIGHT)) { /* Limit right thumbnail width */ @@ -4007,9 +3859,7 @@ static void xmb_frame(void *data, video_frame_info_t *video_info) xmb->icon_spacing_horizontal + pseudo_font_length + min_thumb_size) <= width)) { - if (xmb->left_thumbnail && - !string_is_equal(xmb_thumbnails_ident('L'), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) + if (xmb->left_thumbnail && menu_thumbnail_is_enabled(MENU_THUMBNAIL_LEFT)) { /* Limit left thumbnail width */ @@ -4520,6 +4370,10 @@ static void *xmb_init(void **userdata, bool video_is_threaded) xmb_init_ribbon(xmb); + xmb->thumbnail_path_data = menu_thumbnail_path_init(); + if (!xmb->thumbnail_path_data) + goto error; + return menu; error: @@ -4567,18 +4421,13 @@ static void xmb_free(void *data) if (!string_is_empty(xmb->box_message)) free(xmb->box_message); - if (!string_is_empty(xmb->thumbnail_system)) - free(xmb->thumbnail_system); - if (!string_is_empty(xmb->thumbnail_content)) - free(xmb->thumbnail_content); if (!string_is_empty(xmb->savestate_thumbnail_file_path)) free(xmb->savestate_thumbnail_file_path); - if (!string_is_empty(xmb->thumbnail_file_path)) - free(xmb->thumbnail_file_path); - if (!string_is_empty(xmb->left_thumbnail_file_path)) - free(xmb->left_thumbnail_file_path); if (!string_is_empty(xmb->bg_file_path)) free(xmb->bg_file_path); + + if (xmb->thumbnail_path_data) + free(xmb->thumbnail_path_data); } font_driver_bind_block(NULL, NULL); @@ -5087,16 +4936,14 @@ static void xmb_context_reset_internal(xmb_handle_t *xmb, xmb_context_reset_horizontal_list(xmb); - if (!string_is_equal(xmb_thumbnails_ident('R'), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) + if (menu_thumbnail_is_enabled(MENU_THUMBNAIL_RIGHT) || menu_thumbnail_is_enabled(MENU_THUMBNAIL_LEFT)) { - xmb_update_thumbnail_path(xmb, 0, 'R'); - xmb_update_thumbnail_image(xmb); - } - if (!string_is_equal(xmb_thumbnails_ident('L'), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF))) - { - xmb_update_thumbnail_path(xmb, 0, 'L'); + if (menu_thumbnail_is_enabled(MENU_THUMBNAIL_RIGHT)) + xmb_update_thumbnail_path(xmb, 0, 'R'); + + if (menu_thumbnail_is_enabled(MENU_THUMBNAIL_LEFT)) + xmb_update_thumbnail_path(xmb, 0, 'L'); + xmb_update_thumbnail_image(xmb); } xmb_update_savestate_thumbnail_image(xmb); @@ -5533,9 +5380,9 @@ static int xmb_list_push(void *data, void *userdata, #ifdef HAVE_LIBRETRODB menu_entries_append_enum(info->list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CONTENT_COLLECTION_LIST), - msg_hash_to_str(MENU_ENUM_LABEL_CONTENT_COLLECTION_LIST), - MENU_ENUM_LABEL_CONTENT_COLLECTION_LIST, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLISTS_TAB), + msg_hash_to_str(MENU_ENUM_LABEL_PLAYLISTS_TAB), + MENU_ENUM_LABEL_PLAYLISTS_TAB, MENU_SETTING_ACTION, 0, 0); #endif @@ -5801,8 +5648,8 @@ menu_ctx_driver_t menu_ctx_xmb = { xmb_populate_entries, xmb_toggle, xmb_navigation_clear, - xmb_navigation_pointer_changed, - xmb_navigation_pointer_changed, + NULL, /*xmb_navigation_pointer_changed,*/ /* Note: navigation_set() is called each time navigation_increment/decrement() */ + NULL, /*xmb_navigation_pointer_changed,*/ /* is called, so linking these just duplicates work... */ xmb_navigation_set, xmb_navigation_pointer_changed, xmb_navigation_alphabet, diff --git a/menu/drivers_display/menu_display_ctr.c b/menu/drivers_display/menu_display_ctr.c index 1c6dc9ddb8..a29cc7f531 100644 --- a/menu/drivers_display/menu_display_ctr.c +++ b/menu/drivers_display/menu_display_ctr.c @@ -64,8 +64,7 @@ static void menu_display_ctr_draw(menu_display_ctx_draw_t *draw, { struct ctr_texture *texture = NULL; const float *color = NULL; - ctr_video_t *ctr = video_info ? - (ctr_video_t*)video_info->userdata : NULL; + ctr_video_t *ctr = (ctr_video_t*)video_info->userdata; if (!ctr || !draw) return; @@ -135,7 +134,7 @@ static void menu_display_ctr_draw(menu_display_ctx_draw_t *draw, GPU_SetViewport(NULL, VIRT_TO_PHYS(ctr->drawbuffers.top.left), 0, 0, CTR_TOP_FRAMEBUFFER_HEIGHT, - ctr->video_mode == CTR_VIDEO_MODE_800x240 ? + ctr->video_mode == CTR_VIDEO_MODE_2D_800x240 ? CTR_TOP_FRAMEBUFFER_WIDTH * 2 : CTR_TOP_FRAMEBUFFER_WIDTH); GPU_DrawArray(GPU_GEOMETRY_PRIM, 0, 1); diff --git a/menu/drivers_display/menu_display_d3d10.c b/menu/drivers_display/menu_display_d3d10.c index f04452b069..712dfec833 100644 --- a/menu/drivers_display/menu_display_d3d10.c +++ b/menu/drivers_display/menu_display_d3d10.c @@ -46,14 +46,14 @@ static void* menu_display_d3d10_get_default_mvp(video_frame_info_t *video_info) static void menu_display_d3d10_blend_begin(video_frame_info_t *video_info) { - d3d10_video_t* d3d10 = video_info ? (d3d10_video_t*)video_info->userdata : NULL; + d3d10_video_t* d3d10 = (d3d10_video_t*)video_info->userdata; D3D10SetBlendState(d3d10->device, d3d10->blend_enable, NULL, D3D10_DEFAULT_SAMPLE_MASK); } static void menu_display_d3d10_blend_end(video_frame_info_t *video_info) { - d3d10_video_t* d3d10 = video_info ? (d3d10_video_t*)video_info->userdata : NULL; + d3d10_video_t* d3d10 = (d3d10_video_t*)video_info->userdata; D3D10SetBlendState(d3d10->device, d3d10->blend_disable, NULL, D3D10_DEFAULT_SAMPLE_MASK); } @@ -66,9 +66,8 @@ static void menu_display_d3d10_viewport(menu_display_ctx_draw_t *draw, static void menu_display_d3d10_draw(menu_display_ctx_draw_t *draw, video_frame_info_t *video_info) { - int vertex_count; - d3d10_video_t* d3d10 = video_info ? - (d3d10_video_t*)video_info->userdata : NULL; + int vertex_count; + d3d10_video_t* d3d10 = (d3d10_video_t*)video_info->userdata; if (!d3d10 || !draw || !draw->texture) return; @@ -114,7 +113,8 @@ static void menu_display_d3d10_draw(menu_display_ctx_draw_t *draw, { sprite->pos.x = draw->x / (float)d3d10->viewport.Width; sprite->pos.y = - (d3d10->viewport.Height - draw->y - draw->height) / (float)d3d10->viewport.Height; + (d3d10->viewport.Height - draw->y - draw->height) + / (float)d3d10->viewport.Height; sprite->pos.w = draw->width / (float)d3d10->viewport.Width; sprite->pos.h = draw->height / (float)d3d10->viewport.Height; @@ -188,8 +188,7 @@ static void menu_display_d3d10_draw(menu_display_ctx_draw_t *draw, static void menu_display_d3d10_draw_pipeline(menu_display_ctx_draw_t* draw, video_frame_info_t *video_info) { - d3d10_video_t* d3d10 = video_info ? - (d3d10_video_t*)video_info->userdata : NULL; + d3d10_video_t* d3d10 = (d3d10_video_t*)video_info->userdata; if (!d3d10 || !draw) return; @@ -248,8 +247,7 @@ static void menu_display_d3d10_clear_color( menu_display_ctx_clearcolor_t* clearcolor, video_frame_info_t *video_info) { - d3d10_video_t *d3d10 = video_info ? - (d3d10_video_t*)video_info->userdata : NULL; + d3d10_video_t* d3d10 = (d3d10_video_t*)video_info->userdata; if (!d3d10 || !clearcolor) return; @@ -277,34 +275,32 @@ static bool menu_display_d3d10_font_init_first( void menu_display_d3d10_scissor_begin(video_frame_info_t *video_info, int x, int y, unsigned width, unsigned height) { - D3D10_RECT rect = {0}; - d3d10_video_t *d3d10 = video_info ? - (d3d10_video_t*)video_info->userdata : NULL; - - rect.left = x; - rect.top = y; - rect.right = width + x; - rect.bottom = height + y; + D3D10_RECT rect; + d3d10_video_t *d3d10 = (d3d10_video_t*)video_info->userdata; if (!d3d10 || !width || !height) return; + rect.left = x; + rect.top = y; + rect.right = width + x; + rect.bottom = height + y; + D3D10SetScissorRects(d3d10->device, 1, &rect); } void menu_display_d3d10_scissor_end(video_frame_info_t *video_info) { - D3D10_RECT rect = {0}; - d3d10_video_t *d3d10 = video_info ? - (d3d10_video_t*)video_info->userdata : NULL; + D3D10_RECT rect; + d3d10_video_t *d3d10 = (d3d10_video_t*)video_info->userdata; if (!d3d10) return; - rect.left = d3d10->vp.x; - rect.top = d3d10->vp.y; - rect.right = d3d10->vp.width; - rect.bottom = d3d10->vp.height; + rect.left = 0; + rect.top = 0; + rect.right = video_info->width; + rect.bottom = video_info->height; D3D10SetScissorRects(d3d10->device, 1, &rect); } diff --git a/menu/drivers_display/menu_display_d3d11.c b/menu/drivers_display/menu_display_d3d11.c index 55ac4fc9fe..0a83fd64c4 100644 --- a/menu/drivers_display/menu_display_d3d11.c +++ b/menu/drivers_display/menu_display_d3d11.c @@ -65,8 +65,8 @@ static void menu_display_d3d11_viewport(menu_display_ctx_draw_t *draw, static void menu_display_d3d11_draw(menu_display_ctx_draw_t *draw, video_frame_info_t *video_info) { - int vertex_count; - d3d11_video_t* d3d11 = video_info ? (d3d11_video_t*)video_info->userdata : NULL; + int vertex_count; + d3d11_video_t *d3d11 = (d3d11_video_t*)video_info->userdata; if (!d3d11 || !draw || !draw->texture) return; @@ -187,8 +187,7 @@ static void menu_display_d3d11_draw(menu_display_ctx_draw_t *draw, static void menu_display_d3d11_draw_pipeline(menu_display_ctx_draw_t *draw, video_frame_info_t *video_info) { - d3d11_video_t* d3d11 = video_info ? - (d3d11_video_t*)video_info->userdata : NULL; + d3d11_video_t *d3d11 = (d3d11_video_t*)video_info->userdata; if (!d3d11 || !draw) return; @@ -247,8 +246,7 @@ static void menu_display_d3d11_clear_color( menu_display_ctx_clearcolor_t* clearcolor, video_frame_info_t *video_info) { - d3d11_video_t *d3d11 = video_info ? - (d3d11_video_t*)video_info->userdata : NULL; + d3d11_video_t *d3d11 = (d3d11_video_t*)video_info->userdata; if (!d3d11 || !clearcolor) return; @@ -276,34 +274,32 @@ static bool menu_display_d3d11_font_init_first( void menu_display_d3d11_scissor_begin(video_frame_info_t *video_info, int x, int y, unsigned width, unsigned height) { - D3D11_RECT rect = {0}; - d3d11_video_t *d3d11 = video_info ? - (d3d11_video_t*)video_info->userdata : NULL; - - rect.left = x; - rect.top = y; - rect.right = width + x; - rect.bottom = height + y; + D3D11_RECT rect; + d3d11_video_t *d3d11 = (d3d11_video_t*)video_info->userdata; if (!d3d11 || !width || !height) return; + rect.left = x; + rect.top = y; + rect.right = width + x; + rect.bottom = height + y; + D3D11SetScissorRects(d3d11->context, 1, &rect); } void menu_display_d3d11_scissor_end(video_frame_info_t *video_info) { - D3D11_RECT rect = {0}; - d3d11_video_t *d3d11 = video_info ? - (d3d11_video_t*)video_info->userdata : NULL; + D3D11_RECT rect; + d3d11_video_t *d3d11 = (d3d11_video_t*)video_info->userdata; if (!d3d11) return; - rect.left = d3d11->vp.x; - rect.top = d3d11->vp.y; - rect.right = d3d11->vp.width; - rect.bottom = d3d11->vp.height; + rect.left = 0; + rect.top = 0; + rect.right = video_info->width; + rect.bottom = video_info->height; D3D11SetScissorRects(d3d11->context, 1, &rect); } diff --git a/menu/drivers_display/menu_display_d3d12.c b/menu/drivers_display/menu_display_d3d12.c index e845770724..9d3d14fb8f 100644 --- a/menu/drivers_display/menu_display_d3d12.c +++ b/menu/drivers_display/menu_display_d3d12.c @@ -67,9 +67,8 @@ static void menu_display_d3d12_viewport(menu_display_ctx_draw_t *draw, static void menu_display_d3d12_draw(menu_display_ctx_draw_t *draw, video_frame_info_t *video_info) { - int vertex_count; - d3d12_video_t* d3d12 = video_info ? - (d3d12_video_t*)video_info->userdata : NULL; + int vertex_count; + d3d12_video_t *d3d12 = (d3d12_video_t*)video_info->userdata; if (!d3d12 || !draw || !draw->texture) return; @@ -205,8 +204,7 @@ static void menu_display_d3d12_draw(menu_display_ctx_draw_t *draw, static void menu_display_d3d12_draw_pipeline(menu_display_ctx_draw_t *draw, video_frame_info_t *video_info) { - d3d12_video_t *d3d12 = video_info ? - (d3d12_video_t*)video_info->userdata : NULL; + d3d12_video_t *d3d12 = (d3d12_video_t*)video_info->userdata; if (!d3d12 || !draw) return; @@ -269,7 +267,7 @@ static void menu_display_d3d12_restore_clear_color(void) {} static void menu_display_d3d12_clear_color( menu_display_ctx_clearcolor_t* clearcolor, video_frame_info_t *video_info) { - d3d12_video_t* d3d12 = video_info ? (d3d12_video_t*)video_info->userdata : NULL; + d3d12_video_t *d3d12 = (d3d12_video_t*)video_info->userdata; if (!d3d12 || !clearcolor) return; @@ -297,34 +295,32 @@ static bool menu_display_d3d12_font_init_first( void menu_display_d3d12_scissor_begin(video_frame_info_t *video_info, int x, int y, unsigned width, unsigned height) { - D3D12_RECT rect = {0}; - d3d12_video_t *d3d12 = video_info ? - (d3d12_video_t*)video_info->userdata : NULL; - - rect.left = x; - rect.top = y; - rect.right = width + x; - rect.bottom = height + y; + D3D12_RECT rect; + d3d12_video_t *d3d12 = (d3d12_video_t*)video_info->userdata; if (!d3d12 || !width || !height) return; + rect.left = x; + rect.top = y; + rect.right = width + x; + rect.bottom = height + y; + D3D12RSSetScissorRects(d3d12->queue.cmd, 1, &rect); } void menu_display_d3d12_scissor_end(video_frame_info_t *video_info) { - D3D12_RECT rect = {0}; - d3d12_video_t *d3d12 = video_info ? - (d3d12_video_t*)video_info->userdata : NULL; + D3D12_RECT rect; + d3d12_video_t *d3d12 = (d3d12_video_t*)video_info->userdata; if (!d3d12) return; - rect.left = d3d12->vp.x; - rect.top = d3d12->vp.y; - rect.right = d3d12->vp.width; - rect.bottom = d3d12->vp.height; + rect.left = 0; + rect.top = 0; + rect.right = video_info->width; + rect.bottom = video_info->height; D3D12RSSetScissorRects(d3d12->queue.cmd, 1, &rect); } diff --git a/menu/drivers_display/menu_display_d3d8.c b/menu/drivers_display/menu_display_d3d8.c index c4b0279553..4e10a5c8a6 100644 --- a/menu/drivers_display/menu_display_d3d8.c +++ b/menu/drivers_display/menu_display_d3d8.c @@ -80,8 +80,7 @@ static INT32 menu_display_prim_to_d3d8_enum( static void menu_display_d3d8_blend_begin(video_frame_info_t *video_info) { - d3d8_video_t *d3d = video_info ? - (d3d8_video_t*)video_info->userdata : NULL; + d3d8_video_t *d3d = (d3d8_video_t*)video_info->userdata; if (!d3d) return; @@ -91,8 +90,7 @@ static void menu_display_d3d8_blend_begin(video_frame_info_t *video_info) static void menu_display_d3d8_blend_end(video_frame_info_t *video_info) { - d3d8_video_t *d3d = video_info ? - (d3d8_video_t*)video_info->userdata : NULL; + d3d8_video_t *d3d = (d3d8_video_t*)video_info->userdata; if (!d3d) return; @@ -121,11 +119,9 @@ static void menu_display_d3d8_draw(menu_display_ctx_draw_t *draw, video_frame_info_t *video_info) { unsigned i; - video_shader_ctx_mvp_t mvp; math_matrix_4x4 mop, m1, m2; unsigned width, height; - d3d8_video_t *d3d = video_info ? - (d3d8_video_t*)video_info->userdata : NULL; + d3d8_video_t *d3d = (d3d8_video_t*)video_info->userdata; Vertex * pv = NULL; const float *vertex = NULL; const float *tex_coord = NULL; @@ -212,9 +208,8 @@ static void menu_display_d3d8_draw(menu_display_ctx_draw_t *draw, matrix_4x4_multiply(m2, d3d->mvp_transposed, m1); d3d_matrix_transpose(&m1, &m2); - mvp.data = d3d; - mvp.matrix = &m1; - video_driver_set_mvp(&mvp); + d3d8_set_mvp(d3d->dev, &m1); + if (draw && draw->texture) menu_display_d3d8_bind_texture(draw, d3d); @@ -241,9 +236,8 @@ static void menu_display_d3d8_restore_clear_color(void) static void menu_display_d3d8_clear_color( menu_display_ctx_clearcolor_t *clearcolor, video_frame_info_t *video_info) { - DWORD clear_color = 0; - d3d8_video_t *d3d = video_info ? - (d3d8_video_t*)video_info->userdata : NULL; + DWORD clear_color = 0; + d3d8_video_t *d3d = (d3d8_video_t*)video_info->userdata; if (!d3d || !clearcolor) return; diff --git a/menu/drivers_display/menu_display_d3d9.c b/menu/drivers_display/menu_display_d3d9.c index 72a3ba8e65..f4316aa9d9 100644 --- a/menu/drivers_display/menu_display_d3d9.c +++ b/menu/drivers_display/menu_display_d3d9.c @@ -80,8 +80,7 @@ static INT32 menu_display_prim_to_d3d9_enum( static void menu_display_d3d9_blend_begin(video_frame_info_t *video_info) { - d3d9_video_t *d3d = video_info ? - (d3d9_video_t*)video_info->userdata : NULL; + d3d9_video_t *d3d = (d3d9_video_t*)video_info->userdata; if (!d3d) return; @@ -91,8 +90,7 @@ static void menu_display_d3d9_blend_begin(video_frame_info_t *video_info) static void menu_display_d3d9_blend_end(video_frame_info_t *video_info) { - d3d9_video_t *d3d = video_info ? - (d3d9_video_t*)video_info->userdata : NULL; + d3d9_video_t *d3d = (d3d9_video_t*)video_info->userdata; if (!d3d) return; @@ -122,12 +120,10 @@ static void menu_display_d3d9_draw(menu_display_ctx_draw_t *draw, video_frame_info_t *video_info) { unsigned i; - video_shader_ctx_mvp_t mvp; math_matrix_4x4 mop, m1, m2; unsigned width, height; LPDIRECT3DDEVICE9 dev; - d3d9_video_t *d3d = video_info ? - (d3d9_video_t*)video_info->userdata : NULL; + d3d9_video_t *d3d = (d3d9_video_t*)video_info->userdata; Vertex * pv = NULL; const float *vertex = NULL; const float *tex_coord = NULL; @@ -143,7 +139,8 @@ static void menu_display_d3d9_draw(menu_display_ctx_draw_t *draw, return; pv = (Vertex*) - d3d9_vertex_buffer_lock((LPDIRECT3DVERTEXBUFFER9)d3d->menu_display.buffer); + d3d9_vertex_buffer_lock((LPDIRECT3DVERTEXBUFFER9) + d3d->menu_display.buffer); if (!pv) return; @@ -181,7 +178,8 @@ static void menu_display_d3d9_draw(menu_display_ctx_draw_t *draw, colors[2] /* B */ ); } - d3d9_vertex_buffer_unlock((LPDIRECT3DVERTEXBUFFER9)d3d->menu_display.buffer); + d3d9_vertex_buffer_unlock((LPDIRECT3DVERTEXBUFFER9) + d3d->menu_display.buffer); if(!draw->matrix_data) draw->matrix_data = menu_display_d3d9_get_default_mvp(video_info); @@ -205,9 +203,7 @@ static void menu_display_d3d9_draw(menu_display_ctx_draw_t *draw, matrix_4x4_multiply(m2, d3d->mvp_transposed, m1); d3d_matrix_transpose(&m1, &m2); - mvp.data = d3d; - mvp.matrix = &m1; - video_driver_set_mvp(&mvp); + d3d9_set_mvp(d3d->dev, &m1); if (draw && draw->texture) menu_display_d3d9_bind_texture(draw, d3d); @@ -273,12 +269,12 @@ static void menu_display_d3d9_restore_clear_color(void) } static void menu_display_d3d9_clear_color( - menu_display_ctx_clearcolor_t *clearcolor, video_frame_info_t *video_info) + menu_display_ctx_clearcolor_t *clearcolor, + video_frame_info_t *video_info) { LPDIRECT3DDEVICE9 dev; - DWORD clear_color = 0; - d3d9_video_t *d3d = video_info ? - (d3d9_video_t*)video_info->userdata : NULL; + DWORD clear_color = 0; + d3d9_video_t *d3d = (d3d9_video_t*)video_info->userdata; if (!d3d || !clearcolor) return; @@ -309,36 +305,36 @@ static bool menu_display_d3d9_font_init_first( return true; } -void menu_display_d3d9_scissor_begin(video_frame_info_t *video_info, int x, int y, unsigned width, unsigned height) +void menu_display_d3d9_scissor_begin( + video_frame_info_t *video_info, + int x, int y, unsigned width, unsigned height) { - RECT rect = {0}; - d3d9_video_t *d3d9 = video_info ? - (d3d9_video_t*)video_info->userdata : NULL; - - rect.left = x; - rect.top = y; - rect.right = width + x; - rect.bottom = height + y; + RECT rect; + d3d9_video_t *d3d9 = (d3d9_video_t*)video_info->userdata; if (!d3d9 || !width || !height) return; + rect.left = x; + rect.top = y; + rect.right = width + x; + rect.bottom = height + y; + d3d9_set_scissor_rect(d3d9->dev, &rect); } void menu_display_d3d9_scissor_end(video_frame_info_t *video_info) { - RECT rect = {0}; - d3d9_video_t *d3d9 = video_info ? - (d3d9_video_t*)video_info->userdata : NULL; + RECT rect; + d3d9_video_t *d3d9 = (d3d9_video_t*)video_info->userdata; if (!d3d9) return; - rect.left = d3d9->vp.x; - rect.top = d3d9->vp.y; - rect.right = d3d9->vp.width; - rect.bottom = d3d9->vp.height; + rect.left = 0; + rect.top = 0; + rect.right = video_info->width; + rect.bottom = video_info->height; d3d9_set_scissor_rect(d3d9->dev, &rect); } diff --git a/menu/drivers_display/menu_display_gl.c b/menu/drivers_display/menu_display_gl.c index bbfde4a0e0..310f629a0a 100644 --- a/menu/drivers_display/menu_display_gl.c +++ b/menu/drivers_display/menu_display_gl.c @@ -52,7 +52,7 @@ static const float *menu_display_gl_get_default_tex_coords(void) static void *menu_display_gl_get_default_mvp(video_frame_info_t *video_info) { - gl_t *gl = video_info ? (gl_t*)video_info->userdata : NULL; + gl_t *gl = (gl_t*)video_info->userdata; if (!gl) return NULL; @@ -103,8 +103,6 @@ static void menu_display_gl_viewport(menu_display_ctx_draw_t *draw, static void menu_display_gl_draw(menu_display_ctx_draw_t *draw, video_frame_info_t *video_info) { - video_shader_ctx_mvp_t mvp; - video_shader_ctx_coords_t coords; gl_t *gl = (gl_t*)video_info->userdata; if (!gl || !draw) @@ -118,19 +116,13 @@ static void menu_display_gl_draw(menu_display_ctx_draw_t *draw, draw->coords->lut_tex_coord = menu_display_gl_get_default_tex_coords(); menu_display_gl_viewport(draw, video_info); - if (draw) - glBindTexture(GL_TEXTURE_2D, (GLuint)draw->texture); + glBindTexture(GL_TEXTURE_2D, (GLuint)draw->texture); - coords.handle_data = gl; - coords.data = draw->coords; + gl->shader->set_coords(gl->shader_data, draw->coords); + gl->shader->set_mvp(gl->shader_data, + draw->matrix_data ? (math_matrix_4x4*)draw->matrix_data + : (math_matrix_4x4*)menu_display_gl_get_default_mvp(video_info)); - video_driver_set_coords(&coords); - - mvp.data = gl; - mvp.matrix = draw->matrix_data ? (math_matrix_4x4*)draw->matrix_data - : (math_matrix_4x4*)menu_display_gl_get_default_mvp(video_info); - - video_driver_set_mvp(&mvp); glDrawArrays(menu_display_prim_to_gl_enum( draw->prim_type), 0, draw->coords->vertices); @@ -245,7 +237,8 @@ static bool menu_display_gl_font_init_first( return true; } -static void menu_display_gl_scissor_begin(video_frame_info_t *video_info, int x, int y, +static void menu_display_gl_scissor_begin( + video_frame_info_t *video_info, int x, int y, unsigned width, unsigned height) { glScissor(x, video_info->height - y - height, width, height); diff --git a/menu/drivers_display/menu_display_gl1.c b/menu/drivers_display/menu_display_gl1.c index 7780ebd0ee..7e308015bd 100644 --- a/menu/drivers_display/menu_display_gl1.c +++ b/menu/drivers_display/menu_display_gl1.c @@ -53,7 +53,7 @@ static const float *menu_display_gl1_get_default_tex_coords(void) static void *menu_display_gl1_get_default_mvp(video_frame_info_t *video_info) { - gl1_t *gl1 = video_info ? (gl1_t*)video_info->userdata : NULL; + gl1_t *gl1 = (gl1_t*)video_info->userdata; if (!gl1) return NULL; @@ -100,9 +100,7 @@ static void menu_display_gl1_draw(menu_display_ctx_draw_t *draw, video_frame_info_t *video_info) { video_shader_ctx_mvp_t mvp; - video_shader_ctx_coords_t coords; - gl1_t *gl1 = video_info ? - (gl1_t*)video_info->userdata : NULL; + gl1_t *gl1 = (gl1_t*)video_info->userdata; if (!gl1 || !draw) return; @@ -120,19 +118,13 @@ static void menu_display_gl1_draw(menu_display_ctx_draw_t *draw, glBindTexture(GL_TEXTURE_2D, (GLuint)draw->texture); - coords.handle_data = gl1; - coords.data = draw->coords; - - video_driver_set_coords(&coords); - mvp.data = gl1; mvp.matrix = draw->matrix_data ? (math_matrix_4x4*)draw->matrix_data : (math_matrix_4x4*)menu_display_gl1_get_default_mvp(video_info); glMatrixMode(GL_PROJECTION); glPushMatrix(); - - video_driver_set_mvp(&mvp); + glLoadMatrixf(mvp.matrix); glMatrixMode(GL_MODELVIEW); glPushMatrix(); @@ -201,6 +193,7 @@ static void menu_display_gl1_scissor_begin(video_frame_info_t *video_info, int x static void menu_display_gl1_scissor_end(video_frame_info_t *video_info) { + glScissor(0, 0, video_info->width, video_info->height); glDisable(GL_SCISSOR_TEST); } diff --git a/menu/drivers_display/menu_display_gl_core.c b/menu/drivers_display/menu_display_gl_core.c index 22d9b26672..1e3ee8bc5f 100644 --- a/menu/drivers_display/menu_display_gl_core.c +++ b/menu/drivers_display/menu_display_gl_core.c @@ -51,7 +51,7 @@ static const float gl_core_colors[] = { static void *menu_display_gl_core_get_default_mvp(video_frame_info_t *video_info) { - gl_core_t *gl_core = video_info ? (gl_core_t*)video_info->userdata : NULL; + gl_core_t *gl_core = (gl_core_t*)video_info->userdata; if (!gl_core) return NULL; return &gl_core->mvp_no_rot; @@ -83,23 +83,23 @@ static void menu_display_gl_core_draw_pipeline(menu_display_ctx_draw_t *draw, video_frame_info_t *video_info) { #ifdef HAVE_SHADERPIPELINE + float output_size[2]; + static struct video_coords blank_coords; static uint8_t ubo_scratch_data[768]; static float t = 0.0f; float yflip = 0.0f; - static struct video_coords blank_coords; - float output_size[2]; - video_coord_array_t *ca = NULL; - gl_core_t *gl = video_info ? (gl_core_t*)video_info->userdata : NULL; + video_coord_array_t *ca = NULL; + gl_core_t *gl_core = (gl_core_t*)video_info->userdata; - if (!gl || !draw) + if (!gl_core || !draw) return; - draw->x = 0; - draw->y = 0; - draw->matrix_data = NULL; + draw->x = 0; + draw->y = 0; + draw->matrix_data = NULL; - output_size[0] = (float)video_info->width; - output_size[1] = (float)video_info->height; + output_size[0] = (float)video_info->width; + output_size[1] = (float)video_info->height; switch (draw->pipeline.id) { @@ -123,7 +123,8 @@ static void menu_display_gl_core_draw_pipeline(menu_display_ctx_draw_t *draw, case VIDEO_SHADER_MENU_4: case VIDEO_SHADER_MENU_5: draw->pipeline.backend_data = ubo_scratch_data; - draw->pipeline.backend_data_size = sizeof(math_matrix_4x4) + 4 * sizeof(float); + draw->pipeline.backend_data_size = sizeof(math_matrix_4x4) + + 4 * sizeof(float); /* Match UBO layout in shader. */ memcpy(ubo_scratch_data, @@ -135,11 +136,11 @@ static void menu_display_gl_core_draw_pipeline(menu_display_ctx_draw_t *draw, if (draw->pipeline.id == VIDEO_SHADER_MENU_5) yflip = 1.0f; - else - yflip = 0.0f; - memcpy(ubo_scratch_data + sizeof(math_matrix_4x4) + 2 * sizeof(float), &t, sizeof(t)); - memcpy(ubo_scratch_data + sizeof(math_matrix_4x4) + 3 * sizeof(float), &yflip, sizeof(yflip)); + memcpy(ubo_scratch_data + sizeof(math_matrix_4x4) + + 2 * sizeof(float), &t, sizeof(t)); + memcpy(ubo_scratch_data + sizeof(math_matrix_4x4) + + 3 * sizeof(float), &yflip, sizeof(yflip)); draw->coords = &blank_coords; blank_coords.vertices = 4; draw->prim_type = MENU_DISPLAY_PRIM_TRIANGLESTRIP; @@ -158,7 +159,7 @@ static void menu_display_gl_core_draw(menu_display_ctx_draw_t *draw, const float *color = NULL; struct gl_core_vertex *pv = NULL; GLuint texture = 0; - gl_core_t *gl = video_info ? (gl_core_t*)video_info->userdata : NULL; + gl_core_t *gl = (gl_core_t*)video_info->userdata; const struct gl_core_buffer_locations *loc = NULL; if (!gl || !draw) @@ -228,40 +229,40 @@ static void menu_display_gl_core_draw(menu_display_ctx_draw_t *draw, } if (loc && loc->flat_ubo_vertex >= 0) - { glUniform4fv(loc->flat_ubo_vertex, (GLsizei)((draw->pipeline.backend_data_size + 15) / 16), (const GLfloat*)draw->pipeline.backend_data); - } if (loc && loc->flat_ubo_fragment >= 0) - { glUniform4fv(loc->flat_ubo_fragment, (GLsizei)((draw->pipeline.backend_data_size + 15) / 16), (const GLfloat*)draw->pipeline.backend_data); - } if (!loc) { const math_matrix_4x4 *mat = draw->matrix_data - ? (const math_matrix_4x4*)draw->matrix_data : menu_display_gl_core_get_default_mvp(video_info); + ? (const math_matrix_4x4*)draw->matrix_data : (const math_matrix_4x4*)menu_display_gl_core_get_default_mvp(video_info); if (gl->pipelines.alpha_blend_loc.flat_ubo_vertex >= 0) - { glUniform4fv(gl->pipelines.alpha_blend_loc.flat_ubo_vertex, 4, mat->data); - } } glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); glEnableVertexAttribArray(2); - gl_core_bind_scratch_vbo(gl, vertex, 2 * sizeof(float) * draw->coords->vertices); - glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void *)(uintptr_t)0); - gl_core_bind_scratch_vbo(gl, tex_coord, 2 * sizeof(float) * draw->coords->vertices); - glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void *)(uintptr_t)0); - gl_core_bind_scratch_vbo(gl, color, 4 * sizeof(float) * draw->coords->vertices); - glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void *)(uintptr_t)0); + gl_core_bind_scratch_vbo(gl, vertex, + 2 * sizeof(float) * draw->coords->vertices); + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, + 2 * sizeof(float), (void *)(uintptr_t)0); + gl_core_bind_scratch_vbo(gl, tex_coord, + 2 * sizeof(float) * draw->coords->vertices); + glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, + 2 * sizeof(float), (void *)(uintptr_t)0); + gl_core_bind_scratch_vbo(gl, color, + 4 * sizeof(float) * draw->coords->vertices); + glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, + 4 * sizeof(float), (void *)(uintptr_t)0); if (draw->prim_type == MENU_DISPLAY_PRIM_TRIANGLESTRIP) glDrawArrays(GL_TRIANGLE_STRIP, 0, draw->coords->vertices); @@ -294,7 +295,7 @@ static void menu_display_gl_core_clear_color( static void menu_display_gl_core_blend_begin(video_frame_info_t *video_info) { - gl_core_t *gl = video_info ? (gl_core_t*)video_info->userdata : NULL; + gl_core_t *gl = (gl_core_t*)video_info->userdata; glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); diff --git a/menu/drivers_display/menu_display_metal.m b/menu/drivers_display/menu_display_metal.m index 97103bacad..ac9a9f76d8 100644 --- a/menu/drivers_display/menu_display_metal.m +++ b/menu/drivers_display/menu_display_metal.m @@ -25,8 +25,6 @@ #include "../../gfx/video_driver.h" #import "../../gfx/common/metal_common.h" -#define GET_DRIVER(video_info) (video_info ? (__bridge MetalDriver *)video_info->userdata : NULL); - static const float *menu_display_metal_get_default_vertices(void) { return [MenuDisplay defaultVertices]; @@ -39,7 +37,7 @@ static const float *menu_display_metal_get_default_tex_coords(void) static void *menu_display_metal_get_default_mvp(video_frame_info_t *video_info) { - MetalDriver *md = GET_DRIVER(video_info); + MetalDriver *md = (__bridge MetalDriver *)video_info->userdata; if (!md) return NULL; @@ -48,7 +46,7 @@ static void *menu_display_metal_get_default_mvp(video_frame_info_t *video_info) static void menu_display_metal_blend_begin(video_frame_info_t *video_info) { - MetalDriver *md = GET_DRIVER(video_info); + MetalDriver *md = (__bridge MetalDriver *)video_info->userdata; if (!md) return; @@ -57,7 +55,7 @@ static void menu_display_metal_blend_begin(video_frame_info_t *video_info) static void menu_display_metal_blend_end(video_frame_info_t *video_info) { - MetalDriver *md = GET_DRIVER(video_info); + MetalDriver *md = (__bridge MetalDriver *)video_info->userdata; if (!md) return; @@ -67,7 +65,7 @@ static void menu_display_metal_blend_end(video_frame_info_t *video_info) static void menu_display_metal_draw(menu_display_ctx_draw_t *draw, video_frame_info_t *video_info) { - MetalDriver *md = GET_DRIVER(video_info); + MetalDriver *md = (__bridge MetalDriver *)video_info->userdata; if (!md || !draw) return; @@ -76,7 +74,7 @@ static void menu_display_metal_draw(menu_display_ctx_draw_t *draw, static void menu_display_metal_draw_pipeline(menu_display_ctx_draw_t *draw, video_frame_info_t *video_info) { - MetalDriver *md = GET_DRIVER(video_info); + MetalDriver *md = (__bridge MetalDriver *)video_info->userdata; if (!md || !draw) return; @@ -90,7 +88,7 @@ static void menu_display_metal_viewport(menu_display_ctx_draw_t *draw, static void menu_display_metal_scissor_begin(video_frame_info_t *video_info, int x, int y, unsigned width, unsigned height) { - MetalDriver *md = GET_DRIVER(video_info); + MetalDriver *md = (__bridge MetalDriver *)video_info->userdata; if (!md) return; @@ -100,7 +98,7 @@ static void menu_display_metal_scissor_begin(video_frame_info_t *video_info, int static void menu_display_metal_scissor_end(video_frame_info_t *video_info) { - MetalDriver *md = GET_DRIVER(video_info); + MetalDriver *md = (__bridge MetalDriver *)video_info->userdata; if (!md) return; @@ -109,13 +107,13 @@ static void menu_display_metal_scissor_end(video_frame_info_t *video_info) static void menu_display_metal_restore_clear_color(void) { - // nothing to do + /* nothing to do */ } static void menu_display_metal_clear_color(menu_display_ctx_clearcolor_t *clearcolor, video_frame_info_t *video_info) { - MetalDriver *md = GET_DRIVER(video_info); + MetalDriver *md = (__bridge MetalDriver *)video_info->userdata; if (!md) return; diff --git a/menu/drivers_display/menu_display_vita2d.c b/menu/drivers_display/menu_display_vita2d.c index 701825ea50..8a9b620db4 100644 --- a/menu/drivers_display/menu_display_vita2d.c +++ b/menu/drivers_display/menu_display_vita2d.c @@ -56,8 +56,7 @@ static const float *menu_display_vita2d_get_default_tex_coords(void) static void *menu_display_vita2d_get_default_mvp( video_frame_info_t *video_info) { - vita_video_t *vita2d = video_info ? - (vita_video_t*)video_info->userdata : NULL; + vita_video_t *vita2d = (vita_video_t*)video_info->userdata; if (!vita2d) return NULL; @@ -113,8 +112,7 @@ static void menu_display_vita2d_draw(menu_display_ctx_draw_t *draw, const float *vertex = NULL; const float *tex_coord = NULL; const float *color = NULL; - vita_video_t *vita2d = video_info ? - (vita_video_t*)video_info->userdata : NULL; + vita_video_t *vita2d = (vita_video_t*)video_info->userdata; if (!vita2d || !draw) return; diff --git a/menu/drivers_display/menu_display_vulkan.c b/menu/drivers_display/menu_display_vulkan.c index b4b6af2f30..0beef42eaf 100644 --- a/menu/drivers_display/menu_display_vulkan.c +++ b/menu/drivers_display/menu_display_vulkan.c @@ -50,7 +50,7 @@ static const float vk_colors[] = { static void *menu_display_vk_get_default_mvp(video_frame_info_t *video_info) { - vk_t *vk = video_info ? (vk_t*)video_info->userdata : NULL; + vk_t *vk = (vk_t*)video_info->userdata; if (!vk) return NULL; return &vk->mvp_no_rot; @@ -102,8 +102,7 @@ static unsigned to_menu_pipeline( static void menu_display_vk_viewport(menu_display_ctx_draw_t *draw, video_frame_info_t *video_info) { - vk_t *vk = video_info ? (vk_t*)video_info->userdata - : NULL; + vk_t *vk = (vk_t*)video_info->userdata; if (!vk || !draw) return; @@ -121,13 +120,12 @@ static void menu_display_vk_draw_pipeline(menu_display_ctx_draw_t *draw, { #ifdef HAVE_SHADERPIPELINE static uint8_t ubo_scratch_data[768]; - static float t = 0.0f; - float yflip = 0.0f; + static float t = 0.0f; + float yflip = 0.0f; static struct video_coords blank_coords; float output_size[2]; - video_coord_array_t *ca = NULL; - vk_t *vk = video_info ? - (vk_t*)video_info->userdata : NULL; + video_coord_array_t *ca = NULL; + vk_t *vk = (vk_t*)video_info->userdata; if (!vk || !draw) return; @@ -161,7 +159,8 @@ static void menu_display_vk_draw_pipeline(menu_display_ctx_draw_t *draw, case VIDEO_SHADER_MENU_4: case VIDEO_SHADER_MENU_5: draw->pipeline.backend_data = ubo_scratch_data; - draw->pipeline.backend_data_size = sizeof(math_matrix_4x4) + 4 * sizeof(float); + draw->pipeline.backend_data_size = sizeof(math_matrix_4x4) + + 4 * sizeof(float); /* Match UBO layout in shader. */ memcpy(ubo_scratch_data, @@ -177,11 +176,13 @@ static void menu_display_vk_draw_pipeline(menu_display_ctx_draw_t *draw, else yflip = 1.0f; - memcpy(ubo_scratch_data + sizeof(math_matrix_4x4) + 2 * sizeof(float), &t, sizeof(t)); - memcpy(ubo_scratch_data + sizeof(math_matrix_4x4) + 3 * sizeof(float), &yflip, sizeof(yflip)); - draw->coords = &blank_coords; + memcpy(ubo_scratch_data + sizeof(math_matrix_4x4) + + 2 * sizeof(float), &t, sizeof(t)); + memcpy(ubo_scratch_data + sizeof(math_matrix_4x4) + + 3 * sizeof(float), &yflip, sizeof(yflip)); + draw->coords = &blank_coords; blank_coords.vertices = 4; - draw->prim_type = MENU_DISPLAY_PRIM_TRIANGLESTRIP; + draw->prim_type = MENU_DISPLAY_PRIM_TRIANGLESTRIP; break; } @@ -199,8 +200,7 @@ static void menu_display_vk_draw(menu_display_ctx_draw_t *draw, const float *tex_coord = NULL; const float *color = NULL; struct vk_vertex *pv = NULL; - vk_t *vk = video_info ? - (vk_t*)video_info->userdata : NULL; + vk_t *vk = (vk_t*)video_info->userdata; if (!vk || !draw) return; @@ -305,7 +305,7 @@ static void menu_display_vk_clear_color( { VkClearRect rect; VkClearAttachment attachment; - vk_t *vk = video_info ? (vk_t*)video_info->userdata : NULL; + vk_t *vk = (vk_t*)video_info->userdata; if (!vk || !clearcolor) return; @@ -327,7 +327,7 @@ static void menu_display_vk_clear_color( static void menu_display_vk_blend_begin(video_frame_info_t *video_info) { - vk_t *vk = video_info ? (vk_t*)video_info->userdata : NULL; + vk_t *vk = (vk_t*)video_info->userdata; if (vk) vk->display.blend = true; @@ -335,7 +335,7 @@ static void menu_display_vk_blend_begin(video_frame_info_t *video_info) static void menu_display_vk_blend_end(video_frame_info_t *video_info) { - vk_t *vk = video_info ? (vk_t*)video_info->userdata : NULL; + vk_t *vk = (vk_t*)video_info->userdata; if (vk) vk->display.blend = false; @@ -360,7 +360,7 @@ static bool menu_display_vk_font_init_first( static void menu_display_vk_scissor_begin(video_frame_info_t *video_info, int x, int y, unsigned width, unsigned height) { - vk_t *vk = (vk_t*)video_info->userdata; + vk_t *vk = (vk_t*)video_info->userdata; vk->tracker.use_scissor = true; vk->tracker.scissor.offset.x = x; @@ -372,7 +372,8 @@ static void menu_display_vk_scissor_begin(video_frame_info_t *video_info, static void menu_display_vk_scissor_end(video_frame_info_t *video_info) { - vk_t *vk = (vk_t*)video_info->userdata; + vk_t *vk = (vk_t*)video_info->userdata; + vk->tracker.use_scissor = false; vk->tracker.dirty |= VULKAN_DIRTY_DYNAMIC_BIT; } diff --git a/menu/drivers_display/menu_display_wiiu.c b/menu/drivers_display/menu_display_wiiu.c index 95471205a1..fdc6729fd1 100644 --- a/menu/drivers_display/menu_display_wiiu.c +++ b/menu/drivers_display/menu_display_wiiu.c @@ -63,8 +63,7 @@ static void menu_display_wiiu_viewport(menu_display_ctx_draw_t *draw, static void menu_display_wiiu_draw(menu_display_ctx_draw_t *draw, video_frame_info_t *video_info) { - wiiu_video_t *wiiu = video_info ? - (wiiu_video_t*)video_info->userdata : NULL; + wiiu_video_t *wiiu = (wiiu_video_t*)video_info->userdata; if (!wiiu || !draw) return; @@ -234,8 +233,7 @@ static void menu_display_wiiu_draw_pipeline(menu_display_ctx_draw_t *draw, video_frame_info_t *video_info) { video_coord_array_t *ca = NULL; - wiiu_video_t *wiiu = video_info ? - (wiiu_video_t*)video_info->userdata : NULL; + wiiu_video_t *wiiu = (wiiu_video_t*)video_info->userdata; if (!wiiu || !draw) return; diff --git a/menu/menu_animation.c b/menu/menu_animation.c index 3a1bbb5598..6d8728bbc5 100644 --- a/menu/menu_animation.c +++ b/menu/menu_animation.c @@ -356,7 +356,7 @@ static void menu_animation_ticker_loop(uint64_t idx, /* String 1 */ offset = (phase < (int)str_width) ? phase : 0; - width = str_width - phase; + width = (int)(str_width - phase); width = (width < 0) ? 0 : width; width = (width > (int)max_width) ? max_width : width; @@ -364,9 +364,9 @@ static void menu_animation_ticker_loop(uint64_t idx, *width1 = width; /* String 2 */ - offset = phase - str_width; + offset = (int)(phase - str_width); offset = offset < 0 ? 0 : offset; - width = max_width - *width1; + width = (int)(max_width - *width1); width = (width > (int)spacer_width) ? spacer_width : width; width = width - offset; diff --git a/menu/menu_cbs.h b/menu/menu_cbs.h index e1f61c5e2b..5845b8b157 100644 --- a/menu/menu_cbs.h +++ b/menu/menu_cbs.h @@ -149,6 +149,8 @@ enum }; /* Function callbacks */ +int action_cb_push_dropdown_item_resolution(const char *path, + const char *label, unsigned type, size_t idx, size_t entry_idx); int action_cancel_pop_default(const char *path, const char *label, unsigned type, size_t idx); diff --git a/menu/menu_defines.h b/menu/menu_defines.h index 91a0ad3f16..8ea24d035d 100644 --- a/menu/menu_defines.h +++ b/menu/menu_defines.h @@ -249,6 +249,24 @@ enum rgui_upscale_level RGUI_UPSCALE_LAST }; +enum rgui_aspect_ratio +{ + RGUI_ASPECT_RATIO_4_3 = 0, + RGUI_ASPECT_RATIO_16_9, + RGUI_ASPECT_RATIO_16_9_CENTRE, + RGUI_ASPECT_RATIO_16_10, + RGUI_ASPECT_RATIO_16_10_CENTRE, + RGUI_ASPECT_RATIO_LAST +}; + +enum rgui_aspect_ratio_lock +{ + RGUI_ASPECT_RATIO_LOCK_NONE = 0, + RGUI_ASPECT_RATIO_LOCK_FIT_SCREEN, + RGUI_ASPECT_RATIO_LOCK_INTEGER, + RGUI_ASPECT_RATIO_LOCK_LAST +}; + enum menu_action { MENU_ACTION_NOOP = 0, diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 8f48e54846..0642e5f048 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -1173,15 +1173,6 @@ static int menu_displaylist_parse_system_info(menu_displaylist_info_t *info) menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); - snprintf(feat_str, sizeof(feat_str), - "%s: %s", - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBXML2_SUPPORT), - _libxml2_supp ? - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); - menu_entries_append_enum(info->list, feat_str, "", - MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); - snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_SDL_IMAGE_SUPPORT), @@ -1282,7 +1273,6 @@ static int menu_displaylist_parse_playlist(menu_displaylist_info_t *info, playlist_t *playlist, const char *path_playlist, bool is_collection) { unsigned i; - size_t selection = menu_navigation_get_selection(); size_t list_size = playlist_size(playlist); settings_t *settings = config_get_ptr(); bool is_rgui = string_is_equal(settings->arrays.menu_driver, "rgui"); @@ -1324,8 +1314,24 @@ static int menu_displaylist_parse_playlist(menu_displaylist_info_t *info, strlcpy(label_spacer, PL_LABEL_SPACER_DEFAULT, sizeof(label_spacer)); } - /* Inform menu driver of current system name */ - if (!string_is_empty(info->path)) + /* Inform menu driver of current system name + * > Note: history, favorites and images_history + * require special treatment here, since info->path + * is nonsensical in these cases (and we *do* need + * to call set_thumbnail_system() in these cases, + * since all three playlist types have thumbnail + * support) */ + if (string_is_equal(path_playlist, "history") || + string_is_equal(path_playlist, "favorites") || + string_is_equal(path_playlist, "images_history")) + { + char system_name[15]; + system_name[0] = '\0'; + + strlcpy(system_name, path_playlist, sizeof(system_name)); + menu_driver_set_thumbnail_system(system_name, sizeof(system_name)); + } + else if (!string_is_empty(info->path)) { char lpl_basename[PATH_MAX_LENGTH]; lpl_basename[0] = '\0'; @@ -1340,22 +1346,18 @@ static int menu_displaylist_parse_playlist(menu_displaylist_info_t *info, for (i = 0; i < list_size; i++) { char menu_entry_label[PATH_MAX_LENGTH]; - const char *path = NULL; - const char *label = NULL; - const char *core_path = NULL; - const char *core_name = NULL; + const struct playlist_entry *entry = NULL; menu_entry_label[0] = '\0'; /* Read playlist entry */ - playlist_get_index(playlist, i, - &path, &label, &core_path, &core_name, NULL, NULL); + playlist_get_index(playlist, i, &entry); /* Extract any available runtime values, if required */ if (get_runtime) { runtime_log_t *runtime_log = NULL; - runtime_log = runtime_log_init(path, core_path, + runtime_log = runtime_log_init(entry->path, entry->core_path, settings->uints.playlist_sublabel_runtime_type == PLAYLIST_RUNTIME_PER_CORE); if (runtime_log) @@ -1395,25 +1397,7 @@ static int menu_displaylist_parse_playlist(menu_displaylist_info_t *info, } } - /* If this is a standard collection (not a history list or - * favourites), trigger thumbnail update for current selection. - * Note: Thumbnail updates must be omitted when using RGUI, - * since this functionality is handled elsewhere... */ - if (i == selection) - { - if (is_collection && !string_is_empty(label) && !is_rgui) - { - char *content_basename = strdup(label); - /* Note: If menu_driver_set_thumbnail_content() accepted a const pointer, - * we could save a string duplication here... */ - menu_driver_set_thumbnail_content(content_basename, strlen(content_basename) + 1); - menu_driver_ctl(RARCH_MENU_CTL_UPDATE_THUMBNAIL_PATH, NULL); - menu_driver_ctl(RARCH_MENU_CTL_UPDATE_THUMBNAIL_IMAGE, NULL); - free(content_basename); - } - } - - if (!string_is_empty(path)) + if (!string_is_empty(entry->path)) { /* Standard playlist entry * > Base menu entry label is always playlist label @@ -1421,27 +1405,27 @@ static int menu_displaylist_parse_playlist(menu_displaylist_info_t *info, * > If required, add currently associated core (if any), otherwise * no further action is necessary */ - if (string_is_empty(label)) - fill_short_pathname_representation(menu_entry_label, path, sizeof(menu_entry_label)); + if (string_is_empty(entry->label)) + fill_short_pathname_representation(menu_entry_label, entry->path, sizeof(menu_entry_label)); else - strlcpy(menu_entry_label, label, sizeof(menu_entry_label)); + strlcpy(menu_entry_label, entry->label, sizeof(menu_entry_label)); if (show_inline_core_name) { - if (!string_is_empty(core_name) && !string_is_equal(core_name, file_path_str(FILE_PATH_DETECT))) + if (!string_is_empty(entry->core_name) && !string_is_equal(entry->core_name, file_path_str(FILE_PATH_DETECT))) { strlcat(menu_entry_label, label_spacer, sizeof(menu_entry_label)); - strlcat(menu_entry_label, core_name, sizeof(menu_entry_label)); + strlcat(menu_entry_label, entry->core_name, sizeof(menu_entry_label)); } } - menu_entries_append_enum(info->list, menu_entry_label, path, + menu_entries_append_enum(info->list, menu_entry_label, entry->path, MENU_ENUM_LABEL_PLAYLIST_ENTRY, FILE_TYPE_RPL_ENTRY, 0, i); } else { - if (core_name) - strlcpy(menu_entry_label, core_name, sizeof(menu_entry_label)); + if (entry->core_name) + strlcpy(menu_entry_label, entry->core_name, sizeof(menu_entry_label)); menu_entries_append_enum(info->list, menu_entry_label, path_playlist, MENU_ENUM_LABEL_PLAYLIST_ENTRY, FILE_TYPE_PLAYLIST_ENTRY, 0, i); @@ -1722,12 +1706,15 @@ static int menu_displaylist_parse_database_entry(menu_handle_t *menu, snprintf(crc_str, sizeof(crc_str), "%08X", db_info_entry->crc32); - /* It is unclear why parsing a database should trigger a - * thumbnail update, but I guess this is here for a reason... - * Regardless, thumbnail updates must be disabled when using + /* This allows thumbnails to be shown while viewing database + * entries... + * It only makes sense to do this for the first info entry, + * since menu drivers cannot handle multiple successive + * calls of menu_driver_set_thumbnail_content()... + * Note that thumbnail updates must be disabled when using * RGUI, since this functionality is handled elsewhere * (and doing it here creates harmful conflicts) */ - if (!string_is_equal(settings->arrays.menu_driver, "rgui")) + if ((i == 0) && !string_is_equal(settings->arrays.menu_driver, "rgui")) { if (!string_is_empty(db_info_entry->name)) strlcpy(thumbnail_content, db_info_entry->name, @@ -1745,16 +1732,14 @@ static int menu_displaylist_parse_database_entry(menu_handle_t *menu, { for (j = 0; j < playlist_size(playlist); j++) { - const char *crc32 = NULL; + const struct playlist_entry *entry = NULL; bool match_found = false; struct string_list *tmp_str_list = NULL; - playlist_get_index(playlist, j, - NULL, NULL, NULL, NULL, - &crc32, NULL); + playlist_get_index(playlist, j, &entry); - if (crc32) - tmp_str_list = string_split(crc32, "|"); + if (entry->crc32) + tmp_str_list = string_split(entry->crc32, "|"); if (!tmp_str_list) continue; @@ -2152,8 +2137,8 @@ static unsigned deferred_push_video_shader_parameters_common( return count; } -static int menu_displaylist_parse_settings_internal(void *data, - menu_displaylist_info_t *info, +static int menu_displaylist_parse_settings_internal( + file_list_t *info_list, enum menu_displaylist_parse_type parse_type, bool add_empty_entry, unsigned entry_type, @@ -2312,11 +2297,11 @@ static int menu_displaylist_parse_settings_internal(void *data, (entry_type >= MENU_SETTINGS_INPUT_BEGIN) && (entry_type < MENU_SETTINGS_INPUT_END) ) - entry_type = MENU_SETTINGS_INPUT_BEGIN + count; + entry_type = (unsigned)(MENU_SETTINGS_INPUT_BEGIN + count); if (entry_type == 0) entry_type = menu_setting_set_flags(setting); - menu_entries_append(info->list, short_description, + menu_entries_append(info_list, short_description, name, entry_type, 0, 0); count++; @@ -2352,7 +2337,7 @@ loop: } if (count == 0 && add_empty_entry) - menu_entries_append_enum(info->list, + menu_entries_append_enum(info_list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_SETTINGS_FOUND), msg_hash_to_str(MENU_ENUM_LABEL_NO_SETTINGS_FOUND), MENU_ENUM_LABEL_NO_SETTINGS_FOUND, @@ -2361,8 +2346,8 @@ loop: return 0; } -static int menu_displaylist_parse_settings_internal_enum(void *data, - menu_displaylist_info_t *info, +int menu_displaylist_parse_settings_internal_enum( + file_list_t *info_list, enum menu_displaylist_parse_type parse_type, bool add_empty_entry, rarch_setting_t *setting, @@ -2516,7 +2501,7 @@ static int menu_displaylist_parse_settings_internal_enum(void *data, goto loop; #endif - menu_entries_append_enum(info->list, short_description, + menu_entries_append_enum(info_list, short_description, name, enum_idx, menu_setting_set_flags(setting), 0, 0); count++; @@ -2554,7 +2539,7 @@ loop: if (count == 0) { if (add_empty_entry) - menu_entries_append_enum(info->list, + menu_entries_append_enum(info_list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_SETTINGS_FOUND), msg_hash_to_str(MENU_ENUM_LABEL_NO_SETTINGS_FOUND), MENU_ENUM_LABEL_NO_SETTINGS_FOUND, @@ -2565,10 +2550,6 @@ loop: return 0; } -#define menu_displaylist_parse_settings(data, info, info_label, parse_type, add_empty_entry, entry_type) menu_displaylist_parse_settings_internal(data, info, parse_type, add_empty_entry, entry_type, menu_setting_find(info_label)) - -#define menu_displaylist_parse_settings_enum(data, info, label, parse_type, add_empty_entry) menu_displaylist_parse_settings_internal_enum(data, info, parse_type, add_empty_entry, menu_setting_find_enum(label), label) - static void menu_displaylist_set_new_playlist( menu_handle_t *menu, const char *path) { @@ -2692,7 +2673,7 @@ static int menu_displaylist_parse_load_content_settings( #endif ) { - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_STATE_SLOT, PARSE_ONLY_INT, true); menu_entries_append_enum(info->list, @@ -2890,19 +2871,14 @@ static int menu_displaylist_parse_horizontal_content_actions( menu_displaylist_info_t *info) { bool content_loaded = false; - const char *label = NULL; - const char *entry_path = NULL; - const char *core_path = NULL; - const char *core_name = NULL; - const char *db_name = NULL; playlist_t *playlist = playlist_get_cached(); settings_t *settings = config_get_ptr(); const char *fullpath = path_get(RARCH_PATH_CONTENT); unsigned idx = menu->rpl_entry_selection_ptr; + const struct playlist_entry *entry = NULL; if (playlist) - playlist_get_index(playlist, idx, - &entry_path, &label, &core_path, &core_name, NULL, &db_name); + playlist_get_index(playlist, idx, &entry); content_loaded = !rarch_ctl(RARCH_CTL_IS_DUMMY_CORE, NULL) && string_is_equal(menu->deferred_path, fullpath); @@ -2913,8 +2889,8 @@ static int menu_displaylist_parse_horizontal_content_actions( { const char *ext = NULL; - if (!string_is_empty(entry_path)) - ext = path_get_extension(entry_path); + if (entry && !string_is_empty(entry->path)) + ext = path_get_extension(entry->path); if (!string_is_empty(ext) && audio_driver_mixer_extension_supported(ext)) @@ -2968,10 +2944,9 @@ static int menu_displaylist_parse_horizontal_content_actions( msg_hash_to_str(MENU_ENUM_LABEL_RESET_CORE_ASSOCIATION), MENU_ENUM_LABEL_RESET_CORE_ASSOCIATION, FILE_TYPE_PLAYLIST_ENTRY, 0, 0); } - } - if (!string_is_empty(db_name) && (!content_loaded || + if ((entry && !string_is_empty(entry->db_name)) && (!content_loaded || (content_loaded && settings->bools.quick_menu_show_information))) { char *db_path = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); @@ -2980,7 +2955,7 @@ static int menu_displaylist_parse_horizontal_content_actions( fill_pathname_join_noext(db_path, settings->paths.path_content_database, - db_name, + entry->db_name, PATH_MAX_LENGTH * sizeof(char)); strlcat(db_path, file_path_str(FILE_PATH_RDB_EXTENSION), @@ -2989,7 +2964,7 @@ static int menu_displaylist_parse_horizontal_content_actions( if (filestream_exists(db_path)) menu_entries_append_enum( info->list, - label, + entry->label, db_path, MENU_ENUM_LABEL_INFORMATION, FILE_TYPE_RDB_ENTRY, 0, idx); @@ -3341,10 +3316,10 @@ static int menu_displaylist_parse_options_cheats( msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_DELETE_ALL), MENU_ENUM_LABEL_CHEAT_DELETE_ALL, MENU_SETTING_ACTION, 0, 0); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEAT_APPLY_AFTER_LOAD, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEAT_APPLY_AFTER_TOGGLE, PARSE_ONLY_BOOL, false); menu_entries_append_enum(info->list, @@ -3393,9 +3368,9 @@ static int menu_displaylist_parse_options_remappings( snprintf(key_analog, sizeof(key_analog), msg_hash_to_str(MENU_ENUM_LABEL_INPUT_PLAYER_ANALOG_DPAD_MODE), val); - menu_displaylist_parse_settings(menu, info, + menu_displaylist_parse_settings(info->list, key_type, PARSE_ONLY_UINT, true, 0); - menu_displaylist_parse_settings(menu, info, + menu_displaylist_parse_settings(info->list, key_analog, PARSE_ONLY_UINT, true, 0); } @@ -4004,7 +3979,7 @@ static bool menu_displaylist_push_internal( info->exts = strdup( file_path_str(FILE_PATH_LPL_EXTENSION_NO_DOT)); info->label = strdup( - msg_hash_to_str(MENU_ENUM_LABEL_CONTENT_COLLECTION_LIST)); + msg_hash_to_str(MENU_ENUM_LABEL_PLAYLISTS_TAB)); menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); menu_displaylist_ctl(DISPLAYLIST_MUSIC_HISTORY, info); @@ -4023,7 +3998,7 @@ static bool menu_displaylist_push_internal( info->exts = strdup( file_path_str(FILE_PATH_LPL_EXTENSION_NO_DOT)); info->label = strdup( - msg_hash_to_str(MENU_ENUM_LABEL_CONTENT_COLLECTION_LIST)); + msg_hash_to_str(MENU_ENUM_LABEL_PLAYLISTS_TAB)); menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); menu_displaylist_ctl(DISPLAYLIST_VIDEO_HISTORY, info); @@ -4042,7 +4017,7 @@ static bool menu_displaylist_push_internal( info->exts = strdup( file_path_str(FILE_PATH_LPL_EXTENSION_NO_DOT)); info->label = strdup( - msg_hash_to_str(MENU_ENUM_LABEL_CONTENT_COLLECTION_LIST)); + msg_hash_to_str(MENU_ENUM_LABEL_PLAYLISTS_TAB)); menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); @@ -4074,7 +4049,7 @@ static bool menu_displaylist_push_internal( info->exts = strdup( file_path_str(FILE_PATH_LPL_EXTENSION_NO_DOT)); info->label = strdup( - msg_hash_to_str(MENU_ENUM_LABEL_CONTENT_COLLECTION_LIST)); + msg_hash_to_str(MENU_ENUM_LABEL_PLAYLISTS_TAB)); if (string_is_empty(settings->paths.directory_playlist)) { @@ -4395,8 +4370,8 @@ void menu_displaylist_info_init(menu_displaylist_info_t *info) bool menu_displaylist_setting(menu_displaylist_ctx_parse_entry_t *entry) { - if (menu_displaylist_parse_settings_enum(entry->data, - entry->info, + if (menu_displaylist_parse_settings_enum( + entry->info->list, entry->enum_idx, entry->parse_type, entry->add_empty_entry) == -1) @@ -4404,6 +4379,555 @@ bool menu_displaylist_setting(menu_displaylist_ctx_parse_entry_t *entry) return true; } +unsigned menu_displaylist_build_list(file_list_t *list, enum menu_displaylist_ctl_state type) +{ + unsigned count = 0; + + switch (type) + { + case DISPLAYLIST_QUICK_MENU_VIEWS_SETTINGS_LIST: + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_QUICK_MENU_SHOW_TAKE_SCREENSHOT, + PARSE_ONLY_BOOL, false) == 0) + count++; + + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_QUICK_MENU_SHOW_SAVE_LOAD_STATE, + PARSE_ONLY_BOOL, false) == 0) + count++; + + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_QUICK_MENU_SHOW_UNDO_SAVE_LOAD_STATE, + PARSE_ONLY_BOOL, false) == 0) + count++; + + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_QUICK_MENU_SHOW_ADD_TO_FAVORITES, + PARSE_ONLY_BOOL, false) == 0) + count++; + + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_QUICK_MENU_SHOW_START_RECORDING, + PARSE_ONLY_BOOL, false) == 0) + count++; + + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_QUICK_MENU_SHOW_START_STREAMING, + PARSE_ONLY_BOOL, false) == 0) + count++; + + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_QUICK_MENU_SHOW_RESET_CORE_ASSOCIATION, + PARSE_ONLY_BOOL, false) == 0) + count++; + + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_QUICK_MENU_SHOW_OPTIONS, + PARSE_ONLY_BOOL, false) == 0) + count++; + + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_QUICK_MENU_SHOW_CONTROLS, + PARSE_ONLY_BOOL, false) == 0) + count++; + + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_QUICK_MENU_SHOW_CHEATS, + PARSE_ONLY_BOOL, false) == 0) + count++; + + if (video_shader_any_supported()) + { + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_QUICK_MENU_SHOW_SHADERS, + PARSE_ONLY_BOOL, false) == 0) + count++; + } + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_CONTENT_SHOW_REWIND, + PARSE_ONLY_BOOL, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_CONTENT_SHOW_LATENCY, + PARSE_ONLY_BOOL, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_CONTENT_SHOW_OVERLAYS, + PARSE_ONLY_BOOL, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_QUICK_MENU_SHOW_SAVE_CORE_OVERRIDES, + PARSE_ONLY_BOOL, false) == 0) + count++; + + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_QUICK_MENU_SHOW_SAVE_GAME_OVERRIDES, + PARSE_ONLY_BOOL, false) == 0) + count++; + + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_QUICK_MENU_SHOW_INFORMATION, + PARSE_ONLY_BOOL, false) == 0) + count++; + break; + case DISPLAYLIST_CORE_SETTINGS_LIST: + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_VIDEO_SHARED_CONTEXT, + PARSE_ONLY_BOOL, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_DUMMY_ON_CORE_SHUTDOWN, + PARSE_ONLY_BOOL, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_CHECK_FOR_MISSING_FIRMWARE, + PARSE_ONLY_BOOL, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_VIDEO_ALLOW_ROTATE, + PARSE_ONLY_BOOL, false) == 0) + count++; + break; + case DISPLAYLIST_CONFIGURATION_SETTINGS_LIST: + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_CONFIG_SAVE_ON_EXIT, + PARSE_ONLY_BOOL, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_GAME_SPECIFIC_OPTIONS, + PARSE_ONLY_BOOL, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_AUTO_OVERRIDES_ENABLE, + PARSE_ONLY_BOOL, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_AUTO_REMAPS_ENABLE, + PARSE_ONLY_BOOL, false) == 0) + count++; + break; + case DISPLAYLIST_DIRECTORY_SETTINGS_LIST: + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_SYSTEM_DIRECTORY, + PARSE_ONLY_DIR, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_CORE_ASSETS_DIRECTORY, + PARSE_ONLY_DIR, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_ASSETS_DIRECTORY, + PARSE_ONLY_DIR, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_DYNAMIC_WALLPAPERS_DIRECTORY, + PARSE_ONLY_DIR, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_THUMBNAILS_DIRECTORY, + PARSE_ONLY_DIR, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_RGUI_BROWSER_DIRECTORY, + PARSE_ONLY_DIR, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_RGUI_CONFIG_DIRECTORY, + PARSE_ONLY_DIR, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_LIBRETRO_DIR_PATH, + PARSE_ONLY_DIR, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_LIBRETRO_INFO_PATH, + PARSE_ONLY_DIR, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_CONTENT_DATABASE_DIRECTORY, + PARSE_ONLY_DIR, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_CURSOR_DIRECTORY, + PARSE_ONLY_DIR, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_CHEAT_DATABASE_PATH, + PARSE_ONLY_DIR, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_VIDEO_FILTER_DIR, + PARSE_ONLY_DIR, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_AUDIO_FILTER_DIR, + PARSE_ONLY_DIR, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_VIDEO_SHADER_DIR, + PARSE_ONLY_DIR, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_RECORDING_OUTPUT_DIRECTORY, + PARSE_ONLY_DIR, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_RECORDING_CONFIG_DIRECTORY, + PARSE_ONLY_DIR, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_OVERLAY_DIRECTORY, + PARSE_ONLY_DIR, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_SCREENSHOT_DIRECTORY, + PARSE_ONLY_DIR, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_JOYPAD_AUTOCONFIG_DIR, + PARSE_ONLY_DIR, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_INPUT_REMAPPING_DIRECTORY, + PARSE_ONLY_DIR, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_PLAYLIST_DIRECTORY, + PARSE_ONLY_DIR, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_RUNTIME_LOG_DIRECTORY, + PARSE_ONLY_DIR, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_SAVEFILE_DIRECTORY, + PARSE_ONLY_DIR, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_SAVESTATE_DIRECTORY, + PARSE_ONLY_DIR, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_CACHE_DIRECTORY, + PARSE_ONLY_DIR, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_LOG_DIR, + PARSE_ONLY_DIR, false) == 0) + count++; + break; + case DISPLAYLIST_DRIVER_SETTINGS_LIST: + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_INPUT_DRIVER, + PARSE_ONLY_STRING_OPTIONS, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_JOYPAD_DRIVER, + PARSE_ONLY_STRING_OPTIONS, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_VIDEO_DRIVER, + PARSE_ONLY_STRING_OPTIONS, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_AUDIO_DRIVER, + PARSE_ONLY_STRING_OPTIONS, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_AUDIO_RESAMPLER_DRIVER, + PARSE_ONLY_STRING_OPTIONS, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_CAMERA_DRIVER, + PARSE_ONLY_STRING_OPTIONS, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_LOCATION_DRIVER, + PARSE_ONLY_STRING_OPTIONS, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_MENU_DRIVER, + PARSE_ONLY_STRING_OPTIONS, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_RECORD_DRIVER, + PARSE_ONLY_STRING_OPTIONS, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_MIDI_DRIVER, + PARSE_ONLY_STRING_OPTIONS, false) == 0) + count++; +#ifdef HAVE_LAKKA + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_WIFI_DRIVER, + PARSE_ONLY_STRING_OPTIONS, false) == 0) + count++; +#endif + break; + case DISPLAYLIST_LOGGING_SETTINGS_LIST: + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_LOG_VERBOSITY, + PARSE_ONLY_BOOL, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_LIBRETRO_LOG_LEVEL, + PARSE_ONLY_UINT, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_LOG_TO_FILE, + PARSE_ONLY_BOOL, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_LOG_TO_FILE_TIMESTAMP, + PARSE_ONLY_BOOL, false) == 0) + count++; + + { + settings_t *settings = config_get_ptr(); + if (settings->bools.menu_show_advanced_settings) + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_PERFCNT_ENABLE, + PARSE_ONLY_BOOL, false) == 0) + count++; + } + break; + case DISPLAYLIST_REWIND_SETTINGS_LIST: + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_REWIND_ENABLE, + PARSE_ONLY_BOOL, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_REWIND_GRANULARITY, + PARSE_ONLY_UINT, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_REWIND_BUFFER_SIZE, + PARSE_ONLY_SIZE, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_REWIND_BUFFER_SIZE_STEP, + PARSE_ONLY_UINT, false) == 0) + count++; + break; + case DISPLAYLIST_FRAME_THROTTLE_SETTINGS_LIST: + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_REWIND_SETTINGS, PARSE_ACTION, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_FASTFORWARD_RATIO, + PARSE_ONLY_FLOAT, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_SLOWMOTION_RATIO, + PARSE_ONLY_FLOAT, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_VRR_RUNLOOP_ENABLE, + PARSE_ONLY_BOOL, false) == 0) + count++; + + { + settings_t *settings = config_get_ptr(); + if (settings->bools.menu_show_advanced_settings) + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_MENU_THROTTLE_FRAMERATE, + PARSE_ONLY_BOOL, false) == 0) + count++; + } + break; + case DISPLAYLIST_MENU_SETTINGS_LIST: + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_MENU_WALLPAPER, + PARSE_ONLY_PATH, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_DYNAMIC_WALLPAPER, + PARSE_ONLY_BOOL, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_MENU_WALLPAPER_OPACITY, + PARSE_ONLY_FLOAT, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_MENU_FRAMEBUFFER_OPACITY, + PARSE_ONLY_FLOAT, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_MENU_RGUI_BACKGROUND_FILLER_THICKNESS_ENABLE, + PARSE_ONLY_BOOL, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_MENU_RGUI_BORDER_FILLER_ENABLE, + PARSE_ONLY_BOOL, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_MENU_RGUI_BORDER_FILLER_THICKNESS_ENABLE, + PARSE_ONLY_BOOL, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_MENU_RGUI_FULL_WIDTH_LAYOUT, + PARSE_ONLY_BOOL, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_MENU_LINEAR_FILTER, + PARSE_ONLY_BOOL, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_MENU_RGUI_INTERNAL_UPSCALE_LEVEL, + PARSE_ONLY_UINT, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_MENU_RGUI_ASPECT_RATIO, + PARSE_ONLY_UINT, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_MENU_RGUI_ASPECT_RATIO_LOCK, + PARSE_ONLY_UINT, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_MENU_HORIZONTAL_ANIMATION, + PARSE_ONLY_BOOL, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_RGUI_MENU_COLOR_THEME, + PARSE_ONLY_UINT, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_RGUI_MENU_THEME_PRESET, + PARSE_ONLY_PATH, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_MENU_RGUI_SHADOWS, + PARSE_ONLY_BOOL, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_DPI_OVERRIDE_ENABLE, + PARSE_ONLY_BOOL, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_DPI_OVERRIDE_VALUE, + PARSE_ONLY_UINT, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_XMB_ALPHA_FACTOR, + PARSE_ONLY_UINT, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_XMB_SCALE_FACTOR, + PARSE_ONLY_UINT, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_XMB_FONT, + PARSE_ONLY_PATH, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_MENU_FONT_COLOR_RED, + PARSE_ONLY_UINT, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_MENU_FONT_COLOR_GREEN, + PARSE_ONLY_UINT, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_MENU_FONT_COLOR_BLUE, + PARSE_ONLY_UINT, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_XMB_LAYOUT, + PARSE_ONLY_UINT, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_XMB_THEME, + PARSE_ONLY_UINT, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_XMB_SHADOWS_ENABLE, + PARSE_ONLY_BOOL, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_XMB_RIBBON_ENABLE, + PARSE_ONLY_UINT, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_XMB_MENU_COLOR_THEME, + PARSE_ONLY_UINT, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_OZONE_MENU_COLOR_THEME, + PARSE_ONLY_UINT, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_OZONE_COLLAPSE_SIDEBAR, + PARSE_ONLY_BOOL, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_MATERIALUI_ICONS_ENABLE, + PARSE_ONLY_BOOL, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_MATERIALUI_MENU_COLOR_THEME, + PARSE_ONLY_UINT, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_MATERIALUI_MENU_HEADER_OPACITY, + PARSE_ONLY_FLOAT, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_MATERIALUI_MENU_FOOTER_OPACITY, + PARSE_ONLY_FLOAT, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_MENU_USE_PREFERRED_SYSTEM_COLOR_THEME, + PARSE_ONLY_BOOL, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_MENU_RGUI_INLINE_THUMBNAILS, + PARSE_ONLY_BOOL, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_THUMBNAILS, + PARSE_ONLY_UINT, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_LEFT_THUMBNAILS, + PARSE_ONLY_UINT, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_XMB_VERTICAL_THUMBNAILS, + PARSE_ONLY_BOOL, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_MENU_RGUI_SWAP_THUMBNAILS, + PARSE_ONLY_BOOL, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_MENU_RGUI_THUMBNAIL_DOWNSCALER, + PARSE_ONLY_UINT, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_MENU_RGUI_THUMBNAIL_DELAY, + PARSE_ONLY_UINT, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_MENU_TICKER_TYPE, + PARSE_ONLY_UINT, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_MENU_TICKER_SPEED, + PARSE_ONLY_FLOAT, false) == 0) + count++; + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_MENU_RGUI_EXTENDED_ASCII, + PARSE_ONLY_BOOL, false) == 0) + count++; + break; + default: + break; + } + + return count; +} + bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist_info_t *info) { size_t i; @@ -5340,31 +5864,31 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist case DISPLAYLIST_PLAYLIST_SETTINGS_LIST: menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_HISTORY_LIST_ENABLE, PARSE_ONLY_BOOL, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CONTENT_HISTORY_SIZE, PARSE_ONLY_UINT, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_PLAYLIST_ENTRY_RENAME, PARSE_ONLY_BOOL, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_PLAYLIST_ENTRY_REMOVE, PARSE_ONLY_BOOL, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_PLAYLIST_SORT_ALPHABETICAL, PARSE_ONLY_BOOL, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_PLAYLIST_USE_OLD_FORMAT, PARSE_ONLY_BOOL, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_PLAYLIST_SHOW_INLINE_CORE_NAME, PARSE_ONLY_UINT, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_PLAYLIST_SHOW_SUBLABELS, PARSE_ONLY_BOOL, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_PLAYLIST_SUBLABEL_RUNTIME_TYPE, PARSE_ONLY_UINT, false); @@ -5379,7 +5903,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist for (i = 0; i < RARCH_BIND_LIST_END; i++) { - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, (enum msg_hash_enums)( MENU_ENUM_LABEL_INPUT_HOTKEY_BIND_BEGIN + i), PARSE_ONLY_BIND, false); @@ -5388,172 +5912,64 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist } info->need_push = true; break; - case DISPLAYLIST_DRIVER_SETTINGS_LIST: - menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - ret = menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_INPUT_DRIVER, - PARSE_ONLY_STRING_OPTIONS, false); - ret = menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_JOYPAD_DRIVER, - PARSE_ONLY_STRING_OPTIONS, false); - ret = menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_VIDEO_DRIVER, - PARSE_ONLY_STRING_OPTIONS, false); - ret = menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_AUDIO_DRIVER, - PARSE_ONLY_STRING_OPTIONS, false); - ret = menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_AUDIO_RESAMPLER_DRIVER, - PARSE_ONLY_STRING_OPTIONS, false); - ret = menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_CAMERA_DRIVER, - PARSE_ONLY_STRING_OPTIONS, false); - ret = menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_LOCATION_DRIVER, - PARSE_ONLY_STRING_OPTIONS, false); - ret = menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_MENU_DRIVER, - PARSE_ONLY_STRING_OPTIONS, false); - ret = menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_RECORD_DRIVER, - PARSE_ONLY_STRING_OPTIONS, false); - ret = menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_MIDI_DRIVER, - PARSE_ONLY_STRING_OPTIONS, false); -#ifdef HAVE_LAKKA - ret = menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_WIFI_DRIVER, - PARSE_ONLY_STRING_OPTIONS, false); -#endif - - info->need_refresh = true; - info->need_push = true; - break; - case DISPLAYLIST_CONFIGURATION_SETTINGS_LIST: - menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_CONFIG_SAVE_ON_EXIT, - PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_GAME_SPECIFIC_OPTIONS, - PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_AUTO_OVERRIDES_ENABLE, - PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_AUTO_REMAPS_ENABLE, - PARSE_ONLY_BOOL, false); - - info->need_refresh = true; - info->need_push = true; - break; case DISPLAYLIST_SAVING_SETTINGS_LIST: menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_SORT_SAVEFILES_ENABLE, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_SORT_SAVESTATES_ENABLE, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_BLOCK_SRAM_OVERWRITE, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_AUTOSAVE_INTERVAL, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_SAVESTATE_AUTO_INDEX, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_SAVESTATE_AUTO_SAVE, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_SAVESTATE_AUTO_LOAD, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_SAVESTATE_THUMBNAIL_ENABLE, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_SAVEFILES_IN_CONTENT_DIR_ENABLE, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_SAVESTATES_IN_CONTENT_DIR_ENABLE, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_SYSTEMFILES_IN_CONTENT_DIR_ENABLE, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_SCREENSHOTS_IN_CONTENT_DIR_ENABLE, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CONTENT_RUNTIME_LOG, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CONTENT_RUNTIME_LOG_AGGREGATE, PARSE_ONLY_BOOL, false); info->need_refresh = true; info->need_push = true; break; + case DISPLAYLIST_DRIVER_SETTINGS_LIST: case DISPLAYLIST_LOGGING_SETTINGS_LIST: - menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_LOG_VERBOSITY, - PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_LIBRETRO_LOG_LEVEL, - PARSE_ONLY_UINT, false); - - { - settings_t *settings = config_get_ptr(); - if (settings->bools.menu_show_advanced_settings) - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_PERFCNT_ENABLE, - PARSE_ONLY_BOOL, false); - } - - info->need_refresh = true; - info->need_push = true; - break; case DISPLAYLIST_FRAME_THROTTLE_SETTINGS_LIST: - menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_REWIND_SETTINGS, PARSE_ACTION, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_FASTFORWARD_RATIO, - PARSE_ONLY_FLOAT, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_SLOWMOTION_RATIO, - PARSE_ONLY_FLOAT, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_VRR_RUNLOOP_ENABLE, - PARSE_ONLY_BOOL, false); - - { - settings_t *settings = config_get_ptr(); - if (settings->bools.menu_show_advanced_settings) - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_MENU_THROTTLE_FRAMERATE, - PARSE_ONLY_BOOL, false); - } - - info->need_refresh = true; - info->need_push = true; - break; case DISPLAYLIST_REWIND_SETTINGS_LIST: + case DISPLAYLIST_DIRECTORY_SETTINGS_LIST: + case DISPLAYLIST_CONFIGURATION_SETTINGS_LIST: + case DISPLAYLIST_CORE_SETTINGS_LIST: + case DISPLAYLIST_QUICK_MENU_VIEWS_SETTINGS_LIST: menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_REWIND_ENABLE, - PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_REWIND_GRANULARITY, - PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_REWIND_BUFFER_SIZE, - PARSE_ONLY_SIZE, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_REWIND_BUFFER_SIZE_STEP, - PARSE_ONLY_UINT, false); + count = menu_displaylist_build_list(info->list, type); info->need_refresh = true; info->need_push = true; @@ -5578,71 +5994,71 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist if ( setting ) setting->max = cheat_manager_state.total_memory_size>0?cheat_manager_state.total_memory_size-1:0 ; - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEAT_IDX, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEAT_STATE, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEAT_DESC, PARSE_ONLY_STRING, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEAT_HANDLER, PARSE_ONLY_UINT, false); if ( cheat_manager_state.working_cheat.handler == CHEAT_HANDLER_TYPE_EMU) - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEAT_CODE, PARSE_ONLY_STRING, false); else { - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEAT_MEMORY_SEARCH_SIZE, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEAT_TYPE, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEAT_VALUE, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEAT_ADDRESS, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEAT_BROWSE_MEMORY, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEAT_ADDRESS_BIT_POSITION, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEAT_REPEAT_COUNT, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEAT_REPEAT_ADD_TO_ADDRESS, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEAT_REPEAT_ADD_TO_VALUE, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEAT_RUMBLE_TYPE, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEAT_RUMBLE_VALUE, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEAT_RUMBLE_PORT, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEAT_RUMBLE_PRIMARY_STRENGTH, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEAT_RUMBLE_PRIMARY_DURATION, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEAT_RUMBLE_SECONDARY_STRENGTH, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEAT_RUMBLE_SECONDARY_DURATION, PARSE_ONLY_UINT, false); } @@ -5690,47 +6106,47 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEAT_START_OR_RESTART, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEAT_BIG_ENDIAN, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEAT_SEARCH_EXACT, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEAT_SEARCH_LT, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEAT_SEARCH_LTE, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEAT_SEARCH_GT, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEAT_SEARCH_GTE, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEAT_SEARCH_EQ, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEAT_SEARCH_NEQ, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEAT_SEARCH_EQPLUS, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEAT_SEARCH_EQMINUS, PARSE_ONLY_UINT, false); @@ -5744,11 +6160,11 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist MENU_ENUM_LABEL_CHEAT_ADD_MATCHES, MENU_SETTING_ACTION, 0, 0); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEAT_DELETE_MATCH, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEAT_COPY_MATCH, PARSE_ONLY_UINT, false); @@ -5764,7 +6180,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist MSG_UNKNOWN, MENU_SETTINGS_CHEAT_MATCH, 0, 0); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEAT_BROWSE_MEMORY, PARSE_ONLY_UINT, false); @@ -5784,9 +6200,9 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist } case DISPLAYLIST_ONSCREEN_DISPLAY_SETTINGS_LIST: menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_ONSCREEN_OVERLAY_SETTINGS, PARSE_ACTION, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_ONSCREEN_NOTIFICATIONS_SETTINGS, PARSE_ACTION, false); info->need_refresh = true; @@ -5794,55 +6210,55 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist break; case DISPLAYLIST_ONSCREEN_NOTIFICATIONS_SETTINGS_LIST: menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_FONT_ENABLE, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_FPS_SHOW, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_FRAMECOUNT_SHOW, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_STATISTICS_SHOW, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_MEMORY_SHOW, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_FONT_PATH, PARSE_ONLY_PATH, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_FONT_SIZE, PARSE_ONLY_FLOAT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_MESSAGE_POS_X, PARSE_ONLY_FLOAT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_MESSAGE_POS_Y, PARSE_ONLY_FLOAT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_MESSAGE_COLOR_RED, PARSE_ONLY_FLOAT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_MESSAGE_COLOR_GREEN, PARSE_ONLY_FLOAT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_MESSAGE_COLOR_BLUE, PARSE_ONLY_FLOAT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_MESSAGE_BGCOLOR_ENABLE, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_MESSAGE_BGCOLOR_RED, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_MESSAGE_BGCOLOR_GREEN, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_MESSAGE_BGCOLOR_BLUE, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_MESSAGE_BGCOLOR_OPACITY, PARSE_ONLY_FLOAT, false); @@ -5851,30 +6267,30 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist break; case DISPLAYLIST_ONSCREEN_OVERLAY_SETTINGS_LIST: menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_INPUT_OVERLAY_ENABLE, PARSE_ONLY_BOOL, false); #if 0 - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_OVERLAY_AUTOLOAD_PREFERRED, PARSE_ONLY_BOOL, false); #endif - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_INPUT_OVERLAY_HIDE_IN_MENU, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_INPUT_OVERLAY_SHOW_PHYSICAL_INPUTS, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_INPUT_OVERLAY_SHOW_PHYSICAL_INPUTS_PORT, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_OVERLAY_PRESET, PARSE_ONLY_PATH, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_OVERLAY_OPACITY, PARSE_ONLY_FLOAT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_OVERLAY_SCALE, PARSE_ONLY_FLOAT, false); @@ -5883,19 +6299,19 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist break; case DISPLAYLIST_MENU_FILE_BROWSER_SETTINGS_LIST: menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_SHOW_HIDDEN_FILES, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_USE_BUILTIN_PLAYER, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_FILTER_BY_CURRENT_CORE, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, PARSE_ONLY_BOOL, false); info->need_refresh = true; @@ -5904,341 +6320,113 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist case DISPLAYLIST_MENU_VIEWS_SETTINGS_LIST: menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_QUICK_MENU_VIEWS_SETTINGS, PARSE_ACTION, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_MENU_SHOW_LOAD_CORE, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_MENU_SHOW_LOAD_CONTENT, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_MENU_SHOW_ONLINE_UPDATER, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_MENU_SHOW_CORE_UPDATER, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_MENU_SHOW_INFORMATION, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_MENU_SHOW_CONFIGURATIONS, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_MENU_SHOW_HELP, PARSE_ONLY_BOOL, false); #ifdef HAVE_QT - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_SHOW_WIMP, PARSE_ONLY_UINT, false); #endif - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_MENU_SHOW_QUIT_RETROARCH, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_MENU_SHOW_REBOOT, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_MENU_SHOW_SHUTDOWN, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CONTENT_SHOW_SETTINGS, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CONTENT_SHOW_SETTINGS_PASSWORD, PARSE_ONLY_STRING, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CONTENT_SHOW_FAVORITES, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CONTENT_SHOW_IMAGES, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CONTENT_SHOW_MUSIC, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CONTENT_SHOW_VIDEO, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CONTENT_SHOW_NETPLAY, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CONTENT_SHOW_HISTORY, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CONTENT_SHOW_ADD, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CONTENT_SHOW_PLAYLISTS, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_TIMEDATE_ENABLE, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_TIMEDATE_STYLE, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_BATTERY_LEVEL_ENABLE, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CORE_ENABLE, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_MENU_SHOW_SUBLABELS, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_RGUI_SHOW_START_SCREEN, PARSE_ONLY_BOOL, false); - info->need_refresh = true; - info->need_push = true; - break; - case DISPLAYLIST_QUICK_MENU_VIEWS_SETTINGS_LIST: - menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_QUICK_MENU_SHOW_TAKE_SCREENSHOT, - PARSE_ONLY_BOOL, false); - - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_QUICK_MENU_SHOW_SAVE_LOAD_STATE, - PARSE_ONLY_BOOL, false); - - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_QUICK_MENU_SHOW_UNDO_SAVE_LOAD_STATE, - PARSE_ONLY_BOOL, false); - - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_QUICK_MENU_SHOW_ADD_TO_FAVORITES, - PARSE_ONLY_BOOL, false); - - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_QUICK_MENU_SHOW_START_RECORDING, - PARSE_ONLY_BOOL, false); - - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_QUICK_MENU_SHOW_START_STREAMING, - PARSE_ONLY_BOOL, false); - - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_QUICK_MENU_SHOW_RESET_CORE_ASSOCIATION, - PARSE_ONLY_BOOL, false); - - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_QUICK_MENU_SHOW_OPTIONS, - PARSE_ONLY_BOOL, false); - - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_QUICK_MENU_SHOW_CONTROLS, - PARSE_ONLY_BOOL, false); - - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_QUICK_MENU_SHOW_CHEATS, - PARSE_ONLY_BOOL, false); - if (video_shader_any_supported()) - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_QUICK_MENU_SHOW_SHADERS, - PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_CONTENT_SHOW_REWIND, - PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_CONTENT_SHOW_LATENCY, - PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_CONTENT_SHOW_OVERLAYS, - PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_QUICK_MENU_SHOW_SAVE_CORE_OVERRIDES, - PARSE_ONLY_BOOL, false); - - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_QUICK_MENU_SHOW_SAVE_GAME_OVERRIDES, - PARSE_ONLY_BOOL, false); - - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_QUICK_MENU_SHOW_INFORMATION, - PARSE_ONLY_BOOL, false); - info->need_refresh = true; info->need_push = true; break; case DISPLAYLIST_MENU_SETTINGS_LIST: menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - if (menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_MENU_WALLPAPER, - PARSE_ONLY_PATH, false) == 0) - count++; - if (menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_DYNAMIC_WALLPAPER, - PARSE_ONLY_BOOL, false) == 0) - count++; - if (menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_MENU_WALLPAPER_OPACITY, - PARSE_ONLY_FLOAT, false) == 0) - count++; - if (menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_MENU_FRAMEBUFFER_OPACITY, - PARSE_ONLY_FLOAT, false) == 0) - count++; - if (menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_MENU_RGUI_BACKGROUND_FILLER_THICKNESS_ENABLE, - PARSE_ONLY_BOOL, false) == 0) - count++; - if (menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_MENU_RGUI_BORDER_FILLER_ENABLE, - PARSE_ONLY_BOOL, false) == 0) - count++; - if (menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_MENU_RGUI_BORDER_FILLER_THICKNESS_ENABLE, - PARSE_ONLY_BOOL, false) == 0) - count++; - if (menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_MENU_RGUI_FULL_WIDTH_LAYOUT, - PARSE_ONLY_BOOL, false) == 0) - count++; - if (menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_MENU_LINEAR_FILTER, - PARSE_ONLY_BOOL, false) == 0) - count++; - if (menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_MENU_RGUI_INTERNAL_UPSCALE_LEVEL, - PARSE_ONLY_UINT, false) == 0) - count++; - if (menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_MENU_RGUI_LOCK_ASPECT, - PARSE_ONLY_BOOL, false) == 0) - count++; - if (menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_MENU_HORIZONTAL_ANIMATION, - PARSE_ONLY_BOOL, false) == 0) - count++; - if (menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_RGUI_MENU_COLOR_THEME, - PARSE_ONLY_UINT, false) == 0) - count++; - if (menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_RGUI_MENU_THEME_PRESET, - PARSE_ONLY_PATH, false) == 0) - count++; - if (menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_DPI_OVERRIDE_ENABLE, - PARSE_ONLY_BOOL, false) == 0) - count++; - if (menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_DPI_OVERRIDE_VALUE, - PARSE_ONLY_UINT, false) == 0) - count++; - if (menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_XMB_ALPHA_FACTOR, - PARSE_ONLY_UINT, false) == 0) - count++; - if (menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_XMB_SCALE_FACTOR, - PARSE_ONLY_UINT, false) == 0) - count++; - if (menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_XMB_FONT, - PARSE_ONLY_PATH, false) == 0) - count++; - if (menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_MENU_FONT_COLOR_RED, - PARSE_ONLY_UINT, false) == 0) - count++; - if (menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_MENU_FONT_COLOR_GREEN, - PARSE_ONLY_UINT, false) == 0) - count++; - if (menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_MENU_FONT_COLOR_BLUE, - PARSE_ONLY_UINT, false) == 0) - count++; - if (menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_XMB_LAYOUT, - PARSE_ONLY_UINT, false) == 0) - count++; - if (menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_XMB_THEME, - PARSE_ONLY_UINT, false) == 0) - count++; - if (menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_XMB_SHADOWS_ENABLE, - PARSE_ONLY_BOOL, false) == 0) - count++; - if (menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_XMB_RIBBON_ENABLE, - PARSE_ONLY_UINT, false) == 0) - count++; - if (menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_XMB_MENU_COLOR_THEME, - PARSE_ONLY_UINT, false) == 0) - count++; - if (menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_OZONE_MENU_COLOR_THEME, - PARSE_ONLY_UINT, false) == 0) - count++; - if (menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_OZONE_COLLAPSE_SIDEBAR, - PARSE_ONLY_BOOL, false) == 0) - count++; - if (menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_MATERIALUI_ICONS_ENABLE, - PARSE_ONLY_BOOL, false) == 0) - count++; - if (menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_MATERIALUI_MENU_COLOR_THEME, - PARSE_ONLY_UINT, false) == 0) - count++; - if (menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_MATERIALUI_MENU_HEADER_OPACITY, - PARSE_ONLY_FLOAT, false) == 0) - count++; - if (menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_MATERIALUI_MENU_FOOTER_OPACITY, - PARSE_ONLY_FLOAT, false) == 0) - count++; - if (menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_MENU_USE_PREFERRED_SYSTEM_COLOR_THEME, - PARSE_ONLY_BOOL, false) == 0) - count++; - if (menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_THUMBNAILS, - PARSE_ONLY_UINT, false) == 0) - count++; - if (menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_LEFT_THUMBNAILS, - PARSE_ONLY_UINT, false) == 0) - count++; - if (menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_XMB_VERTICAL_THUMBNAILS, - PARSE_ONLY_BOOL, false) == 0) - count++; - if (menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_MENU_RGUI_THUMBNAIL_DOWNSCALER, - PARSE_ONLY_UINT, false) == 0) - count++; - if (menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_MENU_TICKER_TYPE, - PARSE_ONLY_UINT, false) == 0) - count++; - if (menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_MENU_TICKER_SPEED, - PARSE_ONLY_FLOAT, false) == 0) - count++; + count = menu_displaylist_build_list(info->list, + type); if (count == 0) menu_entries_append_enum(info->list, @@ -6253,7 +6441,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist case DISPLAYLIST_POWER_MANAGEMENT_SETTINGS_LIST: menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_SUSTAINED_PERFORMANCE_MODE, PARSE_ONLY_BOOL, false) == 0) count++; @@ -6271,27 +6459,27 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist case DISPLAYLIST_MENU_SOUNDS_LIST: menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_AUDIO_ENABLE_MENU, PARSE_ONLY_BOOL, false) == 0) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_MENU_SOUND_OK, PARSE_ONLY_BOOL, false) == 0) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_MENU_SOUND_CANCEL, PARSE_ONLY_BOOL, false) == 0) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_MENU_SOUND_NOTICE, PARSE_ONLY_BOOL, false) == 0) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_MENU_SOUND_BGM, PARSE_ONLY_BOOL, false) == 0) count++; @@ -6308,60 +6496,63 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist break; case DISPLAYLIST_USER_INTERFACE_SETTINGS_LIST: menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_MENU_VIEWS_SETTINGS, PARSE_ACTION, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_MENU_SETTINGS, PARSE_ACTION, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_SHOW_ADVANCED_SETTINGS, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_MENU_ENABLE_KIOSK_MODE, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_MENU_KIOSK_MODE_PASSWORD, PARSE_ONLY_STRING, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_NAVIGATION_WRAPAROUND, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_PAUSE_LIBRETRO, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_MOUSE_ENABLE, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_POINTER_ENABLE, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_THREADED_DATA_RUNLOOP_ENABLE, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_PAUSE_NONACTIVE, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_DISABLE_COMPOSITION, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_UI_COMPANION_ENABLE, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_UI_COMPANION_START_ON_BOOT, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_UI_MENUBAR_ENABLE, PARSE_ONLY_BOOL, false); #ifdef HAVE_QT - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_DESKTOP_MENU_ENABLE, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_UI_COMPANION_TOGGLE, PARSE_ONLY_BOOL, false); #endif -#ifdef _3DS - menu_displaylist_parse_settings_enum(menu, info, +#if defined(_3DS) + menu_displaylist_parse_settings_enum(info->list, + MENU_ENUM_LABEL_VIDEO_3DS_DISPLAY_MODE, + PARSE_ONLY_UINT, false); + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_3DS_LCD_BOTTOM, PARSE_ONLY_BOOL, false); #endif @@ -6370,31 +6561,31 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist break; case DISPLAYLIST_RETRO_ACHIEVEMENTS_SETTINGS_LIST: menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEEVOS_ENABLE, PARSE_ONLY_BOOL, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEEVOS_USERNAME, PARSE_ONLY_STRING, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEEVOS_PASSWORD, PARSE_ONLY_STRING, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEEVOS_HARDCORE_MODE_ENABLE, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEEVOS_LEADERBOARDS_ENABLE, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEEVOS_BADGES_ENABLE, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEEVOS_TEST_UNOFFICIAL, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEEVOS_VERBOSE_ENABLE, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEEVOS_AUTO_SCREENSHOT, PARSE_ONLY_BOOL, false); @@ -6403,15 +6594,15 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist break; case DISPLAYLIST_UPDATER_SETTINGS_LIST: menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CORE_UPDATER_BUILDBOT_URL, PARSE_ONLY_STRING, false) != -1) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_BUILDBOT_ASSETS_URL, PARSE_ONLY_STRING, false) != -1) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CORE_UPDATER_AUTO_EXTRACT_ARCHIVE, PARSE_ONLY_BOOL, false) != -1) count++; @@ -6470,71 +6661,71 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist case DISPLAYLIST_NETWORK_SETTINGS_LIST: menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_NETPLAY_PUBLIC_ANNOUNCE, PARSE_ONLY_BOOL, false) != -1) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_NETPLAY_USE_MITM_SERVER, PARSE_ONLY_BOOL, false) != -1) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_NETPLAY_MITM_SERVER, PARSE_ONLY_STRING, false) != -1) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_NETPLAY_IP_ADDRESS, PARSE_ONLY_STRING, false) != -1) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_NETPLAY_TCP_UDP_PORT, PARSE_ONLY_UINT, false) != -1) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_NETPLAY_PASSWORD, PARSE_ONLY_STRING, false) != -1) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_NETPLAY_SPECTATE_PASSWORD, PARSE_ONLY_STRING, false) != -1) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_NETPLAY_START_AS_SPECTATOR, PARSE_ONLY_BOOL, false) != -1) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_NETPLAY_ALLOW_SLAVES, PARSE_ONLY_BOOL, false) != -1) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_NETPLAY_REQUIRE_SLAVES, PARSE_ONLY_BOOL, false) != -1) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_NETPLAY_STATELESS_MODE, PARSE_ONLY_BOOL, false) != -1) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_NETPLAY_CHECK_FRAMES, PARSE_ONLY_INT, false) != -1) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_NETPLAY_INPUT_LATENCY_FRAMES_MIN, PARSE_ONLY_INT, false) != -1) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_NETPLAY_INPUT_LATENCY_FRAMES_RANGE, PARSE_ONLY_INT, false) != -1) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_NETPLAY_NAT_TRAVERSAL, PARSE_ONLY_BOOL, false) != -1) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_NETPLAY_SHARE_DIGITAL, PARSE_ONLY_UINT, false) != -1) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_NETPLAY_SHARE_ANALOG, PARSE_ONLY_UINT, false) != -1) count++; @@ -6543,26 +6734,26 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist unsigned user; for (user = 0; user < MAX_USERS; user++) { - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, (enum msg_hash_enums)(MENU_ENUM_LABEL_NETPLAY_REQUEST_DEVICE_1 + user), PARSE_ONLY_BOOL, false) != -1) count++; } } - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_NETWORK_CMD_ENABLE, PARSE_ONLY_BOOL, false) != -1) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_NETWORK_CMD_PORT, PARSE_ONLY_UINT, false) != -1) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_NETWORK_REMOTE_ENABLE, PARSE_ONLY_BOOL, false) != -1) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_NETWORK_REMOTE_PORT, PARSE_ONLY_UINT, false) != -1) count++; @@ -6572,7 +6763,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist unsigned max_users = *(input_driver_get_uint(INPUT_ACTION_MAX_USERS)); for(user = 0; user < max_users; user++) { - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, (enum msg_hash_enums)( MENU_ENUM_LABEL_NETWORK_REMOTE_USER_1_ENABLE + user), PARSE_ONLY_BOOL, false) != -1) @@ -6580,12 +6771,12 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist } } - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_STDIN_CMD_ENABLE, PARSE_ONLY_BOOL, false) != -1) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_UPDATER_SETTINGS, PARSE_ACTION, false) != -1) count++; @@ -6602,17 +6793,17 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist break; case DISPLAYLIST_LAKKA_SERVICES_LIST: menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_SSH_ENABLE, PARSE_ONLY_BOOL, false) == 0) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_SAMBA_ENABLE, PARSE_ONLY_BOOL, false) == 0) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_BLUETOOTH_ENABLE, PARSE_ONLY_BOOL, false) == 0) count++; @@ -6629,19 +6820,19 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist break; case DISPLAYLIST_USER_SETTINGS_LIST: menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_PRIVACY_SETTINGS, PARSE_ACTION, false); - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_ACCOUNTS_LIST, PARSE_ACTION, false) == 0) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_NETPLAY_NICKNAME, PARSE_ONLY_STRING, false) == 0) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_USER_LANGUAGE, PARSE_ONLY_UINT, false) == 0) count++; @@ -6653,105 +6844,21 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist MENU_ENUM_LABEL_NO_SETTINGS_FOUND, 0, 0, 0); - info->need_refresh = true; - info->need_push = true; - break; - case DISPLAYLIST_DIRECTORY_SETTINGS_LIST: - menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_SYSTEM_DIRECTORY, - PARSE_ONLY_DIR, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_CORE_ASSETS_DIRECTORY, - PARSE_ONLY_DIR, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_ASSETS_DIRECTORY, - PARSE_ONLY_DIR, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_DYNAMIC_WALLPAPERS_DIRECTORY, - PARSE_ONLY_DIR, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_THUMBNAILS_DIRECTORY, - PARSE_ONLY_DIR, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_RGUI_BROWSER_DIRECTORY, - PARSE_ONLY_DIR, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_RGUI_CONFIG_DIRECTORY, - PARSE_ONLY_DIR, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_LIBRETRO_DIR_PATH, - PARSE_ONLY_DIR, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_LIBRETRO_INFO_PATH, - PARSE_ONLY_DIR, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_CONTENT_DATABASE_DIRECTORY, - PARSE_ONLY_DIR, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_CURSOR_DIRECTORY, - PARSE_ONLY_DIR, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_CHEAT_DATABASE_PATH, - PARSE_ONLY_DIR, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_VIDEO_FILTER_DIR, - PARSE_ONLY_DIR, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_AUDIO_FILTER_DIR, - PARSE_ONLY_DIR, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_VIDEO_SHADER_DIR, - PARSE_ONLY_DIR, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_RECORDING_OUTPUT_DIRECTORY, - PARSE_ONLY_DIR, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_RECORDING_CONFIG_DIRECTORY, - PARSE_ONLY_DIR, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_OVERLAY_DIRECTORY, - PARSE_ONLY_DIR, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_SCREENSHOT_DIRECTORY, - PARSE_ONLY_DIR, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_JOYPAD_AUTOCONFIG_DIR, - PARSE_ONLY_DIR, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_INPUT_REMAPPING_DIRECTORY, - PARSE_ONLY_DIR, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_PLAYLIST_DIRECTORY, - PARSE_ONLY_DIR, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_RUNTIME_LOG_DIRECTORY, - PARSE_ONLY_DIR, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_SAVEFILE_DIRECTORY, - PARSE_ONLY_DIR, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_SAVESTATE_DIRECTORY, - PARSE_ONLY_DIR, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_CACHE_DIRECTORY, - PARSE_ONLY_DIR, false); - info->need_refresh = true; info->need_push = true; break; case DISPLAYLIST_PRIVACY_SETTINGS_LIST: menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CAMERA_ALLOW, PARSE_ONLY_BOOL, false) == 0) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_DISCORD_ALLOW, PARSE_ONLY_BOOL, false) == 0) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_LOCATION_ALLOW, PARSE_ONLY_BOOL, true) == 0) count++; @@ -6769,13 +6876,13 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist case DISPLAYLIST_MIDI_SETTINGS_LIST: menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_MIDI_INPUT, PARSE_ONLY_STRING, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_MIDI_OUTPUT, PARSE_ONLY_STRING, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_MIDI_VOLUME, PARSE_ONLY_UINT, false); @@ -6785,16 +6892,16 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist case DISPLAYLIST_CRT_SWITCHRES_SETTINGS_LIST: menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CRT_SWITCH_RESOLUTION, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CRT_SWITCH_RESOLUTION_SUPER, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CRT_SWITCH_X_AXIS_CENTERING, PARSE_ONLY_INT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CRT_SWITCH_RESOLUTION_USE_CUSTOM_REFRESH_RATE, PARSE_ONLY_BOOL, false); @@ -6804,10 +6911,10 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist case DISPLAYLIST_VIDEO_SETTINGS_LIST: { menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CRT_SWITCHRES_SETTINGS, PARSE_ACTION, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_SUSPEND_SCREENSAVER_ENABLE, PARSE_ONLY_BOOL, false); #if defined(GEKKO) || defined(__CELLOS_LV2__) @@ -6816,142 +6923,142 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist if (!string_is_equal(video_display_server_get_ident(), "null")) #endif { - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_SCREEN_RESOLUTION, PARSE_ACTION, false); } - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_PAL60_ENABLE, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_GAMMA, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_SOFT_FILTER, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_FILTER_FLICKER, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_MONITOR_INDEX, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_FULLSCREEN, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_WINDOWED_FULLSCREEN, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_FULLSCREEN_X, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_FULLSCREEN_Y, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_REFRESH_RATE, PARSE_ONLY_FLOAT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_REFRESH_RATE_AUTO, PARSE_ONLY_FLOAT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_REFRESH_RATE_POLLED, PARSE_ONLY_FLOAT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_FORCE_SRGB_DISABLE, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_ASPECT_RATIO_INDEX, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_ASPECT_RATIO, PARSE_ONLY_FLOAT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_VIEWPORT_CUSTOM_X, PARSE_ONLY_INT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_VIEWPORT_CUSTOM_Y, PARSE_ONLY_INT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_VIEWPORT_CUSTOM_WIDTH, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_VIEWPORT_CUSTOM_HEIGHT, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_SCALE, PARSE_ONLY_FLOAT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_WINDOW_OPACITY, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_WINDOW_SHOW_DECORATIONS, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_WINDOW_SAVE_POSITION, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_WINDOW_WIDTH, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_WINDOW_HEIGHT, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_SCALE_INTEGER, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_VI_WIDTH, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_VFILTER, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_ROTATION, PARSE_ONLY_UINT, false); if (video_display_server_can_set_screen_orientation()) - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_SCREEN_ORIENTATION, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_THREADED, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_VSYNC, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_SWAP_INTERVAL, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_ADAPTIVE_VSYNC, PARSE_ONLY_BOOL, false); - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_MAX_SWAPCHAIN_IMAGES, PARSE_ONLY_UINT, false) == 0) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_HARD_SYNC, PARSE_ONLY_BOOL, false) == 0) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_HARD_SYNC_FRAMES, PARSE_ONLY_UINT, false) == 0) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_FRAME_DELAY, PARSE_ONLY_UINT, false) == 0) count++; - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_BLACK_FRAME_INSERTION, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_GPU_SCREENSHOT, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_CROP_OVERSCAN, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_SMOOTH, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_FILTER, PARSE_ONLY_PATH, false); @@ -6959,24 +7066,6 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist info->need_push = true; break; } - case DISPLAYLIST_CORE_SETTINGS_LIST: - menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_VIDEO_SHARED_CONTEXT, - PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_DUMMY_ON_CORE_SHUTDOWN, - PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_CHECK_FOR_MISSING_FIRMWARE, - PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_VIDEO_ALLOW_ROTATE, - PARSE_ONLY_BOOL, false); - - info->need_refresh = true; - info->need_push = true; - break; case DISPLAYLIST_AUDIO_MIXER_SETTINGS_LIST: { unsigned i; @@ -7008,37 +7097,37 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist break; case DISPLAYLIST_AUDIO_SETTINGS_LIST: menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_MIDI_SETTINGS, PARSE_ACTION, false) == 0) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_AUDIO_MIXER_SETTINGS, PARSE_ACTION, false) == 0) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_MENU_SOUNDS, PARSE_ACTION, false) == 0) count++; - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_AUDIO_ENABLE, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_AUDIO_MUTE, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_AUDIO_MIXER_MUTE, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_AUDIO_VOLUME, PARSE_ONLY_FLOAT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_AUDIO_MIXER_VOLUME, PARSE_ONLY_FLOAT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_SYSTEM_BGM_ENABLE, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_AUDIO_SYNC, PARSE_ONLY_BOOL, false); - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_AUDIO_LATENCY, PARSE_ONLY_UINT, false) == 0) count++; @@ -7046,37 +7135,37 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist settings_t *settings = config_get_ptr(); if (string_is_not_equal(settings->arrays.audio_resampler, "null")) { - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_AUDIO_RESAMPLER_QUALITY, PARSE_ONLY_UINT, false); count++; } } - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_AUDIO_RATE_CONTROL_DELTA, PARSE_ONLY_FLOAT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_AUDIO_MAX_TIMING_SKEW, PARSE_ONLY_FLOAT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_AUDIO_BLOCK_FRAMES, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_AUDIO_DEVICE, PARSE_ONLY_STRING, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_AUDIO_OUTPUT_RATE, PARSE_ONLY_UINT, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_AUDIO_DSP_PLUGIN, PARSE_ONLY_PATH, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_AUDIO_WASAPI_EXCLUSIVE_MODE, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_AUDIO_WASAPI_FLOAT_FORMAT, PARSE_ONLY_BOOL, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_AUDIO_WASAPI_SH_BUFFER_LENGTH, PARSE_ONLY_INT, false); @@ -7085,67 +7174,71 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist break; case DISPLAYLIST_INPUT_SETTINGS_LIST: menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_INPUT_MAX_USERS, PARSE_ONLY_UINT, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_INPUT_SMALL_KEYBOARD_ENABLE, PARSE_ONLY_BOOL, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_INPUT_UNIFIED_MENU_CONTROLS, PARSE_ONLY_BOOL, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_QUIT_PRESS_TWICE, PARSE_ONLY_BOOL, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIBRATE_ON_KEYPRESS, PARSE_ONLY_BOOL, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_ENABLE_DEVICE_VIBRATION, PARSE_ONLY_BOOL, false); - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_INPUT_POLL_TYPE_BEHAVIOR, PARSE_ONLY_UINT, false) == 0) count++; - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_INPUT_ICADE_ENABLE, PARSE_ONLY_BOOL, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, PARSE_ONLY_UINT, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_INPUT_TOUCH_ENABLE, PARSE_ONLY_BOOL, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_INPUT_PREFER_FRONT_TOUCH, PARSE_ONLY_BOOL, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_INPUT_MENU_ENUM_TOGGLE_GAMEPAD_COMBO, PARSE_ONLY_UINT, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_MENU_INPUT_SWAP_OK_CANCEL, PARSE_ONLY_BOOL, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_INPUT_ALL_USERS_CONTROL_MENU, PARSE_ONLY_BOOL, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_INPUT_REMAP_BINDS_ENABLE, PARSE_ONLY_BOOL, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_INPUT_AUTODETECT_ENABLE, PARSE_ONLY_BOOL, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_INPUT_DESCRIPTOR_LABEL_SHOW, PARSE_ONLY_BOOL, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_INPUT_DESCRIPTOR_HIDE_UNBOUND, PARSE_ONLY_BOOL, false); - ret = menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_INPUT_AXIS_THRESHOLD, PARSE_ONLY_FLOAT, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, + MENU_ENUM_LABEL_INPUT_BUTTON_AXIS_THRESHOLD, PARSE_ONLY_FLOAT, false); + ret = menu_displaylist_parse_settings_enum(info->list, + MENU_ENUM_LABEL_INPUT_ANALOG_DEADZONE, PARSE_ONLY_FLOAT, false); + ret = menu_displaylist_parse_settings_enum(info->list, + MENU_ENUM_LABEL_INPUT_ANALOG_SENSITIVITY, PARSE_ONLY_FLOAT, false); + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_INPUT_BIND_TIMEOUT, PARSE_ONLY_UINT, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_INPUT_BIND_HOLD, PARSE_ONLY_UINT, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_INPUT_TURBO_PERIOD, PARSE_ONLY_UINT, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_INPUT_DUTY_CYCLE, PARSE_ONLY_UINT, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_INPUT_BIND_MODE, PARSE_ONLY_UINT, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_INPUT_HOTKEY_BINDS, PARSE_ACTION, false); #ifdef HAVE_LIBNX @@ -7163,7 +7256,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist "%s_%u", msg_hash_to_str(MENU_ENUM_LABEL_INPUT_SPLIT_JOYCON), val); - menu_displaylist_parse_settings(menu, info, + menu_displaylist_parse_settings(info->list, key_split_joycon, PARSE_ONLY_UINT, true, 0); } } @@ -7174,7 +7267,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist unsigned max_users = *(input_driver_get_uint(INPUT_ACTION_MAX_USERS)); for (user = 0; user < max_users; user++) { - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, (enum msg_hash_enums)(MENU_ENUM_LABEL_INPUT_USER_1_BINDS + user), PARSE_ACTION, false); } @@ -7187,48 +7280,48 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist case DISPLAYLIST_LATENCY_SETTINGS_LIST: menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_MAX_SWAPCHAIN_IMAGES, PARSE_ONLY_UINT, false) == 0) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_HARD_SYNC, PARSE_ONLY_BOOL, false) == 0) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_HARD_SYNC_FRAMES, PARSE_ONLY_UINT, false) == 0) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_FRAME_DELAY, PARSE_ONLY_UINT, false) == 0) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_AUDIO_LATENCY, PARSE_ONLY_UINT, false) == 0) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_INPUT_POLL_TYPE_BEHAVIOR, PARSE_ONLY_UINT, false) == 0) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_RUN_AHEAD_ENABLED, PARSE_ONLY_BOOL, false) == 0) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_RUN_AHEAD_FRAMES, PARSE_ONLY_UINT, false) == 0) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_RUN_AHEAD_SECONDARY_INSTANCE, PARSE_ONLY_BOOL, false) == 0) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_RUN_AHEAD_HIDE_WARNINGS, PARSE_ONLY_BOOL, false) == 0) count++; #ifdef ANDROID - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_INPUT_BLOCK_TIMEOUT, PARSE_ONLY_UINT, false) == 0) count++; @@ -7245,53 +7338,53 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist break; case DISPLAYLIST_SETTINGS_ALL: menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_DRIVER_SETTINGS, PARSE_ACTION, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_SETTINGS, PARSE_ACTION, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_AUDIO_SETTINGS, PARSE_ACTION, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_INPUT_SETTINGS, PARSE_ACTION, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_LATENCY_SETTINGS, PARSE_ACTION, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CORE_SETTINGS, PARSE_ACTION, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CONFIGURATION_SETTINGS, PARSE_ACTION, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_SAVING_SETTINGS, PARSE_ACTION, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_LOGGING_SETTINGS, PARSE_ACTION, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_FRAME_THROTTLE_SETTINGS, PARSE_ACTION, false); { settings_t *settings = config_get_ptr(); if (string_is_not_equal(settings->arrays.record_driver, "null")) - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_RECORDING_SETTINGS, PARSE_ACTION, false); } - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_ONSCREEN_DISPLAY_SETTINGS, PARSE_ACTION, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_USER_INTERFACE_SETTINGS, PARSE_ACTION, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_POWER_MANAGEMENT_SETTINGS, PARSE_ACTION, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_RETRO_ACHIEVEMENTS_SETTINGS, PARSE_ACTION, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_WIFI_SETTINGS, PARSE_ACTION, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_NETWORK_SETTINGS, PARSE_ACTION, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_NETPLAY_LAN_SCAN_SETTINGS, PARSE_ACTION, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_LAKKA_SERVICES, PARSE_ACTION, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_PLAYLIST_SETTINGS, PARSE_ACTION, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_USER_SETTINGS, PARSE_ACTION, false); - ret = menu_displaylist_parse_settings_enum(menu, info, + ret = menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_DIRECTORY_SETTINGS, PARSE_ACTION, false); info->need_push = true; break; @@ -7443,9 +7536,9 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist #ifdef HAVE_LIBRETRODB menu_entries_append_enum(info->list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CONTENT_COLLECTION_LIST), - msg_hash_to_str(MENU_ENUM_LABEL_CONTENT_COLLECTION_LIST), - MENU_ENUM_LABEL_CONTENT_COLLECTION_LIST, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLISTS_TAB), + msg_hash_to_str(MENU_ENUM_LABEL_PLAYLISTS_TAB), + MENU_ENUM_LABEL_PLAYLISTS_TAB, MENU_SETTING_ACTION, 0, 0); #endif @@ -7594,51 +7687,51 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist { settings_t *settings = config_get_ptr(); menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_RECORD_QUALITY, PARSE_ONLY_UINT, false) == 0) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_RECORD_CONFIG, PARSE_ONLY_PATH, false) == 0) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_STREAM_QUALITY, PARSE_ONLY_UINT, false) == 0) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_STREAM_CONFIG, PARSE_ONLY_PATH, false) == 0) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_STREAMING_MODE, PARSE_ONLY_UINT, false) == 0) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_RECORD_THREADS, PARSE_ONLY_UINT, true) == 0) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_STREAMING_TITLE, PARSE_ONLY_STRING, false) == 0) count++; if (settings->uints.streaming_mode == STREAMING_MODE_LOCAL) { /* To-Do: Refresh on settings->uints.streaming_mode change to show this parameter */ - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_UDP_STREAM_PORT, PARSE_ONLY_UINT, false) == 0) count++; } - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_STREAMING_URL, PARSE_ONLY_STRING, false) == 0) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_GPU_RECORD, PARSE_ONLY_BOOL, false) == 0) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_VIDEO_POST_FILTER_RECORD, PARSE_ONLY_BOOL, false) == 0) count++; @@ -7668,12 +7761,12 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist !string_is_equal(system->library_name, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_CORE))) if (!rarch_ctl(RARCH_CTL_IS_DUMMY_CORE, NULL)) - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CONTENT_SETTINGS, PARSE_ACTION, false); if (sys_info->load_no_content) - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_START_CORE, PARSE_ACTION, false); } @@ -7683,19 +7776,19 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist { if (settings->bools.menu_show_load_core) { - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CORE_LIST, PARSE_ACTION, false); } } if (settings->bools.menu_show_load_content) { - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_LOAD_CONTENT_LIST, PARSE_ACTION, false); /* Core fully loaded, use the subsystem data */ - if (sys_info->subsystem.data) + if (sys_info && sys_info->subsystem.data) subsystem = sys_info->subsystem.data; /* Core not loaded completely, use the data we peeked on load core */ else @@ -7705,67 +7798,67 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist } if (settings->bools.menu_content_show_history) - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY, PARSE_ACTION, false); #ifdef HAVE_LIBRETRODB if (string_is_equal(settings->arrays.menu_driver, "rgui") && settings->bools.menu_content_show_playlists) { menu_entries_append_enum(info->list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CONTENT_COLLECTION_LIST), - msg_hash_to_str(MENU_ENUM_LABEL_CONTENT_COLLECTION_LIST), - MENU_ENUM_LABEL_CONTENT_COLLECTION_LIST, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PLAYLISTS_TAB), + msg_hash_to_str(MENU_ENUM_LABEL_PLAYLISTS_TAB), + MENU_ENUM_LABEL_PLAYLISTS_TAB, MENU_SETTING_ACTION, 0, 0); } #endif if (settings->bools.menu_content_show_add) - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_ADD_CONTENT_LIST, PARSE_ACTION, false); if (settings->bools.menu_content_show_netplay) - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_NETPLAY, PARSE_ACTION, false); if (settings->bools.menu_show_online_updater) - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_ONLINE_UPDATER, PARSE_ACTION, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_SETTINGS, PARSE_ACTION, false); if (settings->bools.menu_show_information) - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_INFORMATION_LIST, PARSE_ACTION, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_RESTART_RETROARCH, PARSE_ACTION, false); if (settings->bools.menu_show_configurations) - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CONFIGURATIONS_LIST, PARSE_ACTION, false); if (settings->bools.menu_show_help) - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_HELP_LIST, PARSE_ACTION, false); if (settings->bools.menu_show_quit_retroarch) - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_QUIT_RETROARCH, PARSE_ACTION, false); #ifdef HAVE_LAKKA_SWITCH - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_SWITCH_GPU_PROFILE, PARSE_ACTION, false); - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_SWITCH_BACKLIGHT_CONTROL, PARSE_ACTION, false); #endif if (settings->bools.menu_show_reboot) - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_REBOOT, PARSE_ACTION, false); if (settings->bools.menu_show_shutdown) - menu_displaylist_parse_settings_enum(menu, info, + menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_SHUTDOWN, PARSE_ACTION, false); info->need_push = true; @@ -7862,18 +7955,18 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist case DISPLAYLIST_ACCOUNTS_LIST: menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_ACCOUNTS_RETRO_ACHIEVEMENTS, PARSE_ACTION, false) == 0) count++; #ifdef HAVE_NETWORKING - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_ACCOUNTS_YOUTUBE, PARSE_ACTION, false) == 0) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_ACCOUNTS_TWITCH, PARSE_ACTION, false) == 0) count++; @@ -7893,11 +7986,11 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist case DISPLAYLIST_ACCOUNTS_CHEEVOS_LIST: menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEEVOS_USERNAME, PARSE_ONLY_STRING, false) == 0) count++; - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_CHEEVOS_PASSWORD, PARSE_ONLY_STRING, false) == 0) count++; @@ -7916,7 +8009,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist case DISPLAYLIST_ACCOUNTS_YOUTUBE_LIST: menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_YOUTUBE_STREAM_KEY, PARSE_ONLY_STRING, false) == 0) count++; @@ -7935,7 +8028,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist case DISPLAYLIST_ACCOUNTS_TWITCH_LIST: menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - if (menu_displaylist_parse_settings_enum(menu, info, + if (menu_displaylist_parse_settings_enum(info->list, MENU_ENUM_LABEL_TWITCH_STREAM_KEY, PARSE_ONLY_STRING, false) == 0) count++; @@ -8002,7 +8095,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist lbl[0] = '\0'; strlcpy(lbl, temp_val, sizeof(lbl)); - ret = menu_displaylist_parse_settings(menu, info, + ret = menu_displaylist_parse_settings(info->list, lbl, PARSE_NONE, true, MENU_SETTINGS_INPUT_BEGIN); info->need_refresh = true; info->need_push = true; @@ -8018,7 +8111,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist free(info->exts); info->exts = strdup( file_path_str(FILE_PATH_RDB_EXTENSION)); - info->enum_idx = MENU_ENUM_LABEL_CONTENT_COLLECTION_LIST; + info->enum_idx = MENU_ENUM_LABEL_PLAYLISTS_TAB; load_content = false; use_filebrowser = true; if (info->path) diff --git a/menu/menu_displaylist.h b/menu/menu_displaylist.h index 1be1b853be..8d55fae715 100644 --- a/menu/menu_displaylist.h +++ b/menu/menu_displaylist.h @@ -23,6 +23,7 @@ #include #include +#include "../msg_hash.h" #include "../setting_list.h" #ifndef COLLECTION_SIZE @@ -251,6 +252,8 @@ bool menu_displaylist_push(menu_displaylist_ctx_entry_t *entry); void menu_displaylist_info_free(menu_displaylist_info_t *info); +unsigned menu_displaylist_build_list(file_list_t *list, enum menu_displaylist_ctl_state type); + void menu_displaylist_info_init(menu_displaylist_info_t *info); bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist_info_t *info); @@ -261,6 +264,18 @@ bool menu_displaylist_setting(menu_displaylist_ctx_parse_entry_t *entry); void netplay_refresh_rooms_menu(file_list_t *list); #endif +int menu_displaylist_parse_settings_internal_enum( + file_list_t *list, + enum menu_displaylist_parse_type parse_type, + bool add_empty_entry, + rarch_setting_t *setting, + enum msg_hash_enums enum_idx + ); + +#define menu_displaylist_parse_settings_enum(list, label, parse_type, add_empty_entry) menu_displaylist_parse_settings_internal_enum(list, parse_type, add_empty_entry, menu_setting_find_enum(label), label) + +#define menu_displaylist_parse_settings(info_list, info_label, parse_type, add_empty_entry, entry_type) menu_displaylist_parse_settings_internal(info_list, parse_type, add_empty_entry, entry_type, menu_setting_find(info_label)) + RETRO_END_DECLS #endif diff --git a/menu/menu_driver.c b/menu/menu_driver.c index 0f6250367f..32f803a60e 100644 --- a/menu/menu_driver.c +++ b/menu/menu_driver.c @@ -181,9 +181,7 @@ static unsigned menu_display_header_height = 0; static bool menu_display_has_windowed = false; static bool menu_display_msg_force = false; -static bool menu_display_font_alloc_framebuf = false; static bool menu_display_framebuf_dirty = false; -static const uint8_t *menu_display_font_framebuf = NULL; static menu_display_ctx_driver_t *menu_disp = NULL; /* when enabled, on next iteration the 'Quick Menu' list will @@ -502,16 +500,6 @@ video_coord_array_t *menu_display_get_coords_array(void) return &menu_disp_ca; } -const uint8_t *menu_display_get_font_framebuffer(void) -{ - return menu_display_font_framebuf; -} - -void menu_display_set_font_framebuffer(const uint8_t *buffer) -{ - menu_display_font_framebuf = buffer; -} - bool menu_display_libretro_running( bool rarch_is_inited, bool rarch_is_dummy_core) @@ -608,16 +596,6 @@ void menu_display_set_msg_force(bool state) menu_display_msg_force = state; } -bool menu_display_get_font_data_init(void) -{ - return menu_display_font_alloc_framebuf; -} - -void menu_display_set_font_data_init(bool state) -{ - menu_display_font_alloc_framebuf = state; -} - /* Returns true if an animation is still active or * when the menu framebuffer still is dirty and * therefore it still needs to be rendered onscreen. @@ -2184,7 +2162,7 @@ void menu_driver_set_thumbnail_system(char *s, size_t len) void menu_driver_set_thumbnail_content(char *s, size_t len) { if (menu_driver_ctx && menu_driver_ctx->set_thumbnail_content) - menu_driver_ctx->set_thumbnail_content(menu_userdata, s, len); + menu_driver_ctx->set_thumbnail_content(menu_userdata, s); } /* Teardown function for the menu driver. */ diff --git a/menu/menu_driver.h b/menu/menu_driver.h index 5bb7ce8ca2..376ee2d29e 100644 --- a/menu/menu_driver.h +++ b/menu/menu_driver.h @@ -378,7 +378,7 @@ typedef struct menu_ctx_driver void (*update_thumbnail_path)(void *data, unsigned i, char pos); void (*update_thumbnail_image)(void *data); void (*set_thumbnail_system)(void *data, char* s, size_t len); - void (*set_thumbnail_content)(void *data, char* s, size_t len); + void (*set_thumbnail_content)(void *data, const char *s); int (*osk_ptr_at_pos)(void *data, int x, int y, unsigned width, unsigned height); void (*update_savestate_thumbnail_path)(void *data, unsigned i); void (*update_savestate_thumbnail_image)(void *data); @@ -549,8 +549,6 @@ void menu_display_font_free(font_data_t *font); void menu_display_coords_array_reset(void); video_coord_array_t *menu_display_get_coords_array(void); -const uint8_t *menu_display_get_font_framebuffer(void); -void menu_display_set_font_framebuffer(const uint8_t *buffer); bool menu_display_libretro(bool is_idle, bool is_inited, bool is_dummy); bool menu_display_libretro_running(bool rarch_is_inited, bool rarch_is_dummy_core); @@ -566,8 +564,6 @@ void menu_display_set_framebuffer_pitch(size_t pitch); bool menu_display_get_msg_force(void); void menu_display_set_msg_force(bool state); -bool menu_display_get_font_data_init(void); -void menu_display_set_font_data_init(bool state); bool menu_display_get_update_pending(void); void menu_display_set_viewport(unsigned width, unsigned height); void menu_display_unset_viewport(unsigned width, unsigned height); diff --git a/menu/menu_input.c b/menu/menu_input.c index e82438a842..b9b123151b 100644 --- a/menu/menu_input.c +++ b/menu/menu_input.c @@ -186,6 +186,7 @@ unsigned menu_event(input_bits_t *p_input, input_bits_t *p_trigger_input) unsigned ok_current = BIT256_GET_PTR(p_input, menu_ok_btn ); unsigned ok_trigger = ok_current & ~ok_old; + bool is_rgui = string_is_equal(settings->arrays.menu_driver, "rgui"); ok_old = ok_current; @@ -272,12 +273,12 @@ unsigned menu_event(input_bits_t *p_input, input_bits_t *p_trigger_input) menu_event_set_osk_idx((enum osk_type)( menu_event_get_osk_idx() - 1)); else - menu_event_set_osk_idx((enum osk_type)(OSK_TYPE_LAST - 1)); + menu_event_set_osk_idx((enum osk_type)(is_rgui ? OSK_SYMBOLS_PAGE1 : OSK_TYPE_LAST - 1)); } if (BIT256_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_R)) { - if (menu_event_get_osk_idx() < OSK_TYPE_LAST - 1) + if (menu_event_get_osk_idx() < (is_rgui ? OSK_SYMBOLS_PAGE1 : OSK_TYPE_LAST - 1)) menu_event_set_osk_idx((enum osk_type)( menu_event_get_osk_idx() + 1)); else diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 2c14999471..cee7f710c3 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -96,6 +96,12 @@ #include "../network/netplay/netplay.h" #endif +/* Required for 3DS display mode setting */ +#if defined(_3DS) +#include "gfx/common/ctr_common.h" +#include <3ds/services/cfgu.h> +#endif + enum settings_list_type { SETTINGS_LIST_NONE = 0, @@ -892,6 +898,78 @@ static void setting_get_string_representation_uint_rgui_internal_upscale_level( } } +static void setting_get_string_representation_uint_rgui_aspect_ratio( + rarch_setting_t *setting, + char *s, size_t len) +{ + if (!setting) + return; + + switch (*setting->value.target.unsigned_integer) + { + case RGUI_ASPECT_RATIO_4_3: + strlcpy(s, + msg_hash_to_str( + MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_4_3), + len); + break; + case RGUI_ASPECT_RATIO_16_9: + strlcpy(s, + msg_hash_to_str( + MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_16_9), + len); + break; + case RGUI_ASPECT_RATIO_16_9_CENTRE: + strlcpy(s, + msg_hash_to_str( + MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_16_9_CENTRE), + len); + break; + case RGUI_ASPECT_RATIO_16_10: + strlcpy(s, + msg_hash_to_str( + MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_16_10), + len); + break; + case RGUI_ASPECT_RATIO_16_10_CENTRE: + strlcpy(s, + msg_hash_to_str( + MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_16_10_CENTRE), + len); + break; + } +} + +static void setting_get_string_representation_uint_rgui_aspect_ratio_lock( + rarch_setting_t *setting, + char *s, size_t len) +{ + if (!setting) + return; + + switch (*setting->value.target.unsigned_integer) + { + case RGUI_ASPECT_RATIO_LOCK_NONE: + strlcpy(s, + msg_hash_to_str( + MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_LOCK_NONE), + len); + break; + case RGUI_ASPECT_RATIO_LOCK_FIT_SCREEN: + strlcpy(s, + msg_hash_to_str( + MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_LOCK_FIT_SCREEN), + len); + break; + case RGUI_ASPECT_RATIO_LOCK_INTEGER: + strlcpy(s, + msg_hash_to_str( + MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_LOCK_INTEGER), + len); + break; + } +} + static void setting_get_string_representation_uint_menu_ticker_type( rarch_setting_t *setting, char *s, size_t len) @@ -1353,6 +1431,44 @@ static void setting_get_string_representation_uint_playlist_inline_core_display_ } } +#if defined(_3DS) +static void setting_get_string_representation_uint_video_3ds_display_mode( + rarch_setting_t *setting, + char *s, size_t len) +{ + if (!setting) + return; + + switch (*setting->value.target.unsigned_integer) + { + case CTR_VIDEO_MODE_3D: + strlcpy(s, + msg_hash_to_str( + MENU_ENUM_LABEL_VALUE_CTR_VIDEO_MODE_3D), + len); + break; + case CTR_VIDEO_MODE_2D: + strlcpy(s, + msg_hash_to_str( + MENU_ENUM_LABEL_VALUE_CTR_VIDEO_MODE_2D), + len); + break; + case CTR_VIDEO_MODE_2D_400x240: + strlcpy(s, + msg_hash_to_str( + MENU_ENUM_LABEL_VALUE_CTR_VIDEO_MODE_2D_400x240), + len); + break; + case CTR_VIDEO_MODE_2D_800x240: + strlcpy(s, + msg_hash_to_str( + MENU_ENUM_LABEL_VALUE_CTR_VIDEO_MODE_2D_800x240), + len); + break; + } +} +#endif + static int setting_action_left_analog_dpad_mode(rarch_setting_t *setting, bool wraparound) { unsigned port = 0; @@ -2360,7 +2476,8 @@ static void setting_get_string_representation_uint_user_language( modes[RETRO_LANGUAGE_POLISH] = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LANG_POLISH); modes[RETRO_LANGUAGE_VIETNAMESE] = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LANG_VIETNAMESE); modes[RETRO_LANGUAGE_ARABIC] = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LANG_ARABIC); - modes[RETRO_LANGUAGE_GREEK] = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LANG_GREEK); + modes[RETRO_LANGUAGE_GREEK] = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LANG_GREEK); + modes[RETRO_LANGUAGE_TURKISH] = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_LANG_TURKISH); strlcpy(s, modes[*msg_hash_get_uint(MSG_HASH_USER_LANGUAGE)], len); } #endif @@ -2403,6 +2520,10 @@ void menu_settings_list_current_add_range( { unsigned idx = list_info->index - 1; + if ((*list)[idx].type == ST_FLOAT) + (*list)[list_info->index - 1].ui_type + = ST_UI_TYPE_FLOAT_SLIDER_AND_SPINBOX; + (*list)[idx].min = min; (*list)[idx].step = step; (*list)[idx].max = max; @@ -3250,11 +3371,34 @@ void general_write_handler(rarch_setting_t *setting) break; case MENU_ENUM_LABEL_LOG_VERBOSITY: if (!verbosity_is_enabled()) + { + rarch_log_file_init(); verbosity_enable(); + } else + { verbosity_disable(); + rarch_log_file_deinit(); + } retroarch_override_setting_unset(RARCH_OVERRIDE_SETTING_VERBOSITY, NULL); break; + case MENU_ENUM_LABEL_LOG_TO_FILE: + if (verbosity_is_enabled()) + { + if (settings->bools.log_to_file && !is_logging_to_file()) + rarch_log_file_init(); + else if (!settings->bools.log_to_file && is_logging_to_file()) + rarch_log_file_deinit(); + } + break; + case MENU_ENUM_LABEL_LOG_DIR: + case MENU_ENUM_LABEL_LOG_TO_FILE_TIMESTAMP: + if (verbosity_is_enabled() && is_logging_to_file()) + { + rarch_log_file_deinit(); + rarch_log_file_init(); + } + break; case MENU_ENUM_LABEL_VIDEO_SMOOTH: video_driver_set_filtering(1, settings->bools.video_smooth); break; @@ -4862,12 +5006,43 @@ static bool setting_append_list( parent_group, general_write_handler, general_read_handler); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_RADIO_BUTTONS; (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; menu_settings_list_current_add_range(list, list_info, 0, 3, 1.0, true, true); (*list)[list_info->index - 1].get_string_representation = &setting_get_string_representation_uint_libretro_log_level; settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED); + CONFIG_BOOL( + list, list_info, + &settings->bools.log_to_file, + MENU_ENUM_LABEL_LOG_TO_FILE, + MENU_ENUM_LABEL_VALUE_LOG_TO_FILE, + default_log_to_file, + 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.log_to_file_timestamp, + MENU_ENUM_LABEL_LOG_TO_FILE_TIMESTAMP, + MENU_ENUM_LABEL_VALUE_LOG_TO_FILE_TIMESTAMP, + log_to_file_timestamp, + 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); + END_SUB_GROUP(list, list_info, parent_group); START_SUB_GROUP(list, list_info, "Performance Counters", &group_info, &subgroup_info, @@ -6118,6 +6293,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); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX; (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; (*list)[list_info->index - 1].get_string_representation = &setting_get_string_representation_uint_video_rotation; @@ -6144,7 +6320,7 @@ static bool setting_append_list( START_SUB_GROUP( list, list_info, - "Synchronization", + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_AUDIO_SYNC), &group_info, &subgroup_info, parent_group); @@ -6408,6 +6584,7 @@ static bool setting_append_list( parent_group, general_write_handler, general_read_handler); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX; (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; (*list)[list_info->index - 1].get_string_representation = &setting_get_string_representation_uint_crt_switch_resolutions; @@ -6442,6 +6619,7 @@ static bool setting_append_list( parent_group, general_write_handler, general_read_handler); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_SPINBOX; (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; (*list)[list_info->index - 1].offset_by = -3; settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED); @@ -6652,7 +6830,7 @@ static bool setting_append_list( START_SUB_GROUP( list, list_info, - "Synchronization", + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_AUDIO_SYNC), &group_info, &subgroup_info, parent_group); @@ -6701,6 +6879,7 @@ static bool setting_append_list( parent_group, general_write_handler, general_read_handler); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX; (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; (*list)[list_info->index - 1].get_string_representation = &setting_get_string_representation_uint_audio_resampler_quality; @@ -6792,6 +6971,7 @@ static bool setting_append_list( general_write_handler, general_read_handler); settings_data_list_current_add_flags(list, list_info, SD_FLAG_ALLOW_INPUT); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_STRING_LINE_EDIT; (*list)[list_info->index - 1].action_left = &setting_string_action_left_audio_device; (*list)[list_info->index - 1].action_right = &setting_string_action_right_audio_device; #endif @@ -6988,6 +7168,7 @@ static bool setting_append_list( parent_group, general_write_handler, general_read_handler); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX; (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; (*list)[list_info->index - 1].get_string_representation = &setting_get_string_representation_poll_type_behavior; @@ -7089,6 +7270,7 @@ static bool setting_append_list( parent_group, general_write_handler, general_read_handler); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX; (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; (*list)[list_info->index - 1].get_string_representation = &setting_get_string_representation_toggle_gamepad_combo; @@ -7206,8 +7388,8 @@ static bool setting_append_list( CONFIG_FLOAT( list, list_info, input_driver_get_float(INPUT_ACTION_AXIS_THRESHOLD), - MENU_ENUM_LABEL_INPUT_AXIS_THRESHOLD, - MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, + MENU_ENUM_LABEL_INPUT_BUTTON_AXIS_THRESHOLD, + MENU_ENUM_LABEL_VALUE_INPUT_BUTTON_AXIS_THRESHOLD, axis_threshold, "%.3f", &group_info, @@ -7216,9 +7398,39 @@ static bool setting_append_list( general_write_handler, general_read_handler); (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; - menu_settings_list_current_add_range(list, list_info, 0, 1.00, 0.001, true, true); + menu_settings_list_current_add_range(list, list_info, 0, 1.0, 0.01, true, true); settings_data_list_current_add_flags(list, list_info, SD_FLAG_LAKKA_ADVANCED); + CONFIG_FLOAT( + list, list_info, + &settings->floats.input_analog_deadzone, + MENU_ENUM_LABEL_INPUT_ANALOG_DEADZONE, + MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_DEADZONE, + analog_deadzone, + "%.1f", + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; + menu_settings_list_current_add_range(list, list_info, 0, 1.0, 0.1, true, true); + + CONFIG_FLOAT( + list, list_info, + &settings->floats.input_analog_sensitivity, + MENU_ENUM_LABEL_INPUT_ANALOG_SENSITIVITY, + MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_SENSITIVITY, + analog_sensitivity, + "%.1f", + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; + menu_settings_list_current_add_range(list, list_info, -5.0, 5.0, 0.1, true, true); + CONFIG_UINT( list, list_info, &settings->uints.input_bind_timeout, @@ -7303,6 +7515,7 @@ static bool setting_append_list( &group_info, &subgroup_info, parent_group); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_BIND_BUTTON; (*list)[list_info->index - 1].index = user_value; (*list)[list_info->index - 1].index_offset = user; @@ -7338,6 +7551,7 @@ static bool setting_append_list( (*list)[list_info->index - 1].get_string_representation = &setting_get_string_representation_video_record_quality; menu_settings_list_current_add_range(list, list_info, RECORD_CONFIG_TYPE_RECORDING_CUSTOM, RECORD_CONFIG_TYPE_RECORDING_GIF, 1, true, true); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX; CONFIG_PATH( list, list_info, @@ -7366,6 +7580,7 @@ static bool setting_append_list( general_write_handler, general_read_handler); settings_data_list_current_add_flags(list, list_info, SD_FLAG_ALLOW_INPUT); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_STRING_LINE_EDIT; CONFIG_UINT( list, list_info, @@ -7427,6 +7642,7 @@ static bool setting_append_list( general_write_handler, general_read_handler); menu_settings_list_current_add_values(list, list_info, "cfg"); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_FILE_SELECTOR; CONFIG_STRING( list, list_info, @@ -7441,6 +7657,7 @@ static bool setting_append_list( general_write_handler, general_read_handler); settings_data_list_current_add_flags(list, list_info, SD_FLAG_ALLOW_INPUT); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_STRING_LINE_EDIT; CONFIG_UINT( list, list_info, @@ -7456,6 +7673,7 @@ static bool setting_append_list( (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint_special; menu_settings_list_current_add_range(list, list_info, 1, 8, 1, true, true); settings_data_list_current_add_flags(list, list_info, SD_FLAG_LAKKA_ADVANCED); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX; CONFIG_DIR( list, list_info, @@ -7539,7 +7757,8 @@ static bool setting_append_list( strdup(input_config_bind_map_get_desc(i)), &retro_keybinds_1[i], &group_info, &subgroup_info, parent_group); - (*list)[list_info->index - 1].bind_type = i + MENU_SETTINGS_BIND_BEGIN; + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_BIND_BUTTON; + (*list)[list_info->index - 1].bind_type = i + MENU_SETTINGS_BIND_BEGIN; menu_settings_list_current_add_enum_idx(list, list_info, (enum msg_hash_enums)(MENU_ENUM_LABEL_INPUT_HOTKEY_BIND_BEGIN + i)); } @@ -7631,6 +7850,7 @@ static bool setting_append_list( parent_group, general_write_handler, general_read_handler); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX; (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; (*list)[list_info->index - 1].offset_by = 1; menu_settings_list_current_add_range(list, list_info, 1, 6, 1, true, true); @@ -8293,23 +8513,43 @@ static bool setting_append_list( &setting_get_string_representation_uint_rgui_internal_upscale_level; menu_settings_list_current_add_range(list, list_info, 0, RGUI_UPSCALE_LAST-1, 1, true, true); settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX; } - CONFIG_BOOL( +#if !defined(GEKKO) + CONFIG_UINT( list, list_info, - &settings->bools.menu_rgui_lock_aspect, - MENU_ENUM_LABEL_MENU_RGUI_LOCK_ASPECT, - MENU_ENUM_LABEL_VALUE_MENU_RGUI_LOCK_ASPECT, - true, - MENU_ENUM_LABEL_VALUE_OFF, - MENU_ENUM_LABEL_VALUE_ON, + &settings->uints.menu_rgui_aspect_ratio, + MENU_ENUM_LABEL_MENU_RGUI_ASPECT_RATIO, + MENU_ENUM_LABEL_VALUE_MENU_RGUI_ASPECT_RATIO, + rgui_aspect, &group_info, &subgroup_info, parent_group, general_write_handler, - general_read_handler, - SD_FLAG_NONE - ); + general_read_handler); + (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; + (*list)[list_info->index - 1].get_string_representation = + &setting_get_string_representation_uint_rgui_aspect_ratio; + menu_settings_list_current_add_range(list, list_info, 0, RGUI_ASPECT_RATIO_LAST-1, 1, true, true); +#endif + + CONFIG_UINT( + list, list_info, + &settings->uints.menu_rgui_aspect_ratio_lock, + MENU_ENUM_LABEL_MENU_RGUI_ASPECT_RATIO_LOCK, + MENU_ENUM_LABEL_VALUE_MENU_RGUI_ASPECT_RATIO_LOCK, + rgui_aspect_lock, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; + (*list)[list_info->index - 1].get_string_representation = + &setting_get_string_representation_uint_rgui_aspect_ratio_lock; + menu_settings_list_current_add_range(list, list_info, 0, RGUI_ASPECT_RATIO_LOCK_LAST-1, 1, true, true); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX; CONFIG_UINT( list, list_info, @@ -8326,6 +8566,7 @@ static bool setting_append_list( (*list)[list_info->index - 1].get_string_representation = &setting_get_string_representation_uint_rgui_menu_color_theme; menu_settings_list_current_add_range(list, list_info, 0, RGUI_THEME_LAST-1, 1, true, true); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX; CONFIG_PATH( list, list_info, @@ -8340,6 +8581,36 @@ static bool setting_append_list( general_write_handler, general_read_handler); menu_settings_list_current_add_values(list, list_info, "cfg"); + + CONFIG_BOOL( + list, list_info, + &settings->bools.menu_rgui_shadows, + MENU_ENUM_LABEL_MENU_RGUI_SHADOWS, + MENU_ENUM_LABEL_VALUE_MENU_RGUI_SHADOWS, + rgui_shadows, + MENU_ENUM_LABEL_VALUE_OFF, + MENU_ENUM_LABEL_VALUE_ON, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler, + SD_FLAG_NONE); + + CONFIG_BOOL( + list, list_info, + &settings->bools.menu_rgui_extended_ascii, + MENU_ENUM_LABEL_MENU_RGUI_EXTENDED_ASCII, + MENU_ENUM_LABEL_VALUE_MENU_RGUI_EXTENDED_ASCII, + rgui_extended_ascii, + MENU_ENUM_LABEL_VALUE_OFF, + MENU_ENUM_LABEL_VALUE_ON, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler, + SD_FLAG_NONE); } if (string_is_equal(settings->arrays.menu_driver, "xmb")) @@ -8382,6 +8653,7 @@ static bool setting_append_list( (*list)[list_info->index - 1].get_string_representation = &setting_get_string_representation_uint_menu_ticker_type; menu_settings_list_current_add_range(list, list_info, 0, TICKER_TYPE_LAST-1, 1, true, true); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_RADIO_BUTTONS; CONFIG_FLOAT( list, list_info, @@ -8466,6 +8738,7 @@ static bool setting_append_list( general_write_handler, general_read_handler); settings_data_list_current_add_flags(list, list_info, SD_FLAG_ALLOW_INPUT); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_PASSWORD_LINE_EDIT; } #ifdef HAVE_THREADS @@ -8575,6 +8848,7 @@ static bool setting_append_list( general_read_handler); settings_data_list_current_add_flags(list, list_info, SD_FLAG_LAKKA_ADVANCED); menu_settings_list_current_add_cmd(list, list_info, CMD_EVENT_REINIT); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_FONT_SELECTOR; CONFIG_UINT( list, list_info, @@ -8636,6 +8910,7 @@ static bool setting_append_list( &setting_get_string_representation_uint_xmb_layout; menu_settings_list_current_add_range(list, list_info, 0, 2, 1, true, true); menu_settings_list_current_add_cmd(list, list_info, CMD_EVENT_REINIT); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX; CONFIG_UINT( list, list_info, @@ -8652,6 +8927,7 @@ static bool setting_append_list( &setting_get_string_representation_uint_xmb_icon_theme; menu_settings_list_current_add_range(list, list_info, 0, XMB_ICON_THEME_LAST - 1, 1, true, true); menu_settings_list_current_add_cmd(list, list_info, CMD_EVENT_REINIT); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX; CONFIG_BOOL( list, list_info, @@ -8686,6 +8962,7 @@ static bool setting_append_list( (*list)[list_info->index - 1].get_string_representation = &setting_get_string_representation_uint_xmb_shader_pipeline; menu_settings_list_current_add_range(list, list_info, 0, XMB_SHADER_PIPELINE_LAST-1, 1, true, true); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX; } #endif @@ -8704,6 +8981,7 @@ static bool setting_append_list( (*list)[list_info->index - 1].get_string_representation = &setting_get_string_representation_uint_xmb_menu_color_theme; menu_settings_list_current_add_range(list, list_info, 0, XMB_THEME_LAST-1, 1, true, true); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX; } #endif if (string_is_equal(settings->arrays.menu_driver, "ozone")) @@ -8923,6 +9201,7 @@ static bool setting_append_list( general_write_handler, general_read_handler); settings_data_list_current_add_flags(list, list_info, SD_FLAG_ALLOW_INPUT | SD_FLAG_LAKKA_ADVANCED); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_PASSWORD_LINE_EDIT; } #endif @@ -9090,6 +9369,7 @@ static bool setting_append_list( (*list)[list_info->index - 1].get_string_representation = &setting_get_string_representation_uint_materialui_menu_color_theme; menu_settings_list_current_add_range(list, list_info, 0, MATERIALUI_THEME_LAST-1, 1, true, true); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX; CONFIG_FLOAT( list, list_info, @@ -9120,6 +9400,8 @@ static bool setting_append_list( general_read_handler); (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; menu_settings_list_current_add_range(list, list_info, 0.0, 1.0, 0.010, true, true); + (*list)[list_info->index - 1].ui_type + = ST_UI_TYPE_FLOAT_SLIDER_AND_SPINBOX; } #endif @@ -9141,6 +9423,7 @@ static bool setting_append_list( (*list)[list_info->index - 1].get_string_representation = &setting_get_string_representation_uint_ozone_menu_color_theme; menu_settings_list_current_add_range(list, list_info, 0, 1, 1, true, true); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX; CONFIG_BOOL( list, list_info, @@ -9174,13 +9457,65 @@ static bool setting_append_list( general_read_handler, SD_FLAG_ADVANCED); + if (string_is_equal(settings->arrays.menu_driver, "rgui")) + { + CONFIG_BOOL( + list, list_info, + &settings->bools.menu_rgui_inline_thumbnails, + MENU_ENUM_LABEL_MENU_RGUI_INLINE_THUMBNAILS, + MENU_ENUM_LABEL_VALUE_MENU_RGUI_INLINE_THUMBNAILS, + rgui_inline_thumbnails, + MENU_ENUM_LABEL_VALUE_OFF, + MENU_ENUM_LABEL_VALUE_ON, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler, + SD_FLAG_NONE); + + CONFIG_BOOL( + list, list_info, + &settings->bools.menu_rgui_swap_thumbnails, + MENU_ENUM_LABEL_MENU_RGUI_SWAP_THUMBNAILS, + MENU_ENUM_LABEL_VALUE_MENU_RGUI_SWAP_THUMBNAILS, + rgui_swap_thumbnails, + MENU_ENUM_LABEL_VALUE_OFF, + MENU_ENUM_LABEL_VALUE_ON, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler, + SD_FLAG_NONE); + } + if (string_is_equal(settings->arrays.menu_driver, "xmb") || string_is_equal(settings->arrays.menu_driver, "ozone") || string_is_equal(settings->arrays.menu_driver, "rgui")) { + enum msg_hash_enums thumbnails_label_value; + enum msg_hash_enums left_thumbnails_label_value; + + if (string_is_equal(settings->arrays.menu_driver, "rgui")) + { + thumbnails_label_value = MENU_ENUM_LABEL_VALUE_THUMBNAILS_RGUI; + left_thumbnails_label_value = MENU_ENUM_LABEL_VALUE_LEFT_THUMBNAILS_RGUI; + } + else if (string_is_equal(settings->arrays.menu_driver, "ozone")) + { + thumbnails_label_value = MENU_ENUM_LABEL_VALUE_THUMBNAILS; + left_thumbnails_label_value = MENU_ENUM_LABEL_VALUE_LEFT_THUMBNAILS_OZONE; + } + else + { + thumbnails_label_value = MENU_ENUM_LABEL_VALUE_THUMBNAILS; + left_thumbnails_label_value = MENU_ENUM_LABEL_VALUE_LEFT_THUMBNAILS; + } + CONFIG_UINT( list, list_info, &settings->uints.menu_thumbnails, MENU_ENUM_LABEL_THUMBNAILS, - MENU_ENUM_LABEL_VALUE_THUMBNAILS, + thumbnails_label_value, menu_thumbnails_default, &group_info, &subgroup_info, @@ -9191,6 +9526,42 @@ static bool setting_append_list( (*list)[list_info->index - 1].get_string_representation = &setting_get_string_representation_uint_menu_thumbnails; menu_settings_list_current_add_range(list, list_info, 0, 3, 1, true, true); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_RADIO_BUTTONS; + + CONFIG_UINT( + list, list_info, + &settings->uints.menu_left_thumbnails, + MENU_ENUM_LABEL_LEFT_THUMBNAILS, + left_thumbnails_label_value, + menu_left_thumbnails_default, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; + (*list)[list_info->index - 1].get_string_representation = + &setting_get_string_representation_uint_menu_left_thumbnails; + menu_settings_list_current_add_range(list, list_info, 0, 3, 1, true, true); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_RADIO_BUTTONS; + } + + if (string_is_equal(settings->arrays.menu_driver, "xmb")) + { + CONFIG_BOOL( + list, list_info, + &settings->bools.menu_xmb_vertical_thumbnails, + MENU_ENUM_LABEL_XMB_VERTICAL_THUMBNAILS, + MENU_ENUM_LABEL_VALUE_XMB_VERTICAL_THUMBNAILS, + xmb_vertical_thumbnails, + MENU_ENUM_LABEL_VALUE_OFF, + MENU_ENUM_LABEL_VALUE_ON, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler, + SD_FLAG_NONE); } if (string_is_equal(settings->arrays.menu_driver, "rgui")) @@ -9210,45 +9581,20 @@ static bool setting_append_list( (*list)[list_info->index - 1].get_string_representation = &setting_get_string_representation_uint_rgui_thumbnail_scaler; menu_settings_list_current_add_range(list, list_info, 0, RGUI_THUMB_SCALE_LAST-1, 1, true, true); - } - - if (string_is_equal(settings->arrays.menu_driver, "xmb") || string_is_equal(settings->arrays.menu_driver, "ozone")) - { - bool is_ozone = string_is_equal(settings->arrays.menu_driver, "ozone"); - enum msg_hash_enums label = is_ozone ? - MENU_ENUM_LABEL_VALUE_LEFT_THUMBNAILS_OZONE : MENU_ENUM_LABEL_VALUE_LEFT_THUMBNAILS; + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_RADIO_BUTTONS; CONFIG_UINT( list, list_info, - &settings->uints.menu_left_thumbnails, - MENU_ENUM_LABEL_LEFT_THUMBNAILS, - label, - menu_left_thumbnails_default, + &settings->uints.menu_rgui_thumbnail_delay, + MENU_ENUM_LABEL_MENU_RGUI_THUMBNAIL_DELAY, + MENU_ENUM_LABEL_VALUE_MENU_RGUI_THUMBNAIL_DELAY, + rgui_thumbnail_delay, &group_info, &subgroup_info, parent_group, general_write_handler, general_read_handler); - (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; - (*list)[list_info->index - 1].get_string_representation = - &setting_get_string_representation_uint_menu_left_thumbnails; - menu_settings_list_current_add_range(list, list_info, 0, 3, 1, true, true); - - if (!is_ozone) - CONFIG_BOOL( - list, list_info, - &settings->bools.menu_xmb_vertical_thumbnails, - MENU_ENUM_LABEL_XMB_VERTICAL_THUMBNAILS, - MENU_ENUM_LABEL_VALUE_XMB_VERTICAL_THUMBNAILS, - xmb_vertical_thumbnails, - MENU_ENUM_LABEL_VALUE_OFF, - MENU_ENUM_LABEL_VALUE_ON, - &group_info, - &subgroup_info, - parent_group, - general_write_handler, - general_read_handler, - SD_FLAG_NONE); + menu_settings_list_current_add_range(list, list_info, 0.0f, 1024.0f, 64.0f, true, true); } CONFIG_BOOL( @@ -9280,6 +9626,7 @@ static bool setting_append_list( (*list)[list_info->index - 1].get_string_representation = &setting_get_string_representation_uint_menu_timedate_style; menu_settings_list_current_add_range(list, list_info, 0, 7, 1, true, true); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX; CONFIG_BOOL( list, list_info, @@ -9507,7 +9854,35 @@ static bool setting_append_list( settings_data_list_current_add_flags(list, list_info, SD_FLAG_LAKKA_ADVANCED); #endif -#ifdef _3DS +#if defined(_3DS) + { + u8 device_model = 0xFF; + + /* Only O3DS and O3DSXL support running in 'dual-framebuffer' + * mode with the parallax barrier disabled + * (i.e. these are the only platforms that can use + * CTR_VIDEO_MODE_2D_400x240 and CTR_VIDEO_MODE_2D_800x240) */ + CFGU_GetSystemModel(&device_model); /* (0 = O3DS, 1 = O3DSXL, 2 = N3DS, 3 = 2DS, 4 = N3DSXL, 5 = N2DSXL) */ + + CONFIG_UINT( + list, list_info, + &settings->uints.video_3ds_display_mode, + MENU_ENUM_LABEL_VIDEO_3DS_DISPLAY_MODE, + MENU_ENUM_LABEL_VALUE_VIDEO_3DS_DISPLAY_MODE, + video_3ds_display_mode, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; + (*list)[list_info->index - 1].get_string_representation = + &setting_get_string_representation_uint_video_3ds_display_mode; + menu_settings_list_current_add_range(list, list_info, 0, + CTR_VIDEO_MODE_LAST - (((device_model == 0) || (device_model == 1)) ? 1 : 3), + 1, true, true); + } + CONFIG_BOOL( list, list_info, &settings->bools.video_3ds_lcd_bottom, @@ -10189,6 +10564,7 @@ static bool setting_append_list( general_write_handler, general_read_handler); settings_data_list_current_add_flags(list, list_info, SD_FLAG_ALLOW_INPUT); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_STRING_LINE_EDIT; CONFIG_STRING( list, list_info, @@ -10203,6 +10579,7 @@ static bool setting_append_list( general_write_handler, general_read_handler); settings_data_list_current_add_flags(list, list_info, SD_FLAG_ALLOW_INPUT); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_STRING_LINE_EDIT; CONFIG_BOOL( list, list_info, @@ -10299,6 +10676,7 @@ static bool setting_append_list( general_read_handler); settings_data_list_current_add_flags(list, list_info, SD_FLAG_ALLOW_INPUT); settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_STRING_LINE_EDIT; CONFIG_UINT( list, list_info, @@ -10329,6 +10707,7 @@ static bool setting_append_list( general_write_handler, general_read_handler); settings_data_list_current_add_flags(list, list_info, SD_FLAG_ALLOW_INPUT); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_PASSWORD_LINE_EDIT; CONFIG_STRING( list, list_info, @@ -10343,6 +10722,7 @@ static bool setting_append_list( general_write_handler, general_read_handler); settings_data_list_current_add_flags(list, list_info, SD_FLAG_ALLOW_INPUT); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_PASSWORD_LINE_EDIT; CONFIG_BOOL( list, list_info, @@ -10418,6 +10798,7 @@ static bool setting_append_list( parent_group, general_write_handler, general_read_handler); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_SPINBOX; menu_settings_list_current_add_range(list, list_info, -600, 600, 1, false, false); settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED); @@ -10432,6 +10813,7 @@ static bool setting_append_list( parent_group, general_write_handler, general_read_handler); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_SPINBOX; (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; menu_settings_list_current_add_range(list, list_info, 0, 15, 1, true, true); @@ -10446,6 +10828,7 @@ static bool setting_append_list( parent_group, general_write_handler, general_read_handler); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_SPINBOX; (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; menu_settings_list_current_add_range(list, list_info, 0, 15, 1, true, true); @@ -10480,6 +10863,7 @@ static bool setting_append_list( (*list)[list_info->index - 1].get_string_representation = &setting_get_string_representation_netplay_share_digital; menu_settings_list_current_add_range(list, list_info, 0, RARCH_NETPLAY_SHARE_DIGITAL_LAST-1, 1, true, true); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX; CONFIG_UINT( list, list_info, @@ -10496,6 +10880,7 @@ static bool setting_append_list( (*list)[list_info->index - 1].get_string_representation = &setting_get_string_representation_netplay_share_analog; menu_settings_list_current_add_range(list, list_info, 0, RARCH_NETPLAY_SHARE_ANALOG_LAST-1, 1, true, true); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX; for (user = 0; user < MAX_USERS; user++) { @@ -10741,6 +11126,7 @@ static bool setting_append_list( general_write_handler, general_read_handler); settings_data_list_current_add_flags(list, list_info, SD_FLAG_ALLOW_INPUT); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_STRING_LINE_EDIT; CONFIG_STRING( list, list_info, @@ -10779,6 +11165,7 @@ static bool setting_append_list( (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; (*list)[list_info->index - 1].get_string_representation = &setting_get_string_representation_uint_user_language; + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX; #endif END_SUB_GROUP(list, list_info, parent_group); @@ -10844,6 +11231,7 @@ static bool setting_append_list( update_streaming_url_write_handler, general_read_handler); settings_data_list_current_add_flags(list, list_info, SD_FLAG_ALLOW_INPUT); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_STRING_LINE_EDIT; END_SUB_GROUP(list, list_info, parent_group); END_GROUP(list, list_info, parent_group); @@ -10870,6 +11258,7 @@ static bool setting_append_list( update_streaming_url_write_handler, general_read_handler); settings_data_list_current_add_flags(list, list_info, SD_FLAG_ALLOW_INPUT); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_STRING_LINE_EDIT; END_SUB_GROUP(list, list_info, parent_group); END_GROUP(list, list_info, parent_group); @@ -10897,6 +11286,7 @@ static bool setting_append_list( general_write_handler, general_read_handler); settings_data_list_current_add_flags(list, list_info, SD_FLAG_ALLOW_INPUT); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_STRING_LINE_EDIT; CONFIG_STRING( list, list_info, @@ -10913,6 +11303,7 @@ static bool setting_append_list( (*list)[list_info->index - 1].get_string_representation = &setting_get_string_representation_cheevos_password; settings_data_list_current_add_flags(list, list_info, SD_FLAG_ALLOW_INPUT); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_PASSWORD_LINE_EDIT; #endif END_SUB_GROUP(list, list_info, parent_group); @@ -11326,6 +11717,21 @@ static bool setting_append_list( general_read_handler); (*list)[list_info->index - 1].action_start = directory_action_start_generic; + CONFIG_DIR( + list, list_info, + settings->paths.log_dir, + sizeof(settings->paths.log_dir), + MENU_ENUM_LABEL_LOG_DIR, + MENU_ENUM_LABEL_VALUE_LOG_DIR, + g_defaults.dirs[DEFAULT_DIR_LOGS], + MENU_ENUM_LABEL_VALUE_DIRECTORY_DEFAULT, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + (*list)[list_info->index - 1].action_start = directory_action_start_generic; + END_SUB_GROUP(list, list_info, parent_group); END_GROUP(list, list_info, parent_group); break; diff --git a/menu/menu_shader.c b/menu/menu_shader.c index c547bfc26c..a27a042235 100644 --- a/menu/menu_shader.c +++ b/menu/menu_shader.c @@ -44,26 +44,6 @@ struct video_shader *menu_shader_get(void) return NULL; } -void menu_shader_manager_decrement_amount_passes(void) -{ - struct video_shader *shader = menu_shader_get(); - - if (!shader) - return; - - shader->passes--; -} - -void menu_shader_manager_increment_amount_passes(void) -{ - struct video_shader *shader = menu_shader_get(); - - if (!shader) - return; - - shader->passes++; -} - void menu_shader_manager_free(void) { if (menu_driver_shader) @@ -343,7 +323,7 @@ bool menu_shader_manager_save_preset( if (!string_is_empty(basename)) strlcpy(preset_path, buffer, sizeof(preset_path)); - if (config_file_write(conf, preset_path, true)) + if (config_file_write(conf, preset_path, false)) { RARCH_LOG("Saved shader preset to %s.\n", preset_path); if (apply) @@ -363,7 +343,7 @@ bool menu_shader_manager_save_preset( fill_pathname_join(preset_path, dirs[d], buffer, sizeof(preset_path)); - if (config_file_write(conf, preset_path, true)) + if (config_file_write(conf, preset_path, false)) { RARCH_LOG("Saved shader preset to %s.\n", preset_path); if (apply) diff --git a/menu/menu_shader.h b/menu/menu_shader.h index 9609449680..a3da011651 100644 --- a/menu/menu_shader.h +++ b/menu/menu_shader.h @@ -82,10 +82,6 @@ void menu_shader_manager_clear_pass_scale(unsigned i); void menu_shader_manager_clear_pass_path(unsigned i); -void menu_shader_manager_decrement_amount_passes(void); - -void menu_shader_manager_increment_amount_passes(void); - RETRO_END_DECLS #endif diff --git a/menu/menu_thumbnail_path.c b/menu/menu_thumbnail_path.c new file mode 100644 index 0000000000..f5eb0a141c --- /dev/null +++ b/menu/menu_thumbnail_path.c @@ -0,0 +1,578 @@ +/* Copyright (C) 2010-2019 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (runtime_file.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include +#include +#include +#include + +#include +#include +#include + +#include "../configuration.h" +#include "../msg_hash.h" +#include "../paths.h" +#include "../file_path_special.h" + +#include "menu_driver.h" +#include "widgets/menu_entry.h" + +#include "menu_thumbnail_path.h" + +/* Used fixed size char arrays here, just to avoid + * the inconvenience of having to calloc()/free() + * each individual entry by hand... */ +struct menu_thumbnail_path_data +{ + char system[PATH_MAX_LENGTH]; + char content_path[PATH_MAX_LENGTH]; + char content_label[PATH_MAX_LENGTH]; + char content_core_name[PATH_MAX_LENGTH]; + char content_db_name[PATH_MAX_LENGTH]; + char content_img[PATH_MAX_LENGTH]; + char right_path[PATH_MAX_LENGTH]; + char left_path[PATH_MAX_LENGTH]; +}; + +/* Initialisation */ + +/* Creates new thumbnail path data container. + * Returns handle to new menu_thumbnail_path_data_t object. + * on success, otherwise NULL. + * Note: Returned object must be free()d */ +menu_thumbnail_path_data_t *menu_thumbnail_path_init() +{ + menu_thumbnail_path_data_t *path_data = NULL; + path_data = (menu_thumbnail_path_data_t*)calloc(1, sizeof(*path_data)); + if (!path_data) + return NULL; + return path_data; +} + +/* Resets thumbnail path data + * (blanks all internal string containers) */ +void menu_thumbnail_path_reset(menu_thumbnail_path_data_t *path_data) +{ + if (!path_data) + return; + + path_data->system[0] = '\0'; + path_data->content_path[0] = '\0'; + path_data->content_label[0] = '\0'; + path_data->content_core_name[0] = '\0'; + path_data->content_db_name[0] = '\0'; + path_data->content_img[0] = '\0'; + path_data->right_path[0] = '\0'; + path_data->left_path[0] = '\0'; +} + +/* Utility Functions */ + +/* Returns currently set thumbnail 'type' (Named_Snaps, + * Named_Titles, Named_Boxarts) for specified thumbnail + * identifier (right, left) */ +const char *menu_thumbnail_get_type(enum menu_thumbnail_id thumbnail_id) +{ + settings_t *settings = config_get_ptr(); + unsigned type = 0; + + if (!settings) + return msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF); + + switch (thumbnail_id) + { + case MENU_THUMBNAIL_RIGHT: + type = settings->uints.menu_thumbnails; + break; + case MENU_THUMBNAIL_LEFT: + type = settings->uints.menu_left_thumbnails; + break; + default: + return msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF); + } + + switch (type) + { + case 1: + return "Named_Snaps"; + case 2: + return "Named_Titles"; + case 3: + return "Named_Boxarts"; + case 0: + default: + break; + } + + return msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF); +} + +/* Returns true if specified thumbnail is enabled + * (i.e. if 'type' is not equal to MENU_ENUM_LABEL_VALUE_OFF) */ +bool menu_thumbnail_is_enabled(enum menu_thumbnail_id thumbnail_id) +{ + settings_t *settings = config_get_ptr(); + + if (!settings) + return false; + + switch (thumbnail_id) + { + case MENU_THUMBNAIL_RIGHT: + return settings->uints.menu_thumbnails != 0; + case MENU_THUMBNAIL_LEFT: + return settings->uints.menu_left_thumbnails != 0; + break; + default: + break; + } + + return false; +} + +/* Setters */ + +/* Fills content_img field of path_data using existing + * content_label field (for internal use only) */ +static void fill_content_img(menu_thumbnail_path_data_t *path_data) +{ + char *scrub_char_pointer = NULL; + + /* Copy source label string */ + strlcpy(path_data->content_img, + path_data->content_label, sizeof(path_data->content_img)); + + /* Scrub characters that are not cross-platform and/or violate the + * No-Intro filename standard: + * http://datomatic.no-intro.org/stuff/The%20Official%20No-Intro%20Convention%20(20071030).zip + * Replace these characters in the entry name with underscores */ + while((scrub_char_pointer = strpbrk(path_data->content_img, "&*/:`\"<>?\\|"))) + *scrub_char_pointer = '_'; + + /* Add PNG extension */ + strlcat(path_data->content_img, + file_path_str(FILE_PATH_PNG_EXTENSION), sizeof(path_data->content_img)); +} + +/* Sets current 'system' (default database name). + * Returns true if 'system' is valid. + * > Used as a fallback when individual content lacks an + * associated database name */ +bool menu_thumbnail_set_system(menu_thumbnail_path_data_t *path_data, const char *system) +{ + if (!path_data) + return false; + + /* When system is updated, must regenerate right/left + * thumbnail paths */ + path_data->right_path[0] = '\0'; + path_data->left_path[0] = '\0'; + + /* 'Reset' path_data system string */ + path_data->system[0] = '\0'; + + if (string_is_empty(system)) + return false; + + /* Hack: There is only one MAME thumbnail repo, + * so filter any input starting with 'MAME...' */ + if (strncmp(system, "MAME", 4) == 0) + strlcpy(path_data->system, "MAME", sizeof(path_data->system)); + else + strlcpy(path_data->system, system, sizeof(path_data->system)); + + return true; +} + +/* Sets current thumbnail content according to the specified label. + * Returns true if content is valid */ +bool menu_thumbnail_set_content(menu_thumbnail_path_data_t *path_data, const char *label) +{ + if (!path_data) + return false; + + /* When content is updated, must regenerate right/left + * thumbnail paths */ + path_data->right_path[0] = '\0'; + path_data->left_path[0] = '\0'; + + /* 'Reset' path_data content strings */ + path_data->content_path[0] = '\0'; + path_data->content_label[0] = '\0'; + path_data->content_core_name[0] = '\0'; + path_data->content_db_name[0] = '\0'; + path_data->content_img[0] = '\0'; + + if (string_is_empty(label)) + return false; + + /* Cache content label */ + strlcpy(path_data->content_label, label, sizeof(path_data->content_label)); + + /* Determine content image name */ + fill_content_img(path_data); + + /* Redundant error check... */ + if (string_is_empty(path_data->content_img)) + return false; + + return true; +} + +/* Sets current thumbnail content to the specified image. + * Returns true if content is valid */ +bool menu_thumbnail_set_content_image(menu_thumbnail_path_data_t *path_data, const char *img_dir, const char *img_name) +{ + char *content_img_no_ext = NULL; + + if (!path_data) + return false; + + /* When content is updated, must regenerate right/left + * thumbnail paths */ + path_data->right_path[0] = '\0'; + path_data->left_path[0] = '\0'; + + /* 'Reset' path_data content strings */ + path_data->content_path[0] = '\0'; + path_data->content_label[0] = '\0'; + path_data->content_core_name[0] = '\0'; + path_data->content_db_name[0] = '\0'; + path_data->content_img[0] = '\0'; + + if (string_is_empty(img_dir)) + return false; + + if (string_is_empty(img_name)) + return false; + + if (path_is_media_type(img_name) != RARCH_CONTENT_IMAGE) + return false; + + /* Cache content image name */ + strlcpy(path_data->content_img, + img_name, sizeof(path_data->content_img)); + + /* Get image label */ + content_img_no_ext = path_remove_extension(path_data->content_img); + if (!string_is_empty(content_img_no_ext)) + strlcpy(path_data->content_label, + content_img_no_ext, sizeof(path_data->content_label)); + else + strlcpy(path_data->content_label, + path_data->content_img, sizeof(path_data->content_label)); + + /* Set file path */ + fill_pathname_join(path_data->content_path, + img_dir, img_name, sizeof(path_data->content_path)); + + /* Set core name to "imageviewer" */ + strlcpy(path_data->content_core_name, + "imageviewer", sizeof(path_data->content_core_name)); + + /* Set database name (arbitrarily) to "_images_" + * (required for compatibility with menu_thumbnail_update_path(), + * but not actually used...) */ + strlcpy(path_data->content_db_name, + "_images_", sizeof(path_data->content_db_name)); + + /* Redundant error check */ + if (string_is_empty(path_data->content_path)) + return false; + + return true; +} + +/* Sets current thumbnail content to the specified playlist entry. + * Returns true if content is valid. + * > Note: It is always best to use playlists when setting + * thumbnail content, since there is no guarantee that the + * corresponding menu entry label will contain a useful + * identifier (it may be 'tainted', e.g. with the current + * core name). 'Real' labels should be extracted from source */ +bool menu_thumbnail_set_content_playlist(menu_thumbnail_path_data_t *path_data, playlist_t *playlist, size_t idx) +{ + const char *content_path = NULL; + const char *content_label = NULL; + const char *core_name = NULL; + const char *db_name = NULL; + const struct playlist_entry *entry = NULL; + + if (!path_data) + return false; + + /* When content is updated, must regenerate right/left + * thumbnail paths */ + path_data->right_path[0] = '\0'; + path_data->left_path[0] = '\0'; + + /* 'Reset' path_data content strings */ + path_data->content_path[0] = '\0'; + path_data->content_label[0] = '\0'; + path_data->content_core_name[0] = '\0'; + path_data->content_db_name[0] = '\0'; + path_data->content_img[0] = '\0'; + + if (!playlist) + return false; + + if (idx >= playlist_get_size(playlist)) + return false; + + /* Read playlist values */ + playlist_get_index(playlist, idx, &entry); + + content_path = entry->path; + content_label = entry->label; + core_name = entry->core_name; + db_name = entry->db_name; + + /* Content without a path is invalid by definition */ + if (string_is_empty(content_path)) + return false; + + /* Cache content path + * (This is required for imageviewer content) */ + strlcpy(path_data->content_path, + content_path, sizeof(path_data->content_path)); + + /* Cache core name + * (This is required for imageviewer content) */ + if (!string_is_empty(core_name)) + strlcpy(path_data->content_core_name, + core_name, sizeof(path_data->content_core_name)); + + /* Get content label */ + if (!string_is_empty(content_label)) + strlcpy(path_data->content_label, + content_label, sizeof(path_data->content_label)); + else + fill_short_pathname_representation(path_data->content_label, + content_path, sizeof(path_data->content_label)); + + /* Determine content image name */ + fill_content_img(path_data); + + /* Redundant error check... */ + if (string_is_empty(path_data->content_img)) + return false; + + /* Thumbnail image name is done -> now check if + * per-content database name is defined */ + if (!string_is_empty(db_name)) + { + /* Hack: There is only one MAME thumbnail repo, + * so filter any input starting with 'MAME...' */ + if (strncmp(db_name, "MAME", 4) == 0) + strlcpy(path_data->content_db_name, + "MAME", sizeof(path_data->content_db_name)); + else + { + char *db_name_no_ext = NULL; + char tmp_buf[PATH_MAX_LENGTH]; + tmp_buf[0] = '\0'; + + /* Remove .lpl extension + * > path_remove_extension() requires a char * (not const) + * so have to use a temporary buffer... */ + strlcpy(tmp_buf, db_name, sizeof(tmp_buf)); + db_name_no_ext = path_remove_extension(tmp_buf); + + if (!string_is_empty(db_name_no_ext)) + strlcpy(path_data->content_db_name, + db_name_no_ext, sizeof(path_data->content_db_name)); + else + strlcpy(path_data->content_db_name, + tmp_buf, sizeof(path_data->content_db_name)); + } + } + + return true; +} + +/* Updaters */ + +/* Updates path for specified thumbnail identifier (right, left). + * Must be called after: + * - menu_thumbnail_set_system() + * - menu_thumbnail_set_content*() + * ...and before: + * - menu_thumbnail_get_path() + * Returns true if generated path is valid */ +bool menu_thumbnail_update_path(menu_thumbnail_path_data_t *path_data, enum menu_thumbnail_id thumbnail_id) +{ + settings_t *settings = config_get_ptr(); + const char *type = menu_thumbnail_get_type(thumbnail_id); + const char *system_name = NULL; + char *thumbnail_path = NULL; + + if (!path_data) + return false; + + /* Determine which path we are updating... */ + switch (thumbnail_id) + { + case MENU_THUMBNAIL_RIGHT: + thumbnail_path = path_data->right_path; + break; + case MENU_THUMBNAIL_LEFT: + thumbnail_path = path_data->left_path; + break; + default: + return false; + } + + thumbnail_path[0] = '\0'; + + /* Sundry error checking */ + if (!settings) + return false; + + if (string_is_empty(settings->paths.directory_thumbnails)) + return false; + + if (!menu_thumbnail_is_enabled(thumbnail_id)) + return false; + + /* Generate new path */ + + /* > Check path_data for empty strings */ + if (string_is_empty(path_data->content_img) || + (string_is_empty(path_data->system) && + string_is_empty(path_data->content_db_name))) + return false; + + /* > Get current system */ + system_name = string_is_empty(path_data->content_db_name) ? + path_data->system : path_data->content_db_name; + + /* > Special case: thumbnail for imageviewer content + * is the image file itself */ + if (string_is_equal(system_name, "images_history") || + string_is_equal(path_data->content_core_name, "imageviewer")) + { + if (string_is_empty(path_data->content_path)) + return false; + + /* imageviewer content is identical for left and right thumbnails */ + if (path_is_media_type(path_data->content_path) == RARCH_CONTENT_IMAGE) + strlcpy(thumbnail_path, + path_data->content_path, PATH_MAX_LENGTH * sizeof(char)); + } + else + { + char tmp_buf[PATH_MAX_LENGTH]; + tmp_buf[0] = '\0'; + + /* > Normal content: assemble path */ + + /* >> Base + system name */ + fill_pathname_join(thumbnail_path, settings->paths.directory_thumbnails, + system_name, PATH_MAX_LENGTH * sizeof(char)); + + /* >> Add type */ + fill_pathname_join(tmp_buf, thumbnail_path, type, sizeof(tmp_buf)); + + /* >> Add content image */ + thumbnail_path[0] = '\0'; + fill_pathname_join(thumbnail_path, tmp_buf, + path_data->content_img, PATH_MAX_LENGTH * sizeof(char)); + } + + /* Final error check - is cached path empty? */ + if (string_is_empty(thumbnail_path)) + return false; + + return true; +} + +/* Getters */ + +/* Fetches the current thumbnail file path of the + * specified thumbnail 'type'. + * Returns true if path is valid. */ +bool menu_thumbnail_get_path(menu_thumbnail_path_data_t *path_data, enum menu_thumbnail_id thumbnail_id, const char **path) +{ + char *thumbnail_path = NULL; + + if (!path_data) + return false; + + if (!path) + return false; + + switch (thumbnail_id) + { + case MENU_THUMBNAIL_RIGHT: + thumbnail_path = path_data->right_path; + break; + case MENU_THUMBNAIL_LEFT: + thumbnail_path = path_data->left_path; + break; + default: + return false; + } + + if (string_is_empty(thumbnail_path)) + return false; + + *path = thumbnail_path; + + return true; +} + +/* Fetches current thumbnail label. + * Returns true if label is valid. */ +bool menu_thumbnail_get_label(menu_thumbnail_path_data_t *path_data, const char **label) +{ + if (!path_data) + return false; + + if (!label) + return false; + + if (string_is_empty(path_data->content_label)) + return false; + + *label = path_data->content_label; + + return true; +} + +/* Fetches current thumbnail core name. + * Returns true if core name is valid. */ +bool menu_thumbnail_get_core_name(menu_thumbnail_path_data_t *path_data, const char **core_name) +{ + if (!path_data) + return false; + + if (!core_name) + return false; + + if (string_is_empty(path_data->content_core_name)) + return false; + + *core_name = path_data->content_core_name; + + return true; +} diff --git a/menu/menu_thumbnail_path.h b/menu/menu_thumbnail_path.h new file mode 100644 index 0000000000..8ff215d382 --- /dev/null +++ b/menu/menu_thumbnail_path.h @@ -0,0 +1,129 @@ +/* Copyright (C) 2010-2019 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (runtime_file.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __MENU_THUMBNAIL_PATH_H +#define __MENU_THUMBNAIL_PATH_H + +#include +#include + +#include + +#include "../playlist.h" + +RETRO_BEGIN_DECLS + +/* Note: This implementation reflects the current + * setup of: + * - menu_driver_set_thumbnail_system() + * - menu_driver_set_thumbnail_content() + * - menu_driver_update_thumbnail_path() + * This is absolutely not the best way to handle things, + * but I have no interest in rewriting the existing + * menu code... */ + +enum menu_thumbnail_id +{ + MENU_THUMBNAIL_RIGHT = 0, + MENU_THUMBNAIL_LEFT +}; + +/* Prevent direct access to menu_thumbnail_path_data_t members */ +typedef struct menu_thumbnail_path_data menu_thumbnail_path_data_t; + +/* Initialisation */ + +/* Creates new thumbnail path data container. + * Returns handle to new menu_thumbnail_path_data_t object. + * on success, otherwise NULL. + * Note: Returned object must be free()d */ +menu_thumbnail_path_data_t *menu_thumbnail_path_init(void); + +/* Resets thumbnail path data + * (blanks all internal string containers) */ +void menu_thumbnail_path_reset(menu_thumbnail_path_data_t *path_data); + +/* Utility Functions */ + +/* Returns currently set thumbnail 'type' (Named_Snaps, + * Named_Titles, Named_Boxarts) for specified thumbnail + * identifier (right, left) */ +const char *menu_thumbnail_get_type(enum menu_thumbnail_id thumbnail_id); + +/* Returns true if specified thumbnail is enabled + * (i.e. if 'type' is not equal to MENU_ENUM_LABEL_VALUE_OFF) */ +bool menu_thumbnail_is_enabled(enum menu_thumbnail_id thumbnail_id); + +/* Setters */ + +/* Sets current 'system' (default database name). + * Returns true if 'system' is valid. + * > Used as a fallback when individual content lacks an + * associated database name */ +bool menu_thumbnail_set_system(menu_thumbnail_path_data_t *path_data, const char *system); + +/* Sets current thumbnail content according to the specified label. + * Returns true if content is valid */ +bool menu_thumbnail_set_content(menu_thumbnail_path_data_t *path_data, const char *label); + +/* Sets current thumbnail content to the specified image. + * Returns true if content is valid */ +bool menu_thumbnail_set_content_image(menu_thumbnail_path_data_t *path_data, const char *img_dir, const char *img_name); + +/* Sets current thumbnail content to the specified playlist entry. + * Returns true if content is valid. + * > Note: It is always best to use playlists when setting + * thumbnail content, since there is no guarantee that the + * corresponding menu entry label will contain a useful + * identifier (it may be 'tainted', e.g. with the current + * core name). 'Real' labels should be extracted from source */ +bool menu_thumbnail_set_content_playlist(menu_thumbnail_path_data_t *path_data, playlist_t *playlist, size_t idx); + +/* Updaters */ + +/* Updates path for specified thumbnail identifier (right, left). + * Must be called after: + * - menu_thumbnail_set_system() + * - menu_thumbnail_set_content*() + * ...and before: + * - menu_thumbnail_get_path() + * Returns true if generated path is valid */ +bool menu_thumbnail_update_path(menu_thumbnail_path_data_t *path_data, enum menu_thumbnail_id thumbnail_id); + +/* Getters */ + +/* Fetches the current thumbnail file path of the + * specified thumbnail 'type'. + * Returns true if path is valid. */ +bool menu_thumbnail_get_path(menu_thumbnail_path_data_t *path_data, enum menu_thumbnail_id thumbnail_id, const char **path); + +/* Fetches current thumbnail label. + * Returns true if label is valid. */ +bool menu_thumbnail_get_label(menu_thumbnail_path_data_t *path_data, const char **label); + +/* Fetches current thumbnail core name. + * Returns true if core name is valid. */ +bool menu_thumbnail_get_core_name(menu_thumbnail_path_data_t *path_data, const char **core_name); + +RETRO_END_DECLS + +#endif diff --git a/menu/widgets/menu_osk.c b/menu/widgets/menu_osk.c index 997590229f..3a32e0955f 100644 --- a/menu/widgets/menu_osk.c +++ b/menu/widgets/menu_osk.c @@ -31,6 +31,7 @@ #include "menu_osk.h" #include "../../input/input_driver.h" +#include "../../configuration.h" static char *osk_grid[45] = {NULL}; @@ -83,9 +84,14 @@ void menu_event_set_osk_ptr(int i) void menu_event_osk_append(int ptr) { - if (ptr < 0) + settings_t *settings = config_get_ptr(); + bool is_rgui; + + if (ptr < 0 || !settings) return; + is_rgui = string_is_equal(settings->arrays.menu_driver, "rgui"); + #ifdef HAVE_LANGEXTRA if (string_is_equal(osk_grid[ptr],"\xe2\x87\xa6")) /* backspace character */ input_keyboard_event(true, '\x7f', '\x7f', 0, RETRO_DEVICE_KEYBOARD); @@ -109,7 +115,7 @@ void menu_event_osk_append(int ptr) menu_event_set_osk_idx(OSK_LOWERCASE_LATIN); else if (string_is_equal(osk_grid[ptr], "Next")) #endif - if (menu_event_get_osk_idx() < OSK_TYPE_LAST - 1) + if (menu_event_get_osk_idx() < (is_rgui ? OSK_SYMBOLS_PAGE1 : OSK_TYPE_LAST - 1)) menu_event_set_osk_idx((enum osk_type)(menu_event_get_osk_idx() + 1)); else menu_event_set_osk_idx((enum osk_type)(OSK_TYPE_UNKNOWN + 1)); diff --git a/menu/widgets/menu_widgets.c b/menu/widgets/menu_widgets.c index b37d532d1c..406ed728e4 100644 --- a/menu/widgets/menu_widgets.c +++ b/menu/widgets/menu_widgets.c @@ -1,6 +1,7 @@ /* RetroArch - A frontend for libretro. * Copyright (C) 2014-2017 - Jean-André Santoni - * Copyright (C) 2018 - natinusala + * Copyright (C) 2015-2018 - Andre Leiradella + * Copyright (C) 2018-2019 - natinusala * * 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- @@ -36,11 +37,16 @@ #include #include +#ifndef PI #define PI 3.14159265359f +#endif + +#ifndef max +#define max(x, y) x >= y ? x : y +#endif /* TODO: Fix context reset freezing everything in place (probably kills animations when it shouldn't anymore) */ - static float msg_queue_background[16] = COLOR_HEX_TO_FLOAT(0x3A3A3A, 1.0f); static float msg_queue_info[16] = COLOR_HEX_TO_FLOAT(0x12ACF8, 1.0f); @@ -79,6 +85,17 @@ static float menu_widgets_pure_white[16] = { 1.00, 1.00, 1.00, 1.00, }; +/* Achievement notification */ +static char *cheevo_title = NULL; +static menu_texture_item cheevo_badge = 0; +static float cheevo_unfold = 0.0f; + +static menu_timer_t cheevo_timer; + +static float cheevo_y = 0.0f; +static unsigned cheevo_width = 0; +static unsigned cheevo_height = 0; + /* Load content animation */ #define ANIMATION_LOAD_CONTENT_DURATION 333 @@ -98,7 +115,7 @@ static float load_content_animation_final_fade_alpha; static menu_timer_t load_content_animation_end_timer; -static float menu_widgets_backdrop_orig[16] = { +static float menu_widgets_backdrop_orig[16] = { 0.00, 0.00, 0.00, 0.75, 0.00, 0.00, 0.00, 0.75, 0.00, 0.00, 0.00, 0.75, @@ -188,7 +205,9 @@ enum menu_widgets_icon MENU_WIDGETS_ICON_INFO, - MENU_WIDGETS_ICON_LAST + MENU_WIDGETS_ICON_ACHIEVEMENT, + + MENU_WIDGETS_ICON_LAST, }; static char *menu_widgets_icons_names[MENU_WIDGETS_ICON_LAST] = { @@ -205,10 +224,12 @@ static char *menu_widgets_icons_names[MENU_WIDGETS_ICON_LAST] = { "menu_hourglass.png", "menu_check.png", - "menu_info.png" + "menu_info.png", + + "menu_achievements.png" }; -static menu_texture_item menu_widgets_icons_textures[MENU_WIDGETS_ICON_LAST]; +static menu_texture_item menu_widgets_icons_textures[MENU_WIDGETS_ICON_LAST] = {0}; /* Volume */ static float volume_db = 0.0f; @@ -1211,7 +1232,7 @@ static void menu_widgets_draw_regular_msg(menu_widget_msg_t *msg, video_frame_in icon, msg_queue_spacing + msg_queue_internal_icon_offset, video_info->height - msg->offset_y - msg_queue_icon_offset_y + msg_queue_internal_icon_offset, video_info->width, video_info->height, 0, 1, menu_widgets_pure_white); - + menu_display_blend_end(video_info); } } @@ -1305,21 +1326,21 @@ void menu_widgets_frame(video_frame_info_t *video_info) menu_display_set_alpha(menu_widgets_backdrop_orig, DEFAULT_BACKDROP); menu_display_draw_quad(video_info, - 0, screenshot_y, + 0, screenshot_y, screenshot_width, screenshot_height, video_info->width, video_info->height, menu_widgets_backdrop_orig ); menu_display_set_alpha(menu_widgets_pure_white, 1.0f); - menu_widgets_draw_icon(video_info, - screenshot_thumbnail_width, screenshot_thumbnail_height, - screenshot_texture, - 0, screenshot_y, - video_info->width, video_info->height, + menu_widgets_draw_icon(video_info, + screenshot_thumbnail_width, screenshot_thumbnail_height, + screenshot_texture, + 0, screenshot_y, + video_info->width, video_info->height, 0, 1, menu_widgets_pure_white ); - + menu_display_draw_text(font_regular, msg_hash_to_str(MSG_SCREENSHOT_SAVED), screenshot_thumbnail_width + simple_widget_padding, settings->floats.video_font_size * 1.9f + screenshot_y, @@ -1347,6 +1368,89 @@ void menu_widgets_frame(video_frame_info_t *video_info) ); } + /* Achievement notification */ + if (cheevo_title) + { + unsigned unfold_offet = ((1.0f-cheevo_unfold) * cheevo_width/2); + + menu_display_set_alpha(menu_widgets_backdrop_orig, DEFAULT_BACKDROP); + menu_display_set_alpha(menu_widgets_pure_white, 1.0f); + + /* Default icon */ + if (!cheevo_badge) + { + /* Backdrop */ + menu_display_draw_quad(video_info, + 0, (int)cheevo_y, + cheevo_height, cheevo_height, + video_info->width, video_info->height, + menu_widgets_backdrop_orig); + + /* Icon */ + if (menu_widgets_icons_textures[MENU_WIDGETS_ICON_ACHIEVEMENT]) + { + menu_display_blend_begin(video_info); + menu_widgets_draw_icon(video_info, + cheevo_height, cheevo_height, + menu_widgets_icons_textures[MENU_WIDGETS_ICON_ACHIEVEMENT], 0, cheevo_y, + video_info->width, video_info->height, 0, 1, menu_widgets_pure_white); + menu_display_blend_end(video_info); + } + } + /* Badge */ + else + { + menu_widgets_draw_icon(video_info, + cheevo_height, cheevo_height, + cheevo_badge, 0, cheevo_y, + video_info->width, video_info->height, 0, 1, menu_widgets_pure_white); + } + + if (cheevo_unfold != 1.0f) + { + menu_display_scissor_begin(video_info, + cheevo_height, 0, + (unsigned)((float)(cheevo_width) * cheevo_unfold), cheevo_height); + } + + /* Backdrop */ + menu_display_draw_quad(video_info, + cheevo_height, (int)cheevo_y, + cheevo_width, cheevo_height, + video_info->width, video_info->height, + menu_widgets_backdrop_orig); + + /* Title */ + menu_display_draw_text(font_regular, + msg_hash_to_str(MSG_ACHIEVEMENT_UNLOCKED), + cheevo_height + simple_widget_padding - unfold_offet, settings->floats.video_font_size * 1.9f + cheevo_y, + video_info->width, video_info->height, + text_color_faint, + TEXT_ALIGN_LEFT, + 1, false, 0, true + ); + + /* Title */ + + /* TODO: is a ticker necessary ? */ + + menu_display_draw_text(font_regular, + cheevo_title, + cheevo_height + simple_widget_padding - unfold_offet, settings->floats.video_font_size * 2.9f + cheevo_y, + video_info->width, video_info->height, + text_color_info, + TEXT_ALIGN_LEFT, + 1, false, 0, true + ); + + if (cheevo_unfold != 1.0f) + { + font_driver_flush(video_info->width, video_info->height, font_regular, video_info); + font_raster_regular.carr.coords.vertices = 0; + menu_display_scissor_end(video_info); + } + } + /* Volume */ if (volume_alpha > 0.0f) { @@ -1700,9 +1804,9 @@ void menu_widgets_context_reset(bool is_threaded) } /* Metrics */ - simple_widget_padding = settings->floats.video_font_size * 2/3; - simple_widget_height = settings->floats.video_font_size + simple_widget_padding; - glyph_width = font_driver_get_message_width(font_regular, "a", 1, 1); + simple_widget_padding = settings->floats.video_font_size * 2/3; + simple_widget_height = settings->floats.video_font_size + simple_widget_padding; + glyph_width = font_driver_get_message_width(font_regular, "a", 1, 1); msg_queue_height = settings->floats.video_font_size * 2.5f; @@ -1772,10 +1876,28 @@ void menu_widgets_context_destroy(void) font_bold = NULL; } +static void menu_widgets_achievement_free(void *userdata) +{ + if (cheevo_title) + { + free(cheevo_title); + cheevo_title = NULL; + } + + if (cheevo_badge) + { + video_driver_texture_unload(&cheevo_badge); + cheevo_badge = 0; + } +} + void menu_widgets_free(void) { int i; + if (!menu_widgets_inited) + return; + menu_widgets_inited = false; /* Kill any pending animation */ @@ -1799,7 +1921,7 @@ void menu_widgets_free(void) } /* Purge everything from the list */ - if (current_msgs) + if (current_msgs) { for (i = 0; i < current_msgs->size; i++) { @@ -1810,6 +1932,10 @@ void menu_widgets_free(void) file_list_free(current_msgs); } + /* Achievement notification */ + menu_widgets_achievement_free(NULL); + + /* Screenshot texture */ video_driver_texture_unload(&screenshot_texture); /* Font */ @@ -1856,15 +1982,6 @@ bool menu_widgets_volume_update_and_show(void) volume_text_alpha = 1.0f; volume_mute = mute; - /* TODO/FIXME - natinusula - - * -menu/widgets/menu_widgets.c: In function 'menu_widgets_volume_update_and_show': -menu/widgets/menu_widgets.c:1859:19: warning: assignment to 'tween_cb' {aka 'void (*)(void *)'} from incompatible pointer type 'void (*)(void)' [-Wincompatible-pointer-types] - entry.cb = menu_widgets_volume_timer_end; - ^ - * - * - */ entry.cb = menu_widgets_volume_timer_end; entry.duration = VOLUME_DURATION; entry.userdata = NULL; @@ -1923,13 +2040,7 @@ static void menu_widgets_screenshot_fadeout(void *userdata) menu_animation_push(&entry); } -void menu_widgets_screenshot_taken(const char *shotname, const char *filename) -{ - strlcpy(screenshot_filename, filename, sizeof(screenshot_filename)); - strlcpy(screenshot_shotname, shotname, sizeof(screenshot_shotname)); -} - -void menu_widgets_take_screenshot(void) +static void menu_widgets_play_screenshot_flash(void) { menu_animation_ctx_entry_t entry; @@ -1947,6 +2058,13 @@ void menu_widgets_take_screenshot(void) menu_animation_push(&entry); } +void menu_widgets_screenshot_taken(const char *shotname, const char *filename) +{ + menu_widgets_play_screenshot_flash(); + strlcpy(screenshot_filename, filename, sizeof(screenshot_filename)); + strlcpy(screenshot_shotname, shotname, sizeof(screenshot_shotname)); +} + bool menu_widgets_task_msg_queue_push(retro_task_t *task, const char *msg, unsigned prio, unsigned duration, @@ -2075,7 +2193,127 @@ void menu_widgets_start_load_content_animation(const char *content_name, bool re load_content_animation_running = true; } +static void menu_widgets_achievement_dismiss(void *userdata) +{ + menu_animation_ctx_entry_t entry; + + /* Slide up animation */ + entry.cb = menu_widgets_achievement_free; + entry.duration = MSG_QUEUE_ANIMATION_DURATION; + entry.easing_enum = EASING_OUT_QUAD; + entry.subject = &cheevo_y; + entry.tag = generic_tag; + entry.target_value = (float)(-(int)(cheevo_height)); + entry.userdata = NULL; + + menu_animation_push(&entry); +} + +static void menu_widgets_achievement_fold(void *userdata) +{ + menu_animation_ctx_entry_t entry; + + /* Fold */ + entry.cb = menu_widgets_achievement_dismiss; + entry.duration = MSG_QUEUE_ANIMATION_DURATION; + entry.easing_enum = EASING_OUT_QUAD; + entry.subject = &cheevo_unfold; + entry.tag = generic_tag; + entry.target_value = 0.0f; + entry.userdata = NULL; + + menu_animation_push(&entry); +} + +static void menu_widgets_achievement_unfold(void *userdata) +{ + menu_animation_ctx_entry_t entry; + menu_timer_ctx_entry_t timer; + + /* Unfold */ + entry.cb = NULL; + entry.duration = MSG_QUEUE_ANIMATION_DURATION; + entry.easing_enum = EASING_OUT_QUAD; + entry.subject = &cheevo_unfold; + entry.tag = generic_tag; + entry.target_value = 1.0f; + entry.userdata = NULL; + + menu_animation_push(&entry); + + /* Wait before dismissing */ + timer.cb = menu_widgets_achievement_fold; + timer.duration = MSG_QUEUE_ANIMATION_DURATION + CHEEVO_NOTIFICATION_DURATION; + timer.userdata = NULL; + + menu_timer_start(&cheevo_timer, &timer); +} + +static void menu_widgets_start_achievement_notification() +{ + settings_t *settings = config_get_ptr(); + menu_animation_ctx_entry_t entry; + cheevo_height = settings->floats.video_font_size * 4; + cheevo_width = max( + font_driver_get_message_width(font_regular, msg_hash_to_str(MSG_ACHIEVEMENT_UNLOCKED), 0, 1), + font_driver_get_message_width(font_regular, cheevo_title, 0, 1) + ); + cheevo_width += simple_widget_padding * 2; + cheevo_y = (float)(-(int)cheevo_height); + cheevo_unfold = 0.0f; + + /* Slide down animation */ + entry.cb = menu_widgets_achievement_unfold; + entry.duration = MSG_QUEUE_ANIMATION_DURATION; + entry.easing_enum = EASING_OUT_QUAD; + entry.subject = &cheevo_y; + entry.tag = generic_tag; + entry.target_value = 0.0f; + entry.userdata = NULL; + + menu_animation_push(&entry); +} + +static void menu_widgets_get_badge_texture(menu_texture_item *tex, const char *badge) +{ + char badge_file[16]; + char fullpath[PATH_MAX_LENGTH]; + settings_t *settings = config_get_ptr(); + + if (!badge || !settings || !settings->bools.cheevos_badges_enable) + { + *tex = 0; + return; + } + + snprintf(badge_file, sizeof(badge_file), "%s.png", badge); + + fill_pathname_application_special(fullpath, + PATH_MAX_LENGTH * sizeof(char), + APPLICATION_SPECIAL_DIRECTORY_THUMBNAILS_CHEEVOS_BADGES); + + menu_display_reset_textures_list(badge_file, fullpath, + tex, TEXTURE_FILTER_MIPMAP_LINEAR, NULL, NULL); +} + +bool menu_widgets_push_achievement(const char *title, const char *badge) +{ + if (!menu_widgets_inited) + return false; + + menu_widgets_achievement_free(NULL); + + /* TODO: Make a queue of notifications to display */ + + cheevo_title = strdup(title); + menu_widgets_get_badge_texture(&cheevo_badge, badge); + + menu_widgets_start_achievement_notification(); + + return true; +} + bool menu_widgets_ready(void) { return menu_widgets_inited; -} \ No newline at end of file +} diff --git a/menu/widgets/menu_widgets.h b/menu/widgets/menu_widgets.h index bf370fc9c6..aef16bd19e 100644 --- a/menu/widgets/menu_widgets.h +++ b/menu/widgets/menu_widgets.h @@ -31,6 +31,7 @@ #define SCREENSHOT_DURATION_IN 66 #define SCREENSHOT_DURATION_OUT SCREENSHOT_DURATION_IN*10 #define SCREENSHOT_NOTIFICATION_DURATION 4000 +#define CHEEVO_NOTIFICATION_DURATION 4000 #define TASK_FINISHED_DURATION 3000 #define HOURGLASS_INTERVAL 5000 #define HOURGLASS_DURATION 1000 @@ -60,8 +61,6 @@ bool menu_widgets_task_msg_queue_push(retro_task_t *task, unsigned prio, unsigned duration, bool flush); -void menu_widgets_take_screenshot(void); - void menu_widgets_screenshot_taken(const char *shotname, const char *filename); void menu_widgets_start_load_content_animation(const char *content_name, bool remove_extension); @@ -71,8 +70,10 @@ void menu_widgets_context_reset(bool is_threaded); void menu_widgets_context_destroy(void); +bool menu_widgets_push_achievement(const char *title, const char *badge); + /* All the functions below should be called in - * the video driver - once they are all added, set + * the video driver - once they are all added, set * enable_menu_widgets to true for that driver */ void menu_widgets_frame(video_frame_info_t *video_info); diff --git a/msg_hash.c b/msg_hash.c index 7890befeda..d45725cfa5 100644 --- a/msg_hash.c +++ b/msg_hash.c @@ -85,6 +85,9 @@ int menu_hash_get_help_enum(enum msg_hash_enums msg, char *s, size_t len) case RETRO_LANGUAGE_GREEK: ret = menu_hash_get_help_el_enum(msg, s, len); break; + case RETRO_LANGUAGE_TURKISH: + ret = menu_hash_get_help_tr_enum(msg, s, len); + break; default: break; } @@ -157,6 +160,9 @@ const char *msg_hash_to_str(enum msg_hash_enums msg) case RETRO_LANGUAGE_GREEK: ret = msg_hash_to_str_el(msg); break; + case RETRO_LANGUAGE_TURKISH: + ret = msg_hash_to_str_tr(msg); + break; default: break; } diff --git a/msg_hash.h b/msg_hash.h index 25e7b53a64..df4111a5c1 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -347,6 +347,7 @@ enum msg_hash_enums MSG_MOVIE_PLAYBACK_ENDED, MSG_TAKING_SCREENSHOT, MSG_SCREENSHOT_SAVED, + MSG_ACHIEVEMENT_UNLOCKED, MSG_CHANGE_THUMBNAIL_TYPE, MSG_NO_THUMBNAIL_AVAILABLE, MSG_PRESS_AGAIN_TO_QUIT, @@ -750,7 +751,9 @@ enum msg_hash_enums MENU_LABEL(INPUT_AUTODETECT_ENABLE), MENU_LABEL(INPUT_DESCRIPTOR_LABEL_SHOW), MENU_LABEL(INPUT_DESCRIPTOR_HIDE_UNBOUND), - MENU_LABEL(INPUT_AXIS_THRESHOLD), + MENU_LABEL(INPUT_BUTTON_AXIS_THRESHOLD), + MENU_LABEL(INPUT_ANALOG_DEADZONE), + MENU_LABEL(INPUT_ANALOG_SENSITIVITY), MENU_LABEL(INPUT_BIND_TIMEOUT), MENU_LABEL(INPUT_BIND_HOLD), MENU_LABEL(INPUT_REMAP_BINDS_ENABLE), @@ -865,9 +868,12 @@ enum msg_hash_enums MENU_LABEL(MENU_RGUI_BORDER_FILLER_ENABLE), MENU_LABEL(MENU_RGUI_BACKGROUND_FILLER_THICKNESS_ENABLE), MENU_LABEL(MENU_RGUI_BORDER_FILLER_THICKNESS_ENABLE), - MENU_LABEL(MENU_RGUI_LOCK_ASPECT), MENU_LABEL(MENU_RGUI_INTERNAL_UPSCALE_LEVEL), + MENU_LABEL(MENU_RGUI_ASPECT_RATIO), + MENU_LABEL(MENU_RGUI_ASPECT_RATIO_LOCK), MENU_LABEL(MENU_RGUI_FULL_WIDTH_LAYOUT), + MENU_LABEL(MENU_RGUI_SHADOWS), + MENU_LABEL(MENU_RGUI_EXTENDED_ASCII), MENU_LABEL(MENU_LINEAR_FILTER), MENU_LABEL(MENU_HORIZONTAL_ANIMATION), MENU_LABEL(NAVIGATION_WRAPAROUND), @@ -898,10 +904,15 @@ enum msg_hash_enums MENU_LABEL(CONTENT_SHOW_PLAYLISTS), MENU_LABEL(XMB_RIBBON_ENABLE), MENU_LABEL(THUMBNAILS), + MENU_LABEL(THUMBNAILS_RGUI), MENU_LABEL(LEFT_THUMBNAILS), + MENU_LABEL(LEFT_THUMBNAILS_RGUI), MENU_LABEL(LEFT_THUMBNAILS_OZONE), MENU_LABEL(XMB_VERTICAL_THUMBNAILS), + MENU_LABEL(MENU_RGUI_INLINE_THUMBNAILS), + MENU_LABEL(MENU_RGUI_SWAP_THUMBNAILS), MENU_LABEL(MENU_RGUI_THUMBNAIL_DOWNSCALER), + MENU_LABEL(MENU_RGUI_THUMBNAIL_DELAY), MENU_LABEL(TIMEDATE_ENABLE), MENU_LABEL(TIMEDATE_STYLE), MENU_LABEL(BATTERY_LEVEL_ENABLE), @@ -944,7 +955,16 @@ enum msg_hash_enums MENU_LABEL(UI_COMPANION_TOGGLE), MENU_LABEL(DESKTOP_MENU_ENABLE), MENU_LABEL(UI_MENUBAR_ENABLE), + +#if defined(_3DS) MENU_LABEL(VIDEO_3DS_LCD_BOTTOM), + MENU_LABEL(VIDEO_3DS_DISPLAY_MODE), + + MENU_ENUM_LABEL_VALUE_CTR_VIDEO_MODE_3D, + MENU_ENUM_LABEL_VALUE_CTR_VIDEO_MODE_2D, + MENU_ENUM_LABEL_VALUE_CTR_VIDEO_MODE_2D_400x240, + MENU_ENUM_LABEL_VALUE_CTR_VIDEO_MODE_2D_800x240, +#endif MENU_ENUM_LABEL_FILE_CONFIG, MENU_ENUM_LABEL_FILE_BROWSER_COMPRESSED_ARCHIVE, @@ -1392,6 +1412,8 @@ enum msg_hash_enums MENU_ENUM_LABEL_VOLUME_DOWN, MENU_LABEL(LOG_VERBOSITY), + MENU_LABEL(LOG_TO_FILE), + MENU_LABEL(LOG_TO_FILE_TIMESTAMP), MENU_ENUM_LABEL_OVERLAY_NEXT, @@ -1702,6 +1724,7 @@ enum msg_hash_enums MENU_LABEL(VIDEO_SHADER_DIR), MENU_LABEL(VIDEO_FILTER_DIR), MENU_LABEL(AUDIO_FILTER_DIR), + MENU_LABEL(LOG_DIR), MENU_LABEL(TURBO_DEADZONE_LIST), MENU_LABEL(LIBRETRO_DIR_PATH), @@ -1748,7 +1771,6 @@ enum msg_hash_enums MENU_ENUM_LABEL_COLLECTION, MENU_LABEL(CONFIGURATIONS), - MENU_LABEL(CONTENT_COLLECTION_LIST), MENU_LABEL(BROWSE_URL_LIST), MENU_ENUM_LABEL_CUSTOM_BIND, @@ -1876,7 +1898,6 @@ enum msg_hash_enums MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_GLSL_SUPPORT, MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_SLANG_SUPPORT, MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_HLSL_SUPPORT, - MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBXML2_SUPPORT, MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_SDL_IMAGE_SUPPORT, MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FBO_SUPPORT, MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FFMPEG_SUPPORT, @@ -1936,6 +1957,7 @@ enum msg_hash_enums MENU_ENUM_LABEL_VALUE_LANG_VIETNAMESE, MENU_ENUM_LABEL_VALUE_LANG_ARABIC, MENU_ENUM_LABEL_VALUE_LANG_GREEK, + MENU_ENUM_LABEL_VALUE_LANG_TURKISH, MENU_ENUM_LABEL_VALUE_NONE, MENU_ENUM_LABEL_VALUE_NO_INFORMATION_AVAILABLE, @@ -1985,6 +2007,16 @@ enum msg_hash_enums MENU_ENUM_LABEL_VALUE_RGUI_UPSCALE_X8, MENU_ENUM_LABEL_VALUE_RGUI_UPSCALE_X9, + MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_4_3, + MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_16_9, + MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_16_9_CENTRE, + MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_16_10, + MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_16_10_CENTRE, + + MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_LOCK_NONE, + MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_LOCK_FIT_SCREEN, + MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_LOCK_INTEGER, + /* Callback strings */ MENU_ENUM_LABEL_CB_CORE_CONTENT_DIRS_LIST, MENU_ENUM_LABEL_CB_CORE_CONTENT_DOWNLOAD, @@ -2023,7 +2055,7 @@ enum msg_hash_enums MENU_ENUM_SUBLABEL_SERVICES_SETTINGS, MENU_LABEL(SELECT_FILE), - MENU_LABEL(SELECT_FROM_COLLECTION), + MENU_LABEL(SELECT_FROM_PLAYLIST), MENU_ENUM_LABEL_VALUE_FILTER, MENU_ENUM_LABEL_VALUE_SCALE, @@ -2466,6 +2498,7 @@ enum msg_hash_enums #define MENU_LABEL_RGUI_CONFIG_DIRECTORY 0x0cb3e005U #define MENU_LABEL_ASSETS_DIRECTORY 0xde1ae8ecU #define MENU_LABEL_CACHE_DIRECTORY 0x851dfb8dU +#define MENU_LABEL_LOG_DIR 0x87BB87E5U /* RDB settings */ @@ -2518,8 +2551,7 @@ enum msg_hash_enums #define MENU_LABEL_REMAP_FILE_SAVE_CORE 0x7c9d4c8fU #define MENU_LABEL_REMAP_FILE_SAVE_CONTENT_DIR 0x7b99c1ffU #define MENU_LABEL_REMAP_FILE_SAVE_GAME 0x7c9f41e0U -#define MENU_LABEL_CONTENT_COLLECTION_LIST 0x32d1df83U -#define MENU_LABEL_COLLECTION 0x5fea5991U +#define MENU_LABEL_PLAYLISTS_TAB 0x5fea5991U #define MENU_LABEL_OPEN_ARCHIVE 0x78c0ca58U #define MENU_LABEL_OPEN_ARCHIVE_DETECT_CORE 0x92442638U @@ -2611,6 +2643,9 @@ int menu_hash_get_help_ar_enum(enum msg_hash_enums msg, char *s, size_t len); const char *msg_hash_to_str_el(enum msg_hash_enums msg); int menu_hash_get_help_el_enum(enum msg_hash_enums msg, char *s, size_t len); +const char *msg_hash_to_str_tr(enum msg_hash_enums msg); +int menu_hash_get_help_tr_enum(enum msg_hash_enums msg, char *s, size_t len); + int menu_hash_get_help_enum(enum msg_hash_enums msg, char *s, size_t len); enum msg_file_type msg_hash_to_file_type(uint32_t hash); diff --git a/paths.c b/paths.c index 8758020347..22ba194d61 100644 --- a/paths.c +++ b/paths.c @@ -256,9 +256,9 @@ void path_set_special(char **argv, unsigned num_content) { unsigned i; union string_list_elem_attr attr; - struct string_list* subsystem_paths = NULL; + struct string_list *subsystem_paths = NULL; char str[PATH_MAX_LENGTH]; - global_t *global = global_get_ptr(); + global_t *global = global_get_ptr(); /* First content file is the significant one. */ path_set_basename(argv[0]); @@ -297,7 +297,9 @@ void path_set_special(char **argv, unsigned num_content) global->name.savestate); } } - free(subsystem_paths); + + if (subsystem_paths) + string_list_free(subsystem_paths); } static bool path_init_subsystem(void) diff --git a/pkg/android/phoenix/jni/Android.mk b/pkg/android/phoenix/jni/Android.mk index 0c63486e0e..542acad1a6 100644 --- a/pkg/android/phoenix/jni/Android.mk +++ b/pkg/android/phoenix/jni/Android.mk @@ -8,6 +8,7 @@ HAVE_NEON := 1 HAVE_LOGGER := 0 HAVE_VULKAN := 1 HAVE_CHEEVOS := 1 +HAVE_FILE_LOGGER := 1 INCFLAGS := DEFINES := diff --git a/pkg/android/phoenix/src/com/retroarch/browser/preferences/util/UserPreferences.java b/pkg/android/phoenix/src/com/retroarch/browser/preferences/util/UserPreferences.java index 2e1ec9ed61..d19cef2643 100644 --- a/pkg/android/phoenix/src/com/retroarch/browser/preferences/util/UserPreferences.java +++ b/pkg/android/phoenix/src/com/retroarch/browser/preferences/util/UserPreferences.java @@ -140,7 +140,6 @@ public final class UserPreferences Log.i(TAG, "dst dir is: " + dst_path); Log.i(TAG, "dst subdir is: " + dst_path_subdir); - config.setBoolean("log_verbosity", true); config.setString("bundle_assets_src_path", ctx.getApplicationInfo().sourceDir); config.setString("bundle_assets_dst_path", dst_path); config.setString("bundle_assets_dst_path_subdir", dst_path_subdir); diff --git a/pkg/android/phoenix/src/com/retroarch/browser/retroactivity/RetroActivityCommon.java b/pkg/android/phoenix/src/com/retroarch/browser/retroactivity/RetroActivityCommon.java index 9b2c34b788..109126a171 100644 --- a/pkg/android/phoenix/src/com/retroarch/browser/retroactivity/RetroActivityCommon.java +++ b/pkg/android/phoenix/src/com/retroarch/browser/retroactivity/RetroActivityCommon.java @@ -21,6 +21,7 @@ import android.os.VibrationEffect; import android.util.Log; import java.lang.Math; import java.util.concurrent.CountDownLatch; +import java.util.Locale; /** * Class which provides common methods for RetroActivity related classes. @@ -153,6 +154,20 @@ public class RetroActivityCommon extends RetroActivityLocation }); } + public String getUserLanguageString() + { + String lang = Locale.getDefault().getLanguage(); + String country = Locale.getDefault().getCountry(); + + if (lang.length() == 0) + return "en"; + + if (country.length() == 0) + return lang; + + return lang + '_' + country; + } + @TargetApi(24) public void setSustainedPerformanceMode(boolean on) { diff --git a/pkg/apple/RetroArch_Metal.xcodeproj/project.pbxproj b/pkg/apple/RetroArch_Metal.xcodeproj/project.pbxproj index 589f6f1295..660c78d3aa 100644 --- a/pkg/apple/RetroArch_Metal.xcodeproj/project.pbxproj +++ b/pkg/apple/RetroArch_Metal.xcodeproj/project.pbxproj @@ -1633,7 +1633,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "make -C ${SRCBASE} -f Makefile.apple HAVE_QT=1 MOC=${QT_INSTALL}/bin/moc generate\n"; + shellScript = "make -C ${SRCBASE} -f Makefile.apple HAVE_MENU=1 HAVE_QT=1 MOC=${QT_INSTALL}/bin/moc generate\n"; }; /* End PBXShellScriptBuildPhase section */ @@ -1703,6 +1703,17 @@ "@executable_path/../Frameworks", ); MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + OTHER_CFLAGS = ( + "$(inherited)", + "$(QT_CFLAGS)", + "-UHAVE_GLSL", + "-UHAVE_OPENGL", + ); + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-UHAVE_GLSL", + "-UHAVE_OPENGL", + ); PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = YES; PRODUCT_BUNDLE_IDENTIFIER = libretro.RetroArch; PRODUCT_NAME = RetroArch; @@ -1723,6 +1734,17 @@ "$(inherited)", "@executable_path/../Frameworks", ); + OTHER_CFLAGS = ( + "$(inherited)", + "$(QT_CFLAGS)", + "-UHAVE_GLSL", + "-UHAVE_OPENGL", + ); + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-UHAVE_GLSL", + "-UHAVE_OPENGL", + ); PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = YES; PRODUCT_BUNDLE_IDENTIFIER = libretro.RetroArch; PRODUCT_NAME = RetroArch; @@ -1742,6 +1764,18 @@ GCC_OPTIMIZATION_LEVEL = 0; INSTALL_PATH = "$(HOME)/Applications"; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + OTHER_CFLAGS = ( + "$(inherited)", + "-DHAVE_MAIN", + "-DHAVE_COCOA_METAL", + "-UHAVE_GLSL", + "-UHAVE_OPENGL", + ); + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-UHAVE_OPENGL", + "-UHAVE_GLSL", + ); PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = YES; PRODUCT_BUNDLE_IDENTIFIER = "libretro.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = RetroArch; @@ -1758,6 +1792,18 @@ GCC_MODEL_TUNING = G5; GCC_PRECOMPILE_PREFIX_HEADER = YES; INSTALL_PATH = "$(HOME)/Applications"; + OTHER_CFLAGS = ( + "$(inherited)", + "-DHAVE_MAIN", + "-DHAVE_COCOA_METAL", + "-UHAVE_GLSL", + "-UHAVE_OPENGL", + ); + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-UHAVE_OPENGL", + "-UHAVE_GLSL", + ); PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = YES; PRODUCT_BUNDLE_IDENTIFIER = "libretro.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = RetroArch; diff --git a/pkg/debian/control b/pkg/debian/control index 184f262979..775036e6eb 100644 --- a/pkg/debian/control +++ b/pkg/debian/control @@ -8,7 +8,6 @@ Build-Depends: debhelper (>= 9), libc6-dev (>= 2.13), libpulse-dev, libsdl2-dev, - libxml2-dev, libavcodec-dev, libavdevice-dev, libavformat-dev, diff --git a/pkg/emscripten/libretro/libretro.js b/pkg/emscripten/libretro/libretro.js index 2dca489768..1654d74e7d 100644 --- a/pkg/emscripten/libretro/libretro.js +++ b/pkg/emscripten/libretro/libretro.js @@ -149,7 +149,7 @@ function selectFiles(files) $('#icnAdd').addClass('fa-spinner spinning'); var count = files.length; - for (var i = 0; i < files.length; i++) + for (var i = 0; i < count; i++) { filereader = new FileReader(); filereader.file_name = files[i].name; diff --git a/pkg/msvc/msvc-2010/RetroArch-msvc2010.vcxproj b/pkg/msvc/msvc-2010/RetroArch-msvc2010.vcxproj index 70775fbb7a..75e61da9a3 100644 --- a/pkg/msvc/msvc-2010/RetroArch-msvc2010.vcxproj +++ b/pkg/msvc/msvc-2010/RetroArch-msvc2010.vcxproj @@ -228,7 +228,6 @@ MultiThreadedDebug CompileAsCpp Fast - StreamingSIMDExtensions2 OldStyle @@ -248,7 +247,6 @@ MultiThreadedDebug CompileAsCpp Fast - StreamingSIMDExtensions2 OldStyle @@ -324,7 +322,6 @@ MultiThreaded CompileAsCpp Fast - StreamingSIMDExtensions2 true OldStyle @@ -350,7 +347,6 @@ MultiThreaded CompileAsCpp Fast - StreamingSIMDExtensions2 true OldStyle diff --git a/pkg/msvc/msvc-2015/RetroArch-msvc2015.vcxproj b/pkg/msvc/msvc-2015/RetroArch-msvc2015.vcxproj index 7be9b56ada..21522d9fc8 100644 --- a/pkg/msvc/msvc-2015/RetroArch-msvc2015.vcxproj +++ b/pkg/msvc/msvc-2015/RetroArch-msvc2015.vcxproj @@ -237,7 +237,6 @@ CompileAsCpp /bigobj Fast - StreamingSIMDExtensions2 OldStyle @@ -257,7 +256,6 @@ MultiThreadedDebug CompileAsCpp Fast - StreamingSIMDExtensions2 OldStyle @@ -331,7 +329,6 @@ MultiThreaded CompileAsCpp Fast - StreamingSIMDExtensions2 true OldStyle @@ -356,7 +353,6 @@ MultiThreaded CompileAsCpp Fast - StreamingSIMDExtensions2 true OldStyle diff --git a/pkg/msvc/msvc-2017/RetroArch-msvc2017.vcxproj b/pkg/msvc/msvc-2017/RetroArch-msvc2017.vcxproj index 16c6f3169e..98e0989b29 100644 --- a/pkg/msvc/msvc-2017/RetroArch-msvc2017.vcxproj +++ b/pkg/msvc/msvc-2017/RetroArch-msvc2017.vcxproj @@ -722,7 +722,6 @@ MultiThreadedDebug CompileAsCpp Fast - StreamingSIMDExtensions2 OldStyle @@ -742,7 +741,6 @@ MultiThreadedDebug CompileAsCpp Fast - StreamingSIMDExtensions2 OldStyle @@ -763,7 +761,6 @@ MultiThreadedDebug CompileAsCpp Fast - StreamingSIMDExtensions2 OldStyle @@ -784,7 +781,6 @@ MultiThreadedDebug CompileAsCpp Fast - StreamingSIMDExtensions2 OldStyle @@ -1014,7 +1010,6 @@ MultiThreaded CompileAsCpp Fast - StreamingSIMDExtensions2 true OldStyle @@ -1040,7 +1035,6 @@ MultiThreaded CompileAsCpp Fast - StreamingSIMDExtensions2 true OldStyle @@ -1066,7 +1060,6 @@ MultiThreaded CompileAsCpp Fast - StreamingSIMDExtensions2 true OldStyle @@ -1092,7 +1085,6 @@ MultiThreaded CompileAsCpp Fast - StreamingSIMDExtensions2 true OldStyle @@ -1814,7 +1806,107 @@ true true true - + + + false + false + moc.exe "%(FullPath)" > "%(RootDir)%(Directory)moc_%(Filename).cpp" + moc.exe "%(FullPath)" > "%(RootDir)%(Directory)moc_%(Filename).cpp" + false + false + QT: Generate %(RootDir)%(Directory)moc_%(Filename).cpp + QT: Generate %(RootDir)%(Directory)moc_%(Filename).cpp + %(RootDir)%(Directory)moc_%(Filename).cpp + %(RootDir)%(Directory)moc_%(Filename).cpp + false + false + false + false + false + false + moc.exe "%(FullPath)" > "%(RootDir)%(Directory)moc_%(Filename).cpp" + moc.exe "%(FullPath)" > "%(RootDir)%(Directory)moc_%(Filename).cpp" + QT: Generate %(RootDir)%(Directory)moc_%(Filename).cpp + QT: Generate %(RootDir)%(Directory)moc_%(Filename).cpp + %(RootDir)%(Directory)moc_%(Filename).cpp + %(RootDir)%(Directory)moc_%(Filename).cpp + false + false + moc.exe "%(FullPath)" > "%(RootDir)%(Directory)moc_%(Filename).cpp" + moc.exe "%(FullPath)" > "%(RootDir)%(Directory)moc_%(Filename).cpp" + QT: Generate %(RootDir)%(Directory)moc_%(Filename).cpp + QT: Generate %(RootDir)%(Directory)moc_%(Filename).cpp + %(RootDir)%(Directory)moc_%(Filename).cpp + %(RootDir)%(Directory)moc_%(Filename).cpp + false + false + moc.exe "%(FullPath)" > "%(RootDir)%(Directory)moc_%(Filename).cpp" + moc.exe "%(FullPath)" > "%(RootDir)%(Directory)moc_%(Filename).cpp" + QT: Generate %(RootDir)%(Directory)moc_%(Filename).cpp + QT: Generate %(RootDir)%(Directory)moc_%(Filename).cpp + %(RootDir)%(Directory)moc_%(Filename).cpp + %(RootDir)%(Directory)moc_%(Filename).cpp + false + false + true + true + true + true + true + true + true + true + + + false + false + moc.exe "%(FullPath)" > "%(RootDir)%(Directory)moc_%(Filename).cpp" + moc.exe "%(FullPath)" > "%(RootDir)%(Directory)moc_%(Filename).cpp" + false + false + QT: Generate %(RootDir)%(Directory)moc_%(Filename).cpp + QT: Generate %(RootDir)%(Directory)moc_%(Filename).cpp + %(RootDir)%(Directory)moc_%(Filename).cpp + %(RootDir)%(Directory)moc_%(Filename).cpp + false + false + false + false + false + false + moc.exe "%(FullPath)" > "%(RootDir)%(Directory)moc_%(Filename).cpp" + moc.exe "%(FullPath)" > "%(RootDir)%(Directory)moc_%(Filename).cpp" + QT: Generate %(RootDir)%(Directory)moc_%(Filename).cpp + QT: Generate %(RootDir)%(Directory)moc_%(Filename).cpp + %(RootDir)%(Directory)moc_%(Filename).cpp + %(RootDir)%(Directory)moc_%(Filename).cpp + false + false + moc.exe "%(FullPath)" > "%(RootDir)%(Directory)moc_%(Filename).cpp" + moc.exe "%(FullPath)" > "%(RootDir)%(Directory)moc_%(Filename).cpp" + QT: Generate %(RootDir)%(Directory)moc_%(Filename).cpp + QT: Generate %(RootDir)%(Directory)moc_%(Filename).cpp + %(RootDir)%(Directory)moc_%(Filename).cpp + %(RootDir)%(Directory)moc_%(Filename).cpp + false + false + moc.exe "%(FullPath)" > "%(RootDir)%(Directory)moc_%(Filename).cpp" + moc.exe "%(FullPath)" > "%(RootDir)%(Directory)moc_%(Filename).cpp" + QT: Generate %(RootDir)%(Directory)moc_%(Filename).cpp + QT: Generate %(RootDir)%(Directory)moc_%(Filename).cpp + %(RootDir)%(Directory)moc_%(Filename).cpp + %(RootDir)%(Directory)moc_%(Filename).cpp + false + false + true + true + true + true + true + true + true + true + diff --git a/pkg/sailfishos/retroarch-sailfishos.spec b/pkg/sailfishos/retroarch-sailfishos.spec index 29de5dfc93..5ca85a1571 100644 --- a/pkg/sailfishos/retroarch-sailfishos.spec +++ b/pkg/sailfishos/retroarch-sailfishos.spec @@ -7,7 +7,6 @@ Group: Applications/Emulators License: GPLv3+ URL: http://www.libretro.com/ -BuildRequires: libxml2-devel BuildRequires: mesa-llvmpipe-libwayland-egl-devel BuildRequires: pulseaudio-devel BuildRequires: OpenAL-devel diff --git a/playlist.c b/playlist.c index 9410fcfb36..663cb632a4 100644 --- a/playlist.c +++ b/playlist.c @@ -1,7 +1,7 @@ /* RetroArch - A frontend for libretro. * Copyright (C) 2010-2014 - Hans-Kristian Arntzen * Copyright (C) 2011-2017 - Daniel De Matteis - * Copyright (C) 2018-2019 - Brad Parker + * Copyright (C) 2016-2019 - 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- @@ -27,6 +27,7 @@ #include #include #include +#include #include #include "playlist.h" @@ -38,28 +39,6 @@ #define PLAYLIST_ENTRIES 6 #endif -struct playlist_entry -{ - char *path; - char *label; - char *core_path; - char *core_name; - char *db_name; - char *crc32; - unsigned runtime_hours; - unsigned runtime_minutes; - unsigned runtime_seconds; - /* Note: due to platform dependence, have to record - * timestamp as either a string or independent integer - * values. The latter is more verbose, but more efficient. */ - unsigned last_played_year; - unsigned last_played_month; - unsigned last_played_day; - unsigned last_played_hour; - unsigned last_played_minute; - unsigned last_played_second; -}; - struct content_playlist { bool modified; @@ -82,8 +61,11 @@ typedef struct char **current_entry_val; int *current_entry_int_val; unsigned *current_entry_uint_val; + struct string_list **current_entry_string_list_val; char *current_meta_string; + char *current_items_string; bool in_items; + bool in_subsystem_roms; } JSONContext; static playlist_t *playlist_cached = NULL; @@ -118,26 +100,12 @@ char *playlist_get_conf_path(playlist_t *playlist) **/ void playlist_get_index(playlist_t *playlist, size_t idx, - const char **path, const char **label, - const char **core_path, const char **core_name, - const char **crc32, - const char **db_name) + const struct playlist_entry **entry) { - if (!playlist) + if (!playlist || !entry) return; - if (path) - *path = playlist->entries[idx].path; - if (label) - *label = playlist->entries[idx].label; - if (core_path) - *core_path = playlist->entries[idx].core_path; - if (core_name) - *core_name = playlist->entries[idx].core_name; - if (db_name) - *db_name = playlist->entries[idx].db_name; - if (crc32) - *crc32 = playlist->entries[idx].crc32; + *entry = &playlist->entries[idx]; } void playlist_get_runtime_index(playlist_t *playlist, @@ -197,13 +165,11 @@ void playlist_delete_index(playlist_t *playlist, void playlist_get_index_by_path(playlist_t *playlist, const char *search_path, - char **path, char **label, - char **core_path, char **core_name, - char **crc32, - char **db_name) + const struct playlist_entry **entry) { size_t i; - if (!playlist) + + if (!playlist || !entry) return; for (i = 0; i < playlist->size; i++) @@ -211,18 +177,8 @@ void playlist_get_index_by_path(playlist_t *playlist, if (!string_is_equal(playlist->entries[i].path, search_path)) continue; - if (path) - *path = playlist->entries[i].path; - if (label) - *label = playlist->entries[i].label; - if (core_path) - *core_path = playlist->entries[i].core_path; - if (core_name) - *core_name = playlist->entries[i].core_name; - if (db_name) - *db_name = playlist->entries[i].db_name; - if (crc32) - *crc32 = playlist->entries[i].crc32; + *entry = &playlist->entries[i]; + break; } } @@ -265,6 +221,12 @@ static void playlist_free_entry(struct playlist_entry *entry) free(entry->db_name); if (entry->crc32 != NULL) free(entry->crc32); + if (entry->subsystem_ident != NULL) + free(entry->subsystem_ident); + if (entry->subsystem_name != NULL) + free(entry->subsystem_name); + if (entry->subsystem_roms != NULL) + string_list_free(entry->subsystem_roms); entry->path = NULL; entry->label = NULL; @@ -272,6 +234,9 @@ static void playlist_free_entry(struct playlist_entry *entry) entry->core_name = NULL; entry->db_name = NULL; entry->crc32 = NULL; + entry->subsystem_ident = NULL; + entry->subsystem_name = NULL; + entry->subsystem_roms = NULL; entry->runtime_hours = 0; entry->runtime_minutes = 0; entry->runtime_seconds = 0; @@ -284,10 +249,7 @@ static void playlist_free_entry(struct playlist_entry *entry) } void playlist_update(playlist_t *playlist, size_t idx, - const char *path, const char *label, - const char *core_path, const char *core_name, - const char *crc32, - const char *db_name) + const struct playlist_entry *update_entry) { struct playlist_entry *entry = NULL; @@ -296,52 +258,52 @@ void playlist_update(playlist_t *playlist, size_t idx, entry = &playlist->entries[idx]; - if (path && (path != entry->path)) + if (update_entry->path && (update_entry->path != entry->path)) { if (entry->path != NULL) free(entry->path); - entry->path = strdup(path); + entry->path = strdup(update_entry->path); playlist->modified = true; } - if (label && (label != entry->label)) + if (update_entry->label && (update_entry->label != entry->label)) { if (entry->label != NULL) free(entry->label); - entry->label = strdup(label); + entry->label = strdup(update_entry->label); playlist->modified = true; } - if (core_path && (core_path != entry->core_path)) + if (update_entry->core_path && (update_entry->core_path != entry->core_path)) { if (entry->core_path != NULL) free(entry->core_path); entry->core_path = NULL; - entry->core_path = strdup(core_path); + entry->core_path = strdup(update_entry->core_path); playlist->modified = true; } - if (core_name && (core_name != entry->core_name)) + if (update_entry->core_name && (update_entry->core_name != entry->core_name)) { if (entry->core_name != NULL) free(entry->core_name); - entry->core_name = strdup(core_name); + entry->core_name = strdup(update_entry->core_name); playlist->modified = true; } - if (db_name && (db_name != entry->db_name)) + if (update_entry->db_name && (update_entry->db_name != entry->db_name)) { if (entry->db_name != NULL) free(entry->db_name); - entry->db_name = strdup(db_name); + entry->db_name = strdup(update_entry->db_name); playlist->modified = true; } - if (crc32 && (crc32 != entry->crc32)) + if (update_entry->crc32 && (update_entry->crc32 != entry->crc32)) { if (entry->crc32 != NULL) free(entry->crc32); - entry->crc32 = strdup(crc32); + entry->crc32 = strdup(update_entry->crc32); playlist->modified = true; } } @@ -458,8 +420,9 @@ bool playlist_push_runtime(playlist_t *playlist, struct playlist_entry tmp; bool equal_path; - equal_path = (!path && !playlist->entries[i].path) || - (path && playlist->entries[i].path && + equal_path = + (!path && !playlist->entries[i].path) || + (path && playlist->entries[i].path && #ifdef _WIN32 /*prevent duplicates on case-insensitive operating systems*/ string_is_equal_noncase(path,playlist->entries[i].path) @@ -534,28 +497,24 @@ success: /** * playlist_push: * @playlist : Playlist handle. - * @path : Path of new playlist entry. - * @core_path : Core path of new playlist entry. - * @core_name : Core name of new playlist entry. * * Push entry to top of playlist. **/ bool playlist_push(playlist_t *playlist, - const char *path, const char *label, - const char *core_path, const char *core_name, - const char *crc32, - const char *db_name) + const struct playlist_entry *entry) { size_t i; - bool core_path_empty = string_is_empty(core_path); - bool core_name_empty = string_is_empty(core_name); + bool core_path_empty = string_is_empty(entry->core_path); + bool core_name_empty = string_is_empty(entry->core_name); + const char *core_name = entry->core_name; + const char *path = entry->path; if (core_path_empty || core_name_empty) { if (core_name_empty && !core_path_empty) { static char base_path[255] = {0}; - fill_pathname_base_noext(base_path, core_path, sizeof(base_path)); + fill_pathname_base_noext(base_path, entry->core_path, sizeof(base_path)); core_name = base_path; } @@ -581,9 +540,9 @@ bool playlist_push(playlist_t *playlist, (path && playlist->entries[i].path && #ifdef _WIN32 /*prevent duplicates on case-insensitive operating systems*/ - string_is_equal_noncase(path,playlist->entries[i].path) + string_is_equal_noncase(path, playlist->entries[i].path) #else - string_is_equal(path,playlist->entries[i].path) + string_is_equal(path, playlist->entries[i].path) #endif ); @@ -592,9 +551,57 @@ bool playlist_push(playlist_t *playlist, if (!equal_path) continue; - if (!string_is_equal(playlist->entries[i].core_path, core_path)) + if (!string_is_equal(playlist->entries[i].core_path, entry->core_path)) continue; + if ( !string_is_empty(entry->subsystem_ident) + && !string_is_empty(playlist->entries[i].subsystem_ident) + && !string_is_equal(playlist->entries[i].subsystem_ident, entry->subsystem_ident)) + continue; + + if ( string_is_empty(entry->subsystem_ident) + && !string_is_empty(playlist->entries[i].subsystem_ident)) + continue; + + if ( !string_is_empty(entry->subsystem_ident) + && string_is_empty(playlist->entries[i].subsystem_ident)) + continue; + + if ( !string_is_empty(entry->subsystem_name) + && !string_is_empty(playlist->entries[i].subsystem_name) + && !string_is_equal(playlist->entries[i].subsystem_name, entry->subsystem_name)) + continue; + + if ( string_is_empty(entry->subsystem_name) + && !string_is_empty(playlist->entries[i].subsystem_name)) + continue; + + if ( !string_is_empty(entry->subsystem_name) + && string_is_empty(playlist->entries[i].subsystem_name)) + continue; + + if (entry->subsystem_roms) + { + int j; + const struct string_list *roms = playlist->entries[i].subsystem_roms; + bool unequal = false; + + if (entry->subsystem_roms->size != roms->size) + continue; + + for (j = 0; j < entry->subsystem_roms->size; j++) + { + if (!string_is_equal(entry->subsystem_roms->elems[j].data, roms->elems[j].data)) + { + unequal = true; + break; + } + } + + if (unequal) + continue; + } + /* If top entry, we don't want to push a new entry since * the top and the entry to be pushed are the same. */ if (i == 0) @@ -629,6 +636,9 @@ bool playlist_push(playlist_t *playlist, playlist->entries[0].core_name = NULL; playlist->entries[0].db_name = NULL; playlist->entries[0].crc32 = NULL; + playlist->entries[0].subsystem_ident = NULL; + playlist->entries[0].subsystem_name = NULL; + playlist->entries[0].subsystem_roms = NULL; playlist->entries[0].runtime_hours = 0; playlist->entries[0].runtime_minutes = 0; playlist->entries[0].runtime_seconds = 0; @@ -638,18 +648,32 @@ bool playlist_push(playlist_t *playlist, playlist->entries[0].last_played_hour = 0; playlist->entries[0].last_played_minute = 0; playlist->entries[0].last_played_second = 0; - if (!string_is_empty(path)) - playlist->entries[0].path = strdup(path); - if (!string_is_empty(label)) - playlist->entries[0].label = strdup(label); - if (!string_is_empty(core_path)) - playlist->entries[0].core_path = strdup(core_path); + if (!string_is_empty(entry->path)) + playlist->entries[0].path = strdup(entry->path); + if (!string_is_empty(entry->label)) + playlist->entries[0].label = strdup(entry->label); + if (!string_is_empty(entry->core_path)) + playlist->entries[0].core_path = strdup(entry->core_path); if (!string_is_empty(core_name)) - playlist->entries[0].core_name = strdup(core_name); - if (!string_is_empty(db_name)) - playlist->entries[0].db_name = strdup(db_name); - if (!string_is_empty(crc32)) - playlist->entries[0].crc32 = strdup(crc32); + playlist->entries[0].core_name = strdup(core_name); + if (!string_is_empty(entry->db_name)) + playlist->entries[0].db_name = strdup(entry->db_name); + if (!string_is_empty(entry->crc32)) + playlist->entries[0].crc32 = strdup(entry->crc32); + if (!string_is_empty(entry->subsystem_ident)) + playlist->entries[0].subsystem_ident = strdup(entry->subsystem_ident); + if (!string_is_empty(entry->subsystem_name)) + playlist->entries[0].subsystem_name = strdup(entry->subsystem_name); + + if (entry->subsystem_roms) + { + union string_list_elem_attr attributes = {0}; + + playlist->entries[0].subsystem_roms = string_list_new(); + + for (i = 0; i < entry->subsystem_roms->size; i++) + string_list_append(playlist->entries[0].subsystem_roms, entry->subsystem_roms->elems[i].data, attributes); + } } playlist->size++; @@ -672,8 +696,9 @@ static void JSONLogError(JSONContext *pCtx) { if (pCtx->parser && JSON_Parser_GetError(pCtx->parser) != JSON_Error_AbortedByHandler) { - JSON_Error error = JSON_Parser_GetError(pCtx->parser); + JSON_Error error = JSON_Parser_GetError(pCtx->parser); JSON_Location errorLocation = { 0, 0, 0 }; + (void)JSON_Parser_GetErrorLocation(pCtx->parser, &errorLocation); RARCH_WARN("Error: Invalid JSON at line %d, column %d (input byte %d) - %s.\n", (int)errorLocation.line + 1, @@ -891,7 +916,7 @@ end: void playlist_write_file(playlist_t *playlist) { size_t i; - RFILE *file = NULL; + RFILE *file = NULL; settings_t *settings = config_get_ptr(); if (!playlist || !playlist->modified) @@ -1001,6 +1026,60 @@ void playlist_write_file(playlist_t *playlist) JSON_Writer_WriteColon(context.writer); JSON_Writer_WriteSpace(context.writer, 1); JSON_Writer_WriteString(context.writer, playlist->entries[i].db_name ? playlist->entries[i].db_name : "", playlist->entries[i].db_name ? strlen(playlist->entries[i].db_name) : 0, JSON_UTF8); + + if (!string_is_empty(playlist->entries[i].subsystem_ident)) + { + JSON_Writer_WriteComma(context.writer); + JSON_Writer_WriteNewLine(context.writer); + JSON_Writer_WriteSpace(context.writer, 6); + JSON_Writer_WriteString(context.writer, "subsystem_ident", strlen("subsystem_ident"), JSON_UTF8); + JSON_Writer_WriteColon(context.writer); + JSON_Writer_WriteSpace(context.writer, 1); + JSON_Writer_WriteString(context.writer, playlist->entries[i].subsystem_ident ? playlist->entries[i].subsystem_ident : "", playlist->entries[i].subsystem_ident ? strlen(playlist->entries[i].subsystem_ident) : 0, JSON_UTF8); + } + + if (!string_is_empty(playlist->entries[i].subsystem_name)) + { + JSON_Writer_WriteComma(context.writer); + JSON_Writer_WriteNewLine(context.writer); + JSON_Writer_WriteSpace(context.writer, 6); + JSON_Writer_WriteString(context.writer, "subsystem_name", strlen("subsystem_name"), JSON_UTF8); + JSON_Writer_WriteColon(context.writer); + JSON_Writer_WriteSpace(context.writer, 1); + JSON_Writer_WriteString(context.writer, playlist->entries[i].subsystem_name ? playlist->entries[i].subsystem_name : "", playlist->entries[i].subsystem_name ? strlen(playlist->entries[i].subsystem_name) : 0, JSON_UTF8); + } + + if (playlist->entries[i].subsystem_roms && playlist->entries[i].subsystem_roms->size > 0) + { + int j; + + JSON_Writer_WriteComma(context.writer); + JSON_Writer_WriteNewLine(context.writer); + JSON_Writer_WriteSpace(context.writer, 6); + JSON_Writer_WriteString(context.writer, "subsystem_roms", strlen("subsystem_roms"), JSON_UTF8); + JSON_Writer_WriteColon(context.writer); + JSON_Writer_WriteSpace(context.writer, 1); + JSON_Writer_WriteStartArray(context.writer); + JSON_Writer_WriteNewLine(context.writer); + + for (j = 0; j < playlist->entries[i].subsystem_roms->size; j++) + { + const struct string_list *roms = playlist->entries[i].subsystem_roms; + JSON_Writer_WriteSpace(context.writer, 8); + JSON_Writer_WriteString(context.writer, !string_is_empty(roms->elems[j].data) ? roms->elems[j].data : "", !string_is_empty(roms->elems[j].data) ? strlen(roms->elems[j].data) : 0, JSON_UTF8); + + if (j < playlist->entries[i].subsystem_roms->size - 1) + { + JSON_Writer_WriteComma(context.writer); + JSON_Writer_WriteNewLine(context.writer); + } + } + + JSON_Writer_WriteNewLine(context.writer); + JSON_Writer_WriteSpace(context.writer, 6); + JSON_Writer_WriteEndArray(context.writer); + } + JSON_Writer_WriteNewLine(context.writer); JSON_Writer_WriteSpace(context.writer, 4); @@ -1104,9 +1183,13 @@ static JSON_Parser_HandlerResult JSONStartArrayHandler(JSON_Parser parser) if (pCtx->object_depth == 1) { if (string_is_equal(pCtx->current_meta_string, "items") && pCtx->array_depth == 1) - { pCtx->in_items = true; - } + } + else if (pCtx->object_depth == 2) + { + if (pCtx->array_depth == 2) + if (string_is_equal(pCtx->current_items_string, "subsystem_roms")) + pCtx->in_subsystem_roms = true; } return JSON_Parser_Continue; @@ -1127,6 +1210,19 @@ static JSON_Parser_HandlerResult JSONEndArrayHandler(JSON_Parser parser) free(pCtx->current_meta_string); pCtx->current_meta_string = NULL; pCtx->in_items = false; + + if (pCtx->current_items_string) + { + free(pCtx->current_items_string); + pCtx->current_items_string = NULL; + } + } + } + else if (pCtx->object_depth == 2) + { + if (pCtx->in_subsystem_roms && string_is_equal(pCtx->current_items_string, "subsystem_roms") && pCtx->array_depth == 1) + { + pCtx->in_subsystem_roms = false; } } @@ -1144,14 +1240,10 @@ static JSON_Parser_HandlerResult JSONStartObjectHandler(JSON_Parser parser) if (pCtx->array_depth == 1) { if (pCtx->playlist->size < pCtx->playlist->cap) - { pCtx->current_entry = &pCtx->playlist->entries[pCtx->playlist->size]; - } else - { /* hit max item limit */ return JSON_Parser_Abort; - } } } @@ -1165,9 +1257,7 @@ static JSON_Parser_HandlerResult JSONEndObjectHandler(JSON_Parser parser) if (pCtx->in_items && pCtx->object_depth == 2) { if (pCtx->array_depth == 1) - { pCtx->playlist->size++; - } } retro_assert(pCtx->object_depth > 0); @@ -1182,7 +1272,19 @@ static JSON_Parser_HandlerResult JSONStringHandler(JSON_Parser parser, char *pVa JSONContext *pCtx = (JSONContext*)JSON_Parser_GetUserData(parser); (void)attributes; /* unused */ - if (pCtx->in_items && pCtx->object_depth == 2) + if (pCtx->in_items && pCtx->in_subsystem_roms && pCtx->object_depth == 2 && pCtx->array_depth == 2) + { + if (pCtx->current_entry_string_list_val && length && !string_is_empty(pValue)) + { + union string_list_elem_attr attr = {0}; + + if (!*pCtx->current_entry_string_list_val) + *pCtx->current_entry_string_list_val = string_list_new(); + + string_list_append(*pCtx->current_entry_string_list_val, pValue, attr); + } + } + else if (pCtx->in_items && pCtx->object_depth == 2) { if (pCtx->array_depth == 1) { @@ -1229,13 +1331,9 @@ static JSON_Parser_HandlerResult JSONNumberHandler(JSON_Parser parser, char *pVa if (pCtx->array_depth == 1) { if (pCtx->current_entry_int_val && length && !string_is_empty(pValue)) - { - *pCtx->current_entry_int_val = strtoul(pValue, NULL, 10); - } + *pCtx->current_entry_int_val = (int)strtoul(pValue, NULL, 10); else if (pCtx->current_entry_uint_val && length && !string_is_empty(pValue)) - { - *pCtx->current_entry_uint_val = strtoul(pValue, NULL, 10); - } + *pCtx->current_entry_uint_val = (unsigned)strtoul(pValue, NULL, 10); else { /* must be a value for an unknown member we aren't tracking, skip it */ @@ -1281,6 +1379,13 @@ static JSON_Parser_HandlerResult JSONObjectMemberHandler(JSON_Parser parser, cha if (length) { + if (!string_is_empty(pValue)) + { + if (!string_is_empty(pCtx->current_items_string)) + free(pCtx->current_items_string); + pCtx->current_items_string = strdup(pValue); + } + if (string_is_equal(pValue, "path")) pCtx->current_entry_val = &pCtx->current_entry->path; else if (string_is_equal(pValue, "label")) @@ -1293,6 +1398,12 @@ static JSON_Parser_HandlerResult JSONObjectMemberHandler(JSON_Parser parser, cha pCtx->current_entry_val = &pCtx->current_entry->crc32; else if (string_is_equal(pValue, "db_name")) pCtx->current_entry_val = &pCtx->current_entry->db_name; + else if (string_is_equal(pValue, "subsystem_ident")) + pCtx->current_entry_val = &pCtx->current_entry->subsystem_ident; + else if (string_is_equal(pValue, "subsystem_name")) + pCtx->current_entry_val = &pCtx->current_entry->subsystem_name; + else if (string_is_equal(pValue, "subsystem_roms")) + pCtx->current_entry_string_list_val = &pCtx->current_entry->subsystem_roms; else if (string_is_equal(pValue, "runtime_hours")) pCtx->current_entry_uint_val = &pCtx->current_entry->runtime_hours; else if (string_is_equal(pValue, "runtime_minutes")) @@ -1398,7 +1509,9 @@ static bool playlist_read_file( goto end; } - /*JSON_Parser_SetTrackObjectMembers(context.parser, JSON_True);*/ +#if 0 + JSON_Parser_SetTrackObjectMembers(context.parser, JSON_True); +#endif JSON_Parser_SetAllowBOM(context.parser, JSON_True); JSON_Parser_SetAllowComments(context.parser, JSON_True); JSON_Parser_SetAllowSpecialNumbers(context.parser, JSON_True); @@ -1406,18 +1519,20 @@ static bool playlist_read_file( JSON_Parser_SetAllowUnescapedControlCharacters(context.parser, JSON_True); JSON_Parser_SetReplaceInvalidEncodingSequences(context.parser, JSON_True); - /*JSON_Parser_SetNullHandler(context.parser, &JSONNullHandler); - JSON_Parser_SetBooleanHandler(context.parser, &JSONBooleanHandler); +#if 0 + JSON_Parser_SetNullHandler(context.parser, &JSONNullHandler); + JSON_Parser_SetBooleanHandler(context.parser, &JSONBooleanHandler); JSON_Parser_SetSpecialNumberHandler(context.parser, &JSONSpecialNumberHandler); - JSON_Parser_SetArrayItemHandler(context.parser, &JSONArrayItemHandler);*/ + JSON_Parser_SetArrayItemHandler(context.parser, &JSONArrayItemHandler); +#endif - JSON_Parser_SetNumberHandler(context.parser, &JSONNumberHandler); - JSON_Parser_SetStringHandler(context.parser, &JSONStringHandler); - JSON_Parser_SetStartObjectHandler(context.parser, &JSONStartObjectHandler); - JSON_Parser_SetEndObjectHandler(context.parser, &JSONEndObjectHandler); - JSON_Parser_SetObjectMemberHandler(context.parser, &JSONObjectMemberHandler); - JSON_Parser_SetStartArrayHandler(context.parser, &JSONStartArrayHandler); - JSON_Parser_SetEndArrayHandler(context.parser, &JSONEndArrayHandler); + JSON_Parser_SetNumberHandler(context.parser, &JSONNumberHandler); + JSON_Parser_SetStringHandler(context.parser, &JSONStringHandler); + JSON_Parser_SetStartObjectHandler(context.parser, &JSONStartObjectHandler); + JSON_Parser_SetEndObjectHandler(context.parser, &JSONEndObjectHandler); + JSON_Parser_SetObjectMemberHandler(context.parser, &JSONObjectMemberHandler); + JSON_Parser_SetStartArrayHandler(context.parser, &JSONStartArrayHandler); + JSON_Parser_SetEndArrayHandler(context.parser, &JSONEndArrayHandler); JSON_Parser_SetUserData(context.parser, &context); while (!filestream_eof(file)) @@ -1453,6 +1568,9 @@ static bool playlist_read_file( if (context.current_meta_string) free(context.current_meta_string); + + if (context.current_items_string) + free(context.current_items_string); } else { @@ -1476,9 +1594,9 @@ static bool playlist_read_file( /* Read playlist entry and terminate string with NUL character * regardless of Windows or Unix line endings */ - if((last = strrchr(buf[i], '\r'))) + if ((last = strrchr(buf[i], '\r'))) *last = '\0'; - else if((last = strrchr(buf[i], '\n'))) + else if ((last = strrchr(buf[i], '\n'))) *last = '\0'; } @@ -1576,8 +1694,8 @@ static int playlist_qsort_func(const struct playlist_entry *a, if (!a || !b) goto end; - a_str = a->label; - b_str = b->label; + a_str = a->label; + b_str = b->label; /* It is quite possible for playlist labels * to be blank. If that is the case, have to use @@ -1589,6 +1707,7 @@ static int playlist_qsort_func(const struct playlist_entry *a, goto end; a_fallback_label = (char*)calloc(PATH_MAX_LENGTH, sizeof(char)); + if (!a_fallback_label) goto end; @@ -1606,6 +1725,7 @@ static int playlist_qsort_func(const struct playlist_entry *a, goto end; b_fallback_label = (char*)calloc(PATH_MAX_LENGTH, sizeof(char)); + if (!b_fallback_label) goto end; @@ -1648,24 +1768,14 @@ void playlist_qsort(playlist_t *playlist) void command_playlist_push_write( playlist_t *playlist, - const char *path, - const char *label, - const char *core_path, - const char *core_name, - const char *crc32, - const char *db_name) + const struct playlist_entry *entry) { if (!playlist) return; if (playlist_push( playlist, - path, - label, - core_path, - core_name, - crc32, - db_name + entry )) playlist_write_file(playlist); } @@ -1673,12 +1783,7 @@ void command_playlist_push_write( void command_playlist_update_write( playlist_t *plist, size_t idx, - const char *path, - const char *label, - const char *core_path, - const char *core_display_name, - const char *crc32, - const char *db_name) + const struct playlist_entry *entry) { playlist_t *playlist = plist ? plist : playlist_get_cached(); @@ -1688,12 +1793,7 @@ void command_playlist_update_write( playlist_update( playlist, idx, - path, - label, - core_path, - core_display_name, - crc32, - db_name); + entry); playlist_write_file(playlist); } @@ -1737,9 +1837,9 @@ void playlist_get_db_name(playlist_t *playlist, size_t idx, /* Only use file basename if this is a 'collection' playlist * (i.e. ignore history/favourites) */ - if (!string_is_empty(conf_path_basename) && - !string_is_equal(conf_path_basename, file_path_str(FILE_PATH_CONTENT_FAVORITES)) && - !string_is_equal(conf_path_basename, file_path_str(FILE_PATH_CONTENT_HISTORY)) && + if (!string_is_empty(conf_path_basename) && + !string_is_equal(conf_path_basename, file_path_str(FILE_PATH_CONTENT_FAVORITES)) && + !string_is_equal(conf_path_basename, file_path_str(FILE_PATH_CONTENT_HISTORY)) && !string_is_equal(conf_path_basename, file_path_str(FILE_PATH_CONTENT_IMAGE_HISTORY)) && !string_is_equal(conf_path_basename, file_path_str(FILE_PATH_CONTENT_MUSIC_HISTORY)) && !string_is_equal(conf_path_basename, file_path_str(FILE_PATH_CONTENT_VIDEO_HISTORY))) diff --git a/playlist.h b/playlist.h index 9de8b2a19a..5532d1e40d 100644 --- a/playlist.h +++ b/playlist.h @@ -1,6 +1,7 @@ /* RetroArch - A frontend for libretro. * Copyright (C) 2010-2014 - Hans-Kristian Arntzen * Copyright (C) 2011-2017 - Daniel De Matteis + * Copyright (C) 2016-2019 - 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- @@ -21,10 +22,36 @@ #include #include +#include RETRO_BEGIN_DECLS -typedef struct content_playlist playlist_t; +typedef struct content_playlist playlist_t; + +struct playlist_entry +{ + char *path; + char *label; + char *core_path; + char *core_name; + char *db_name; + char *crc32; + char *subsystem_ident; + char *subsystem_name; + struct string_list *subsystem_roms; + unsigned runtime_hours; + unsigned runtime_minutes; + unsigned runtime_seconds; + /* Note: due to platform dependence, have to record + * timestamp as either a string or independent integer + * values. The latter is more verbose, but more efficient. */ + unsigned last_played_year; + unsigned last_played_month; + unsigned last_played_day; + unsigned last_played_hour; + unsigned last_played_minute; + unsigned last_played_second; +}; /** * playlist_init: @@ -66,18 +93,12 @@ size_t playlist_size(playlist_t *playlist); * playlist_get_index: * @playlist : Playlist handle. * @idx : Index of playlist entry. - * @path : Path of playlist entry. - * @core_path : Core path of playlist entry. - * @core_name : Core name of playlist entry. * * Gets values of playlist index: **/ void playlist_get_index(playlist_t *playlist, size_t idx, - const char **path, const char **label, - const char **core_path, const char **core_name, - const char **crc32, - const char **db_name); + const struct playlist_entry **entry); void playlist_get_runtime_index(playlist_t *playlist, size_t idx, @@ -106,10 +127,7 @@ void playlist_delete_index(playlist_t *playlist, * Push entry to top of playlist. **/ bool playlist_push(playlist_t *playlist, - const char *path, const char *label, - const char *core_path, const char *core_name, - const char *crc32, - const char *db_name); + const struct playlist_entry *entry); bool playlist_push_runtime(playlist_t *playlist, const char *path, const char *core_path, @@ -118,10 +136,7 @@ bool playlist_push_runtime(playlist_t *playlist, unsigned last_played_hour, unsigned last_played_minute, unsigned last_played_second); void playlist_update(playlist_t *playlist, size_t idx, - const char *path, const char *label, - const char *core_path, const char *core_name, - const char *crc32, - const char *db_name); + const struct playlist_entry *update_entry); /* Note: register_update determines whether the internal * 'playlist->modified' flag is set when updating runtime @@ -137,10 +152,7 @@ void playlist_update_runtime(playlist_t *playlist, size_t idx, void playlist_get_index_by_path(playlist_t *playlist, const char *search_path, - char **path, char **label, - char **core_path, char **core_name, - char **crc32, - char **db_name); + const struct playlist_entry **entry); bool playlist_entry_exists(playlist_t *playlist, const char *path, @@ -164,22 +176,12 @@ bool playlist_init_cached(const char *path, size_t size); void command_playlist_push_write( playlist_t *playlist, - const char *path, - const char *label, - const char *core_path, - const char *core_name, - const char *crc32, - const char *db_name); + const struct playlist_entry *entry); void command_playlist_update_write( playlist_t *playlist, size_t idx, - const char *path, - const char *label, - const char *core_path, - const char *core_display_name, - const char *crc32, - const char *db_name); + const struct playlist_entry *entry); /* Returns true if specified playlist index matches * specified content/core paths */ diff --git a/ps2/compat_files/fileXio_cdvd.c b/ps2/compat_files/fileXio_cdvd.c new file mode 100644 index 0000000000..5c61840568 --- /dev/null +++ b/ps2/compat_files/fileXio_cdvd.c @@ -0,0 +1,199 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "ps2_devices.h" +#include "ps2_descriptor.h" + +/* I dont know why but this line is totally needed */ +static SifRpcClientData_t clientInit __attribute__ ((aligned(64))); + +static int comp_entries_by_filename(const void *elem1, const void *elem2) +{ + return strcmp(((entries*)elem1)->filename, ((entries*)elem2)->filename); +} + +static int ps2_cdDiscValid(void) //returns 1 if disc valid, else returns 0 +{ + int cdmode = sceCdGetDiskType(); + + switch (cdmode) { + case SCECdPSCD: + case SCECdPSCDDA: + case SCECdPS2CD: + case SCECdPS2CDDA: + case SCECdPS2DVD: + case SCECdCDDA: + case SCECdDVDV: + return 1; + case SCECdNODISC: + case SCECdDETCT: + case SCECdDETCTCD: + case SCECdDETCTDVDS: + case SCECdDETCTDVDD: + case SCECdUNKNOWN: + case SCECdIllegalMedia: + default: + return 0; + } +} + +static u64 cd_Timer(void) +{ + return (clock() / (CLOCKS_PER_SEC / 1000)); +} + +static void ps2_cdStop(void) +{ + CDVD_Stop(); + sceCdSync(0); +} + +static int prepareCDVD(void) +{ + u64 wait_start; + int cdmode = sceCdGetDiskType(); + + if (sceCdGetDiskType() <= SCECdUNKNOWN) { + wait_start = cd_Timer(); + while ((cd_Timer() < wait_start + 500) && !ps2_cdDiscValid()) { + if (cdmode == SCECdNODISC) + return 0; + } + if (cdmode == SCECdNODISC) + return 0; + if ((cdmode < SCECdPSCD) || (cdmode > SCECdPS2DVD)) { + ps2_cdStop(); + return 0; + } + } + + return 1; +} + +static int listcdvd(const char *path, entries *FileEntry) +{ + static struct TocEntry TocEntryList[FILEENTRY_SIZE]; + char dir[1025]; + int i, n; + int t = 0; + int first_file_index; + + strcpy(dir, &path[5]); + // Directories first... + + CDVD_FlushCache(); + n = CDVD_GetDir(dir, NULL, CDVD_GET_DIRS_ONLY, TocEntryList, FILEENTRY_SIZE, dir); + + for (i = 0; i < n; i++) { + if (TocEntryList[i].fileProperties & 0x02 && (!strcmp( + TocEntryList[i].filename, ".") || !strcmp( + TocEntryList[i].filename, ".."))) + continue; // Skip pseudopaths "." and ".." + + FileEntry[t].dircheck = 1; + strcpy(FileEntry[t].filename, TocEntryList[i].filename); + t++; + + if (t >= FILEENTRY_SIZE - 2) { + break; + } + } + + qsort(FileEntry, t, sizeof(entries), comp_entries_by_filename); + first_file_index = t; + + // Now files only + + CDVD_FlushCache(); + n = CDVD_GetDir(dir, NULL, CDVD_GET_FILES_ONLY, TocEntryList, FILEENTRY_SIZE, dir); + + for (i = 0; i < n; i++) { + if (TocEntryList[i].fileProperties & 0x02 && (!strcmp( + TocEntryList[i].filename, ".") || !strcmp( + TocEntryList[i].filename, ".."))) + continue; // Skip pseudopaths "." and ".." + + FileEntry[t].dircheck = 0; + strcpy(FileEntry[t].filename, TocEntryList[i].filename); + t++; + + if (t >= FILEENTRY_SIZE - 2) { + break; + } + } + + qsort(FileEntry + first_file_index, t - first_file_index, sizeof(entries), comp_entries_by_filename); + + return t; +} + +static int fileXioCDDread(int fd, iox_dirent_t *dirent) +{ + DescriptorTranslation *descriptor = __ps2_fd_grab(fd); + + if (descriptor && descriptor->current_folder_position < descriptor->items) { + strcpy(dirent->name, descriptor->FileEntry[descriptor->current_folder_position].filename); + if (descriptor->FileEntry[descriptor->current_folder_position].dircheck) { + dirent->stat.mode = FIO_S_IFDIR; + } else { + dirent->stat.mode = FIO_S_IFREG; + } + descriptor->current_folder_position++; + } else { + descriptor->current_folder_position = 0; + return 0; + } + + return 1; +} + +static int fileXioCDDopen(const char *name) +{ + int fd = -1; + if (prepareCDVD()){ + fd = __ps2_acquire_descriptor(); + DescriptorTranslation *descriptor = __ps2_fd_grab(fd); + descriptor->current_folder_position = 0; + descriptor->items = listcdvd(name, descriptor->FileEntry); + } + return fd; +} + + +int ps2fileXioDopen(const char *name) +{ + enum BootDeviceIDs deviceID = getBootDeviceID((char *)name); + int fd = -1; + if (deviceID == BOOT_DEVICE_CDFS) { + fd = fileXioCDDopen(name); + } else { + fd = fileXioDopen(name); + } + + return fd; +} + +int ps2fileXioDread(int fd, iox_dirent_t *dirent) +{ + if (is_fd_valid(fd)) { + return fileXioCDDread(fd, dirent); + } else { + return fileXioDread(fd, dirent); + } +} + +int ps2fileXioDclose(int fd) +{ + if (is_fd_valid(fd)) { + return __ps2_release_descriptor(fd); + } else { + return fileXioDclose(fd); + } +} diff --git a/ps2/compat_files/ps2_descriptor.c b/ps2/compat_files/ps2_descriptor.c new file mode 100644 index 0000000000..c46be16c9b --- /dev/null +++ b/ps2/compat_files/ps2_descriptor.c @@ -0,0 +1,151 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2010-2018 - Francisco Javier Trujillo Mata - fjtrujy + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + +#include + +#include +#include +#include +#include + +static DescriptorTranslation *__ps2_fdmap[MAX_OPEN_FILES]; +static DescriptorTranslation __ps2_fdmap_pool[MAX_OPEN_FILES]; +static int _lock_sema_id = -1; + +static inline int _lock(void) +{ + return(WaitSema(_lock_sema_id)); +} + +static inline int _unlock(void) +{ + return(SignalSema(_lock_sema_id)); +} + +static int __ps2_fd_drop(DescriptorTranslation *map) +{ + _lock(); + + if (map->ref_count == 1) + { + map->ref_count--; + map->current_folder_position = -1; + free(map->FileEntry); + memset(map, 0, sizeof(DescriptorTranslation)); + } + else + { + map->ref_count--; + } + + _unlock(); + return 0; +} + +int is_fd_valid(int fd) +{ + /* Correct fd value */ + fd = MAX_OPEN_FILES - fd; + + return (fd >= 0) && (fd < MAX_OPEN_FILES) && (__ps2_fdmap[fd] != NULL); +} + +void _init_ps2_io(void) { + int ret; + ee_sema_t sp; + + memset(__ps2_fdmap, 0, sizeof(__ps2_fdmap)); + memset(__ps2_fdmap_pool, 0, sizeof(__ps2_fdmap_pool)); + + sp.init_count = 1; + sp.max_count = 1; + sp.option = 0; + _lock_sema_id = CreateSema(&sp); + +} + +void _free_ps2_io(void) { + _lock(); + _unlock(); + if(_lock_sema_id >= 0) DeleteSema(_lock_sema_id); +} + +int __ps2_acquire_descriptor(void) +{ + int fd = -1; + int i = 0; + _lock(); + + /* get free descriptor */ + for (fd = 0; fd < MAX_OPEN_FILES; ++fd) + { + if (__ps2_fdmap[fd] == NULL) + { + /* get free pool */ + for (i = 0; i < MAX_OPEN_FILES; ++i) + { + if (__ps2_fdmap_pool[i].ref_count == 0) + { + __ps2_fdmap[fd] = &__ps2_fdmap_pool[i]; + __ps2_fdmap[fd]->ref_count = 1; + __ps2_fdmap[fd]->current_folder_position = -1; + __ps2_fdmap[fd]->FileEntry = calloc(sizeof(entries), FILEENTRY_SIZE); + _unlock(); + return MAX_OPEN_FILES - fd; + } + } + } + } + + /* no mores descriptors available... */ + _unlock(); + return -1; +} + +int __ps2_release_descriptor(int fd) +{ + int res = -1; + + if (is_fd_valid(fd) && __ps2_fd_drop(__ps2_fdmap[MAX_OPEN_FILES - fd]) >= 0) + { + _lock(); + /* Correct fd value */ + fd = MAX_OPEN_FILES - fd; + __ps2_fdmap[fd] = NULL; + res = 0; + _unlock(); + } + + return res; +} + +DescriptorTranslation *__ps2_fd_grab(int fd) +{ + DescriptorTranslation *map = NULL; + + _lock(); + + if (is_fd_valid(fd)) + { + /* Correct fd value */ + fd = MAX_OPEN_FILES - fd; + map = __ps2_fdmap[fd]; + + if (map) + map->ref_count++; + } + + _unlock(); + return map; +} diff --git a/ps2/compat_files/ps2_devices.c b/ps2/compat_files/ps2_devices.c index 08a071bd96..63a6eeadd6 100644 --- a/ps2/compat_files/ps2_devices.c +++ b/ps2/compat_files/ps2_devices.c @@ -16,12 +16,15 @@ #include #include +#include +#include #define DEVICE_SLASH "/" #define DEVICE_MC0 "mc0:" #define DEVICE_MC1 "mc1:" #define DEVICE_CDROM "cdrom0:" +#define DEVICE_CDFS "cdfs:" #define DEVICE_MASS "mass:" #define DEVICE_MASS0 "mass0:" #define DEVICE_HDD "hdd:" @@ -40,6 +43,7 @@ #define DEVICE_MC0_PATH DEVICE_MC0 DEVICE_SLASH #define DEVICE_MC1_PATH DEVICE_MC1 DEVICE_SLASH +#define DEVICE_CDFS_PATH DEVICE_CDFS DEVICE_SLASH #define DEVICE_CDROM_PATH DEVICE_CDROM DEVICE_SLASH #define DEVICE_MASS_PATH DEVICE_MASS DEVICE_SLASH #define DEVICE_MASS0_PATH DEVICE_MASS0 DEVICE_SLASH @@ -67,6 +71,8 @@ char *rootDevicePath(enum BootDeviceIDs device_id) return DEVICE_MC1_PATH; case BOOT_DEVICE_CDROM: return DEVICE_CDROM_PATH; + case BOOT_DEVICE_CDFS: + return DEVICE_CDFS_PATH; case BOOT_DEVICE_MASS: return DEVICE_MASS_PATH; case BOOT_DEVICE_MASS0: @@ -110,6 +116,8 @@ enum BootDeviceIDs getBootDeviceID(char *path) return BOOT_DEVICE_MC1; else if (!strncmp(path, DEVICE_CDROM, 7)) return BOOT_DEVICE_CDROM; + else if (!strncmp(path, DEVICE_CDFS, 5)) + return BOOT_DEVICE_CDFS; else if (!strncmp(path, DEVICE_MASS, 5)) return BOOT_DEVICE_MASS; else if (!strncmp(path, DEVICE_MASS0, 6)) diff --git a/ps2/include/fileXio_cdvd.h b/ps2/include/fileXio_cdvd.h new file mode 100644 index 0000000000..ada31a1006 --- /dev/null +++ b/ps2/include/fileXio_cdvd.h @@ -0,0 +1,37 @@ +#ifndef PS2_CD_H +#define PS2_CD_H + +#include +#include +#include + +#define CDVD_INIT_INIT 0x00 +#define CDVD_INIT_NOCHECK 0x01 +#define CDVD_INIT_EXIT 0x05 + +typedef enum { + CDVD_TYPE_NODISK = 0x00, /* No Disc inserted */ + CDVD_TYPE_DETECT, /* Detecting disc type */ + CDVD_TYPE_DETECT_CD, + CDVD_TYPE_DETECT_DVDSINGLE, + CDVD_TYPE_DETECT_DVDDUAL, + CDVD_TYPE_UNKNOWN, /* Unknown disc type */ + + CDVD_TYPE_PS1CD = 0x10, /* PS1 CD with no CDDA tracks */ + CDVD_TYPE_PS1CDDA, /* PS1 CD with CDDA tracks */ + CDVD_TYPE_PS2CD, /* PS2 CD with no CDDA tracks */ + CDVD_TYPE_PS2CDDA, /* PS2 CD with CDDA tracks */ + CDVD_TYPE_PS2DVD, /* PS2 DVD */ + + CDVD_TYPE_CDDA = 0xFD, /* CDDA */ + CDVD_TYPE_DVDVIDEO, /* DVD Video */ + CDVD_TYPE_ILLEGAL, /* Illegal disk type */ +} CdvdDiscType_t; + +int cdInit(int); + +int ps2fileXioDopen(const char *name); +int ps2fileXioDread(int fd, iox_dirent_t *dirent); +int ps2fileXioDclose(int fd); + +#endif /* PS2_CD_H */ diff --git a/ps2/include/inttypes.h b/ps2/include/inttypes.h index 8b37fcc33e..3234974612 100644 --- a/ps2/include/inttypes.h +++ b/ps2/include/inttypes.h @@ -19,4 +19,4 @@ #define PRIu64 "lu" #define PRIuPTR "lu" -#endif //INTTYPES_H +#endif /* INTTYPES_H */ diff --git a/ps2/include/ps2_descriptor.h b/ps2/include/ps2_descriptor.h new file mode 100644 index 0000000000..f0e17cc53f --- /dev/null +++ b/ps2/include/ps2_descriptor.h @@ -0,0 +1,46 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2010-2018 - Francisco Javier Trujillo Mata - fjtrujy + * + * 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 PS2_DESCRIPTOR_H +#define PS2_DESCRIPTOR_H + +#include +#include + +#define MAX_OPEN_FILES 256 +#define FILEENTRY_SIZE 2048 + +typedef struct { + int dircheck; + char filename[256]; +} entries; + +typedef struct +{ + int ref_count; + int items; + int current_folder_position; + entries *FileEntry; +} DescriptorTranslation; + +extern DescriptorTranslation *__ps2_fdmap[]; + +void _init_ps2_io(void); +void _free_ps2_io(void); +int is_fd_valid(int fd); +int __ps2_acquire_descriptor(void); +int __ps2_release_descriptor(int fd); +DescriptorTranslation *__ps2_fd_grab(int fd); + +#endif /* PS2_DESCRIPTOR_H */ diff --git a/ps2/include/ps2_devices.h b/ps2/include/ps2_devices.h index deab4ec0d2..a2bc283572 100644 --- a/ps2/include/ps2_devices.h +++ b/ps2/include/ps2_devices.h @@ -22,6 +22,7 @@ enum BootDeviceIDs{ BOOT_DEVICE_MC0 = 0, BOOT_DEVICE_MC1, BOOT_DEVICE_CDROM, + BOOT_DEVICE_CDFS, BOOT_DEVICE_MASS, BOOT_DEVICE_MASS0, BOOT_DEVICE_HDD, diff --git a/ps2/include/ps2_irx_variables.h b/ps2/include/ps2_irx_variables.h new file mode 100644 index 0000000000..856d82e209 --- /dev/null +++ b/ps2/include/ps2_irx_variables.h @@ -0,0 +1,69 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2010-2018 - Francisco Javier Trujillo Mata - fjtrujy + * + * 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 PS2_IRX_VARIABLES_H +#define PS2_IRX_VARIABLES_H + +extern unsigned char freesio2_irx; +extern unsigned int size_freesio2_irx; + +extern unsigned char mcman_irx; +extern unsigned int size_mcman_irx; + +extern unsigned char mcserv_irx; +extern unsigned int size_mcserv_irx; + +extern unsigned char freemtap_irx; +extern unsigned int size_freemtap_irx; + +extern unsigned char freepad_irx; +extern unsigned int size_freepad_irx; + +extern unsigned char poweroff_irx; +extern unsigned int size_poweroff_irx; + +extern unsigned char iomanX_irx; +extern unsigned int size_iomanX_irx; + +extern unsigned char fileXio_irx; +extern unsigned int size_fileXio_irx; + +extern unsigned char ps2dev9_irx; +extern unsigned int size_ps2dev9_irx; + +extern unsigned char ps2atad_irx; +extern unsigned int size_ps2atad_irx; + +extern unsigned char ps2hdd_irx; +extern unsigned int size_ps2hdd_irx; + +extern unsigned char ps2fs_irx; +extern unsigned int size_ps2fs_irx; + +extern unsigned char usbd_irx; +extern unsigned int size_usbd_irx; + +extern unsigned char usbhdfsd_irx; +extern unsigned int size_usbhdfsd_irx; + +extern unsigned char cdvd_irx; +extern unsigned int size_cdvd_irx; + +extern unsigned char audsrv_irx; +extern unsigned int size_audsrv_irx; + +extern unsigned char freesd_irx; +extern unsigned int size_freesd_irx; + +#endif /* PS2_IRX_VARIABLES_H */ diff --git a/ps2/irx/Makefile b/ps2/irx/Makefile new file mode 100644 index 0000000000..ce28efa15b --- /dev/null +++ b/ps2/irx/Makefile @@ -0,0 +1,33 @@ +#Configuration for IRX +EE_BIN2C = bin2c +IRX_DIR = $(PS2SDK)/iop/irx + +#Specific folder for cdvd.irx +LIBCDVD_DIR = ../libcdvd +LIBCDVD_IRX_DIR = $(LIBCDVD_DIR)/lib + +#IRX modules +# IRX modules - modules have to be in IRX_DIR +IRX_FILES += freemtap.irx freepad.irx freesio2.irx iomanX.irx fileXio.irx mcman.irx mcserv.irx usbd.irx usbhdfsd.irx +IRX_FILES += freesd.irx audsrv.irx poweroff.irx +IRX_C_FILES = $(IRX_FILES:.irx=_irx.c) cdvd_irx.c + +all: cdvd irxs + +# Specific file name and output per IRX Module +%.irx: + $(EE_BIN2C) $(IRX_DIR)/$@ $(@:.irx=_irx.c) $(@:.irx=_irx) + +irxs: $(IRX_FILES) + +cdvd: + $(MAKE) -C $(LIBCDVD_DIR) + $(EE_BIN2C) $(LIBCDVD_IRX_DIR)/$@.irx $@_irx.c $@_irx + +clean: + rm -f $(IRX_C_FILES) + $(MAKE) -C $(LIBCDVD_DIR) clean + +#Include preferences +include $(PS2SDK)/samples/Makefile.pref +include $(PS2SDK)/samples/Makefile.eeglobal diff --git a/ps2/libcdvd/Makefile b/ps2/libcdvd/Makefile new file mode 100644 index 0000000000..765a8e05e4 --- /dev/null +++ b/ps2/libcdvd/Makefile @@ -0,0 +1,19 @@ +# Remove the line below, if you want to disable silent mode +#.SILENT: + +all: lib/libcdvdfs.a lib/cdvd.irx + +lib: + mkdir -p $@ + +clean: + $(MAKE) -C ee clean + $(MAKE) -C iop clean + +lib/cdvd.irx: iop | lib + @echo Building IRX + $(MAKE) -C $< + +lib/libcdvdfs.a: ee | lib + @echo Building EE client + $(MAKE) -C $< diff --git a/ps2/libcdvd/common/cdvd.h b/ps2/libcdvd/common/cdvd.h new file mode 100644 index 0000000000..516e0fc9dd --- /dev/null +++ b/ps2/libcdvd/common/cdvd.h @@ -0,0 +1,45 @@ +#ifndef _CDVD_H +#define _CDVD_H + +// This header contains the common definitions for libcdvd +// that are used by both IOP and EE sides + +#define CDVD_IRX 0xB001337 +#define CDVD_FINDFILE 0x01 +#define CDVD_GETDIR 0x02 +#define CDVD_STOP 0x04 +#define CDVD_TRAYREQ 0x05 +#define CDVD_DISKREADY 0x06 +#define CDVD_FLUSHCACHE 0x07 +#define CDVD_GETSIZE 0x08 + + +struct TocEntry +{ + u32 fileLBA; + u32 fileSize; + u8 fileProperties; + u8 padding1[3]; + char filename[128 + 1]; + u8 padding2[3]; +} __attribute__((packed)); + + +enum CDVD_getMode { + CDVD_GET_FILES_ONLY = 1, + CDVD_GET_DIRS_ONLY = 2, + CDVD_GET_FILES_AND_DIRS = 3 +}; + +// Macros for TrayReq +#define CdTrayOpen 0 +#define CdTrayClose 1 +#define CdTrayCheck 2 + +// Macros for DiskReady +#define CdComplete 0x02 +#define CdNotReady 0x06 +#define CdBlock 0x00 +#define CdNonBlock 0x01 + +#endif // _CDVD_H diff --git a/ps2/libcdvd/ee/Makefile b/ps2/libcdvd/ee/Makefile new file mode 100644 index 0000000000..9a079c88eb --- /dev/null +++ b/ps2/libcdvd/ee/Makefile @@ -0,0 +1,10 @@ +EE_LIB = ../lib/libcdvdfs.a +EE_OBJS = cdvd_rpc.o + +all: $(EE_LIB) + +clean: + rm -f $(EE_LIB) $(EE_OBJS) + +include $(PS2SDK)/samples/Makefile.pref +include $(PS2SDK)/samples/Makefile.eeglobal diff --git a/ps2/libcdvd/ee/cdvd_rpc.c b/ps2/libcdvd/ee/cdvd_rpc.c new file mode 100644 index 0000000000..14227a5bb8 --- /dev/null +++ b/ps2/libcdvd/ee/cdvd_rpc.c @@ -0,0 +1,135 @@ +#include +#include +#include +#include +#include + +#include "cdvd_rpc.h" + +int k_sceSifDmaStat(unsigned int id); +static unsigned sbuff[0x1300] __attribute__((aligned(64))); +static SifRpcClientData_t cd0; + +int cdvd_inited = 0; + +int CDVD_Init() +{ + int i; + + while (1) { + if (SifBindRpc(&cd0, CDVD_IRX, 0) < 0) + return -1; // bind error + if (cd0.server != 0) + break; + i = 0x10000; + while (i--) + ; + } + + cdvd_inited = 1; + + return 0; +} + +int CDVD_DiskReady(int mode) +{ + if (!cdvd_inited) + return -1; + + sbuff[0] = mode; + + SifCallRpc(&cd0, CDVD_DISKREADY, 0, (void *)(&sbuff[0]), 4, (void *)(&sbuff[0]), 4, 0, 0); + + return sbuff[0]; +} + +int CDVD_FindFile(const char *fname, struct TocEntry *tocEntry) +{ + if (!cdvd_inited) + return -1; + + strncpy((char *)&sbuff, fname, 1024); + + SifCallRpc(&cd0, CDVD_FINDFILE, 0, (void *)(&sbuff[0]), 1024, (void *)(&sbuff[0]), sizeof(struct TocEntry) + 1024, 0, 0); + + memcpy(tocEntry, &sbuff[256], sizeof(struct TocEntry)); + + return sbuff[0]; +} + +void CDVD_Stop() +{ + if (!cdvd_inited) + return; + + SifCallRpc(&cd0, CDVD_STOP, 0, (void *)(&sbuff[0]), 0, (void *)(&sbuff[0]), 0, 0, 0); + + return; +} + +int CDVD_TrayReq(int mode) +{ + if (!cdvd_inited) + return -1; + + SifCallRpc(&cd0, CDVD_TRAYREQ, 0, (void *)(&sbuff[0]), 4, (void *)(&sbuff[0]), 4, 0, 0); + + return sbuff[0]; +} + +int CDVD_GetDir(const char *pathname, const char *extensions, enum CDVD_getMode getMode, struct TocEntry tocEntry[], unsigned int req_entries, char *new_pathname) +{ + unsigned int num_entries; + + if (!cdvd_inited) + return -1; + + // copy the requested pathname to the rpc buffer + strncpy((char *)sbuff, pathname, 1023); + + // copy in the extension list to the rpc buffer + if (extensions == NULL) { + // Can't copy in the extension list since there isnt one, so just null the string in the rpc buffer + sbuff[1024 / 4] = 0; + } else { + strncpy((char *)&sbuff[1024 / 4], extensions, 127); + } + + sbuff[1152 / 4] = getMode; + + sbuff[1156 / 4] = (int)tocEntry; + + sbuff[1160 / 4] = req_entries; + + SifWriteBackDCache(tocEntry, req_entries * sizeof(struct TocEntry)); + + // This will get the directory contents, and fill tocEntry via DMA + SifCallRpc(&cd0, CDVD_GETDIR, 0, (void *)(&sbuff[0]), 1024 + 128 + 4 + 4 + 4, (void *)(&sbuff[0]), 4 + 1024, 0, 0); + + num_entries = sbuff[0]; + + if (new_pathname != NULL) + strncpy(new_pathname, (char *)&sbuff[1], 1023); + + return (num_entries); +} + +void CDVD_FlushCache() +{ + if (!cdvd_inited) + return; + + SifCallRpc(&cd0, CDVD_FLUSHCACHE, 0, (void *)(&sbuff[0]), 0, (void *)(&sbuff[0]), 0, 0, 0); + + return; +} + +unsigned int CDVD_GetSize() +{ + if (!cdvd_inited) + return -1; + + SifCallRpc(&cd0, CDVD_GETSIZE, 0, (void *)(&sbuff[0]), 0, (void *)(&sbuff[0]), 4, 0, 0); + + return sbuff[0]; +} diff --git a/ps2/libcdvd/ee/cdvd_rpc.h b/ps2/libcdvd/ee/cdvd_rpc.h new file mode 100644 index 0000000000..394adb73e7 --- /dev/null +++ b/ps2/libcdvd/ee/cdvd_rpc.h @@ -0,0 +1,28 @@ +#ifndef _CDVD_RPC_H +#define _CDVD_RPC_H + +// include the common definitions +#include "../common/cdvd.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +int CDVD_Init(); +int CDVD_DiskReady(int mode); +int CDVD_FindFile(const char *fname, struct TocEntry *tocEntry); +void CDVD_Stop(); +int CDVD_TrayReq(int mode); +int CDVD_DiskReady(int mode); +int CDVD_GetDir(const char *pathname, const char *extensions, enum CDVD_getMode getMode, struct TocEntry tocEntry[], unsigned int req_entries, char *new_pathname); +void CDVD_FlushCache(); +unsigned int CDVD_GetSize(); + + +#ifdef __cplusplus +} +#endif + + +#endif // _CDVD_H diff --git a/ps2/libcdvd/iop/Makefile b/ps2/libcdvd/iop/Makefile new file mode 100644 index 0000000000..c1dfd7c6c3 --- /dev/null +++ b/ps2/libcdvd/iop/Makefile @@ -0,0 +1,12 @@ +IOP_BIN = ../lib/cdvd.irx + +IOP_OBJS = cdvd_iop.o imports.o + + +all: $(IOP_BIN) + +clean: + rm -f $(IOP_BIN) $(IOP_OBJS) + +include $(PS2SDK)/Defs.make +include Rules.make diff --git a/ps2/libcdvd/iop/Rules.make b/ps2/libcdvd/iop/Rules.make new file mode 100644 index 0000000000..3a53febbe3 --- /dev/null +++ b/ps2/libcdvd/iop/Rules.make @@ -0,0 +1,54 @@ +# _____ ___ ____ ___ ____ +# ____| | ____| | | |____| +# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. +#----------------------------------------------------------------------- +# Copyright 2001-2004. +# Licenced under Academic Free License version 2.0 +# Review ps2sdk README & LICENSE files for further details. + + +IOP_CC_VERSION := $(shell $(IOP_CC) -v 2>&1 | sed -n 's/^.*version //p') + +ASFLAGS_TARGET = -mcpu=r3000 + +ifeq ($(IOP_CC_VERSION),3.2.2) +CFLAGS_TARGET = -miop +ASFLAGS_TARGET = -march=r3000 +LDFLAGS_TARGET = -miop +endif + +IOP_INCS := $(IOP_INCS) -I$(PS2SDK)/iop/include -I$(PS2SDK)/common/include + +IOP_CFLAGS := $(CFLAGS_TARGET) -O2 -G0 -D_IOP -c $(IOP_INCS) $(IOP_CFLAGS) +IOP_ASFLAGS := $(ASFLAGS_TARGET) -EL -G0 $(IOP_ASFLAGS) +IOP_LDFLAGS := $(LDFLAGS_TARGET) -nostdlib $(IOP_LDFLAGS) + +# Externally defined variables: IOP_BIN, IOP_OBJS, IOP_LIB + +%.o : %.c + $(IOP_CC) $(IOP_CFLAGS) $< -o $@ + +%.o : %.s + $(IOP_AS) $(IOP_ASFLAGS) $< -o $@ + +# A rule to build imports.lst. +%.o : %.lst + echo "#include \"irx_imports.h\"" > build-imports.c + cat $< >> build-imports.c + $(IOP_CC) $(IOP_CFLAGS) build-imports.c -o $@ + -rm -f build-imports.c + +# A rule to build exports.tab. +%.o : %.tab + echo "#include \"irx.h\"" > build-exports.c + cat $< >> build-exports.c + $(IOP_CC) $(IOP_CFLAGS) build-exports.c -o $@ + -rm -f build-exports.c + + +$(IOP_BIN) : $(IOP_OBJS) + $(IOP_CC) $(IOP_LDFLAGS) -o $(IOP_BIN) $(IOP_OBJS) $(IOP_LIBS) + +$(IOP_LIB) : $(IOP_OBJS) + $(IOP_AR) cru $(IOP_LIB) $(IOP_OBJS) + diff --git a/ps2/libcdvd/iop/cdvd_iop.c b/ps2/libcdvd/iop/cdvd_iop.c new file mode 100644 index 0000000000..6fd3b8dd6c --- /dev/null +++ b/ps2/libcdvd/iop/cdvd_iop.c @@ -0,0 +1,1852 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "cdvd_iop.h" + +#define TRUE 1 +#define FALSE 0 + +enum PathMatch { + NOT_MATCH = 0, + MATCH, + SUBDIR +}; + +//#define DEBUG + +// 16 sectors worth of toc entry +#define MAX_DIR_CACHE_SECTORS 32 + + +//static u8 cdVolDescriptor[2048]; +static sceCdRMode cdReadMode; + +int lastsector; +int last_bk = 0; + + +struct rootDirTocHeader +{ + u16 length; + u32 tocLBA; + u32 tocLBA_bigend; + u32 tocSize; + u32 tocSize_bigend; + u8 dateStamp[8]; + u8 reserved[6]; + u8 reserved2; + u8 reserved3; +} __attribute__((packed)); + +struct asciiDate +{ + char year[4]; + char month[2]; + char day[2]; + char hours[2]; + char minutes[2]; + char seconds[2]; + char hundreths[2]; + char terminator[1]; +} __attribute__((packed)); + +struct cdVolDesc +{ + u8 filesystemType; // 0x01 = ISO9660, 0x02 = Joliet, 0xFF = NULL + u8 volID[5]; // "CD001" + u8 reserved2; + u8 reserved3; + u8 sysIdName[32]; + u8 volName[32]; // The ISO9660 Volume Name + u8 reserved5[8]; + u32 volSize; // Volume Size + u32 volSizeBig; // Volume Size Big-Endian + u8 reserved6[32]; + u32 unknown1; + u32 unknown1_bigend; + u16 volDescSize; + u16 volDescSize_bigend; + u32 unknown3; + u32 unknown3_bigend; + u32 priDirTableLBA; // LBA of Primary Dir Table + u32 reserved7; + u32 secDirTableLBA; // LBA of Secondary Dir Table + u32 reserved8; + struct rootDirTocHeader rootToc; + u8 volSetName[128]; + u8 publisherName[128]; + u8 preparerName[128]; + u8 applicationName[128]; + u8 copyrightFileName[37]; + u8 abstractFileName[37]; + u8 bibliographyFileName[37]; + struct asciiDate creationDate; + struct asciiDate modificationDate; + struct asciiDate effectiveDate; + struct asciiDate expirationDate; + u8 reserved10; + u8 reserved11[1166]; +} __attribute__((packed)); + +struct dirTableEntry +{ + u8 dirNameLength; + u8 reserved; + u32 dirTOCLBA; + u16 dirDepth; + u8 dirName[32]; +} __attribute__((packed)); + +struct dirTocEntry +{ + short length; + unsigned int fileLBA; + unsigned int fileLBA_bigend; + unsigned int fileSize; + unsigned int fileSize_bigend; + unsigned char dateStamp[6]; + unsigned char reserved1; + unsigned char fileProperties; + unsigned char reserved2[6]; + unsigned char filenameLength; + unsigned char filename[128]; +} __attribute__((packed)); // This is the internal format on the CD +// a file with a single character filename will have a 34byte toc entry +// (max 60 entries per sector)6 + +// TocEntry structure contains only the important stuff needed for export +// + +struct fdtable +{ + iop_file_t *fd; + int fileSize; + int LBA; + int filePos; +}; + + +struct dir_cache_info +{ + char pathname[1024]; // The pathname of the cached directory + unsigned int valid; // TRUE if cache data is valid, FALSE if not + + unsigned int path_depth; // The path depth of the cached directory (0 = root) + + unsigned int sector_start; // The start sector (LBA) of the cached directory + unsigned int sector_num; // The total size of the directory (in sectors) + unsigned int cache_offset; // The offset from sector_start of the cached area + unsigned int cache_size; // The size of the cached directory area (in sectors) + + char *cache; // The actual cached data +}; + + +static struct dir_cache_info CachedDirInfo; + +enum Cache_getMode { + CACHE_START = 0, + CACHE_NEXT = 1 +}; + +static struct cdVolDesc CDVolDesc; + +static unsigned int *buffer; // RPC send/receive buffer +struct t_SifRpcDataQueue qd; +struct t_SifRpcServerData sd0; + + +static struct fdtable fd_table[16]; +static int fd_used[16]; +static int files_open; + +static iop_device_t file_driver; + +/* Filing-system exported functions */ +int CDVD_init(iop_device_t *driver); +int CDVD_open(iop_file_t *f, const char *name, int mode); +int CDVD_lseek(iop_file_t *f, int offset, int whence); +int CDVD_read(iop_file_t *f, void *buffer, int size); +int CDVD_write(iop_file_t *f, void *buffer, int size); +int CDVD_close(iop_file_t *f); + +/* RPC exported functions */ +int CDVD_findfile(const char *fname, struct TocEntry *tocEntry); +int CDVD_stop(void); +int CDVD_trayreq(int mode); +int CDVD_diskready(void); +int CDVD_GetDir_RPC(const char *pathname, const char *extensions, enum CDVD_getMode getMode, struct TocEntry tocEntry[], unsigned int req_entries); + +int CDVD_getdir_IOP(const char *pathname, const char *extensions, enum CDVD_getMode getMode, struct TocEntry tocEntry[], unsigned int req_entries); + + +// Functions called by the RPC server +void *CDVDRpc_Stop(); +void *CDVDRpc_FlushCache(); +void *CDVDRpc_TrayReq(unsigned int *sbuff); +void *CDVDRpc_DiskReady(unsigned int *sbuff); +void *CDVDRpc_FindFile(unsigned int *sbuff); +void *CDVDRpc_Getdir(unsigned int *sbuff); +void *CDVDRpc_GetSize(unsigned int *sbuff); + + +/* Internal use functions */ +int isValidDisc(void); +int strcasecmp(const char *s1, const char *s2); +int strncasecmp(const char *s1, const char *s2, int limit); +int CDVD_GetVolumeDescriptor(void); +void _splitpath(const char *constpath, char *dir, char *fname); +void TocEntryCopy(struct TocEntry *tocEntry, struct dirTocEntry *internalTocEntry); +int TocEntryCompare(char *filename, const char *extensions); + +enum PathMatch ComparePath(const char *path); + +int CDVD_Cache_Dir(const char *pathname, enum Cache_getMode getMode); +int FindPath(char *pathname); + + +void *CDVD_rpc_server(int fno, void *data, int size); +void CDVD_Thread(void *param); + + + +/******************** +* Optimised CD Read * +********************/ + +int ReadSect(u32 lsn, u32 sectors, void *buf, sceCdRMode *mode) +{ + int retry; + int result = 0; + cdReadMode.trycount = 32; + + for (retry = 0; retry < 32; retry++) // 32 retries + { + if (retry <= 8) + cdReadMode.spindlctrl = 1; // Try fast reads for first 8 tries + else + cdReadMode.spindlctrl = 0; // Then try slow reads + + if (!isValidDisc()) + return FALSE; + + sceCdDiskReady(0); + + if (sceCdRead(lsn, sectors, buf, mode) != TRUE) { + // Failed to read + if (retry == 31) { + // Still failed after last retry + memset(buf, 0, (sectors << 11)); + // printf("Couldn't Read from file for some reason\n"); + return FALSE; // error + } + } else { + // Read okay + sceCdSync(0); + break; + } + + result = sceCdGetError(); + if (result == 0) + break; + } + + cdReadMode.trycount = 32; + cdReadMode.spindlctrl = 1; + + if (result == 0) + return TRUE; + + memset(buf, 0, (sectors << 11)); + + return FALSE; // error +} + +/*********************************************** +* Determines if there is a valid disc inserted * +***********************************************/ +int isValidDisc(void) +{ + int result; + + switch (sceCdGetDiskType()) { + case SCECdPSCD: + case SCECdPSCDDA: + case SCECdPS2CD: + case SCECdPS2CDDA: + case SCECdPS2DVD: + result = 1; + break; + default: + result = 0; + } + + return result; +} + +/************************************************************* +* The functions below are the normal file-system operations, * +* used to provide a standard filesystem interface. There is * +* no need to export these functions for calling via RPC * +*************************************************************/ +int dummy() +{ +#ifdef DEBUG + printf("CDVD: dummy function called\n"); +#endif + + return -5; +} + +int CDVD_init(iop_device_t *driver) +{ + printf("CDVD: CDVD Filesystem v1.15\n"); + printf("by A.Lee (aka Hiryu) & Nicholas Van Veen (aka Sjeep)\n"); + printf("CDVD: Initializing '%s' file driver.\n", driver->name); + + sceCdInit(SCECdINoD); + + memset(fd_table, 0, sizeof(fd_table)); + memset(fd_used, 0, 16 * 4); + + return 0; +} + +int CDVD_deinit(iop_device_t *driver) +{ + return 0; +} + +int CDVD_open(iop_file_t *f, const char *name, int mode) +{ + int j; + static struct TocEntry tocEntry; + +#ifdef DEBUG + printf("CDVD: fd_open called.\n"); + printf(" kernel_fd.. %p\n", f); + printf(" name....... %s %x\n", name, (int)name); + printf(" mode....... %d\n\n", mode); +#endif + + // check if the file exists + if (CDVD_findfile(name, &tocEntry) != TRUE) { + return -1; + } + + if (mode != O_RDONLY) + return -2; + + // set up a new file descriptor + for (j = 0; j < 16; j++) { + if (fd_used[j] == 0) + break; + } + + if (j >= 16) + return -3; + + + fd_used[j] = 1; + files_open++; + +#ifdef DEBUG + printf("CDVD: internal fd %d\n", j); +#endif + + fd_table[j].fd = f; + fd_table[j].fileSize = tocEntry.fileSize; + fd_table[j].LBA = tocEntry.fileLBA; + fd_table[j].filePos = 0; + +#ifdef DEBUG + printf("tocEntry.fileSize = %d\n", tocEntry.fileSize); + + printf("Opened file: %s\n", name); +#endif + + return j; +} + + + +int CDVD_lseek(iop_file_t *f, int offset, int whence) +{ + int i; + +#ifdef DEBUG + printf("CDVD: fd_seek called.\n"); + printf(" kernel_fd... %p\n", f); + printf(" offset...... %d\n", offset); + printf(" whence...... %d\n\n", whence); +#endif + + for (i = 0; i < 16; i++) { + if (fd_table[i].fd == f) + break; + } + + if (i >= 16) { +#ifdef DEBUG + printf("CDVD_lseek: ERROR: File does not appear to be open!\n"); +#endif + + return -1; + } + + switch (whence) { + case SEEK_SET: + fd_table[i].filePos = offset; + break; + + case SEEK_CUR: + fd_table[i].filePos += offset; + break; + + case SEEK_END: + fd_table[i].filePos = fd_table[i].fileSize + offset; + break; + + default: + return -1; + } + + if (fd_table[i].filePos < 0) + fd_table[i].filePos = 0; + + if (fd_table[i].filePos > fd_table[i].fileSize) + fd_table[i].filePos = fd_table[i].fileSize; + + return fd_table[i].filePos; +} + + +int CDVD_read(iop_file_t *f, void *buffer, int size) +{ + int i; + + int start_sector; + int off_sector; + int num_sectors; + + int read = 0; + // int sector; + + // int size_left; + // int copy_size; + + static char local_buffer[9 * 2048]; + + +#ifdef DEBUG + printf("CDVD: read called\n"); + printf(" kernel_fd... %p\n", f); + printf(" buffer...... 0x%X\n", (int)buffer); + printf(" size........ %d\n\n", size); +#endif + + for (i = 0; i < 16; i++) { + if (fd_table[i].fd == f) + break; + } + + if (i >= 16) { +#ifdef DEBUG + printf("CDVD_read: ERROR: File does not appear to be open!\n"); +#endif + + return -1; + } + + + // A few sanity checks + if (fd_table[i].filePos > fd_table[i].fileSize) { + // We cant start reading from past the beginning of the file + return 0; // File exists but we couldnt read anything from it + } + + if ((fd_table[i].filePos + size) > fd_table[i].fileSize) + size = fd_table[i].fileSize - fd_table[i].filePos; + + if (size <= 0) + return 0; + + if (size > 16384) + size = 16384; + + // Now work out where we want to start reading from + start_sector = fd_table[i].LBA + (fd_table[i].filePos >> 11); + off_sector = (fd_table[i].filePos & 0x7FF); + + num_sectors = (off_sector + size); + num_sectors = (num_sectors >> 11) + ((num_sectors & 2047) != 0); + +#ifdef DEBUG + printf("CDVD_read: read sectors %d to %d\n", start_sector, start_sector + num_sectors); +#endif + + // Skip a Sector for equal (use the last sector in buffer) + if (start_sector == lastsector) { + read = 1; + if (last_bk > 0) + memcpy(local_buffer, local_buffer + 2048 * (last_bk), 2048); + last_bk = 0; + } + + lastsector = start_sector + num_sectors - 1; + // Read the data (we only ever get 16KB max request at once) + + if (read == 0 || (read == 1 && num_sectors > 1)) { + if (ReadSect(start_sector + read, num_sectors - read, local_buffer + ((read) << 11), &cdReadMode) != TRUE) { +#ifdef DEBUG + printf("Couldn't Read from file for some reason\n"); +#endif + } + + last_bk = num_sectors - 1; + } + + memcpy(buffer, local_buffer + off_sector, size); + + fd_table[i].filePos += size; + + return (size); +} + + +int CDVD_write(iop_file_t *f, void *buffer, int size) +{ + if (size == 0) + return 0; + else + return -1; +} + + + +int CDVD_close(iop_file_t *f) +{ + int i; + +#ifdef DEBUG + printf("CDVD: fd_close called.\n"); + printf(" kernel fd.. %p\n\n", f); +#endif + + for (i = 0; i < 16; i++) { + if (fd_table[i].fd == f) + break; + } + + if (i >= 16) { +#ifdef DEBUG + printf("CDVD_close: ERROR: File does not appear to be open!\n"); +#endif + + return -1; + } + +#ifdef DEBUG + printf("CDVD: internal fd %d\n", i); +#endif + + fd_used[i] = 0; + files_open--; + + return 0; +} + + +static iop_device_ops_t filedriver_ops = { + &CDVD_init, + &CDVD_deinit, + (void *)&dummy, + &CDVD_open, + &CDVD_close, + &CDVD_read, + &CDVD_write, + &CDVD_lseek, + (void *)&dummy, + (void *)&dummy, + (void *)&dummy, + (void *)&dummy, + (void *)&dummy, + (void *)&dummy, + (void *)&dummy, + (void *)&dummy, + (void *)&dummy}; + +int _start(int argc, char **argv) +{ + int i; + struct _iop_thread param; + int th; + + // Initialise the directory cache + strcpy(CachedDirInfo.pathname, ""); // The pathname of the cached directory + CachedDirInfo.valid = FALSE; // Cache is not valid + CachedDirInfo.path_depth = 0; // 0 = root) + CachedDirInfo.sector_start = 0; // The start sector (LBA) of the cached directory + CachedDirInfo.sector_num = 0; // The total size of the directory (in sectors) + CachedDirInfo.cache_offset = 0; // The offset from sector_start of the cached area + CachedDirInfo.cache_size = 0; // The size of the cached directory area (in sectors) + + if (CachedDirInfo.cache == NULL) + CachedDirInfo.cache = (char *)AllocSysMemory(0, MAX_DIR_CACHE_SECTORS * 2048, NULL); + + + // setup the cdReadMode structure + cdReadMode.trycount = 0; + cdReadMode.spindlctrl = SCECdSpinStm; + cdReadMode.datapattern = SCECdSecS2048; + + // setup the file_driver structure + file_driver.name = "cdfs"; + file_driver.type = IOP_DT_FS; + file_driver.version = 1; + file_driver.desc = "CDVD Filedriver"; + file_driver.ops = &filedriver_ops; + + DelDrv("cdfs"); + AddDrv(&file_driver); + + param.attr = TH_C; + param.thread = (void *)CDVD_Thread; + param.priority = 40; + param.stacksize = 0x8000; + param.option = 0; + + th = CreateThread(¶m); + + if (th > 0) { + StartThread(th, NULL); + return MODULE_RESIDENT_END; + } else + return MODULE_NO_RESIDENT_END; +} + +/************************************************************** +* The functions below are not exported for normal file-system * +* operations, but are used by the file-system operations, and * +* may also be exported for use via RPC * +**************************************************************/ + + +int CDVD_GetVolumeDescriptor(void) +{ + // Read until we find the last valid Volume Descriptor + int volDescSector; + + static struct cdVolDesc localVolDesc; + +#ifdef DEBUG + printf("CDVD_GetVolumeDescriptor called\n"); +#endif + + for (volDescSector = 16; volDescSector < 20; volDescSector++) { + ReadSect(volDescSector, 1, &localVolDesc, &cdReadMode); + + // If this is still a volume Descriptor + if (strncmp(localVolDesc.volID, "CD001", 5) == 0) { + if ((localVolDesc.filesystemType == 1) || + (localVolDesc.filesystemType == 2)) { + memcpy(&CDVolDesc, &localVolDesc, sizeof(struct cdVolDesc)); + } + } else + break; + } + +#ifdef DEBUG + switch (CDVolDesc.filesystemType) { + case 1: + printf("CD FileSystem is ISO9660\n"); + break; + + case 2: + printf("CD FileSystem is Joliet\n"); + break; + + default: + printf("CD FileSystem is unknown type\n"); + break; + } +#endif + // sceCdStop(); + + return TRUE; +} + + +int CDVD_findfile(const char *fname, struct TocEntry *tocEntry) +{ + static char filename[128 + 1]; + static char pathname[1024 + 1]; + + struct dirTocEntry *tocEntryPointer; + +#ifdef DEBUG + printf("CDVD_findfile called\n"); +#endif + + _splitpath(fname, pathname, filename); + +#ifdef DEBUG + printf("Trying to find file: %s in directory: %s\n", filename, pathname); +#endif + + // if ((CachedDirInfo.valid==TRUE) + // && (strcasecmp(pathname, CachedDirInfo.pathname)==0)) + + if ((CachedDirInfo.valid == TRUE) && (ComparePath(pathname) == MATCH)) { + // the directory is already cached, so check through the currently + // cached chunk of the directory first + + tocEntryPointer = (struct dirTocEntry *)CachedDirInfo.cache; + + for (; tocEntryPointer < (struct dirTocEntry *)(CachedDirInfo.cache + (CachedDirInfo.cache_size * 2048)); tocEntryPointer = (struct dirTocEntry *)((u8 *)tocEntryPointer + tocEntryPointer->length)) { + if (tocEntryPointer->length == 0) { +#ifdef DEBUG + printf("Got a null pointer entry, so either reached end of dir, or end of sector\n"); +#endif + + tocEntryPointer = (struct dirTocEntry *)(CachedDirInfo.cache + (((((char *)tocEntryPointer - CachedDirInfo.cache) / 2048) + 1) * 2048)); + } + + if (tocEntryPointer >= (struct dirTocEntry *)(CachedDirInfo.cache + (CachedDirInfo.cache_size * 2048))) { + // reached the end of the cache block + break; + } + + if ((tocEntryPointer->fileProperties & 0x02) == 0) { + // It's a file + TocEntryCopy(tocEntry, tocEntryPointer); + + if (strcasecmp(tocEntry->filename, filename) == 0) { + // and it matches !! + return TRUE; + } + } + } // end of for loop + + + + // If that was the only dir block, and we havent found it, then fail + if (CachedDirInfo.cache_size == CachedDirInfo.sector_num) + return FALSE; + + // Otherwise there is more dir to check + if (CachedDirInfo.cache_offset == 0) { + // If that was the first block then continue with the next block + if (CDVD_Cache_Dir(pathname, CACHE_NEXT) != TRUE) + return FALSE; + } else { + // otherwise (if that wasnt the first block) then start checking from the start + if (CDVD_Cache_Dir(pathname, CACHE_START) != TRUE) + return FALSE; + } + } else { +#ifdef DEBUG + printf("Trying to cache directory\n"); +#endif + // The wanted directory wasnt already cached, so cache it now + if (CDVD_Cache_Dir(pathname, CACHE_START) != TRUE) { +#ifdef DEBUG + printf("Failed to cache directory\n"); +#endif + + return FALSE; + } + } + +// If we've got here, then we have a block of the directory cached, and want to check +// from this point, to the end of the dir +#ifdef DEBUG + printf("cache_size = %d\n", CachedDirInfo.cache_size); +#endif + + while (CachedDirInfo.cache_size > 0) { + tocEntryPointer = (struct dirTocEntry *)CachedDirInfo.cache; + + if (CachedDirInfo.cache_offset == 0) + tocEntryPointer = (struct dirTocEntry *)((u8 *)tocEntryPointer + tocEntryPointer->length); + + for (; tocEntryPointer < (struct dirTocEntry *)(CachedDirInfo.cache + (CachedDirInfo.cache_size * 2048)); tocEntryPointer = (struct dirTocEntry *)((u8 *)tocEntryPointer + tocEntryPointer->length)) { + if (tocEntryPointer->length == 0) { +#ifdef DEBUG + printf("Got a null pointer entry, so either reached end of dir, or end of sector\n"); + printf("Offset into cache = %d bytes\n", (char *)tocEntryPointer - CachedDirInfo.cache); +#endif + + tocEntryPointer = (struct dirTocEntry *)(CachedDirInfo.cache + (((((char *)tocEntryPointer - CachedDirInfo.cache) / 2048) + 1) * 2048)); + } + + if (tocEntryPointer >= (struct dirTocEntry *)(CachedDirInfo.cache + (CachedDirInfo.cache_size * 2048))) { + // reached the end of the cache block + break; + } + + TocEntryCopy(tocEntry, tocEntryPointer); + + if (strcasecmp(tocEntry->filename, filename) == 0) { +#ifdef DEBUG + printf("Found a matching file\n"); +#endif + // and it matches !! + return TRUE; + } + +#ifdef DEBUG + printf("Non-matching file - looking for %s , found %s\n", filename, tocEntry->filename); +#endif + } // end of for loop + +#ifdef DEBUG + printf("Reached end of cache block\n"); +#endif + // cache the next block + CDVD_Cache_Dir(pathname, CACHE_NEXT); + } + +// we've run out of dir blocks to cache, and still not found it, so fail + +#ifdef DEBUG + printf("CDVD_findfile: could not find file\n"); +#endif + + return FALSE; +} + + + +// Find, and cache, the requested directory, for use by GetDir or (and thus open) +// provide an optional offset variable, for use when caching dirs of greater than 500 files + +// returns TRUE if all TOC entries have been retrieved, or +// returns FALSE if there are more TOC entries to be retrieved +int CDVD_Cache_Dir(const char *pathname, enum Cache_getMode getMode) +{ + + // macke sure that the requested pathname is not directly modified + static char dirname[1024]; + + int path_len; + +#ifdef DEBUG + printf("Attempting to find, and cache, directory: %s\n", pathname); +#endif + + // only take any notice of the existing cache, if it's valid + if (CachedDirInfo.valid == TRUE) { + // Check if the requested path is already cached + // if (strcasecmp(pathname,CachedDirInfo.pathname)==0) + if (ComparePath(pathname) == MATCH) { +#ifdef DEBUG + printf("CacheDir: The requested path is already cached\n"); +#endif + + // If so, is the request ot cache the start of the directory, or to resume the next block ? + if (getMode == CACHE_START) { +#ifdef DEBUG + printf(" and requested cache from start of dir\n"); +#endif + + if (CachedDirInfo.cache_offset == 0) { +// requested cache of start of the directory, and thats what's already cached +// so sit back and do nothing +#ifdef DEBUG + printf(" and start of dir is already cached so nothing to do :o)\n"); +#endif + + CachedDirInfo.valid = TRUE; + return TRUE; + } else { +// Requested cache of start of the directory, but thats not what's cached +// so re-cache the start of the directory + +#ifdef DEBUG + printf(" but dir isn't cached from start, so re-cache existing dir from start\n"); +#endif + + // reset cache data to start of existing directory + CachedDirInfo.cache_offset = 0; + CachedDirInfo.cache_size = CachedDirInfo.sector_num; + + if (CachedDirInfo.cache_size > MAX_DIR_CACHE_SECTORS) + CachedDirInfo.cache_size = MAX_DIR_CACHE_SECTORS; + + // Now fill the cache with the specified sectors + if (ReadSect(CachedDirInfo.sector_start + CachedDirInfo.cache_offset, CachedDirInfo.cache_size, CachedDirInfo.cache, &cdReadMode) != TRUE) { +#ifdef DEBUG + printf("Couldn't Read from CD !\n"); +#endif + + CachedDirInfo.valid = FALSE; // should we completely invalidate just because we couldnt read first time? + return FALSE; + } + + CachedDirInfo.valid = TRUE; + return TRUE; + } + } else // getMode == CACHE_NEXT + { + // So get the next block of the existing directory + + CachedDirInfo.cache_offset += CachedDirInfo.cache_size; + + CachedDirInfo.cache_size = CachedDirInfo.sector_num - CachedDirInfo.cache_offset; + + if (CachedDirInfo.cache_size > MAX_DIR_CACHE_SECTORS) + CachedDirInfo.cache_size = MAX_DIR_CACHE_SECTORS; + + // Now fill the cache with the specified sectors + if (ReadSect(CachedDirInfo.sector_start + CachedDirInfo.cache_offset, CachedDirInfo.cache_size, CachedDirInfo.cache, &cdReadMode) != TRUE) { +#ifdef DEBUG + printf("Couldn't Read from CD !\n"); +#endif + + CachedDirInfo.valid = FALSE; // should we completely invalidate just because we couldnt read first time? + return FALSE; + } + + CachedDirInfo.valid = TRUE; + return TRUE; + } + } else // requested directory is not the cached directory (but cache is still valid) + { +#ifdef DEBUG + printf("Cache is valid, but cached directory, is not the requested one\n" + "so check if the requested directory is a sub-dir of the cached one\n"); + + printf("Requested Path = %s , Cached Path = %s\n", pathname, CachedDirInfo.pathname); +#endif + + + // Is the requested pathname a sub-directory of the current-directory ? + + // if the requested pathname is longer than the pathname of the cached dir + // and the pathname of the cached dir matches the beginning of the requested pathname + // and the next character in the requested pathname is a dir seperator + // printf("Length of Cached pathname = %d, length of req'd pathname = %d\n",path_len, strlen(pathname)); + // printf("Result of strncasecmp = %d\n",strncasecmp(pathname, CachedDirInfo.pathname, path_len)); + // printf("next character after length of cached name = %c\n",pathname[path_len]); + + // if ((strlen(pathname) > path_len) + // && (strncasecmp(pathname, CachedDirInfo.pathname, path_len)==0) + // && ((pathname[path_len]=='/') || (pathname[path_len]=='\\'))) + + if (ComparePath(pathname) == SUBDIR) { +// If so then we can start our search for the path, from the currently cached directory +#ifdef DEBUG + printf("Requested dir is a sub-dir of the cached directory,\n" + "so start search from current cached dir\n"); +#endif + // if the cached chunk, is not the start of the dir, + // then we will need to re-load it before starting search + if (CachedDirInfo.cache_offset != 0) { + CachedDirInfo.cache_offset = 0; + CachedDirInfo.cache_size = CachedDirInfo.sector_num; + if (CachedDirInfo.cache_size > MAX_DIR_CACHE_SECTORS) + CachedDirInfo.cache_size = MAX_DIR_CACHE_SECTORS; + + // Now fill the cache with the specified sectors + if (ReadSect(CachedDirInfo.sector_start + CachedDirInfo.cache_offset, CachedDirInfo.cache_size, CachedDirInfo.cache, &cdReadMode) != TRUE) { +#ifdef DEBUG + printf("Couldn't Read from CD !\n"); +#endif + + CachedDirInfo.valid = FALSE; // should we completely invalidate just because we couldnt read time? + return FALSE; + } + } + + // start the search, with the path after the current directory + path_len = strlen(CachedDirInfo.pathname); + strcpy(dirname, pathname + path_len); + + // FindPath should use the current directory cache to start it's search + // and should change CachedDirInfo.pathname, to the path of the dir it finds + // it should also cache the first chunk of directory sectors, + // and fill the contents of the other elements of CachedDirInfo appropriately + + return (FindPath(dirname)); + } + } + } + +// If we've got here, then either the cache was not valid to start with +// or the requested path is not a subdirectory of the currently cached directory +// so lets start again +#ifdef DEBUG + printf("The cache is not valid, or the requested directory is not a sub-dir of the cached one\n"); +#endif + + if (!isValidDisc()) { +#ifdef DEBUG + printf("No supported disc inserted.\n"); +#endif + + return -1; + } + + sceCdDiskReady(0); + + // Read the main volume descriptor + if (CDVD_GetVolumeDescriptor() != TRUE) { +#ifdef DEBUG + printf("Could not read the CD/DVD Volume Descriptor\n"); +#endif + + return -1; + } + +#ifdef DEBUG + printf("Read the CD Volume Descriptor\n"); +#endif + + CachedDirInfo.path_depth = 0; + + strcpy(CachedDirInfo.pathname, ""); + + // Setup the lba and sector size, for retrieving the root toc + CachedDirInfo.cache_offset = 0; + CachedDirInfo.sector_start = CDVolDesc.rootToc.tocLBA; + CachedDirInfo.sector_num = (CDVolDesc.rootToc.tocSize >> 11) + ((CDVolDesc.rootToc.tocSize & 2047) != 0); + + CachedDirInfo.cache_size = CachedDirInfo.sector_num; + + if (CachedDirInfo.cache_size > MAX_DIR_CACHE_SECTORS) + CachedDirInfo.cache_size = MAX_DIR_CACHE_SECTORS; + + + // Now fill the cache with the specified sectors + if (ReadSect(CachedDirInfo.sector_start + CachedDirInfo.cache_offset, CachedDirInfo.cache_size, CachedDirInfo.cache, &cdReadMode) != TRUE) { +#ifdef DEBUG + printf("Couldn't Read from CD !\n"); +#endif + + CachedDirInfo.valid = FALSE; // should we completely invalidate just because we couldnt read time? + return FALSE; + } + +#ifdef DEBUG + printf("Read the first block from the root directory\n"); +#endif + +// FindPath should use the current directory cache to start it's search (in this case the root) +// and should change CachedDirInfo.pathname, to the path of the dir it finds +// it should also cache the first chunk of directory sectors, +// and fill the contents of the other elements of CachedDirInfo appropriately +#ifdef DEBUG + printf("Calling FindPath\n"); +#endif + strcpy(dirname, pathname); + + return (FindPath(dirname)); +} + +int FindPath(char *pathname) +{ + char *dirname; + char *seperator; + + int dir_entry; + int found_dir; + + struct dirTocEntry *tocEntryPointer; + struct TocEntry localTocEntry; + + dirname = strtok(pathname, "\\/"); + +#ifdef DEBUG + printf("FindPath: trying to find directory %s\n", pathname); +#endif + + if (!isValidDisc()) + return FALSE; + + sceCdDiskReady(0); + + while (dirname != NULL) { + found_dir = FALSE; + + tocEntryPointer = (struct dirTocEntry *)CachedDirInfo.cache; + + // Always skip the first entry (self-refencing entry) + tocEntryPointer = (struct dirTocEntry *)((u8 *)tocEntryPointer + tocEntryPointer->length); + + dir_entry = 0; + + for (; tocEntryPointer < (struct dirTocEntry *)(CachedDirInfo.cache + (CachedDirInfo.cache_size * 2048)); tocEntryPointer = (struct dirTocEntry *)((u8 *)tocEntryPointer + tocEntryPointer->length)) { + // If we have a null toc entry, then we've either reached the end of the dir, or have reached a sector boundary + if (tocEntryPointer->length == 0) { +#ifdef DEBUG + printf("Got a null pointer entry, so either reached end of dir, or end of sector\n"); +#endif + + tocEntryPointer = (struct dirTocEntry *)(CachedDirInfo.cache + (((((char *)tocEntryPointer - CachedDirInfo.cache) / 2048) + 1) * 2048)); + } + + if (tocEntryPointer >= (struct dirTocEntry *)(CachedDirInfo.cache + (CachedDirInfo.cache_size * 2048))) { + // If we've gone past the end of the cache + // then check if there are more sectors to load into the cache + + if ((CachedDirInfo.cache_offset + CachedDirInfo.cache_size) < CachedDirInfo.sector_num) { + // If there are more sectors to load, then load them + CachedDirInfo.cache_offset += CachedDirInfo.cache_size; + CachedDirInfo.cache_size = CachedDirInfo.sector_num - CachedDirInfo.cache_offset; + + if (CachedDirInfo.cache_size > MAX_DIR_CACHE_SECTORS) + CachedDirInfo.cache_size = MAX_DIR_CACHE_SECTORS; + + if (ReadSect(CachedDirInfo.sector_start + CachedDirInfo.cache_offset, CachedDirInfo.cache_size, CachedDirInfo.cache, &cdReadMode) != TRUE) { +#ifdef DEBUG + printf("Couldn't Read from CD !\n"); +#endif + + CachedDirInfo.valid = FALSE; // should we completely invalidate just because we couldnt read time? + return FALSE; + } + + tocEntryPointer = (struct dirTocEntry *)CachedDirInfo.cache; + } else { + CachedDirInfo.valid = FALSE; + return FALSE; + } + } + + // If the toc Entry is a directory ... + if (tocEntryPointer->fileProperties & 0x02) { + // Convert to our format (inc ascii name), for the check + TocEntryCopy(&localTocEntry, tocEntryPointer); + + // If it's the link to the parent directory, then give it the name ".." + if (dir_entry == 0) { + if (CachedDirInfo.path_depth != 0) { +#ifdef DEBUG + printf("First directory entry in dir, so name it '..'\n"); +#endif + + strcpy(localTocEntry.filename, ".."); + } + } + + // Check if this is the directory that we are looking for + if (strcasecmp(dirname, localTocEntry.filename) == 0) { +#ifdef DEBUG + printf("Found the matching sub-directory\n"); +#endif + + found_dir = TRUE; + + if (dir_entry == 0) { + // We've matched with the parent directory + // so truncate the pathname by one level + + if (CachedDirInfo.path_depth > 0) + CachedDirInfo.path_depth--; + + if (CachedDirInfo.path_depth == 0) { + // If at root then just clear the path to root + // (simpler than finding the colon seperator etc) + CachedDirInfo.pathname[0] = 0; + } else { + seperator = strrchr(CachedDirInfo.pathname, '/'); + + if (seperator != NULL) + *seperator = 0; + } + } else { + // otherwise append a seperator, and the matched directory + // to the pathname + strcat(CachedDirInfo.pathname, "/"); + +#ifdef DEBUG + printf("Adding '%s' to cached pathname - path depth = %d\n", dirname, CachedDirInfo.path_depth); +#endif + + strcat(CachedDirInfo.pathname, dirname); + + CachedDirInfo.path_depth++; + } + + // Exit out of the search loop + // (and find the next sub-directory, if there is one) + break; + } else { +#ifdef DEBUG + printf("Found a directory, but it doesn't match\n"); +#endif + } + } + + dir_entry++; + + } // end of cache block search loop + + + // if we've reached here, without finding the directory, then it's not there + if (found_dir != TRUE) { + CachedDirInfo.valid = FALSE; + return FALSE; + } + + // find name of next dir + dirname = strtok(NULL, "\\/"); + + CachedDirInfo.sector_start = localTocEntry.fileLBA; + CachedDirInfo.sector_num = (localTocEntry.fileSize >> 11) + ((CDVolDesc.rootToc.tocSize & 2047) != 0); + + // Cache the start of the found directory + // (used in searching if this isn't the last dir, + // or used by whatever requested the cache in the first place if it is the last dir) + CachedDirInfo.cache_offset = 0; + CachedDirInfo.cache_size = CachedDirInfo.sector_num; + + if (CachedDirInfo.cache_size > MAX_DIR_CACHE_SECTORS) + CachedDirInfo.cache_size = MAX_DIR_CACHE_SECTORS; + + if (ReadSect(CachedDirInfo.sector_start + CachedDirInfo.cache_offset, CachedDirInfo.cache_size, CachedDirInfo.cache, &cdReadMode) != TRUE) { +#ifdef DEBUG + printf("Couldn't Read from CD, trying to read %d sectors, starting at sector %d !\n", + CachedDirInfo.cache_size, CachedDirInfo.sector_start + CachedDirInfo.cache_offset); +#endif + + CachedDirInfo.valid = FALSE; // should we completely invalidate just because we couldnt read time? + return FALSE; + } + } + +// If we've got here then we found the requested directory +#ifdef DEBUG + printf("FindPath found the path\n"); +#endif + + CachedDirInfo.valid = TRUE; + return TRUE; +} + + + +// This is the getdir for use by IOP clients +// fills an array of TocEntry stucts in IOP memory +int CDVD_getdir_IOP(const char *pathname, const char *extensions, enum CDVD_getMode getMode, struct TocEntry tocEntry[], unsigned int req_entries) +{ + // TO DO + return FALSE; +} + + +// This is the getdir for use by the EE RPC client +// It DMA's entries to the specified buffer in EE memory +int CDVD_GetDir_RPC(const char *pathname, const char *extensions, enum CDVD_getMode getMode, struct TocEntry tocEntry[], unsigned int req_entries) +{ + int matched_entries; + int dir_entry; + + struct TocEntry localTocEntry; + + struct dirTocEntry *tocEntryPointer; + + int intStatus; // interrupt status - for dis/en-abling interrupts + + struct t_SifDmaTransfer dmaStruct; + int dmaID; + + dmaID = 0; + +#ifdef DEBUG + printf("RPC GetDir Request\n"); +#endif + + matched_entries = 0; + + // pre-cache the dir (and get the new pathname - in-case selected "..") + if (CDVD_Cache_Dir(pathname, CACHE_START) != TRUE) { +#ifdef DEBUG + printf("CDVD_GetDir_RPC - Call of CDVD_Cache_Dir failed\n"); +#endif + + return -1; + } + +#ifdef DEBUG + printf("requested directory is %d sectors\n", CachedDirInfo.sector_num); +#endif + + if ((getMode == CDVD_GET_DIRS_ONLY) || (getMode == CDVD_GET_FILES_AND_DIRS)) { + // Cache the start of the requested directory + if (CDVD_Cache_Dir(CachedDirInfo.pathname, CACHE_START) != TRUE) { +#ifdef DEBUG + printf("CDVD_GetDir_RPC - Call of CDVD_Cache_Dir failed\n"); +#endif + + return -1; + } + + tocEntryPointer = (struct dirTocEntry *)CachedDirInfo.cache; + + // skip the first self-referencing entry + tocEntryPointer = (struct dirTocEntry *)((u8 *)tocEntryPointer + tocEntryPointer->length); + + // skip the parent entry if this is the root + if (CachedDirInfo.path_depth == 0) + tocEntryPointer = (struct dirTocEntry *)((u8 *)tocEntryPointer + tocEntryPointer->length); + + dir_entry = 0; + + while (1) { +#ifdef DEBUG + printf("CDVD_GetDir_RPC - inside while-loop\n"); +#endif + + // parse the current cache block + for (; tocEntryPointer < (struct dirTocEntry *)(CachedDirInfo.cache + (CachedDirInfo.cache_size * 2048)); tocEntryPointer = (struct dirTocEntry *)((u8 *)tocEntryPointer + tocEntryPointer->length)) { + if (tocEntryPointer->length == 0) { + // if we have a toc entry length of zero, + // then we've either reached the end of the sector, or the end of the dir + // so point to next sector (if there is one - will be checked by next condition) + + tocEntryPointer = (struct dirTocEntry *)(CachedDirInfo.cache + (((((char *)tocEntryPointer - CachedDirInfo.cache) / 2048) + 1) * 2048)); + } + + if (tocEntryPointer >= (struct dirTocEntry *)(CachedDirInfo.cache + (CachedDirInfo.cache_size * 2048))) { + // we've reached the end of the current cache block (which may be end of entire dir + // so just break the loop + break; + } + + // Check if the current entry is a dir or a file + if (tocEntryPointer->fileProperties & 0x02) { +#ifdef DEBUG + printf("We found a dir, and we want all dirs\n"); +#endif + + // wait for any previous DMA to complete + // before over-writing localTocEntry + while (sceSifDmaStat(dmaID) >= 0) + ; + + TocEntryCopy(&localTocEntry, tocEntryPointer); + + if (dir_entry == 0) { + if (CachedDirInfo.path_depth != 0) { +#ifdef DEBUG + printf("It's the first directory entry, so name it '..'\n"); +#endif + + strcpy(localTocEntry.filename, ".."); + } + } + + // DMA localTocEntry to the address specified by tocEntry[matched_entries] + + // setup the dma struct + dmaStruct.src = &localTocEntry; + dmaStruct.dest = &tocEntry[matched_entries]; + dmaStruct.size = sizeof(struct TocEntry); + dmaStruct.attr = 0; + + // Do the DMA transfer + CpuSuspendIntr(&intStatus); + + dmaID = sceSifSetDma(&dmaStruct, 1); + + CpuResumeIntr(intStatus); + + matched_entries++; + } else // it must be a file + { +#ifdef DEBUG + printf("We found a file, but we dont want files (at least not yet)\n"); +#endif + } + + dir_entry++; + + if (matched_entries >= req_entries) // if we've filled the requested buffer + return (matched_entries); // then just return + + } // end of the current cache block + + // if there is more dir to load, then load next chunk, else finish + if ((CachedDirInfo.cache_offset + CachedDirInfo.cache_size) < CachedDirInfo.sector_num) { + if (CDVD_Cache_Dir(CachedDirInfo.pathname, CACHE_NEXT) != TRUE) { + // failed to cache next block (should return TRUE even if + // there is no more directory, as long as a CD read didnt fail + return -1; + } + } else + break; + + tocEntryPointer = (struct dirTocEntry *)CachedDirInfo.cache; + } + } + + // Next do files + if ((getMode == CDVD_GET_FILES_ONLY) || (getMode == CDVD_GET_FILES_AND_DIRS)) { + // Cache the start of the requested directory + if (CDVD_Cache_Dir(CachedDirInfo.pathname, CACHE_START) != TRUE) { +#ifdef DEBUG + printf("CDVD_GetDir_RPC - Call of CDVD_Cache_Dir failed\n"); +#endif + + return -1; + } + + tocEntryPointer = (struct dirTocEntry *)CachedDirInfo.cache; + + // skip the first self-referencing entry + tocEntryPointer = (struct dirTocEntry *)((u8 *)tocEntryPointer + tocEntryPointer->length); + + // skip the parent entry if this is the root + if (CachedDirInfo.path_depth == 0) + tocEntryPointer = (struct dirTocEntry *)((u8 *)tocEntryPointer + tocEntryPointer->length); + + dir_entry = 0; + + while (1) { +#ifdef DEBUG + printf("CDVD_GetDir_RPC - inside while-loop\n"); +#endif + + // parse the current cache block + for (; tocEntryPointer < (struct dirTocEntry *)(CachedDirInfo.cache + (CachedDirInfo.cache_size * 2048)); tocEntryPointer = (struct dirTocEntry *)((u8 *)tocEntryPointer + tocEntryPointer->length)) { + if (tocEntryPointer->length == 0) { + // if we have a toc entry length of zero, + // then we've either reached the end of the sector, or the end of the dir + // so point to next sector (if there is one - will be checked by next condition) + + tocEntryPointer = (struct dirTocEntry *)(CachedDirInfo.cache + (((((char *)tocEntryPointer - CachedDirInfo.cache) / 2048) + 1) * 2048)); + } + + if (tocEntryPointer >= (struct dirTocEntry *)(CachedDirInfo.cache + (CachedDirInfo.cache_size * 2048))) { + // we've reached the end of the current cache block (which may be end of entire dir + // so just break the loop + break; + } + + // Check if the current entry is a dir or a file + if (tocEntryPointer->fileProperties & 0x02) { +#ifdef DEBUG + printf("We don't want files now\n"); +#endif + } else // it must be a file + { + // wait for any previous DMA to complete + // before over-writing localTocEntry + while (sceSifDmaStat(dmaID) >= 0) + ; + + TocEntryCopy(&localTocEntry, tocEntryPointer); + + if (strlen(extensions) > 0) { + // check if the file matches the extension list + if (TocEntryCompare(localTocEntry.filename, extensions) == TRUE) { +#ifdef DEBUG + printf("We found a file that matches the requested extension list\n"); +#endif + + // DMA localTocEntry to the address specified by tocEntry[matched_entries] + + // setup the dma struct + dmaStruct.src = &localTocEntry; + dmaStruct.dest = &tocEntry[matched_entries]; + dmaStruct.size = sizeof(struct TocEntry); + dmaStruct.attr = 0; + + // Do the DMA transfer + CpuSuspendIntr(&intStatus); + + dmaID = sceSifSetDma(&dmaStruct, 1); + + CpuResumeIntr(intStatus); + + matched_entries++; + } else { +#ifdef DEBUG + printf("We found a file, but it didnt match the requested extension list\n"); +#endif + } + } else // no extension list to match against + { +#ifdef DEBUG + printf("We found a file, and there is not extension list to match against\n"); +#endif + + // DMA localTocEntry to the address specified by tocEntry[matched_entries] + + // setup the dma struct + dmaStruct.src = &localTocEntry; + dmaStruct.dest = &tocEntry[matched_entries]; + dmaStruct.size = sizeof(struct TocEntry); + dmaStruct.attr = 0; + + // Do the DMA transfer + CpuSuspendIntr(&intStatus); + + dmaID = sceSifSetDma(&dmaStruct, 1); + + CpuResumeIntr(intStatus); + + matched_entries++; + } + } + + dir_entry++; + + if (matched_entries >= req_entries) // if we've filled the requested buffer + return (matched_entries); // then just return + + } // end of the current cache block + + + // if there is more dir to load, then load next chunk, else finish + if ((CachedDirInfo.cache_offset + CachedDirInfo.cache_size) < CachedDirInfo.sector_num) { + if (CDVD_Cache_Dir(CachedDirInfo.pathname, CACHE_NEXT) != TRUE) { + // failed to cache next block (should return TRUE even if + // there is no more directory, as long as a CD read didnt fail + return -1; + } + } else + break; + + tocEntryPointer = (struct dirTocEntry *)CachedDirInfo.cache; + } + } + // reached the end of the dir, before filling up the requested entries + + return (matched_entries); +} + +int CdFlushCache(void) +{ + strcpy(CachedDirInfo.pathname, ""); // The pathname of the cached directory + CachedDirInfo.valid = FALSE; // Cache is not valid + CachedDirInfo.path_depth = 0; // 0 = root) + CachedDirInfo.sector_start = 0; // The start sector (LBA) of the cached directory + CachedDirInfo.sector_num = 0; // The total size of the directory (in sectors) + CachedDirInfo.cache_offset = 0; // The offset from sector_start of the cached area + CachedDirInfo.cache_size = 0; // The size of the cached directory area (in sectors) + + return TRUE; +} + +unsigned int CdGetSize(void) +{ + if (CDVD_GetVolumeDescriptor() != TRUE) + return TRUE; + + return CDVolDesc.volSize; +} + +void *CDVDRpc_FlushCache() +{ + CdFlushCache(); + + return NULL; +} + + +void *CDVDRpc_Stop() +{ + if (isValidDisc()) { + sceCdStop(); + sceCdSync(0); + } + + return NULL; +} + +// Send: Offset 0 = mode. Size = int +// Return: Offset 0 = traycnt. Size = int +void *CDVDRpc_TrayReq(unsigned int *sbuff) +{ + int ret; + + sceCdTrayReq(sbuff[0], (int *)&ret); + + sbuff[0] = ret; + return sbuff; +} + +// Send: Offset 0 = mode +// Return: Offset 0 = ret val (cd status) +void *CDVDRpc_DiskReady(unsigned int *sbuff) +{ + int ret; + + if (isValidDisc()) + ret = sceCdDiskReady(sbuff[0]); + else + ret = -1; + + sbuff[0] = ret; + return sbuff; +} + +// Send: Offset 0 = filename string (1024 bytes) +// Return: Offset 0 = ret val (true/false). Size = int +// Offset 1024 = start of TocEntry structure +void *CDVDRpc_FindFile(unsigned int *sbuff) +{ + int ret; + + ret = CDVD_findfile((char *)&sbuff[0], (struct TocEntry *)&sbuff[1024 / 4]); + + sbuff[0] = ret; + + return sbuff; +} + +// Send: Offset 0 = filename string (1024 bytes) +// Send: Offset 1024 = extension string (128 bytes) +// Send: Offset 1152 = CDVD_getMode +// Send: Offset 1156 = pointer to array of TocEntry structures in EE mem +// Send: Offset 1160 = requested number of entries + +// Return: Offset 0 = ret val (number of matched entries). Size = int +// Return: Offset 4 = updated pathname (for if path selected = ".." +void *CDVDRpc_Getdir(unsigned int *sbuff) +{ + int ret; + + ret = CDVD_GetDir_RPC( + (char *)&sbuff[0 / 4], // pathname string + (char *)&sbuff[1024 / 4], // extension string + sbuff[1152 / 4], // CDVD_getMode + (struct TocEntry *)sbuff[1156 / 4], // pointer to array of TocEntry structures in EE mem + sbuff[1160 / 4] // requested number of entries + ); + + sbuff[0] = ret; + strcpy((char *)&sbuff[1], CachedDirInfo.pathname); + return sbuff; +} + +void *CDVDRpc_GetSize(unsigned int *sbuff) +{ + sbuff[0] = CdGetSize(); + return sbuff; +} + +/************************************************* +* The functions below are for internal use only, * +* and are not to be exported * +*************************************************/ + +void CDVD_Thread(void *param) +{ +#ifdef DEBUG + printf("CDVD: RPC Initialize\n"); +#endif + + sceSifInitRpc(0); + + // 0x4800 bytes for TocEntry structures (can fit 128 of them) + // 0x400 bytes for the filename string + buffer = AllocSysMemory(0, 0x4C00, NULL); + if (buffer == NULL) { +#ifdef DEBUG + printf("Failed to allocate memory for RPC buffer!\n"); +#endif + + SleepThread(); + } + + sceSifSetRpcQueue(&qd, GetThreadId()); + sceSifRegisterRpc(&sd0, CDVD_IRX, CDVD_rpc_server, (void *)buffer, 0, 0, &qd); + sceSifRpcLoop(&qd); +} + +void *CDVD_rpc_server(int fno, void *data, int size) +{ + + switch (fno) { + case CDVD_FINDFILE: + return CDVDRpc_FindFile((unsigned *)data); + case CDVD_GETDIR: + return CDVDRpc_Getdir((unsigned *)data); + case CDVD_STOP: + return CDVDRpc_Stop(); + case CDVD_TRAYREQ: + return CDVDRpc_TrayReq((unsigned *)data); + case CDVD_DISKREADY: + return CDVDRpc_DiskReady((unsigned *)data); + case CDVD_FLUSHCACHE: + return CDVDRpc_FlushCache(); + } + + return NULL; +} + +void _splitpath(const char *constpath, char *dir, char *fname) +{ + // 255 char max path-length is an ISO9660 restriction + // we must change this for Joliet or relaxed iso restriction support + static char pathcopy[1024 + 1]; + + char *slash; + + strncpy(pathcopy, constpath, 1024); + + slash = strrchr(pathcopy, '/'); + + // if the path doesn't contain a '/' then look for a '\' + if (!slash) + slash = strrchr(pathcopy, (int)'\\'); + + // if a slash was found + if (slash != NULL) { + // null terminate the path + slash[0] = 0; + // and copy the path into 'dir' + strncpy(dir, pathcopy, 1024); + dir[255] = 0; + + // copy the filename into 'fname' + strncpy(fname, slash + 1, 128); + fname[128] = 0; + } else { + dir[0] = 0; + + strncpy(fname, pathcopy, 128); + fname[128] = 0; + } +} + +// Copy a TOC Entry from the CD native format to our tidier format +void TocEntryCopy(struct TocEntry *tocEntry, struct dirTocEntry *internalTocEntry) +{ + int i; + int filenamelen; + + tocEntry->fileSize = internalTocEntry->fileSize; + tocEntry->fileLBA = internalTocEntry->fileLBA; + tocEntry->fileProperties = internalTocEntry->fileProperties; + + if (CDVolDesc.filesystemType == 2) { + // This is a Joliet Filesystem, so use Unicode to ISO string copy + filenamelen = internalTocEntry->filenameLength / 2; + + for (i = 0; i < filenamelen; i++) + tocEntry->filename[i] = internalTocEntry->filename[(i << 1) + 1]; + } else { + filenamelen = internalTocEntry->filenameLength; + + // use normal string copy + strncpy(tocEntry->filename, internalTocEntry->filename, 128); + } + + tocEntry->filename[filenamelen] = 0; + + if (!(tocEntry->fileProperties & 0x02)) { + // strip the ;1 from the filename (if it's there) + strtok(tocEntry->filename, ";"); + } +} + +// Check if a TOC Entry matches our extension list +int TocEntryCompare(char *filename, const char *extensions) +{ + static char ext_list[129]; + + char *token; + + char *ext_point; + + strncpy(ext_list, extensions, 128); + ext_list[128] = 0; + + token = strtok(ext_list, " ,"); + while (token != NULL) { + // if 'token' matches extension of 'filename' + // then return a match + ext_point = strrchr(filename, '.'); + + if (strcasecmp(ext_point, token) == 0) + return (TRUE); + + /* Get next token: */ + token = strtok(NULL, " ,"); + } + + // If not match found then return FALSE + return (FALSE); +} + +// Used in findfile +//int tolower(int c); +int strcasecmp(const char *s1, const char *s2) +{ + while (*s1 != '\0' && tolower(*s1) == tolower(*s2)) { + s1++; + s2++; + } + + return tolower(*(unsigned char *)s1) - tolower(*(unsigned char *)s2); +} + +int strncasecmp(const char *s1, const char *s2, int limit) +{ + int i; + + for (i = 0; i < limit; i++) { + if (*s1 == '\0') + return tolower(*(unsigned char *)s1) - tolower(*(unsigned char *)s2); + + if (tolower(*s1) != tolower(*s2)) + return tolower(*(unsigned char *)s1) - tolower(*(unsigned char *)s2); + + s1++; + s2++; + } + + return 0; +} + +enum PathMatch ComparePath(const char *path) +{ + int length; + int i; + + length = strlen(CachedDirInfo.pathname); + + for (i = 0; i < length; i++) { + // check if character matches + if (path[i] != CachedDirInfo.pathname[i]) { + // if not, then is it just because of different path seperator ? + if ((path[i] == '/') || (path[i] == '\\')) { + if ((CachedDirInfo.pathname[i] == '/') || (CachedDirInfo.pathname[i] == '\\')) { + continue; + } + } + + // if the characters don't match for any other reason then report a failure + return NOT_MATCH; + } + } + + // Reached the end of the Cached pathname + + // if requested path is same length, then report exact match + if (path[length] == 0) + return MATCH; + + // if requested path is longer, and next char is a dir seperator + // then report sub-dir match + if ((path[length] == '/') || (path[length] == '\\')) + return SUBDIR; + else + return NOT_MATCH; +} diff --git a/ps2/libcdvd/iop/cdvd_iop.h b/ps2/libcdvd/iop/cdvd_iop.h new file mode 100644 index 0000000000..989ed12cef --- /dev/null +++ b/ps2/libcdvd/iop/cdvd_iop.h @@ -0,0 +1,84 @@ +#ifndef _CDVD_IOP_H +#define _CDVD_IOP_H + +#include "../common/cdvd.h" + +// Macros for READ Data pattan +#define CdSecS2048 0 // sector size 2048 +#define CdSecS2328 1 // sector size 2328 +#define CdSecS2340 2 // sector size 2340 + +// Macros for Spindle control +#define CdSpinMax 0 +#define CdSpinNom 1 // Starts reading data at maximum rotational velocity and if a read error occurs, the rotational velocity is reduced. +#define CdSpinStm 0 // Recommended stream rotation speed. + +typedef struct +{ + u8 stat; // 0: normal. Any other: error + u8 second; // second (BCD value) + u8 minute; // minute (BCD value) + u8 hour; // hour (BCD value) + u8 week; // week (BCD value) + u8 day; // day (BCD value) + u8 month; // month (BCD value) + u8 year; // year (BCD value) +} CdCLOCK; + +typedef struct +{ + u32 lsn; // Logical sector number of file + u32 size; // File size (in bytes) + char name[16]; // Filename + u8 date[8]; // 1th: Seconds + // 2th: Minutes + // 3th: Hours + // 4th: Date + // 5th: Month + // 6th 7th: Year (4 digits) +} CdlFILE; + +typedef struct +{ + u8 minute; // Minutes + u8 second; // Seconds + u8 sector; // Sector + u8 track; // Track number +} CdlLOCCD; + +typedef struct +{ + u8 trycount; // Read try count (No. of error retries + 1) (0 - 255) + u8 spindlctrl; // SCECdSpinStm: Recommended stream rotation speed. + // SCECdSpinNom: Starts reading data at maximum rotational velocity and if a read error occurs, the rotational velocity is reduced. + u8 datapattern; // SCECdSecS2048: Data size 2048 bytes + // SCECdSecS2328: 2328 bytes + // SCECdSecS2340: 2340 bytes + u8 pad; // Padding data produced by alignment. +} CdRMode; + + +int CdBreak(void); +int CdCallback(void (*func)()); +int CdDiskReady(int mode); +int CdGetDiskType(void); +int CdGetError(void); +u32 CdGetReadPos(void); +int CdGetToc(u8 *toc); +int CdInit(int init_mode); +CdlLOCCD *CdIntToPos(int i, CdlLOCCD *p); +int CdPause(void); +int CdPosToInt(CdlLOCCD *p); +int CdRead(u32 lsn, u32 sectors, void *buf, CdRMode *mode); +int CdReadClock(CdCLOCK *rtc); +int CdSearchFile(CdlFILE *fp, const char *name); +int CdSeek(u32 lsn); +int CdStandby(void); +int CdStatus(void); +int CdStop(void); +int CdSync(int mode); +int CdTrayReq(int mode, u32 *traycnt); +int CdFlushCache(void); +unsigned int CdGetSize(void); + +#endif // _CDVD_H diff --git a/ps2/libcdvd/iop/imports.lst b/ps2/libcdvd/iop/imports.lst new file mode 100644 index 0000000000..f47423c148 --- /dev/null +++ b/ps2/libcdvd/iop/imports.lst @@ -0,0 +1,62 @@ +cdvdman_IMPORTS_start +I_sceCdInit +I_sceCdGetError +I_sceCdRead +I_sceCdStop +I_sceCdSync +I_sceCdDiskReady +I_sceCdGetDiskType +I_sceCdTrayReq +cdvdman_IMPORTS_end + +intrman_IMPORTS_start +I_CpuSuspendIntr +I_CpuResumeIntr +intrman_IMPORTS_end + +ioman_IMPORTS_start +I_AddDrv +I_DelDrv +ioman_IMPORTS_end + +sifcmd_IMPORTS_start +I_sceSifInitRpc +I_sceSifSetRpcQueue +I_sceSifRegisterRpc +I_sceSifRpcLoop +sifcmd_IMPORTS_end + +sifman_IMPORTS_start +I_sceSifSetDma +I_sceSifDmaStat +sifman_IMPORTS_end + +stdio_IMPORTS_start +I_printf +I_puts +stdio_IMPORTS_end + +sysclib_IMPORTS_start +I_tolower +I_strcpy +I_strncpy +I_strncmp +I_strtok +I_strrchr +I_strcat +I_strlen +I_memset +I_memcpy +I_memcmp +sysclib_IMPORTS_end + +sysmem_IMPORTS_start +I_AllocSysMemory +sysmem_IMPORTS_end + +thbase_IMPORTS_start +I_GetThreadId +I_CreateThread +I_StartThread +I_SleepThread +thbase_IMPORTS_end diff --git a/ps2/libcdvd/iop/irx_imports.h b/ps2/libcdvd/iop/irx_imports.h new file mode 100644 index 0000000000..4048b3d831 --- /dev/null +++ b/ps2/libcdvd/iop/irx_imports.h @@ -0,0 +1,9 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include diff --git a/ps2/libcdvd/license.txt b/ps2/libcdvd/license.txt new file mode 100644 index 0000000000..bd0a0cb71d --- /dev/null +++ b/ps2/libcdvd/license.txt @@ -0,0 +1,45 @@ +Copyright (c) 2002, A.Lee & Nicholas Van Veen +All rights reserved. + +Redistribution and use of this software, in source and binary forms, with or +without modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. You are granted a license to use this software for academic, research and + non-commercial purposes only. + +4. The copyright holder imposes no restrictions on any code developed using + this software. However, the copyright holder retains a non-exclusive + royalty-free license to any modifications to the distribution made by the + licensee. + +5. Any licensee wishing to make commercial use of this software should contact + the copyright holder to execute the appropriate license for such commercial + use. Commercial use includes: + + - Integration of all or part of the source code into a product for sale + or commercial license by or on behalf of Licensee to third parties, or + + - Distribution of the binary code or source code to third parties that + need it to utilize a commercial product sold or licensed by or on + behalf of Licensee. + + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. + diff --git a/qb/config.libs.sh b/qb/config.libs.sh index 56090cb6b7..997081a894 100644 --- a/qb/config.libs.sh +++ b/qb/config.libs.sh @@ -222,7 +222,7 @@ else fi check_pkgconf RSOUND rsound 1.1 -check_pkgconf ROAR libroar +check_pkgconf ROAR libroar 1.0.12 check_val '' JACK -ljack '' jack 0.120.1 '' false check_val '' PULSE -lpulse '' libpulse '' '' false check_val '' SDL -lSDL SDL sdl 1.2.10 '' false @@ -405,8 +405,6 @@ if [ "$HAVE_KMS" != "no" ]; then fi fi -check_val '' LIBXML2 -lxml2 libxml2 libxml-2.0 '' '' false - if [ "$HAVE_EGL" = "yes" ]; then if [ "$HAVE_OPENGLES" != "no" ]; then if [ "$OPENGLES_LIBS" ] || [ "$OPENGLES_CFLAGS" ]; then @@ -509,11 +507,6 @@ if [ "$HAVE_MENU" != 'no' ]; then fi fi -if [ "$HAVE_MENU_WIDGETS" != 'no' ]; then - die : 'Notice: Menu widgets are not fully implemented and should not be enabled' \ - 'Please do not report any bug concerning widgets until this message is removed' -fi - check_macro NEON __ARM_NEON__ add_define MAKEFILE OS "$OS" diff --git a/qb/config.params.sh b/qb/config.params.sh index 69e3bc1faa..8bb4d964f1 100644 --- a/qb/config.params.sh +++ b/qb/config.params.sh @@ -80,7 +80,6 @@ HAVE_EGL=auto # EGL context support HAVE_VG=auto # OpenVG support HAVE_CG=auto # Cg shader support HAVE_HLSL=no # HLSL9 shader support (for Direct3D9) -HAVE_LIBXML2=auto # libxml2 support HAVE_BUILTINZLIB=no # Bake in zlib HAVE_ZLIB=auto # zlib support (ZIP extract, PNG decoding/encoding) HAVE_ALSA=auto # ALSA support diff --git a/record/drivers/record_ffmpeg.c b/record/drivers/record_ffmpeg.c index 851c0975fb..56a8a6bfa2 100644 --- a/record/drivers/record_ffmpeg.c +++ b/record/drivers/record_ffmpeg.c @@ -703,7 +703,7 @@ static bool ffmpeg_init_config_common(struct ff_config_param *params, unsigned p params->scale_factor = 1; strlcpy(params->format, "webm", sizeof(params->format)); } - else if (preset <= RECORD_CONFIG_TYPE_STREAMING_LOW_QUALITY) + else if (preset < RECORD_CONFIG_TYPE_STREAMING_LOW_QUALITY) { params->scale_factor = 1; strlcpy(params->format, "gif", sizeof(params->format)); diff --git a/retroarch.c b/retroarch.c index 91347ea49a..cd54d12c61 100644 --- a/retroarch.c +++ b/retroarch.c @@ -44,6 +44,7 @@ #include #include +#include #include #include