diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000000..00a283e2ad --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,22 @@ +## Guidelines + +1. Rebase before opening a pull request +2. If you are sending several unrelated fixes or features, use a branch and a separate pull request for each +3. If possible try squashing everything in a single commit. This is particularly beneficial in the case of feature merges since it allows easy bisecting when a problem arises + + +## Description + +[Description of the pull request, detail any issues you are fixing or any features you are implementing] + +## Related Issues + +[Any issues this pull request may be addressing] + +## Related Pull Requests + +[Any other PRs from related repositories that might be needed for this pull request to work] + +## Reviewers + +[If possible @mention all the people that should review your pull request] diff --git a/.gitignore b/.gitignore index 1a100e9fea..ad6ea6ab19 100644 --- a/.gitignore +++ b/.gitignore @@ -95,8 +95,6 @@ pkg/apple/iOS/modules/ obj-unix/ .vagrant/ -.MAKEFILE_DEFINES -.CONFIG_DEFINES /pkg/msvc/Release Cg/*.exe /pkg/msvc/Release Cg/*.iobj /pkg/msvc/Release Cg/*.ipdb diff --git a/.travis.yml b/.travis.yml index 73b48fb889..a67a17b635 100644 --- a/.travis.yml +++ b/.travis.yml @@ -55,6 +55,7 @@ addons: - libsdl-image1.2-dev - libsdl-mixer1.2-dev - libsdl-ttf2.0-dev + - libusb-1.0-0-dev coverity_scan: project: name: "RetroArch" diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000000..53837e538f --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,28 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "MINGW64 (MSYS2) debug", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/retroarch.exe", + "args": [], + "stopAtEntry": false, + "cwd": "${workspaceFolder}", + "environment": [], + "externalConsole": true, + "MIMode": "gdb", + "miDebuggerPath": "c:\\msys64\\mingw64\\bin\\gdb.exe", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ] + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000..1fdc2bf309 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,12 @@ +{ + "terminal.integrated.shell.windows": "C:\\msys64\\usr\\bin\\bash.exe", + "terminal.integrated.env.windows": { + "PATH": "/mingw64/lib/ccache/bin:/mingw64/lib/ccache/bin:/mingw64/lib/ccache/bin:/mingw64/bin:/usr/local/bin:/usr/bin:/bin:$PATH", + "MSYSTEM": "MINGW64", + }, + "terminal.integrated.cursorBlinking": true, + + "editor.tabSize": 3, + "editor.renderWhitespace": "all", + "editor.insertSpaces": true, +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000000..496810ecfa --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,91 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "taskName": "Build", + "type": "shell", + + "group": { + "kind": "build", + "isDefault": true }, + + "command": "./configure; make -j2", + "options": { + "shell": { + "executable": "C:\\msys64\\usr\\bin\\bash.exe", + "args": [ + "-c" + ] + } + } + } + { + "taskName": "Build with debugging symbols", + "type": "shell", + + "group": "build", + + "command": "./configure; DEBUG=1 make -j2", + "options": { + "shell": { + "executable": "C:\\msys64\\usr\\bin\\bash.exe", + "args": [ + "-c" + ] + } + } + } + { + "taskName": "Build without reconfiguring", + "type": "shell", + + "group": "build", + + "command": "make -j2", + "options": { + "shell": { + "executable": "C:\\msys64\\usr\\bin\\bash.exe", + "args": [ + "-c" + ] + } + } + } + { + "taskName": "Clean", + "type": "shell", + + "group": "build", + + "command": "make clean", + "options": { + "shell": { + "executable": "C:\\msys64\\usr\\bin\\bash.exe", + "args": [ + "-c" + ] + } + } + } + { + "taskName": "Start", + "type": "shell", + + "group": { + "kind": "test", + "isDefault": true }, + + "command": "./retroarch -v", + "options": { + "shell": { + "executable": "C:\\msys64\\usr\\bin\\bash.exe", + "args": [ + "-c" + ] + } + } + } + ] +} \ No newline at end of file diff --git a/CHANGES.md b/CHANGES.md index 881e7e832c..17bb6ec41b 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,14 @@ -# 1.6.8 (future) +# 1.7.0 (future) +- CHEEVOS: Add badges + +# 1.6.9 +- COMMON: Small memory leak. +- NETPLAY: Fix network command only working once. + +# 1.6.8 - Audio: Fix the Audio DSP picker +- CHEEVOS: Add support for Atari Lynx cheevos. +- CHEEVOS: Add support for RetroAchievements Leaderboards. - GUI: (MaterialUI) Fix crash that happened on context reset with Vulkan. - GUI: (MaterialUI) Skip querying and drawing items that are not visible; Cache content height and bbox calculation. - GUI: (MaterialUI) Fix entry box highlight calculation. @@ -10,12 +19,15 @@ - GUI: Add menu option for OSD text color. - GUI: Add menu option to remove frame count from OSD. - GUI: Allow wraparound of int/float settings when pressing the left key +- INPUT/LIBRETRO: Add support for more mouse buttons (buttons 4/5) +- INPUT/LIBRETRO: Add support for analog buttons - INPUT: Always show the controls menu even if descriptors are not set - INPUT: Fix input descriptors not being set on cores that don't implement the controllers interface - INPUT: Apply descriptors only for the amount of cores the core supports - INPUT: Implement keyboard to gamepad input remapping (limited to one gamepad device for now) - INPUT: Fix absolute mouse move handling on the winraw driver - INPUT: Ignore keyboard input if window is not active on udev driver +- INPUT: Sanitize the filenames of autoconfig profiles before saving - LOBBIES: Fix crash on navigating left / right from the lobby menu - LOCALIZATION: Update Dutch translation - LOCALIZATION: Update Italian translation. @@ -26,6 +38,8 @@ - LINUX/PI: Broadcom VC4: Add Videocore config option - LINUX/UDEV: Fix - RetroArch reads keyboard input when not focused with the udev input driver. - NETPLAY: Fix disconnection not fully deinitializing Netplay. +- NETPLAY: Fix lan rooms when there is more than one room +- NETPLAY: Fix lan rooms on systems where all addresses are treated as IPv6 - COMMON: Fix clear/free loop conditionals in playlists. - WINDOWS/GDI: Fix flickering of text. - WINDOWS/GDI: Fix graphics corruption on Windows 98 @@ -42,6 +56,7 @@ - SCANNER: Support CHD files. - SCANNER: Support Gamecube ISO scanning. - SCANNER: Use primary data track of disc images for CRC lookups rather than cue files. This is slower but finds matches more reliably, and is necessary for CHD files to work at all. Update your databases! +- SCANNER: Fall back on looking inside archives when matching MAME/FBA content (most recent cores only). If you had difficulty with content being detected before, you may have better luck now. Update your databases and core info! # 1.6.7 - SCANNER: Fix directory scanning. diff --git a/Makefile b/Makefile index 2a5e3c7676..8e70dd430d 100644 --- a/Makefile +++ b/Makefile @@ -119,10 +119,16 @@ endif RARCH_OBJ := $(addprefix $(OBJDIR)/,$(OBJ)) +ifneq ($(X86),) + CFLAGS += -m32 + CXXLAGS += -m32 + LDFLAGS += -m32 +endif + ifneq ($(SANITIZER),) - CFLAGS := -fsanitize=$(SANITIZER) $(CFLAGS) - CXXFLAGS := -fsanitize=$(SANITIZER) $(CXXFLAGS) - LDFLAGS := -fsanitize=$(SANITIZER) $(LDFLAGS) + CFLAGS := -fsanitize=$(SANITIZER) $(CFLAGS) + CXXFLAGS := -fsanitize=$(SANITIZER) $(CXXFLAGS) + LDFLAGS := -fsanitize=$(SANITIZER) $(LDFLAGS) endif ifneq ($(findstring $(GPERFTOOLS),profiler),) @@ -204,7 +210,7 @@ install: $(TARGET) rm -rf $(DESTDIR)$(ASSETS_DIR)/retroarch/assets/xmb/monochrome/src; \ rm -rf $(DESTDIR)$(ASSETS_DIR)/retroarch/assets/xmb/retroactive/src; \ rm -rf $(DESTDIR)$(ASSETS_DIR)/retroarch/assets/xmb/neoactive/src; \ - rm -rf $(DESTDIR)$(ASSETS_DIR)/retroarch/assets/xmb/retroactive_marked/src; \ + rm -rf $(DESTDIR)$(ASSETS_DIR)/retroarch/assets/xmb/retrosystem/src; \ rm -rf $(DESTDIR)$(ASSETS_DIR)/retroarch/assets/xmb/dot-art/src; \ echo "Asset copying done."; \ fi diff --git a/Makefile.common b/Makefile.common index 0601c56ee2..58158f33aa 100644 --- a/Makefile.common +++ b/Makefile.common @@ -52,10 +52,6 @@ ifeq ($(HAVE_VITA2D), 1) DEFINES += -DHAVE_VITA2D endif -ifeq ($(HAVE_FBO), 1) - DEFINES += -DHAVE_FBO -endif - ifeq ($(HAVE_DYLIB), 1) DEFINES += -DHAVE_DYLIB endif @@ -188,6 +184,10 @@ OBJ += frontend/frontend.o \ setting_list.o \ list_special.o \ $(LIBRETRO_COMM_DIR)/file/nbio/nbio_stdio.o \ + $(LIBRETRO_COMM_DIR)/file/nbio/nbio_linux.o \ + $(LIBRETRO_COMM_DIR)/file/nbio/nbio_unixmmap.o \ + $(LIBRETRO_COMM_DIR)/file/nbio/nbio_windowsmmap.o \ + $(LIBRETRO_COMM_DIR)/file/nbio/nbio_intf.o \ $(LIBRETRO_COMM_DIR)/file/file_path.o \ file_path_special.o \ file_path_str.o \ @@ -322,7 +322,7 @@ endif endif ifeq ($(HAVE_SSA),1) -LIBS += -lass +LIBS += $(SSA_LIBS) endif # LibretroDB @@ -601,7 +601,7 @@ ifeq ($(HAVE_AL), 1) ifeq ($(OSX),1) LIBS += -framework OpenAL else - LIBS += -lopenal + LIBS += $(AL_LIBS) endif endif @@ -812,7 +812,7 @@ ifeq ($(HAVE_THREADS), 1) audio/audio_thread_wrapper.o DEFINES += -DHAVE_THREADS ifeq ($(findstring Haiku,$(OS)),) - LIBS += -lpthread + LIBS += $(THREADS_LIBS) endif endif @@ -916,7 +916,11 @@ ifeq ($(HAVE_THREADS), 1) ifeq ($(HAVE_HID), 1) DEFINES += -DHAVE_LIBUSB OBJ += input/drivers_hid/libusb_hid.o - LIBS += -lusb-1.0 + ifneq ($(findstring BSD,$(OS)),) + LIBS += -lusb + else + LIBS += -lusb-1.0 + endif endif endif endif @@ -1066,7 +1070,7 @@ endif else DEFINES += -DHAVE_GL_SYNC OBJ += $(LIBRETRO_COMM_DIR)/glsym/glsym_gl.o - GL_LIBS := -lGL + GL_LIBS := $(OPENGL_LIBS) ifeq ($(OSX), 1) GL_LIBS := -framework OpenGL OBJ += gfx/drivers_context/cgl_ctx.o @@ -1480,6 +1484,7 @@ ifeq ($(HAVE_NETWORKING), 1) OBJ += cheevos/cheevos.o \ cheevos/var.o \ cheevos/cond.o \ + cheevos/badges.o \ $(LIBRETRO_COMM_DIR)/utils/md5.o endif @@ -1511,7 +1516,7 @@ ifeq ($(HAVE_NETWORKING), 1) $(DEPS_DIR)/miniupnpc/minixml.o \ $(DEPS_DIR)/miniupnpc/minisoap.o else - LIBS += -lminiupnpc + LIBS += $(MINIUPNPC_LIBS) endif endif endif @@ -1526,7 +1531,7 @@ ifneq ($(findstring Win32,$(OS)),) gfx/drivers_font/gdi_font.o \ menu/drivers_display/menu_display_gdi.o - LIBS += -lmsimg32 + LIBS += -lmsimg32 -lhid -lsetupapi endif ifeq ($(HAVE_AVFOUNDATION), 1) diff --git a/Makefile.ctr b/Makefile.ctr index 308c5bf62f..c277d3df77 100644 --- a/Makefile.ctr +++ b/Makefile.ctr @@ -14,16 +14,16 @@ APP_DESCRIPTION = Retroarch 3DS APP_AUTHOR = Team Libretro APP_PRODUCT_CODE = RETROARCH-3DS APP_UNIQUE_ID = 0xBAC00 -APP_ICON = ctr/assets/default.png -APP_BANNER = ctr/assets/libretro_banner.png -APP_AUDIO = ctr/assets/silent.wav -APP_RSF = ctr/tools/template.rsf +APP_ICON = pkg/ctr/assets/default.png +APP_BANNER = pkg/ctr/assets/libretro_banner.png +APP_AUDIO = pkg/ctr/assets/silent.wav +APP_RSF = pkg/ctr/tools/template.rsf APP_SYSTEM_MODE = 64MB APP_SYSTEM_MODE_EXT = 124MB APP_BIG_TEXT_SECTION = 0 APP_USE_SVCHAX = 0 -include ctr/Makefile.cores +include pkg/ctr/Makefile.cores OBJ := OBJ += gfx/drivers/ctr_shaders/ctr_sprite.o @@ -190,14 +190,14 @@ NM := $(PREFIX)nm LD := $(CXX) ifneq ($(findstring Linux,$(shell uname -a)),) - MAKEROM = ctr/tools/makerom-linux - BANNERTOOL = ctr/tools/bannertool-linux + MAKEROM = pkg/ctr/tools/makerom-linux + BANNERTOOL = pkg/ctr/tools/bannertool-linux else ifneq ($(findstring Darwin,$(shell uname -a)),) - MAKEROM = ctr/tools/makerom-mac - BANNERTOOL = ctr/tools/bannertool-mac + MAKEROM = pkg/ctr/tools/makerom-mac + BANNERTOOL = pkg/ctr/tools/bannertool-mac else - MAKEROM = ctr/tools/makerom.exe - BANNERTOOL = ctr/tools/bannertool.exe + MAKEROM = pkg/ctr/tools/makerom.exe + BANNERTOOL = pkg/ctr/tools/bannertool.exe endif %.o: %.vsh %.gsh @@ -228,15 +228,15 @@ endif %.vsh: $(TARGET).smdh: $(APP_ICON) - smdhtool --create "$(APP_TITLE)" "$(APP_DESCRIPTION)" "$(APP_AUTHOR)" $(APP_ICON) $@ + $(DEVKITPRO)/devkitARM/bin/smdhtool --create "$(APP_TITLE)" "$(APP_DESCRIPTION)" "$(APP_AUTHOR)" $(APP_ICON) $@ $(TARGET).3dsx: $(TARGET).elf ifeq ($(APP_BIG_TEXT_SECTION), 1) - cp ctr/big_text_section.xml $(TARGET).xml + cp pkg/ctr/big_text_section.xml $(TARGET).xml else rm -f $(TARGET).xml endif - -3dsxtool $< $@ $(_3DSXFLAGS) + $(DEVKITPRO)/devkitARM/bin/3dsxtool $< $@ $(_3DSXFLAGS) $(TARGET).elf: ctr/3dsx_custom_crt0.o $(LD) $(LDFLAGS) $(OBJ) $(LIBDIRS) $(LIBS) -o $@ diff --git a/Makefile.ctr.salamander b/Makefile.ctr.salamander index b53a31ff43..930b5badc7 100644 --- a/Makefile.ctr.salamander +++ b/Makefile.ctr.salamander @@ -11,10 +11,10 @@ APP_DESCRIPTION = Retroarch 3DS APP_AUTHOR = Team Libretro APP_PRODUCT_CODE = RETROARCH-3DS APP_UNIQUE_ID = 0xBAC00 -APP_ICON = ctr/assets/default.png -APP_BANNER = ctr/assets/libretro_banner.png -APP_AUDIO = ctr/assets/silent.wav -APP_RSF = ctr/tools/template.rsf +APP_ICON = pkg/ctr/assets/default.png +APP_BANNER = pkg/ctr/assets/libretro_banner.png +APP_AUDIO = pkg/ctr/assets/silent.wav +APP_RSF = pkg/ctr/tools/template.rsf APP_SYSTEM_MODE = 64MB APP_SYSTEM_MODE_EXT = 124MB @@ -44,7 +44,7 @@ ifeq ($(strip $(DEVKITPRO)),) endif ifeq ($(strip $(CTRULIB)),) - CTRULIB = $(DEVKITPRO)/ctrulib + CTRULIB = $(DEVKITPRO)/libctru endif APP_TITLE := $(shell echo "$(APP_TITLE)" | cut -c1-128) @@ -122,14 +122,14 @@ NM := $(PREFIX)nm LD := $(CXX) ifneq ($(findstring Linux,$(shell uname -a)),) - MAKEROM = ctr/tools/makerom-linux - BANNERTOOL = ctr/tools/bannertool-linux + MAKEROM = pkg/ctr/tools/makerom-linux + BANNERTOOL = pkg/ctr/tools/bannertool-linux else ifneq ($(findstring Darwin,$(shell uname -a)),) - MAKEROM = ctr/tools/makerom-mac - BANNERTOOL = ctr/tools/bannertool-mac + MAKEROM = pkg/ctr/tools/makerom-mac + BANNERTOOL = pkg/ctr/tools/bannertool-mac else - MAKEROM = ctr/tools/makerom.exe - BANNERTOOL = ctr/tools/bannertool.exe + MAKEROM = pkg/ctr/tools/makerom.exe + BANNERTOOL = pkg/ctr/tools/bannertool.exe endif %.o: %.vsh %.gsh @@ -160,11 +160,11 @@ endif %.vsh: $(TARGET).smdh: $(APP_ICON) - smdhtool --create "$(APP_TITLE)" "$(APP_DESCRIPTION)" "$(APP_AUTHOR)" $(APP_ICON) $@ + $(DEVKITPRO)/devkitARM/bin/smdhtool --create "$(APP_TITLE)" "$(APP_DESCRIPTION)" "$(APP_AUTHOR)" $(APP_ICON) $@ $(TARGET).3dsx: $(TARGET).elf ifeq ($(APP_BIG_TEXT_SECTION), 1) - cp ctr/big_text_section.xml $(TARGET).xml + cp pkg/ctr/big_text_section.xml $(TARGET).xml else rm -f $(TARGET).xml endif diff --git a/Makefile.emscripten b/Makefile.emscripten index 3c424f60a1..fb3a215339 100644 --- a/Makefile.emscripten +++ b/Makefile.emscripten @@ -19,7 +19,6 @@ HAVE_RGUI = 1 HAVE_SDL = 0 HAVE_SDL2 = 1 HAVE_ZLIB = 1 -HAVE_FBO = 1 WANT_ZLIB = 1 MEMORY = 536870912 diff --git a/Makefile.griffin b/Makefile.griffin index 9b318e6710..5e2217dd6e 100644 --- a/Makefile.griffin +++ b/Makefile.griffin @@ -318,7 +318,6 @@ else ifeq ($(platform), windows_msvc6_x86) HAVE_STB_FONT := 1 HAVE_THREADS := 1 HAVE_LIBRETRODB := 1 - HAVE_FBO := 1 HAVE_COMMAND := 1 HAVE_STDIN_CMD := 1 HAVE_CMD := 1 @@ -335,14 +334,14 @@ else ifeq ($(platform), windows_msvc6_x86) PLATCFLAGS += -D_WIN32 -D_WIN32_WINNT=0x0351 -D__STDC_CONSTANT_MACROS -D_MBCS LDFLAGS += shell32.lib user32.lib gdi32.lib comdlg32.lib winmm.lib ole32.lib - VCDIR ?= $(shell reg query "HKLM\SOFTWARE\Wow6432Node\Microsoft\DevStudio\6.0\Products\Microsoft Visual C++" -v "ProductDir" | grep -o '[A-Z]:\\.*') + VCDIR ?= $(shell reg query "HKLM\SOFTWARE\Wow6432Node\Microsoft\DevStudio\6.0\Products\Microsoft Visual C++" -v "ProductDir" | grep -io '[A-Z]:\\.*') PATH := $(shell IFS=$$'\n'; cygpath "$(VCDIR)/bin"):$(PATH) PATH := $(PATH):$(shell IFS=$$'\n'; cygpath "$(VCDIR)/../Common/MSDev98/Bin") INCLUDE := $(shell IFS=$$'\n'; cygpath -w "$(VCDIR)/Include") LIB := $(shell IFS=$$'\n'; cygpath -w "$(VCDIR)/Lib") - export INCLUDE := $(INCLUDE);$(INETSDK)\Include;libretro-common\include;libretro-common\include\compat\msvc + export INCLUDE := $(INCLUDE);$(INETSDK)\Include;libretro-common\include;libretro-common\include\compat\msvc;gfx\include;deps;deps\stb export LIB := $(LIB);$(INETSDK)\Lib else ifeq ($(platform), windows_msvc2003_x86) HAVE_RPNG := 1 @@ -360,7 +359,6 @@ else ifeq ($(platform), windows_msvc2003_x86) HAVE_STB_FONT := 1 HAVE_THREADS := 1 HAVE_LIBRETRODB := 1 - HAVE_FBO := 1 HAVE_COMMAND := 1 HAVE_STDIN_CMD := 1 HAVE_CMD := 1 @@ -385,10 +383,10 @@ else ifeq ($(platform), windows_msvc2003_x86) ifeq ($(HAVE_DIRECTX), 1) PLATCFLAGS += -DHAVE_DINPUT -DHAVE_DSOUND DXSDK_DIR := $(DXSDK_DIR:\=) - export INCLUDE := $(INCLUDE);$(INETSDK)\Include;$(DXSDK_DIR)\Include;libretro-common\include;libretro-common\include\compat\msvc + export INCLUDE := $(INCLUDE);$(INETSDK)\Include;$(DXSDK_DIR)\Include;libretro-common\include;libretro-common\include\compat\msvc;gfx\include;deps;deps\stb export LIB := $(LIB);$(INETSDK)\Lib;$(DXSDK_DIR)\Lib\x86 else - export INCLUDE := $(INCLUDE);$(INETSDK)\Include;libretro-common\include;libretro-common\include\compat\msvc + export INCLUDE := $(INCLUDE);$(INETSDK)\Include;libretro-common\include;libretro-common\include\compat\msvc;gfx\include;deps;deps\stb export LIB := $(LIB);$(INETSDK)\Lib endif else ifeq ($(platform), windows_msvc2005_x86) @@ -407,7 +405,6 @@ else ifeq ($(platform), windows_msvc2005_x86) HAVE_STB_FONT := 1 HAVE_THREADS := 1 HAVE_LIBRETRODB := 1 - HAVE_FBO := 1 HAVE_COMMAND := 1 HAVE_STDIN_CMD := 1 HAVE_CMD := 1 @@ -433,10 +430,10 @@ else ifeq ($(platform), windows_msvc2005_x86) ifeq ($(HAVE_DIRECTX), 1) PLATCFLAGS += -DHAVE_DINPUT -DHAVE_DSOUND DXSDK_DIR := $(DXSDK_DIR:\=) - export INCLUDE := $(INCLUDE);$(INETSDK)\Include;$(DXSDK_DIR)\Include;libretro-common\include;libretro-common\include\compat\msvc + export INCLUDE := $(INCLUDE);$(INETSDK)\Include;$(DXSDK_DIR)\Include;libretro-common\include;libretro-common\include\compat\msvc;gfx\include;deps;deps\stb export LIB := $(LIB);$(INETSDK)\Lib;$(DXSDK_DIR)\Lib\x86 else - export INCLUDE := $(INCLUDE);$(INETSDK)\Include;libretro-common\include;libretro-common\include\compat\msvc + export INCLUDE := $(INCLUDE);$(INETSDK)\Include;libretro-common\include;libretro-common\include\compat\msvc;gfx\include;deps;deps\stb export LIB := $(LIB);$(INETSDK)\Lib endif else ifneq (,$(findstring windows_msvc2010,$(platform))) @@ -455,7 +452,6 @@ else ifneq (,$(findstring windows_msvc2010,$(platform))) HAVE_STB_FONT := 1 HAVE_THREADS := 1 HAVE_LIBRETRODB := 1 - HAVE_FBO := 1 HAVE_COMMAND := 1 HAVE_STDIN_CMD := 1 HAVE_CMD := 1 @@ -497,17 +493,17 @@ else ifneq (,$(findstring windows_msvc2010,$(platform))) PATH := $(PATH):$(shell IFS=$$'\n'; cygpath "$(VS100COMNTOOLS)../IDE") INCLUDE := $(shell IFS=$$'\n'; cygpath -w "$(VS100COMNTOOLS)../../VC/include") - WindowsSdkDir ?= $(shell reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A" -v "InstallationFolder" | grep -o '[A-Z]:\\.*') - WindowsSdkDir ?= $(shell reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1A" -v "InstallationFolder" | grep -o '[A-Z]:\\.*') + WindowsSdkDir ?= $(shell reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A" -v "InstallationFolder" | grep -io '[A-Z]:\\.*') + WindowsSdkDir ?= $(shell reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1A" -v "InstallationFolder" | grep -io '[A-Z]:\\.*') WindowsSdkDir := $(WindowsSdkDir:\=) ifeq ($(HAVE_DIRECTX), 1) PLATCFLAGS += -DHAVE_DINPUT -DHAVE_DSOUND -DHAVE_D3D -DHAVE_D3D9 -DHAVE_XAUDIO -DHAVE_XINPUT DXSDK_DIR := $(DXSDK_DIR:\=) - export INCLUDE := $(INCLUDE);$(WindowsSdkDir)\Include;$(DXSDK_DIR)\Include;libretro-common\include;libretro-common\include\compat\msvc;gfx\include + export INCLUDE := $(INCLUDE);$(WindowsSdkDir)\Include;$(DXSDK_DIR)\Include;libretro-common\include;libretro-common\include\compat\msvc;gfx\include;deps;deps\stb export LIB := $(LIB);$(WindowsSdkDir)\$(PlatLib);$(DXSDK_DIR)\Lib\$(WinArch) else - export INCLUDE := $(INCLUDE);$(WindowsSdkDir)\Include;libretro-common\include;libretro-common\include\compat\msvc;gfx\include + export INCLUDE := $(INCLUDE);$(WindowsSdkDir)\Include;libretro-common\include;libretro-common\include\compat\msvc;gfx\include;deps;deps\stb export LIB := $(LIB);$(WindowsSdkDir)\$(PlatLib) endif else ifneq (,$(findstring windows_msvc2012,$(platform))) @@ -526,7 +522,6 @@ else ifneq (,$(findstring windows_msvc2012,$(platform))) HAVE_STB_FONT := 1 HAVE_THREADS := 1 HAVE_LIBRETRODB := 1 - HAVE_FBO := 1 HAVE_COMMAND := 1 HAVE_STDIN_CMD := 1 HAVE_CMD := 1 @@ -573,16 +568,16 @@ else ifneq (,$(findstring windows_msvc2012,$(platform))) PATH := $(PATH):$(shell IFS=$$'\n'; cygpath "$(VS110COMNTOOLS)../IDE") INCLUDE := $(shell IFS=$$'\n'; cygpath -w "$(VS110COMNTOOLS)../../VC/include") - WindowsSdkDir ?= $(shell reg query "HKLM\SOFTWARE\Microsoft\Windows Kits\Installed Roots" -v "KitsRoot81" | grep -o '[A-Z]:\\.*') + WindowsSdkDir ?= $(shell reg query "HKLM\SOFTWARE\Microsoft\Windows Kits\Installed Roots" -v "KitsRoot81" | grep -io '[A-Z]:\\.*') WindowsSdkDir := $(WindowsSdkDir:\=) ifeq ($(HAVE_DIRECTX), 1) PLATCFLAGS += -DHAVE_DINPUT -DHAVE_DSOUND -DHAVE_D3D -DHAVE_D3D9 -DHAVE_XAUDIO -DHAVE_XINPUT DXSDK_DIR := $(DXSDK_DIR:\=) - export INCLUDE := $(INCLUDE);$(WindowsSdkDir)\Include\um;$(WindowsSdkDir)\Include\shared;$(DXSDK_DIR)\Include;libretro-common\include;libretro-common\include\compat\msvc;gfx\include + export INCLUDE := $(INCLUDE);$(WindowsSdkDir)\Include\um;$(WindowsSdkDir)\Include\shared;$(DXSDK_DIR)\Include;libretro-common\include;libretro-common\include\compat\msvc;gfx\include;deps;deps\stb export LIB := $(LIB);$(WindowsSdkDir)\$(PlatLib);$(DXSDK_DIR)\Lib\$(WinArch) else - export INCLUDE := $(INCLUDE);$(WindowsSdkDir)\Include\um;$(WindowsSdkDir)\Include\shared;libretro-common\include;libretro-common\include\compat\msvc;gfx\include + export INCLUDE := $(INCLUDE);$(WindowsSdkDir)\Include\um;$(WindowsSdkDir)\Include\shared;libretro-common\include;libretro-common\include\compat\msvc;gfx\include;deps;deps\stb export LIB := $(LIB);$(WindowsSdkDir)\$(PlatLib) endif else ifneq (,$(findstring windows_msvc2013,$(platform))) @@ -601,7 +596,6 @@ else ifneq (,$(findstring windows_msvc2013,$(platform))) HAVE_STB_FONT := 1 HAVE_THREADS := 1 HAVE_LIBRETRODB := 1 - HAVE_FBO := 1 HAVE_COMMAND := 1 HAVE_STDIN_CMD := 1 HAVE_CMD := 1 @@ -648,16 +642,16 @@ else ifneq (,$(findstring windows_msvc2013,$(platform))) PATH := $(PATH):$(shell IFS=$$'\n'; cygpath "$(VS120COMNTOOLS)../IDE") INCLUDE := $(shell IFS=$$'\n'; cygpath -w "$(VS120COMNTOOLS)../../VC/include") - WindowsSdkDir ?= $(shell reg query "HKLM\SOFTWARE\Microsoft\Windows Kits\Installed Roots" -v "KitsRoot81" | grep -o '[A-Z]:\\.*') + WindowsSdkDir ?= $(shell reg query "HKLM\SOFTWARE\Microsoft\Windows Kits\Installed Roots" -v "KitsRoot81" | grep -io '[A-Z]:\\.*') WindowsSdkDir := $(WindowsSdkDir:\=) ifeq ($(HAVE_DIRECTX), 1) PLATCFLAGS += -DHAVE_DINPUT -DHAVE_DSOUND -DHAVE_D3D -DHAVE_D3D9 -DHAVE_XAUDIO -DHAVE_XINPUT DXSDK_DIR := $(DXSDK_DIR:\=) - export INCLUDE := $(INCLUDE);$(WindowsSdkDir)\Include\um;$(WindowsSdkDir)\Include\shared;$(DXSDK_DIR)\Include;libretro-common\include;libretro-common\include\compat\msvc;gfx\include + export INCLUDE := $(INCLUDE);$(WindowsSdkDir)\Include\um;$(WindowsSdkDir)\Include\shared;$(DXSDK_DIR)\Include;libretro-common\include;libretro-common\include\compat\msvc;gfx\include;deps;deps\stb export LIB := $(LIB);$(WindowsSdkDir)\$(PlatLib);$(DXSDK_DIR)\Lib\$(WinArch) else - export INCLUDE := $(INCLUDE);$(WindowsSdkDir)\Include\um;$(WindowsSdkDir)\Include\shared;libretro-common\include;libretro-common\include\compat\msvc;gfx\include + export INCLUDE := $(INCLUDE);$(WindowsSdkDir)\Include\um;$(WindowsSdkDir)\Include\shared;libretro-common\include;libretro-common\include\compat\msvc;gfx\include;deps;deps\stb export LIB := $(LIB);$(WindowsSdkDir)\$(PlatLib) endif endif @@ -666,11 +660,11 @@ ifneq (,$(findstring msvc,$(platform))) CFLAGS += -W2 $(MACHDEP) $(PLATCFLAGS) else CFLAGS += -Wall -std=gnu99 $(MACHDEP) $(PLATCFLAGS) $(INCLUDE) - INCLUDE += -I./libretro-common/include + INCLUDE += -I./libretro-common/include \ + -Ideps \ + -Ideps/stb endif -INCLUDE += -Ideps -Ideps/stb - OBJ = griffin/griffin.o $(PLATOBJS) ifeq ($(HAVE_GRIFFIN_CPP), 1) @@ -812,10 +806,6 @@ ifeq ($(HAVE_GETOPT_LONG), 1) CFLAGS += -DHAVE_GETOPT_LONG=1 endif -ifeq ($(HAVE_FBO), 1) - CFLAGS += -DHAVE_FBO -endif - ifeq ($(HAVE_DYLIB), 1) CFLAGS += -DHAVE_DYLIB endif @@ -843,6 +833,7 @@ ifeq ($(DEBUG), 1) endif CFLAGS += -Od -Zi -D_DEBUG -MTd -TP + LDFLAGS += -DEBUG else CFLAGS += -O0 -g -DDEBUG endif diff --git a/Makefile.ps3 b/Makefile.ps3 index 26816a3413..b23e55327a 100644 --- a/Makefile.ps3 +++ b/Makefile.ps3 @@ -101,7 +101,7 @@ PPU_LDLIBS = $(FONT_LIBS) $(GL_LIBS) $(WHOLE_START) -lretro_ps3 $(WHOLE_END) -l PPU_RANLIB = $(CELL_SDK)/host-win32/ppu/bin/ppu-lv2-ranlib.exe -DEFINES += -DHAVE_THREADS -DRARCH_CONSOLE -DHAVE_OPENGL -DHAVE_HEADSET -DHAVE_LANGEXTRA -DHAVE_OPENGLES -DHAVE_OPENGLES1 -DHAVE_PSGL -DHAVE_CG -DHAVE_CG_RUNTIME_COMPILER -DHAVE_FBO -DHAVE_SYSMODULES -DHAVE_SYSUTILS -DHAVE_RARCH_EXEC -DHAVE_RSOUND -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_RBMP -DHAVE_RTGA -DHAVE_7Z -DWANT_ZLIB -DSINC_LOWER_QUALITY -D__CELLOS_LV2__ -DHAVE_NETWORKING=1 -DHAVE_SOCKET_LEGACY=1 -DHAVE_MOUSE -DHAVE_GRIFFIN=1 -DHAVE_MULTIMAN=1 -DPC_DEVELOPMENT_IP_ADDRESS=\"$(PC_DEVELOPMENT_IP_ADDRESS)\" -DPC_DEVELOPMENT_UDP_PORT=$(PC_DEVELOPMENT_UDP_PORT) -DHAVE_FILTERS_BUILTIN +DEFINES += -DHAVE_THREADS -DRARCH_CONSOLE -DHAVE_OPENGL -DHAVE_HEADSET -DHAVE_LANGEXTRA -DHAVE_OPENGLES -DHAVE_OPENGLES1 -DHAVE_PSGL -DHAVE_CG -DHAVE_CG_RUNTIME_COMPILER -DHAVE_SYSMODULES -DHAVE_SYSUTILS -DHAVE_RARCH_EXEC -DHAVE_RSOUND -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_RBMP -DHAVE_RTGA -DHAVE_7Z -DWANT_ZLIB -DSINC_LOWER_QUALITY -D__CELLOS_LV2__ -DHAVE_NETWORKING=1 -DHAVE_SOCKET_LEGACY=1 -DHAVE_MOUSE -DHAVE_GRIFFIN=1 -DHAVE_MULTIMAN=1 -DPC_DEVELOPMENT_IP_ADDRESS=\"$(PC_DEVELOPMENT_IP_ADDRESS)\" -DPC_DEVELOPMENT_UDP_PORT=$(PC_DEVELOPMENT_UDP_PORT) -DHAVE_FILTERS_BUILTIN #DEFINES += -DHAVE_IMAGEVIEWER diff --git a/Makefile.ps3.cobra b/Makefile.ps3.cobra index 8620f30a7a..d3f95fee52 100644 --- a/Makefile.ps3.cobra +++ b/Makefile.ps3.cobra @@ -99,7 +99,7 @@ PPU_LDLIBS = $(FONT_LIBS) $(GL_LIBS) $(WHOLE_START) -lretro_ps3 $(WHOLE_END) -l PPU_RANLIB = $(CELL_SDK)/host-win32/ppu/bin/ppu-lv2-ranlib.exe -DEFINES += -DHAVE_THREADS -DRARCH_CONSOLE -DHAVE_OPENGL -DHAVE_OVERLAY -DHAVE_HEADSET -DHAVE_OPENGLES -DHAVE_OPENGLES1 -DHAVE_PSGL -DHAVE_CG -DHAVE_CG_RUNTIME_COMPILER -DHAVE_FBO -DHAVE_SYSMODULES -DHAVE_SYSUTILS -DHAVE_RARCH_EXEC -DHAVE_RSOUND -DHAVE_ZLIB -DHAVE_RPNG -DWANT_ZLIB -DSINC_LOWER_QUALITY -D__CELLOS_LV2__ -DHAVE_NETWORKING=1 -DHAVE_SOCKET_LEGACY=1 -DHAVE_MOUSE -DHAVE_GRIFFIN=1 -DHAVE_MULTIMAN=0 -DPC_DEVELOPMENT_IP_ADDRESS=\"$(PC_DEVELOPMENT_IP_ADDRESS)\" -DPC_DEVELOPMENT_UDP_PORT=$(PC_DEVELOPMENT_UDP_PORT) -DHAVE_STB_VORBIS +DEFINES += -DHAVE_THREADS -DRARCH_CONSOLE -DHAVE_OPENGL -DHAVE_OVERLAY -DHAVE_HEADSET -DHAVE_OPENGLES -DHAVE_OPENGLES1 -DHAVE_PSGL -DHAVE_CG -DHAVE_CG_RUNTIME_COMPILER -DHAVE_SYSMODULES -DHAVE_SYSUTILS -DHAVE_RARCH_EXEC -DHAVE_RSOUND -DHAVE_ZLIB -DHAVE_RPNG -DWANT_ZLIB -DSINC_LOWER_QUALITY -D__CELLOS_LV2__ -DHAVE_NETWORKING=1 -DHAVE_SOCKET_LEGACY=1 -DHAVE_MOUSE -DHAVE_GRIFFIN=1 -DHAVE_MULTIMAN=0 -DPC_DEVELOPMENT_IP_ADDRESS=\"$(PC_DEVELOPMENT_IP_ADDRESS)\" -DPC_DEVELOPMENT_UDP_PORT=$(PC_DEVELOPMENT_UDP_PORT) -DHAVE_STB_VORBIS ifeq ($(DEBUG), 1) PPU_OPTIMIZE_LV := -O0 -g diff --git a/Makefile.psl1ght b/Makefile.psl1ght index 8ae57a28ea..2676bac26d 100644 --- a/Makefile.psl1ght +++ b/Makefile.psl1ght @@ -89,7 +89,7 @@ ifeq ($(HAVE_FILE_LOGGER), 1) CFLAGS += -DHAVE_FILE_LOGGER endif -SHARED_FLAGS := -DRARCH_CONSOLE -DHAVE_OPENGL -DHAVE_OVERLAY -DHAVE_HEADSET -DHAVE_OPENGLES -DHAVE_OPENGLES1 -DHAVE_PSGL -DHAVE_CG -DHAVE_CG_RUNTIME_COMPILER -DHAVE_GCMGL -DHAVE_FBO -DHAVE_SYSMODULES -DHAVE_SYSUTILS -DHAVE_RARCH_EXEC -DHAVE_MOUSE -DHAVE_ZLIB -DHAVE_RPNG -DWANT_ZLIB -DHAVE_GRIFFIN=1 -DHAVE_NETWORKING=1 -DHAVE_SOCKET_LEGACY=1 -DPC_DEVELOPMENT_IP_ADDRESS=\"$(PC_DEVELOPMENT_IP_ADDRESS)\" -DPC_DEVELOPMENT_UDP_PORT=$(PC_DEVELOPMENT_UDP_PORT) -Wno-char-subscripts -DHAVE_CC_RESAMPLER +SHARED_FLAGS := -DRARCH_CONSOLE -DHAVE_OPENGL -DHAVE_OVERLAY -DHAVE_HEADSET -DHAVE_OPENGLES -DHAVE_OPENGLES1 -DHAVE_PSGL -DHAVE_CG -DHAVE_CG_RUNTIME_COMPILER -DHAVE_GCMGL -DHAVE_SYSMODULES -DHAVE_SYSUTILS -DHAVE_RARCH_EXEC -DHAVE_MOUSE -DHAVE_ZLIB -DHAVE_RPNG -DWANT_ZLIB -DHAVE_GRIFFIN=1 -DHAVE_NETWORKING=1 -DHAVE_SOCKET_LEGACY=1 -DPC_DEVELOPMENT_IP_ADDRESS=\"$(PC_DEVELOPMENT_IP_ADDRESS)\" -DPC_DEVELOPMENT_UDP_PORT=$(PC_DEVELOPMENT_UDP_PORT) -Wno-char-subscripts -DHAVE_CC_RESAMPLER CFLAGS += -std=gnu99 $(SHARED_FLAGS) CXXFLAGS += $(SHARED_FLAGS) diff --git a/Makefile.wiiu b/Makefile.wiiu index b83d1caae7..00881ed117 100644 --- a/Makefile.wiiu +++ b/Makefile.wiiu @@ -18,24 +18,27 @@ OBJ += wiiu/system/exception_handler.o OBJ += wiiu/system/missing_libc_functions.o OBJ += wiiu/fs/sd_fat_devoptab.o OBJ += wiiu/fs/fs_utils.o -OBJ += wiiu/controller_patcher/ControllerPatcher.o -OBJ += wiiu/controller_patcher/ControllerPatcherWrapper.o -OBJ += wiiu/controller_patcher/ConfigReader.o -OBJ += wiiu/controller_patcher/config/ConfigParser.o -OBJ += wiiu/controller_patcher/config/ConfigValues.o -OBJ += wiiu/controller_patcher/network/ControllerPatcherNet.o -OBJ += wiiu/controller_patcher/network/TCPServer.o -OBJ += wiiu/controller_patcher/network/UDPClient.o -OBJ += wiiu/controller_patcher/network/UDPServer.o -OBJ += wiiu/controller_patcher/patcher/ControllerPatcherUtils.o -OBJ += wiiu/controller_patcher/patcher/ControllerPatcherHID.o -OBJ += wiiu/controller_patcher/utils/CPRetainVars.o -OBJ += wiiu/controller_patcher/utils/CPStringTools.o -OBJ += wiiu/controller_patcher/utils/PadConst.o -OBJ += wiiu/controller_patcher/utils/FSHelper.o OBJ += wiiu/tex_shader.o OBJ += wiiu/hbl.o +ifeq ($(ENABLE_CONTROLLER_PATCHER), 1) + OBJ += wiiu/controller_patcher/ControllerPatcher.o + OBJ += wiiu/controller_patcher/ControllerPatcherWrapper.o + OBJ += wiiu/controller_patcher/ConfigReader.o + OBJ += wiiu/controller_patcher/config/ConfigParser.o + OBJ += wiiu/controller_patcher/config/ConfigValues.o + OBJ += wiiu/controller_patcher/network/ControllerPatcherNet.o + OBJ += wiiu/controller_patcher/network/TCPServer.o + OBJ += wiiu/controller_patcher/network/UDPClient.o + OBJ += wiiu/controller_patcher/network/UDPServer.o + OBJ += wiiu/controller_patcher/patcher/ControllerPatcherUtils.o + OBJ += wiiu/controller_patcher/patcher/ControllerPatcherHID.o + OBJ += wiiu/controller_patcher/utils/CPRetainVars.o + OBJ += wiiu/controller_patcher/utils/CPStringTools.o + OBJ += wiiu/controller_patcher/utils/PadConst.o + OBJ += wiiu/controller_patcher/utils/FSHelper.o +endif + DEFINES := ifeq ($(GRIFFIN_BUILD), 1) @@ -158,6 +161,9 @@ CFLAGS += -DWIIU -DMSB_FIRST CFLAGS += -DHAVE_MAIN CFLAGS += -DHAVE_UPDATE_ASSETS CFLAGS += -DRARCH_INTERNAL -DRARCH_CONSOLE +ifeq ($(ENABLE_CONTROLLER_PATCHER), 1) + CFLAGS += -DENABLE_CONTROLLER_PATCHER +endif CFLAGS += -DHAVE_FILTERS_BUILTIN $(DEFINES) ifneq ($(PC_DEVELOPMENT_IP_ADDRESS),) diff --git a/Makefile.win b/Makefile.win index 624d32cc04..26c3f7aa37 100644 --- a/Makefile.win +++ b/Makefile.win @@ -5,7 +5,6 @@ HAVE_XAUDIO = 1 HAVE_DSOUND = 1 HAVE_WASAPI = 1 HAVE_OPENGL = 1 -HAVE_FBO = 1 HAVE_DYLIB = 1 HAVE_D3D9 = 1 HAVE_NETWORKING = 1 diff --git a/cheevos/badges.c b/cheevos/badges.c new file mode 100644 index 0000000000..961fbc600e --- /dev/null +++ b/cheevos/badges.c @@ -0,0 +1,54 @@ +#include +#include +#include + +#include "../file_path_special.h" +#include "../configuration.h" +#include "../verbosity.h" +#include "../network/net_http_special.h" + +#include "badges.h" + +badges_ctx_t badges_ctx; + +bool badge_exists(const char* filepath) +{ + if(path_file_exists(filepath)) + return true; + else + return false; +} + +void set_badge_menu_texture(badges_ctx_t * badges, int i) +{ + const char * locked_suffix = (badges->badge_locked[i] == true) ? "_lock.png" : ".png"; + + unsigned int bufferSize = 16; + char badge_file[bufferSize]; + + snprintf(badge_file, bufferSize, "%s", badges->badge_id_list[i]); + strcat(badge_file, locked_suffix); + + char fullpath[PATH_MAX_LENGTH]; + fill_pathname_application_special(fullpath, + PATH_MAX_LENGTH * sizeof(char), + APPLICATION_SPECIAL_DIRECTORY_THUMBNAILS_CHEEVOS_BADGES); + + menu_display_reset_textures_list(badge_file, fullpath, &badges->menu_texture_list[i],TEXTURE_FILTER_MIPMAP_LINEAR); +} + +void set_badge_info (badges_ctx_t *badge_struct, int id, const char *badge_id, bool active) +{ + badge_struct->badge_id_list[id] = badge_id; + badge_struct->badge_locked[id] = active; + set_badge_menu_texture(badge_struct, id); +} + +menu_texture_item get_badge_texture (int id) +{ + settings_t *settings = config_get_ptr(); + if (!settings->bools.cheevos_badges_enable) + return (menu_texture_item)NULL; + + return badges_ctx.menu_texture_list[id]; +} diff --git a/cheevos/badges.h b/cheevos/badges.h new file mode 100644 index 0000000000..57a8de6ed2 --- /dev/null +++ b/cheevos/badges.h @@ -0,0 +1,29 @@ +#ifndef __RARCH_BADGE_H +#define __RARCH_BADGE_H + +#include "../menu/menu_driver.h" + +#include + +RETRO_BEGIN_DECLS + +#define CHEEVOS_BADGE_LIMIT 256 + +typedef struct +{ + bool badge_locked[CHEEVOS_BADGE_LIMIT]; + const char * badge_id_list[CHEEVOS_BADGE_LIMIT]; + menu_texture_item menu_texture_list[CHEEVOS_BADGE_LIMIT]; +} badges_ctx_t; + +bool badge_exists(const char* filepath); +void set_badge_menu_texture(badges_ctx_t * badges, int i); +extern void set_badge_info (badges_ctx_t *badge_struct, int id, const char *badge_id, bool active); +extern menu_texture_item get_badge_texture(int id); + +extern badges_ctx_t badges_ctx; +static badges_ctx_t new_badges_ctx; + +RETRO_END_DECLS + +#endif diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c index 017199aa8a..b2cf87154b 100644 --- a/cheevos/cheevos.c +++ b/cheevos/cheevos.c @@ -16,6 +16,8 @@ #include #include +#include +#include #include #include #include @@ -35,10 +37,12 @@ #include "../menu/menu_entries.h" #endif +#include "badges.h" #include "cheevos.h" #include "var.h" #include "cond.h" +#include "../file_path_special.h" #include "../command.h" #include "../dynamic.h" #include "../configuration.h" @@ -76,6 +80,9 @@ * THE USER'S PASSWORD, TAKE CARE! */ #undef CHEEVOS_LOG_PASSWORD +/* Define this macro to log downloaded badge images. */ +#undef CHEEVOS_LOG_BADGES + /* C89 wants only int values in enums. */ #define CHEEVOS_JSON_KEY_GAMEID 0xb4960eecU #define CHEEVOS_JSON_KEY_ACHIEVEMENTS 0x69749ae1U @@ -99,27 +106,6 @@ #define CHEEVOS_EIGHT_MB ( 8 * 1024 * 1024) #define CHEEVOS_SIZE_LIMIT (64 * 1024 * 1024) -enum -{ - CHEEVOS_DIRTY_TITLE = 1 << 0, - CHEEVOS_DIRTY_DESC = 1 << 1, - CHEEVOS_DIRTY_POINTS = 1 << 2, - CHEEVOS_DIRTY_AUTHOR = 1 << 3, - CHEEVOS_DIRTY_ID = 1 << 4, - CHEEVOS_DIRTY_BADGE = 1 << 5, - CHEEVOS_DIRTY_CONDITIONS = 1 << 6, - CHEEVOS_DIRTY_VOTES = 1 << 7, - CHEEVOS_DIRTY_DESCRIPTION = 1 << 8, - - CHEEVOS_DIRTY_ALL = (1 << 9) - 1 -}; - -enum -{ - CHEEVOS_ACTIVE_SOFTCORE = 1 << 0, - CHEEVOS_ACTIVE_HARDCORE = 1 << 1 -}; - typedef struct { cheevos_cond_t *conds; @@ -208,18 +194,21 @@ typedef struct typedef struct { cheevos_var_t var; - int multiplier; + double multiplier; + bool compare_next; } cheevos_term_t; typedef struct { cheevos_term_t *terms; unsigned count; + unsigned compare_count; } cheevos_expr_t; typedef struct { unsigned id; + unsigned format; const char *title; const char *description; int active; @@ -231,6 +220,42 @@ typedef struct cheevos_expr_t value; } cheevos_leaderboard_t; +/* +typedef struct +{ + bool is_lookup; + char* prestring; + cheevos_expr_t expression; +} cheevos_rps_element_t; + +typedef struct +{ + char* name; + unsigned type; +} cheevos_rps_format_t; + +typedef struct +{ + unsigned compare; + char* result; +} cheevos_rps_lookup_value; + +typedef struct +{ + char* name; + cheevos_rps_lookup_value* values; +} cheevos_rps_lookup_t; + +typedef struct +{ + cheevos_rps_element_t* elements; + cheevos_rps_format_t* formats; + unsigned format_count; + cheevos_rps_lookup_t* lookups; + unsigned lookup_count; +} cheevos_rps_t; +*/ + typedef struct { int console_id; @@ -516,6 +541,8 @@ static void cheevos_add_var(const cheevos_var_t* var, char** memaddr, { if (var->type == CHEEVOS_VAR_TYPE_DELTA_MEM) cheevos_add_char(memaddr, left, 'd'); + else if (var->is_bcd) + cheevos_add_char(memaddr, left, 'b'); cheevos_add_string(memaddr, left, "0x"); cheevos_add_var_size(memaddr, left, var); @@ -858,24 +885,27 @@ static unsigned cheevos_count_cond_sets(const char *memaddr) static int cheevos_parse_condition(cheevos_condition_t *condition, const char* memaddr) { + if (!condition) + return 0; + condition->count = cheevos_count_cond_sets(memaddr); if (condition->count) { unsigned set = 0; - cheevos_condset_t *condset = NULL; - cheevos_condset_t *conds = NULL; const cheevos_condset_t* end = NULL; - - (void)conds; - - condition->condsets = (cheevos_condset_t*) + cheevos_condset_t *conds = NULL; + cheevos_condset_t *condset = NULL; + cheevos_condset_t *condsets = (cheevos_condset_t*) calloc(condition->count, sizeof(cheevos_condset_t)); - if (!condition->condsets) + (void)conds; + + if (!condsets) return -1; - end = condition->condsets + condition->count; + condition->condsets = condsets; + end = condition->condsets + condition->count; for (condset = condition->condsets; condset < end; condset++, set++) { @@ -897,9 +927,10 @@ static int cheevos_parse_condition(cheevos_condition_t *condition, const char* m { while (--condset >= condition->condsets) { - free((void*)condset->conds); + if ((void*)condset->conds) + free((void*)condset->conds); } - + return -1; } @@ -912,7 +943,6 @@ static int cheevos_parse_condition(cheevos_condition_t *condition, const char* m return 0; } -#ifdef CHEEVOS_ENABLE_LBOARDS static void cheevos_free_condition(cheevos_condition_t* condition) { unsigned i; @@ -920,27 +950,38 @@ static void cheevos_free_condition(cheevos_condition_t* condition) if (condition->condsets) { for (i = 0; i < condition->count; i++) - free((void*)condition->condsets[i].conds); + { + if (condition->condsets[i].conds) + { + free(condition->condsets[i].conds); + condition->condsets[i].conds = NULL; + } + } - free((void*)condition->condsets); + if (condition->condsets) + { + free(condition->condsets); + condition->condsets = NULL; + } } } -#endif /***************************************************************************** Parse the Mem field of leaderboards. *****************************************************************************/ -#ifdef CHEEVOS_ENABLE_LBOARDS static int cheevos_parse_expression(cheevos_expr_t *expr, const char* mem) { const char* aux; char* end; unsigned i; expr->count = 1; + expr->compare_count = 1; - for (aux = mem; *aux != '"'; aux++) + for (aux = mem;; aux++) { + if(*aux == '"' || *aux == ':') + break; expr->count += *aux == '_'; } @@ -949,31 +990,77 @@ static int cheevos_parse_expression(cheevos_expr_t *expr, const char* mem) if (!expr->terms) return -1; - for (i = 0, aux = mem; i < expr->count; i++) + for (i = 0; i < expr->count; i++) + { + expr->terms[i].compare_next = false; + expr->terms[i].multiplier = 1; + } + + for (i = 0, aux = mem; i < expr->count;) { cheevos_var_parse(&expr->terms[i].var, &aux); if (*aux != '*') { - free((void*)expr->terms); - return -1; + /* expression has no multiplier */ + if (*aux == '_') + { + aux++; + i++; + } + else if (*aux == '$') + { + expr->terms[i].compare_next = true; + expr->compare_count++; + aux++; + i++; + } + + /* no multiplier at end of string */ + else if (*aux == '\0' || *aux == '"' || *aux == ',') + return 0; + + /* invalid character in expression */ + else + { + if (expr->terms) + { + free(expr->terms); + expr->terms = NULL; + } + return -1; + } } + else + { + if(aux[1] == 'h' || aux[1] == 'H') + expr->terms[i].multiplier = (double)strtol(aux + 2, &end, 16); + else + expr->terms[i].multiplier = strtod(aux + 1, &end); + aux = end; - expr->terms[i].multiplier = (int)strtol(aux + 1, &end, 10); - aux = end + 1; + if(*aux == '$') + { + aux++; + expr->terms[i].compare_next = true; + expr->compare_count++; + } + else + expr->terms[i].compare_next = false; + + aux++; + i++; + } } - return 0; } -#endif -#ifdef CHEEVOS_ENABLE_LBOARDS static int cheevos_parse_mem(cheevos_leaderboard_t *lb, const char* mem) { - lb->start.condsets = NULL; + lb->start.condsets = NULL; lb->cancel.condsets = NULL; lb->submit.condsets = NULL; - lb->value.terms = NULL; + lb->value.terms = NULL; for (;;) { @@ -997,8 +1084,6 @@ static int cheevos_parse_mem(cheevos_leaderboard_t *lb, const char* mem) if (cheevos_parse_expression(&lb->value, mem + 4)) goto error; } - else - goto error; for (mem += 4;; mem++) { @@ -1016,10 +1101,13 @@ error: cheevos_free_condition(&lb->start); cheevos_free_condition(&lb->cancel); cheevos_free_condition(&lb->submit); - free((void*)lb->value.terms); + if (lb->value.terms) + { + free((void*)lb->value.terms); + lb->value.terms = NULL; + } return -1; } -#endif /***************************************************************************** Load achievements from a JSON string. @@ -1075,19 +1163,104 @@ static int cheevos_new_cheevo(cheevos_readud_t *ud) return 0; error: - free((void*)cheevo->title); - free((void*)cheevo->description); - free((void*)cheevo->author); - free((void*)cheevo->badge); + if (cheevo->title) + { + free((void*)cheevo->title); + cheevo->title = NULL; + } + if (cheevo->description) + { + free((void*)cheevo->description); + cheevo->description = NULL; + } + if (cheevo->author) + { + free((void*)cheevo->author); + cheevo->author = NULL; + } + if (cheevo->badge) + { + free((void*)cheevo->badge); + cheevo->badge = NULL; + } return -1; } -#ifdef CHEEVOS_ENABLE_LBOARDS +/***************************************************************************** +Helper functions for displaying leaderboard values. +*****************************************************************************/ + +static void cheevos_format_value(const unsigned value, const unsigned type, + char* formatted_value, size_t formatted_size) +{ + unsigned mins, secs, millis; + + switch(type) + { + case CHEEVOS_FORMAT_VALUE: + snprintf(formatted_value, formatted_size, "%u", value); + break; + + case CHEEVOS_FORMAT_SCORE: + snprintf(formatted_value, formatted_size, "%06upts", value); + break; + + case CHEEVOS_FORMAT_FRAMES: + mins = value / 3600; + secs = (value % 3600) / 60; + millis = (int) (value % 60) * (10.00 / 6.00); + snprintf(formatted_value, formatted_size, "%02u:%02u.%02u", mins, secs, millis); + break; + + case CHEEVOS_FORMAT_MILLIS: + mins = value / 6000; + secs = (value % 6000) / 100; + millis = (int) (value % 100); + snprintf(formatted_value, formatted_size, "%02u:%02u.%02u", mins, secs, millis); + break; + + case CHEEVOS_FORMAT_SECS: + mins = value / 60; + secs = value % 60; + snprintf(formatted_value, formatted_size, "%02u:%02u", mins, secs); + break; + + default: + snprintf(formatted_value, formatted_size, "%u (?)", value); + } +} + +unsigned cheevos_parse_format(cheevos_field_t* format) +{ + /* Most likely */ + if (strncmp(format->string, "VALUE", format->length) == 0) + return CHEEVOS_FORMAT_VALUE; + else if (strncmp(format->string, "TIME", format->length) == 0) + return CHEEVOS_FORMAT_FRAMES; + else if (strncmp(format->string, "SCORE", format->length) == 0) + return CHEEVOS_FORMAT_SCORE; + + /* Less likely */ + else if (strncmp(format->string, "MILLISECS", format->length) == 0) + return CHEEVOS_FORMAT_MILLIS; + else if (strncmp(format->string, "TIMESECS", format->length) == 0) + return CHEEVOS_FORMAT_SECS; + + /* Rare (RPS only) */ + else if (strncmp(format->string, "POINTS", format->length) == 0) + return CHEEVOS_FORMAT_SCORE; + else if (strncmp(format->string, "FRAMES", format->length) == 0) + return CHEEVOS_FORMAT_FRAMES; + else + return CHEEVOS_FORMAT_OTHER; +} + static int cheevos_new_lboard(cheevos_readud_t *ud) { cheevos_leaderboard_t *lboard = cheevos_locals.leaderboards + ud->lboard_count++; lboard->id = strtol(ud->id.string, NULL, 10); + lboard->format = cheevos_parse_format(&ud->format); lboard->title = cheevos_dupstr(&ud->title); lboard->description = cheevos_dupstr(&ud->desc); @@ -1104,11 +1277,12 @@ static int cheevos_new_lboard(cheevos_readud_t *ud) return 0; error: - free((void*)lboard->title); - free((void*)lboard->description); + if ((void*)lboard->title) + free((void*)lboard->title); + if ((void*)lboard->description) + free((void*)lboard->description); return -1; } -#endif static int cheevos_read__json_key( void *userdata, const char *name, size_t length) @@ -1224,10 +1398,8 @@ static int cheevos_read__json_end_object(void *userdata) if (ud->in_cheevos) return cheevos_new_cheevo(ud); -#ifdef CHEEVOS_ENABLE_LBOARDS else if (ud->in_lboards) return cheevos_new_lboard(ud); -#endif return 0; } @@ -1284,9 +1456,12 @@ static int cheevos_parse(const char *json) if ( !cheevos_locals.core.cheevos || !cheevos_locals.unofficial.cheevos || !cheevos_locals.leaderboards) { - free((void*)cheevos_locals.core.cheevos); - free((void*)cheevos_locals.unofficial.cheevos); - free((void*)cheevos_locals.leaderboards); + if ((void*)cheevos_locals.core.cheevos) + free((void*)cheevos_locals.core.cheevos); + if ((void*)cheevos_locals.unofficial.cheevos) + free((void*)cheevos_locals.unofficial.cheevos); + if ((void*)cheevos_locals.leaderboards) + free((void*)cheevos_locals.leaderboards); cheevos_locals.core.count = cheevos_locals.unofficial.count = cheevos_locals.lboard_count = 0; @@ -1632,8 +1807,11 @@ static void cheevos_test_cheevo_set(const cheevoset_t *set) RARCH_LOG("[CHEEVOS]: awarding cheevo %u: %s (%s).\n", cheevo->id, cheevo->title, cheevo->description); - runloop_msg_queue_push(cheevo->title, 0, 3 * 60, false); - runloop_msg_queue_push(cheevo->description, 0, 5 * 60, false); + char msg[256]; + snprintf(msg, sizeof(msg), "Achievement Unlocked: %s", cheevo->title); + msg[sizeof(msg) - 1] = 0; + runloop_msg_queue_push(msg, 0, 2 * 60, false); + runloop_msg_queue_push(cheevo->description, 0, 3 * 60, false); cheevos_make_unlock_url(cheevo, url, sizeof(url)); task_push_http_transfer(url, true, NULL, cheevos_unlocked, cheevo); @@ -1644,7 +1822,6 @@ static void cheevos_test_cheevo_set(const cheevoset_t *set) } } -#ifdef CHEEVOS_ENABLE_LBOARDS static int cheevos_test_lboard_condition(const cheevos_condition_t* condition) { int dirty_conds = 0; @@ -1679,14 +1856,28 @@ static int cheevos_expr_value(cheevos_expr_t* expr) { cheevos_term_t* term = expr->terms; unsigned i; - int value = 0; + + /* Separate possible values with '$' operator, submit the largest */ + unsigned current_value = 0; + int values[expr->compare_count]; + memset(values, 0, sizeof values); for (i = expr->count; i != 0; i--, term++) { - value += cheevos_var_get_value(&term->var) * term->multiplier; + values[current_value] += cheevos_var_get_value(&term->var) * term->multiplier; + if (term->compare_next) + current_value++; } - return value; + if (expr->compare_count > 1) + { + int maximum = values[0]; + for (unsigned j = 1; j < expr->compare_count; j++) + maximum = values[j] > maximum ? values[j] : maximum; + + return maximum; + } + else return values[0]; } static void cheevos_make_lboard_url(const cheevos_leaderboard_t *lboard, @@ -1699,7 +1890,7 @@ static void cheevos_make_lboard_url(const cheevos_leaderboard_t *lboard, hash[0] = '\0'; - snprintf(signature, sizeof(signature), "%u%s%u", lboard->id, + snprintf(signature, sizeof(signature), "%u%s%u", lboard->id, settings->arrays.cheevos_username, lboard->id); @@ -1727,9 +1918,7 @@ static void cheevos_make_lboard_url(const cheevos_leaderboard_t *lboard, cheevos_log_url("[CHEEVOS]: url to submit the leaderboard: %s\n", url); #endif } -#endif -#ifdef CHEEVOS_ENABLE_LBOARDS static void cheevos_lboard_submit(void *task_data, void *user_data, const char *error) { cheevos_leaderboard_t *lboard = (cheevos_leaderboard_t *)user_data; @@ -1752,9 +1941,7 @@ static void cheevos_lboard_submit(void *task_data, void *user_data, const char * } #endif } -#endif -#ifdef CHEEVOS_ENABLE_LBOARDS static void cheevos_test_leaderboards(void) { cheevos_leaderboard_t* lboard = cheevos_locals.leaderboards; @@ -1776,18 +1963,35 @@ static void cheevos_test_leaderboards(void) if (cheevos_test_lboard_condition(&lboard->submit)) { - char url[256]; + lboard->active = 0; - cheevos_make_lboard_url(lboard, url, sizeof(url)); - task_push_http_transfer(url, true, NULL, cheevos_lboard_submit, lboard); + /* failsafe for improper LBs */ + if (value == 0) + { + RARCH_LOG("[CHEEVOS]: error: lboard %s tried to submit 0\n", lboard->title); + runloop_msg_queue_push("Leaderboard attempt cancelled!", 0, 2 * 60, false); + } + else + { + char url[256]; + cheevos_make_lboard_url(lboard, url, sizeof(url)); + task_push_http_transfer(url, true, NULL, cheevos_lboard_submit, lboard); + RARCH_LOG("[CHEEVOS]: submit lboard %s\n", lboard->title); - RARCH_LOG("[CHEEVOS]: submit lboard %s\n", lboard->title); + char msg[256]; + char formatted_value[16]; + cheevos_format_value(value, lboard->format, formatted_value, sizeof(formatted_value)); + snprintf(msg, sizeof(msg), "Submitted %s for %s", formatted_value, lboard->title); + msg[sizeof(msg) - 1] = 0; + runloop_msg_queue_push(msg, 0, 2 * 60, false); + } } if (cheevos_test_lboard_condition(&lboard->cancel)) { RARCH_LOG("[CHEEVOS]: cancel lboard %s\n", lboard->title); lboard->active = 0; + runloop_msg_queue_push("Leaderboard attempt cancelled!", 0, 2 * 60, false); } } else @@ -1797,11 +2001,16 @@ static void cheevos_test_leaderboards(void) RARCH_LOG("[CHEEVOS]: start lboard %s\n", lboard->title); lboard->active = 1; lboard->last_value = -1; + + char msg[256]; + snprintf(msg, sizeof(msg), "Leaderboard Active: %s", lboard->title); + msg[sizeof(msg) - 1] = 0; + runloop_msg_queue_push(msg, 0, 2 * 60, false); + runloop_msg_queue_push(lboard->description, 0, 3*60, false); } } } } -#endif /***************************************************************************** Free the loaded achievements. @@ -1809,15 +2018,20 @@ Free the loaded achievements. static void cheevos_free_condset(const cheevos_condset_t *set) { - free((void*)set->conds); + if (set->conds) + free((void*)set->conds); } static void cheevos_free_cheevo(const cheevo_t *cheevo) { - free((void*)cheevo->title); - free((void*)cheevo->description); - free((void*)cheevo->author); - free((void*)cheevo->badge); + if (cheevo->title) + free((void*)cheevo->title); + if (cheevo->description) + free((void*)cheevo->description); + if (cheevo->author) + free((void*)cheevo->author); + if (cheevo->badge) + free((void*)cheevo->badge); cheevos_free_condset(cheevo->condition.condsets); } @@ -1829,7 +2043,8 @@ static void cheevos_free_cheevo_set(const cheevoset_t *set) while (cheevo < end) cheevos_free_cheevo(cheevo++); - free((void*)set->cheevos); + if (set->cheevos) + free((void*)set->cheevos); } #ifndef CHEEVOS_DONT_DEACTIVATE @@ -1933,7 +2148,7 @@ void cheevos_reset_game(void) cheevo->last = 1; } -void cheevos_populate_menu(void *data, bool hardcore) +void cheevos_populate_menu(void *data) { #ifdef HAVE_MENU unsigned i; @@ -1946,39 +2161,30 @@ void cheevos_populate_menu(void *data, bool hardcore) for (i = 0; cheevo < end; i++, cheevo++) { - if (!hardcore) + + if (!(cheevo->active & CHEEVOS_ACTIVE_HARDCORE)) { - if (!(cheevo->active & CHEEVOS_ACTIVE_SOFTCORE)) - { - menu_entries_append_enum(info->list, cheevo->title, - cheevo->description, MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); - items_found++; - } - else - { - menu_entries_append_enum(info->list, cheevo->title, - cheevo->description, MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); - items_found++; - } + menu_entries_append_enum(info->list, cheevo->title, + cheevo->description, MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY_HARDCORE, + MENU_SETTINGS_CHEEVOS_START + i, 0, 0); + items_found++; + set_badge_info(&badges_ctx, i, cheevo->badge, (cheevo->active & CHEEVOS_ACTIVE_HARDCORE)); + } + else if (!(cheevo->active & CHEEVOS_ACTIVE_SOFTCORE)) + { + menu_entries_append_enum(info->list, cheevo->title, + cheevo->description, MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY, + MENU_SETTINGS_CHEEVOS_START + i, 0, 0); + items_found++; + set_badge_info(&badges_ctx, i, cheevo->badge, (cheevo->active & CHEEVOS_ACTIVE_SOFTCORE)); } else { - if (!(cheevo->active & CHEEVOS_ACTIVE_HARDCORE)) - { - menu_entries_append_enum(info->list, cheevo->title, - cheevo->description, MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); - items_found++; - } - else - { - menu_entries_append_enum(info->list, cheevo->title, - cheevo->description, MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); - items_found++; - } + menu_entries_append_enum(info->list, cheevo->title, + cheevo->description, MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY, + MENU_SETTINGS_CHEEVOS_START + i, 0, 0); + items_found++; + set_badge_info(&badges_ctx, i, cheevo->badge, (cheevo->active & CHEEVOS_ACTIVE_SOFTCORE)); } } @@ -1990,39 +2196,29 @@ void cheevos_populate_menu(void *data, bool hardcore) for (i = cheevos_locals.core.count; cheevo < end; i++, cheevo++) { - if (!hardcore) + if (!(cheevo->active & CHEEVOS_ACTIVE_HARDCORE)) { - if (!(cheevo->active & CHEEVOS_ACTIVE_SOFTCORE)) - { - menu_entries_append_enum(info->list, cheevo->title, - cheevo->description, MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); - items_found++; - } - else - { - menu_entries_append_enum(info->list, cheevo->title, - cheevo->description, MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); - items_found++; - } + menu_entries_append_enum(info->list, cheevo->title, + cheevo->description, MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY_HARDCORE, + MENU_SETTINGS_CHEEVOS_START + i, 0, 0); + items_found++; + set_badge_info(&badges_ctx, i, cheevo->badge, (cheevo->active & CHEEVOS_ACTIVE_HARDCORE)); + } + else if (!(cheevo->active & CHEEVOS_ACTIVE_SOFTCORE)) + { + menu_entries_append_enum(info->list, cheevo->title, + cheevo->description, MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY, + MENU_SETTINGS_CHEEVOS_START + i, 0, 0); + items_found++; + set_badge_info(&badges_ctx, i, cheevo->badge, (cheevo->active & CHEEVOS_ACTIVE_SOFTCORE)); } else { - if (!(cheevo->active & CHEEVOS_ACTIVE_HARDCORE)) - { - menu_entries_append_enum(info->list, cheevo->title, - cheevo->description, MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); - items_found++; - } - else - { - menu_entries_append_enum(info->list, cheevo->title, - cheevo->description, MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); - items_found++; - } + menu_entries_append_enum(info->list, cheevo->title, + cheevo->description, MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY, + MENU_SETTINGS_CHEEVOS_START + i, 0, 0); + items_found++; + set_badge_info(&badges_ctx, i, cheevo->badge, (cheevo->active & CHEEVOS_ACTIVE_SOFTCORE)); } } } @@ -2130,7 +2326,7 @@ static void cheevos_patch_addresses(cheevoset_t* set) case CHEEVOS_VAR_TYPE_DELTA_MEM: cheevos_var_patch_addr(&cond->source, cheevos_locals.console_id); #ifdef CHEEVOS_DUMP_ADDRS - RARCH_LOG("[CHEEVOS]: var %03d:%08X\n", cond->source.bank_id + 1, cond->source.value); + RARCH_LOG("[CHEEVOS]: s-var %03d:%08X\n", cond->source.bank_id + 1, cond->source.value); #endif break; @@ -2144,7 +2340,7 @@ static void cheevos_patch_addresses(cheevoset_t* set) case CHEEVOS_VAR_TYPE_DELTA_MEM: cheevos_var_patch_addr(&cond->target, cheevos_locals.console_id); #ifdef CHEEVOS_DUMP_ADDRS - RARCH_LOG("[CHEEVOS]: var %03d:%08X\n", cond->target.bank_id + 1, cond->target.value); + RARCH_LOG("[CHEEVOS]: t-var %03d:%08X\n", cond->target.bank_id + 1, cond->target.value); #endif break; @@ -2156,6 +2352,85 @@ static void cheevos_patch_addresses(cheevoset_t* set) } } +static void cheevos_patch_lb_conditions(cheevos_condition_t* condition) +{ + unsigned i, j; + cheevos_condset_t* condset = condition->condsets; + + for (i = condition->count; i != 0; i--, condset++) + { + cheevos_cond_t* cond = condset->conds; + + for (j = condset->count; j != 0; j--, cond++) + { + switch (cond->source.type) + { + case CHEEVOS_VAR_TYPE_ADDRESS: + case CHEEVOS_VAR_TYPE_DELTA_MEM: + cheevos_var_patch_addr(&cond->source, cheevos_locals.console_id); +#ifdef CHEEVOS_DUMP_ADDRS + RARCH_LOG("[CHEEVOS]: s-var %03d:%08X\n", cond->source.bank_id + 1, cond->source.value); +#endif + break; + default: + break; + } + switch (cond->target.type) + { + case CHEEVOS_VAR_TYPE_ADDRESS: + case CHEEVOS_VAR_TYPE_DELTA_MEM: + cheevos_var_patch_addr(&cond->target, cheevos_locals.console_id); +#ifdef CHEEVOS_DUMP_ADDRS + RARCH_LOG("[CHEEVOS]: t-var %03d:%08X\n", cond->target.bank_id + 1, cond->target.value); +#endif + break; + default: + break; + } + } + } +} + +static void cheevos_patch_lb_expressions(cheevos_expr_t* expression) +{ + unsigned i; + cheevos_term_t* term = expression->terms; + + for (i = expression->count; i != 0; i--, term++) + { + switch (term->var.type) + { + case CHEEVOS_VAR_TYPE_ADDRESS: + case CHEEVOS_VAR_TYPE_DELTA_MEM: + cheevos_var_patch_addr(&term->var, cheevos_locals.console_id); +#ifdef CHEEVOS_DUMP_ADDRS + RARCH_LOG("[CHEEVOS]: s-var %03d:%08X\n", term->var.bank_id + 1, term->var.value); +#endif + break; + default: + break; + } + } +} + +static void cheevos_patch_lbs(cheevos_leaderboard_t *leaderboard) +{ + unsigned i; + + for(i = 0; i < cheevos_locals.lboard_count; i++) + { + cheevos_condition_t* start = &leaderboard[i].start; + cheevos_condition_t* cancel = &leaderboard[i].cancel; + cheevos_condition_t* submit = &leaderboard[i].submit; + cheevos_expr_t* value = &leaderboard[i].value; + + cheevos_patch_lb_conditions(start); + cheevos_patch_lb_conditions(cancel); + cheevos_patch_lb_conditions(submit); + cheevos_patch_lb_expressions(value); + } +} + void cheevos_test(void) { settings_t *settings = config_get_ptr(); @@ -2164,6 +2439,7 @@ void cheevos_test(void) { cheevos_patch_addresses(&cheevos_locals.core); cheevos_patch_addresses(&cheevos_locals.unofficial); + cheevos_patch_lbs(cheevos_locals.leaderboards); cheevos_locals.addrs_patched = true; } @@ -2173,9 +2449,8 @@ void cheevos_test(void) if (settings->bools.cheevos_test_unofficial) cheevos_test_cheevo_set(&cheevos_locals.unofficial); -#ifdef CHEEVOS_ENABLE_LBOARDS - cheevos_test_leaderboards(); -#endif + if (settings->bools.cheevos_hardcore_mode_enable && settings->bools.cheevos_leaderboards_enable) + cheevos_test_leaderboards(); } bool cheevos_set_cheats(void) @@ -2235,37 +2510,47 @@ typedef struct char url[256]; \ struct http_connection_t *conn; \ struct http_t *http; \ - retro_time_t t0; + retro_time_t t0; \ + char badge_basepath[PATH_MAX_LENGTH]; \ + char badge_fullpath[PATH_MAX_LENGTH]; \ + char badge_name[16]; \ + cheevo_t *cheevo; \ + const cheevo_t *cheevo_end; #include "coro.h" -#define CHEEVOS_VAR_INFO CORO_VAR(info) -#define CHEEVOS_VAR_DATA CORO_VAR(data) -#define CHEEVOS_VAR_LEN CORO_VAR(len) -#define CHEEVOS_VAR_PATH CORO_VAR(path) -#define CHEEVOS_VAR_SETTINGS CORO_VAR(settings) -#define CHEEVOS_VAR_SYSINFO CORO_VAR(sysinfo) -#define CHEEVOS_VAR_I CORO_VAR(i) -#define CHEEVOS_VAR_J CORO_VAR(j) -#define CHEEVOS_VAR_K CORO_VAR(k) -#define CHEEVOS_VAR_EXT CORO_VAR(ext) -#define CHEEVOS_VAR_MD5 CORO_VAR(md5) -#define CHEEVOS_VAR_HASH CORO_VAR(hash) -#define CHEEVOS_VAR_GAMEID CORO_VAR(gameid) -#define CHEEVOS_VAR_JSON CORO_VAR(json) -#define CHEEVOS_VAR_COUNT CORO_VAR(count) -#define CHEEVOS_VAR_OFFSET CORO_VAR(offset) -#define CHEEVOS_VAR_HEADER CORO_VAR(header) -#define CHEEVOS_VAR_ROMSIZE CORO_VAR(romsize) -#define CHEEVOS_VAR_BYTES CORO_VAR(bytes) -#define CHEEVOS_VAR_MAPPER CORO_VAR(mapper) -#define CHEEVOS_VAR_ROUND CORO_VAR(round) -#define CHEEVOS_VAR_STREAM CORO_VAR(stream) -#define CHEEVOS_VAR_SIZE CORO_VAR(size) -#define CHEEVOS_VAR_URL CORO_VAR(url) -#define CHEEVOS_VAR_CONN CORO_VAR(conn) -#define CHEEVOS_VAR_HTTP CORO_VAR(http) -#define CHEEVOS_VAR_T0 CORO_VAR(t0) +#define CHEEVOS_VAR_INFO CORO_VAR(info) +#define CHEEVOS_VAR_DATA CORO_VAR(data) +#define CHEEVOS_VAR_LEN CORO_VAR(len) +#define CHEEVOS_VAR_PATH CORO_VAR(path) +#define CHEEVOS_VAR_SETTINGS CORO_VAR(settings) +#define CHEEVOS_VAR_SYSINFO CORO_VAR(sysinfo) +#define CHEEVOS_VAR_I CORO_VAR(i) +#define CHEEVOS_VAR_J CORO_VAR(j) +#define CHEEVOS_VAR_K CORO_VAR(k) +#define CHEEVOS_VAR_EXT CORO_VAR(ext) +#define CHEEVOS_VAR_MD5 CORO_VAR(md5) +#define CHEEVOS_VAR_HASH CORO_VAR(hash) +#define CHEEVOS_VAR_GAMEID CORO_VAR(gameid) +#define CHEEVOS_VAR_JSON CORO_VAR(json) +#define CHEEVOS_VAR_COUNT CORO_VAR(count) +#define CHEEVOS_VAR_OFFSET CORO_VAR(offset) +#define CHEEVOS_VAR_HEADER CORO_VAR(header) +#define CHEEVOS_VAR_ROMSIZE CORO_VAR(romsize) +#define CHEEVOS_VAR_BYTES CORO_VAR(bytes) +#define CHEEVOS_VAR_MAPPER CORO_VAR(mapper) +#define CHEEVOS_VAR_ROUND CORO_VAR(round) +#define CHEEVOS_VAR_STREAM CORO_VAR(stream) +#define CHEEVOS_VAR_SIZE CORO_VAR(size) +#define CHEEVOS_VAR_URL CORO_VAR(url) +#define CHEEVOS_VAR_CONN CORO_VAR(conn) +#define CHEEVOS_VAR_HTTP CORO_VAR(http) +#define CHEEVOS_VAR_T0 CORO_VAR(t0) +#define CHEEVOS_VAR_BADGE_PATH CORO_VAR(badge_fullpath) +#define CHEEVOS_VAR_BADGE_BASE_PATH CORO_VAR(badge_fullpath) +#define CHEEVOS_VAR_BADGE_NAME CORO_VAR(badge_name) +#define CHEEVOS_VAR_CHEEVO_CURR CORO_VAR(cheevo) +#define CHEEVOS_VAR_CHEEVO_END CORO_VAR(cheevo_end) static int cheevos_iterate(coro_t* coro) { @@ -2286,11 +2571,12 @@ static int cheevos_iterate(coro_t* coro) FILL_MD5 = -7, GET_GAMEID = -8, GET_CHEEVOS = -9, - LOGIN = -10, - HTTP_GET = -11, - DEACTIVATE = -12, - PLAYING = -13, - DELAY = -14 + GET_BADGES = -10, + LOGIN = -11, + HTTP_GET = -12, + DEACTIVATE = -13, + PLAYING = -14, + DELAY = -15 }; static const uint32_t genesis_exts[] = @@ -2371,7 +2657,7 @@ static int cheevos_iterate(coro_t* coro) /* Load the content into memory, or copy it over to our own buffer */ if (!CHEEVOS_VAR_DATA) { - CHEEVOS_VAR_STREAM = filestream_open(CHEEVOS_VAR_PATH, RFILE_MODE_READ, 0); + CHEEVOS_VAR_STREAM = filestream_open(CHEEVOS_VAR_PATH, RFILE_MODE_READ, -1); if (!CHEEVOS_VAR_STREAM) CORO_STOP(); @@ -2523,11 +2809,14 @@ static int cheevos_iterate(coro_t* coro) #endif if (cheevos_parse(CHEEVOS_VAR_JSON)) { - free((void*)CHEEVOS_VAR_JSON); + if ((void*)CHEEVOS_VAR_JSON) + free((void*)CHEEVOS_VAR_JSON); CORO_STOP(); } - free((void*)CHEEVOS_VAR_JSON); + if ((void*)CHEEVOS_VAR_JSON) + free((void*)CHEEVOS_VAR_JSON); + cheevos_loaded = true; /* @@ -2544,27 +2833,35 @@ static int cheevos_iterate(coro_t* coro) if(CHEEVOS_VAR_SETTINGS->bools.cheevos_verbose_enable) { - const cheevo_t* cheevo = cheevos_locals.core.cheevos; - const cheevo_t* end = cheevo + cheevos_locals.core.count; - int number_of_unlocked = cheevos_locals.core.count; - int mode; - char msg[256]; + if(cheevos_locals.core.count > 0) + { + const cheevo_t* cheevo = cheevos_locals.core.cheevos; + const cheevo_t* end = cheevo + cheevos_locals.core.count; + int number_of_unlocked = cheevos_locals.core.count; + int mode; + char msg[256]; - if(CHEEVOS_VAR_SETTINGS->bools.cheevos_hardcore_mode_enable) - mode = CHEEVOS_ACTIVE_HARDCORE; + if(CHEEVOS_VAR_SETTINGS->bools.cheevos_hardcore_mode_enable) + mode = CHEEVOS_ACTIVE_HARDCORE; + else + mode = CHEEVOS_ACTIVE_SOFTCORE; + + for(; cheevo < end; cheevo++) + if(cheevo->active & mode) + number_of_unlocked--; + + snprintf(msg, sizeof(msg), "You have %d of %d achievements unlocked.", + number_of_unlocked, cheevos_locals.core.count); + msg[sizeof(msg) - 1] = 0; + runloop_msg_queue_push(msg, 0, 6 * 60, false); + } else - mode = CHEEVOS_ACTIVE_SOFTCORE; + runloop_msg_queue_push("This game has no achievements.", 0, 5 * 60, false); - for(; cheevo < end; cheevo++) - if(cheevo->active & mode) - number_of_unlocked--; - - snprintf(msg, sizeof(msg), "You have %d of %d achievements unlocked.", - number_of_unlocked, cheevos_locals.core.count); - msg[sizeof(msg) - 1] = 0; - runloop_msg_queue_push(msg, 0, 6 * 60, false); } + CORO_GOSUB(GET_BADGES); + CORO_STOP(); /************************************************************************** @@ -2635,7 +2932,7 @@ static int cheevos_iterate(coro_t* coro) * Output CHEEVOS_VAR_GAMEID the Retro Achievements game ID, or 0 if not found *************************************************************************/ CORO_SUB(LYNX_MD5) - + if (CHEEVOS_VAR_LEN < 0x0240) { CHEEVOS_VAR_GAMEID = 0; @@ -2818,12 +3115,14 @@ static int cheevos_iterate(coro_t* coro) if (cheevos_get_value(CHEEVOS_VAR_JSON, CHEEVOS_JSON_KEY_GAMEID, gameid, sizeof(gameid))) { - free((void*)CHEEVOS_VAR_JSON); + if ((void*)CHEEVOS_VAR_JSON) + free((void*)CHEEVOS_VAR_JSON); RARCH_ERR("[CHEEVOS]: error getting game_id.\n"); CORO_RET(); } - free((void*)CHEEVOS_VAR_JSON); + if ((void*)CHEEVOS_VAR_JSON) + free((void*)CHEEVOS_VAR_JSON); RARCH_LOG("[CHEEVOS]: got game id %s.\n", gameid); CHEEVOS_VAR_GAMEID = strtol(gameid, NULL, 10); CORO_RET(); @@ -2836,14 +3135,12 @@ static int cheevos_iterate(coro_t* coro) *************************************************************************/ CORO_SUB(GET_CHEEVOS) - CORO_GOSUB(LOGIN); + CORO_GOSUB(LOGIN); - snprintf( - CHEEVOS_VAR_URL, sizeof(CHEEVOS_VAR_URL), - "http://retroachievements.org/dorequest.php?r=patch&u=%s&g=%u&f=3&l=1&t=%s", - CHEEVOS_VAR_SETTINGS->arrays.cheevos_username, - CHEEVOS_VAR_GAMEID, cheevos_locals.token - ); + snprintf(CHEEVOS_VAR_URL, sizeof(CHEEVOS_VAR_URL), + "http://retroachievements.org/dorequest.php?r=patch&u=%s&g=%u&f=3&l=1&t=%s", + CHEEVOS_VAR_SETTINGS->arrays.cheevos_username, + CHEEVOS_VAR_GAMEID, cheevos_locals.token); CHEEVOS_VAR_URL[sizeof(CHEEVOS_VAR_URL) - 1] = 0; @@ -2862,6 +3159,62 @@ static int cheevos_iterate(coro_t* coro) RARCH_LOG("[CHEEVOS]: got achievements for game id %u.\n", CHEEVOS_VAR_GAMEID); CORO_RET(); + /************************************************************************** + * Info Gets the achievements from Retro Achievements + * Inputs CHEEVOS_VAR_GAMEID + * Outputs CHEEVOS_VAR_JSON + *************************************************************************/ + CORO_SUB(GET_BADGES) + + badges_ctx = new_badges_ctx; + + settings_t *settings = config_get_ptr(); + if (!string_is_equal(settings->arrays.menu_driver, "xmb") || + !settings->bools.cheevos_badges_enable) + CORO_RET(); + + CHEEVOS_VAR_CHEEVO_CURR = cheevos_locals.core.cheevos; + CHEEVOS_VAR_CHEEVO_END = cheevos_locals.core.cheevos + cheevos_locals.core.count; + + for (; CHEEVOS_VAR_CHEEVO_CURR < CHEEVOS_VAR_CHEEVO_END ; CHEEVOS_VAR_CHEEVO_CURR++) + { + for (CHEEVOS_VAR_J = 0 ; CHEEVOS_VAR_J < 2; CHEEVOS_VAR_J++) + { + CHEEVOS_VAR_BADGE_PATH[0] = '\0'; + fill_pathname_application_special(CHEEVOS_VAR_BADGE_BASE_PATH, sizeof(CHEEVOS_VAR_BADGE_BASE_PATH), + APPLICATION_SPECIAL_DIRECTORY_THUMBNAILS_CHEEVOS_BADGES); + + if (!path_is_directory(CHEEVOS_VAR_BADGE_BASE_PATH)) + path_mkdir(CHEEVOS_VAR_BADGE_BASE_PATH); + CORO_YIELD(); + if (CHEEVOS_VAR_J == 0) + snprintf(CHEEVOS_VAR_BADGE_NAME, sizeof(CHEEVOS_VAR_BADGE_NAME), "%s.png", CHEEVOS_VAR_CHEEVO_CURR->badge); + else + snprintf(CHEEVOS_VAR_BADGE_NAME, sizeof(CHEEVOS_VAR_BADGE_NAME), "%s_lock.png", CHEEVOS_VAR_CHEEVO_CURR->badge); + + fill_pathname_join(CHEEVOS_VAR_BADGE_PATH, CHEEVOS_VAR_BADGE_BASE_PATH, CHEEVOS_VAR_BADGE_NAME, sizeof(CHEEVOS_VAR_BADGE_PATH)); + + if (!badge_exists(CHEEVOS_VAR_BADGE_PATH)) + { +#ifdef CHEEVOS_LOG_BADGES + RARCH_LOG("[CHEEVOS]: downloading badge %s\n", CHEEVOS_VAR_BADGE_PATH); +#endif + snprintf(CHEEVOS_VAR_URL, sizeof(CHEEVOS_VAR_URL), "http://i.retroachievements.org/Badge/%s", CHEEVOS_VAR_BADGE_NAME); + + CORO_GOSUB(HTTP_GET); + if (CHEEVOS_VAR_JSON != NULL) + { + if (!filestream_write_file(CHEEVOS_VAR_BADGE_PATH, CHEEVOS_VAR_JSON, CHEEVOS_VAR_K)) + RARCH_ERR("[CHEEVOS]: error writing badge %s\n", CHEEVOS_VAR_BADGE_PATH); + else + free(CHEEVOS_VAR_JSON); + } + } + } + } + + CORO_RET(); + /************************************************************************** * Info Logs in the user at Retro Achievements *************************************************************************/ @@ -2905,7 +3258,8 @@ static int cheevos_iterate(coro_t* coro) if (CHEEVOS_VAR_JSON) { int res = cheevos_get_value(CHEEVOS_VAR_JSON, CHEEVOS_JSON_KEY_TOKEN, cheevos_locals.token, sizeof(cheevos_locals.token)); - free((void*)CHEEVOS_VAR_JSON); + if ((void*)CHEEVOS_VAR_JSON) + free((void*)CHEEVOS_VAR_JSON); if (!res) { @@ -2954,7 +3308,7 @@ static int cheevos_iterate(coro_t* coro) { if (CHEEVOS_VAR_K != 0) RARCH_LOG("[CHEEVOS]: Retrying HTTP request: %u of 5\n", CHEEVOS_VAR_K + 1); - + CHEEVOS_VAR_JSON = NULL; CHEEVOS_VAR_CONN = net_http_connection_new(CHEEVOS_VAR_URL, "GET", NULL); @@ -3002,6 +3356,7 @@ static int cheevos_iterate(coro_t* coro) CHEEVOS_VAR_JSON[length] = 0; } + CHEEVOS_VAR_K = length; net_http_delete(CHEEVOS_VAR_HTTP); net_http_connection_free(CHEEVOS_VAR_CONN); CORO_RET(); @@ -3047,8 +3402,9 @@ static int cheevos_iterate(coro_t* coro) RARCH_LOG("[CHEEVOS]: deactivated unlocked achievements in softcore mode.\n"); else RARCH_ERR("[CHEEVOS]: error deactivating unlocked achievements in softcore mode.\n"); - - free((void*)CHEEVOS_VAR_JSON); + + if ((void*)CHEEVOS_VAR_JSON) + free((void*)CHEEVOS_VAR_JSON); } else RARCH_ERR("[CHEEVOS]: error retrieving list of unlocked achievements in softcore mode.\n"); @@ -3075,8 +3431,9 @@ static int cheevos_iterate(coro_t* coro) RARCH_LOG("[CHEEVOS]: deactivated unlocked achievements in hardcore mode.\n"); else RARCH_ERR("[CHEEVOS]: error deactivating unlocked achievements in hardcore mode.\n"); - - free((void*)CHEEVOS_VAR_JSON); + + if ((void*)CHEEVOS_VAR_JSON) + free((void*)CHEEVOS_VAR_JSON); } else RARCH_ERR("[CHEEVOS]: error retrieving list of unlocked achievements in hardcore mode.\n"); @@ -3109,7 +3466,8 @@ static int cheevos_iterate(coro_t* coro) if (CHEEVOS_VAR_JSON) { RARCH_LOG("[CHEEVOS]: posted playing activity.\n"); - free((void*)CHEEVOS_VAR_JSON); + if ((void*)CHEEVOS_VAR_JSON) + free((void*)CHEEVOS_VAR_JSON); } else RARCH_ERR("[CHEEVOS]: error posting playing activity.\n"); @@ -3124,11 +3482,16 @@ static void cheevos_task_handler(retro_task_t *task) { coro_t *coro = (coro_t*)task->state; + if (!coro) + return; + if (!cheevos_iterate(coro)) { task_set_finished(task, true); - free(CHEEVOS_VAR_DATA); - free((void*)CHEEVOS_VAR_PATH); + if (CHEEVOS_VAR_DATA) + free(CHEEVOS_VAR_DATA); + if ((void*)CHEEVOS_VAR_PATH) + free((void*)CHEEVOS_VAR_PATH); free((void*)coro); } } @@ -3136,8 +3499,8 @@ static void cheevos_task_handler(retro_task_t *task) bool cheevos_load(const void *data) { retro_task_t *task; - coro_t *coro; - const struct retro_game_info *info; + const struct retro_game_info *info = NULL; + coro_t *coro = NULL; cheevos_loaded = 0; @@ -3153,7 +3516,8 @@ bool cheevos_load(const void *data) if (!task) { - free((void*)coro); + if ((void*)coro) + free((void*)coro); return false; } @@ -3172,8 +3536,10 @@ bool cheevos_load(const void *data) if (!CHEEVOS_VAR_DATA) { - free((void*)task); - free((void*)coro); + if ((void*)task) + free((void*)task); + if ((void*)coro) + free((void*)coro); return false; } diff --git a/cheevos/cheevos.h b/cheevos/cheevos.h index 359d8a541b..cf2526e504 100644 --- a/cheevos/cheevos.h +++ b/cheevos/cheevos.h @@ -60,15 +60,64 @@ typedef enum CHEEVOS_CONSOLE_SEGA_CD = 9, CHEEVOS_CONSOLE_SEGA_32X = 10, CHEEVOS_CONSOLE_MASTER_SYSTEM = 11, - CHEEVOS_CONSOLE_XBOX_360 = 12, - CHEEVOS_CONSOLE_ATARI_LYNX = 13 + CHEEVOS_CONSOLE_PLAYSTATION = 12, + CHEEVOS_CONSOLE_ATARI_LYNX = 13, + CHEEVOS_CONSOLE_NEOGEO = 14, + CHEEVOS_CONSOLE_XBOX_360 = 15, + CHEEVOS_CONSOLE_GAMECUBE = 16, + CHEEVOS_CONSOLE_ATARI_JAGUAR = 17, + CHEEVOS_CONSOLE_NINTENDO_DS = 18, + CHEEVOS_CONSOLE_WII = 19, + CHEEVOS_CONSOLE_WII_U = 20, + CHEEVOS_CONSOLE_PLAYSTATION_2 = 21, + CHEEVOS_CONSOLE_XBOX = 22, + CHEEVOS_CONSOLE_SKYNET = 23, + CHEEVOS_CONSOLE_XBOX_ONE = 24, + CHEEVOS_CONSOLE_ATARI_2600 = 25, + CHEEVOS_CONSOLE_MS_DOS = 26, + CHEEVOS_CONSOLE_ARCADE = 27, + CHEEVOS_CONSOLE_VIRTUAL_BOY = 28, + CHEEVOS_CONSOLE_MSX = 29, + CHEEVOS_CONSOLE_COMMODORE_64 = 30, + CHEEVOS_CONSOLE_ZX81 = 31 } cheevos_console_t; +enum +{ + CHEEVOS_DIRTY_TITLE = 1 << 0, + CHEEVOS_DIRTY_DESC = 1 << 1, + CHEEVOS_DIRTY_POINTS = 1 << 2, + CHEEVOS_DIRTY_AUTHOR = 1 << 3, + CHEEVOS_DIRTY_ID = 1 << 4, + CHEEVOS_DIRTY_BADGE = 1 << 5, + CHEEVOS_DIRTY_CONDITIONS = 1 << 6, + CHEEVOS_DIRTY_VOTES = 1 << 7, + CHEEVOS_DIRTY_DESCRIPTION = 1 << 8, + + CHEEVOS_DIRTY_ALL = (1 << 9) - 1 +}; + +enum +{ + CHEEVOS_ACTIVE_SOFTCORE = 1 << 0, + CHEEVOS_ACTIVE_HARDCORE = 1 << 1 +}; + +enum +{ + CHEEVOS_FORMAT_FRAMES = 0, + CHEEVOS_FORMAT_SECS, + CHEEVOS_FORMAT_MILLIS, + CHEEVOS_FORMAT_SCORE, + CHEEVOS_FORMAT_VALUE, + CHEEVOS_FORMAT_OTHER +}; + bool cheevos_load(const void *data); void cheevos_reset_game(void); -void cheevos_populate_menu(void *data, bool hardcore); +void cheevos_populate_menu(void *data); bool cheevos_get_description(cheevos_ctx_desc_t *desc); diff --git a/cheevos/var.c b/cheevos/var.c index 2b567bf21e..36828b46b3 100644 --- a/cheevos/var.c +++ b/cheevos/var.c @@ -119,12 +119,21 @@ void cheevos_var_parse(cheevos_var_t* var, const char** memaddr) const char *str = *memaddr; unsigned base = 16; + var->is_bcd = false; + if (toupper((unsigned char)*str) == 'D' && str[1] == '0' && toupper((unsigned char)str[2]) == 'X') { /* d0x + 4 hex digits */ str += 3; var->type = CHEEVOS_VAR_TYPE_DELTA_MEM; } + else if (toupper((unsigned char)*str) == 'B' && str[1] == '0' && toupper((unsigned char)str[2]) == 'X') + { + /* b0x (binary-coded decimal) */ + str += 3; + var->is_bcd = true; + var->type = CHEEVOS_VAR_TYPE_ADDRESS; + } else if (*str == '0' && toupper((unsigned char)str[1]) == 'X') { /* 0x + 4 hex digits */ @@ -406,5 +415,8 @@ unsigned cheevos_var_get_value(cheevos_var_t* var) break; } - return value; + if(var->is_bcd) + return (((value >> 4) & 0xf) * 10) + (value & 0xf); + else + return value; } diff --git a/cheevos/var.h b/cheevos/var.h index 2e9959288e..336b65d4ed 100644 --- a/cheevos/var.h +++ b/cheevos/var.h @@ -62,6 +62,7 @@ typedef struct cheevos_var_size_t size; cheevos_var_type_t type; int bank_id; + bool is_bcd; unsigned value; unsigned previous; } cheevos_var_t; diff --git a/command.c b/command.c index 8666504be3..67fa8014c5 100644 --- a/command.c +++ b/command.c @@ -641,6 +641,7 @@ static void command_stdin_poll(command_t *handle) bool command_poll(command_t *handle) { + memset(handle->state, 0, sizeof(handle->state)); #if defined(HAVE_NETWORKING) && defined(HAVE_NETWORK_CMD) && defined(HAVE_COMMAND) command_network_poll(handle); #endif @@ -1101,7 +1102,7 @@ static void command_event_load_auto_state(void) #endif #ifdef HAVE_CHEEVOS - if (settings->bools.cheevos_hardcore_mode_enable) + if (cheevos_loaded && settings->bools.cheevos_hardcore_mode_enable) goto error; #endif @@ -1307,14 +1308,18 @@ static void command_event_restore_default_shader_preset(void) if (!path_is_empty(RARCH_PATH_DEFAULT_SHADER_PRESET)) { /* auto shader preset: reload the original shader */ - settings_t *settings = config_get_ptr(); + settings_t *settings = config_get_ptr(); + const char *shader_preset = path_get(RARCH_PATH_DEFAULT_SHADER_PRESET); - RARCH_LOG("%s %s\n", - msg_hash_to_str(MSG_RESTORING_DEFAULT_SHADER_PRESET_TO), - path_get(RARCH_PATH_DEFAULT_SHADER_PRESET)); - strlcpy(settings->paths.path_shader, - path_get(RARCH_PATH_DEFAULT_SHADER_PRESET), - sizeof(settings->paths.path_shader)); + if (!string_is_empty(shader_preset)) + { + RARCH_LOG("%s %s\n", + msg_hash_to_str(MSG_RESTORING_DEFAULT_SHADER_PRESET_TO), + shader_preset); + strlcpy(settings->paths.path_shader, + shader_preset, + sizeof(settings->paths.path_shader)); + } } path_clear(RARCH_PATH_DEFAULT_SHADER_PRESET); @@ -1351,7 +1356,7 @@ static bool command_event_save_auto_state(void) goto error; #ifdef HAVE_CHEEVOS - if (settings->bools.cheevos_hardcore_mode_enable) + if (cheevos_loaded && settings->bools.cheevos_hardcore_mode_enable) goto error; #endif @@ -1373,24 +1378,32 @@ error: return false; } -static bool command_event_save_config(const char *config_path, +static bool command_event_save_config( + const char *config_path, char *s, size_t len) { - if (string_is_empty(config_path) || !config_save_file(config_path)) + bool path_exists = !string_is_empty(config_path); + const char *str = path_exists ? config_path : + path_get(RARCH_PATH_CONFIG); + + if (path_exists && config_save_file(config_path)) + { + snprintf(s, len, "[Config]: %s \"%s\".", + msg_hash_to_str(MSG_SAVED_NEW_CONFIG_TO), + config_path); + RARCH_LOG("%s\n", s); + return true; + } + + if (!string_is_empty(str)) { snprintf(s, len, "%s \"%s\".", msg_hash_to_str(MSG_FAILED_SAVING_CONFIG_TO), - path_get(RARCH_PATH_CONFIG)); + str); RARCH_ERR("%s\n", s); - - return false; } - snprintf(s, len, "[Config]: %s \"%s\".", - msg_hash_to_str(MSG_SAVED_NEW_CONFIG_TO), - path_get(RARCH_PATH_CONFIG)); - RARCH_LOG("%s\n", s); - return true; + return false; } /** @@ -1407,6 +1420,7 @@ static bool command_event_save_core_config(void) bool ret = false; bool found_path = false; bool overrides_active = false; + const char *core_path = NULL; char *config_dir = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); char *config_name = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); char *config_path = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); @@ -1429,8 +1443,10 @@ static bool command_event_save_core_config(void) goto error; } + core_path = path_get(RARCH_PATH_CORE); + /* Infer file name based on libretro core. */ - if (!string_is_empty(path_get(RARCH_PATH_CORE)) && path_file_exists(path_get(RARCH_PATH_CORE))) + if (!string_is_empty(core_path) && path_file_exists(core_path)) { unsigned i; RARCH_LOG("%s\n", msg_hash_to_str(MSG_USING_CORE_NAME_FOR_NEW_CONFIG)); @@ -1442,7 +1458,7 @@ static bool command_event_save_core_config(void) fill_pathname_base_noext( config_name, - path_get(RARCH_PATH_CORE), + core_path, config_size); fill_pathname_join(config_path, config_dir, config_name, @@ -1489,7 +1505,8 @@ static bool command_event_save_core_config(void) command_event_save_config(config_path, msg, sizeof(msg)); - runloop_msg_queue_push(msg, 1, 180, true); + if (!string_is_empty(msg)) + runloop_msg_queue_push(msg, 1, 180, true); if (overrides_active) rarch_ctl(RARCH_CTL_SET_OVERRIDES_ACTIVE, NULL); @@ -1685,6 +1702,62 @@ static bool command_event_resize_windowed_scale(void) return true; } +void command_playlist_push_write( + void *data, + const char *path, + const char *label, + const char *core_path, + const char *core_name) +{ + playlist_t *playlist = (playlist_t*)data; + + if (!playlist) + return; + + if (playlist_push( + playlist, + path, + label, + core_path, + core_name, + NULL, + NULL + )) + playlist_write_file(playlist); +} + +void command_playlist_update_write( + void *data, + size_t idx, + const char *core_display_name, + const char *label, + const char *path) +{ + playlist_t *plist = (playlist_t*)data; + playlist_t *playlist = NULL; + + if (plist) + playlist = plist; +#ifdef HAVE_MENU + else + menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &playlist); +#endif + if (!playlist) + return; + + playlist_update( + playlist, + idx, + label, + NULL, + path, + core_display_name, + NULL, + NULL); + + playlist_write_file(playlist); +} + /** * command_event: * @cmd : Event command index. @@ -1733,18 +1806,23 @@ bool command_event(enum event_command cmd, void *data) { #ifdef HAVE_MENU core_info_ctx_find_t info_find; - rarch_system_info_t *system_info = runloop_get_system_info(); - struct retro_system_info *system = &system_info->info; + rarch_system_info_t *system_info = NULL; + struct retro_system_info *system = NULL; + const char *core_path = NULL; + system_info = runloop_get_system_info(); + system = &system_info->info; + core_path = path_get(RARCH_PATH_CORE); #if defined(HAVE_DYNAMIC) - if (string_is_empty(path_get(RARCH_PATH_CORE))) + if (string_is_empty(core_path)) return false; #endif + libretro_get_system_info( - path_get(RARCH_PATH_CORE), + core_path, system, &system_info->load_no_content); - info_find.path = path_get(RARCH_PATH_CORE); + info_find.path = core_path; if (!core_info_load(&info_find)) { @@ -1770,7 +1848,7 @@ bool command_event(enum event_command cmd, void *data) #ifdef HAVE_CHEEVOS { settings_t *settings = config_get_ptr(); - if (settings->bools.cheevos_hardcore_mode_enable) + if (cheevos_loaded && settings->bools.cheevos_hardcore_mode_enable) return false; } #endif @@ -1812,7 +1890,7 @@ bool command_event(enum event_command cmd, void *data) { settings_t *settings = config_get_ptr(); #ifdef HAVE_CHEEVOS - if (settings->bools.cheevos_hardcore_mode_enable) + if (cheevos_loaded && settings->bools.cheevos_hardcore_mode_enable) return false; #endif @@ -1903,7 +1981,7 @@ bool command_event(enum event_command cmd, void *data) { #ifdef HAVE_CHEEVOS settings_t *settings = config_get_ptr(); - if (settings->bools.cheevos_hardcore_mode_enable) + if (cheevos_loaded && settings->bools.cheevos_hardcore_mode_enable) return false; #endif @@ -1914,7 +1992,7 @@ bool command_event(enum event_command cmd, void *data) { settings_t *settings = config_get_ptr(); #ifdef HAVE_CHEEVOS - if (settings->bools.cheevos_hardcore_mode_enable) + if (cheevos_loaded && settings->bools.cheevos_hardcore_mode_enable) return false; #endif if (settings->bools.rewind_enable) @@ -2237,18 +2315,32 @@ TODO: Add a setting for these tweaks */ ui_companion_driver_toggle(); break; case CMD_EVENT_ADD_TO_FAVORITES: - playlist_push( + { + global_t *global = global_get_ptr(); + rarch_system_info_t *sys_info = runloop_get_system_info(); + const char *core_name = NULL; + const char *core_path = NULL; + const char *label = NULL; + + if (sys_info) + { + core_name = sys_info->info.library_name; + core_path = path_get(RARCH_PATH_CORE); + } + + if (!string_is_empty(global->name.label)) + label = global->name.label; + + command_playlist_push_write( g_defaults.content_favorites, - path_get(RARCH_PATH_CONTENT), - NULL, - file_path_str(FILE_PATH_DETECT), - file_path_str(FILE_PATH_DETECT), - NULL, - NULL + (const char*)data, + label, + core_path, + core_name ); - playlist_write_file(g_defaults.content_favorites); runloop_msg_queue_push(msg_hash_to_str(MSG_ADDED_TO_FAVORITES), 1, 180, true); break; + } case CMD_EVENT_RESTART_RETROARCH: if (!frontend_driver_set_fork(FRONTEND_FORK_RESTART)) return false; diff --git a/command.h b/command.h index 33c408638f..286383fc83 100644 --- a/command.h +++ b/command.h @@ -259,6 +259,20 @@ bool command_free(command_t *handle); **/ bool command_event(enum event_command action, void *data); +void command_playlist_push_write( + void *data, + const char *path, + const char *label, + const char *core_path, + const char *core_name); + +void command_playlist_update_write( + void *data, + size_t idx, + const char *core_display_name, + const char *label, + const char *path); + RETRO_END_DECLS #endif diff --git a/config.def.h b/config.def.h index 880da62e0a..c3fb49f6f6 100644 --- a/config.def.h +++ b/config.def.h @@ -293,6 +293,12 @@ static bool xmb_show_add = true; #endif #endif +#if defined(HAVE_LIBRETRODB) && !defined(RARCH_CONSOLE) +static bool automatically_add_content_to_playlist = true; +#else +static bool automatically_add_content_to_playlist = false; +#endif + static float menu_framebuffer_opacity = 0.900; static float menu_wallpaper_opacity = 0.300; @@ -528,7 +534,7 @@ static const bool netplay_nat_traversal = false; static const unsigned netplay_delay_frames = 16; -static const int netplay_check_frames = 30; +static const int netplay_check_frames = 600; static const bool netplay_use_mitm_server = false; diff --git a/config.def.keybinds.h b/config.def.keybinds.h index 5ed2203f51..b7f0a32e86 100644 --- a/config.def.keybinds.h +++ b/config.def.keybinds.h @@ -22,163 +22,202 @@ /* User 1 */ static const struct retro_keybind retro_keybinds_1[] = { - /* | RetroPad button | enum | keyboard key | js btn | js axis | */ + /* | RetroPad button | enum | keyboard key | m-btn | js btn | js axis | */ #ifdef __QNX__ - { true, RETRO_DEVICE_ID_JOYPAD_B, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, RETROK_k, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_Y, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, RETROK_i, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_SELECT, RETROK_v, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_START, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_START, RETROK_b, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_UP, RETROK_e, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_DOWN, RETROK_s, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_LEFT, RETROK_w, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_RIGHT, RETROK_d, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_A, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_A, RETROK_l, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_X, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_X, RETROK_o, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_L, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L, RETROK_f, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_R, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R, RETROK_j, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_L2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L2, RETROK_r, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_R2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R2, RETROK_u, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_L3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L3, RETROK_g, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_R3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R3, RETROK_h, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_B, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, RETROK_k, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_Y, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, RETROK_i, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_SELECT, RETROK_v, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_START, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_START, RETROK_b, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_UP, RETROK_e, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_DOWN, RETROK_s, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_LEFT, RETROK_w, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_RIGHT, RETROK_d, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_A, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_A, RETROK_l, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_X, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_X, RETROK_o, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_L, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L, RETROK_f, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_R, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R, RETROK_j, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_L2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L2, RETROK_r, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_R2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R2, RETROK_u, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_L3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L3, RETROK_g, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_R3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R3, RETROK_h, NO_BTN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_LEFT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_LEFT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_LEFT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_LEFT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_RIGHT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_RIGHT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_RIGHT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_RIGHT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_LEFT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_LEFT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_LEFT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_LEFT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_RIGHT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_RIGHT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_RIGHT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_RIGHT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_TURBO_ENABLE, MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_FAST_FORWARD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_KEY, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_FAST_FORWARD_HOLD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_HOLD_KEY,RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_LOAD_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_SAVE_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_SAVE_STATE_KEY, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_FULLSCREEN_TOGGLE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FULLSCREEN_TOGGLE_KEY,RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_QUIT_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_STATE_SLOT_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_STATE_SLOT_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_REWIND, MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_MOVIE_RECORD_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_PAUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_FRAMEADVANCE, MENU_ENUM_LABEL_VALUE_INPUT_META_FRAMEADVANCE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_RESET, MENU_ENUM_LABEL_VALUE_INPUT_META_RESET, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_SHADER_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_SHADER_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_PREV, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_CHEAT_INDEX_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_CHEAT_INDEX_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_CHEAT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_TOGGLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_SCREENSHOT, MENU_ENUM_LABEL_VALUE_INPUT_META_SCREENSHOT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_MUTE, MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_OSK, MENU_ENUM_LABEL_VALUE_INPUT_META_OSK, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_NETPLAY_FLIP, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_FLIP, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_NETPLAY_GAME_WATCH, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_GAME_WATCH, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_SLOWMOTION, MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ENABLE_HOTKEY, MENU_ENUM_LABEL_VALUE_INPUT_META_ENABLE_HOTKEY, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_VOLUME_UP, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_UP, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_VOLUME_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_DOWN, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_OVERLAY_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_OVERLAY_NEXT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_DISK_EJECT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_EJECT_TOGGLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_DISK_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_NEXT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_DISK_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_PREV, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_GRAB_MOUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GRAB_MOUSE_TOGGLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_GAME_FOCUS_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GAME_FOCUS_TOGGLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_MENU_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, RETROK_SPACE, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_TRIGGER, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_RELOAD, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_AUX_A, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_AUX_B, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_AUX_C, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_START, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_DPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_DPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_DPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_DPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + + { true, RARCH_TURBO_ENABLE, MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + + { true, RARCH_FAST_FORWARD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_FAST_FORWARD_HOLD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_HOLD_KEY,RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LOAD_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_SAVE_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_SAVE_STATE_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_FULLSCREEN_TOGGLE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FULLSCREEN_TOGGLE_KEY,RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_QUIT_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_STATE_SLOT_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_STATE_SLOT_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_REWIND, MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_MOVIE_RECORD_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_PAUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_FRAMEADVANCE, MENU_ENUM_LABEL_VALUE_INPUT_META_FRAMEADVANCE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_RESET, MENU_ENUM_LABEL_VALUE_INPUT_META_RESET, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_SHADER_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_SHADER_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_PREV, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_CHEAT_INDEX_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_CHEAT_INDEX_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_CHEAT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_SCREENSHOT, MENU_ENUM_LABEL_VALUE_INPUT_META_SCREENSHOT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_MUTE, MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_OSK, MENU_ENUM_LABEL_VALUE_INPUT_META_OSK, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_NETPLAY_FLIP, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_FLIP, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_NETPLAY_GAME_WATCH, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_GAME_WATCH, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_SLOWMOTION, MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ENABLE_HOTKEY, MENU_ENUM_LABEL_VALUE_INPUT_META_ENABLE_HOTKEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_VOLUME_UP, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_UP, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_VOLUME_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_DOWN, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_OVERLAY_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_OVERLAY_NEXT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_DISK_EJECT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_EJECT_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_DISK_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_NEXT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_DISK_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_PREV, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_GRAB_MOUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GRAB_MOUSE_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_GAME_FOCUS_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GAME_FOCUS_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_MENU_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, RETROK_SPACE, NO_BTN, NO_BTN, 0, AXIS_NONE }, #else - { true, RETRO_DEVICE_ID_JOYPAD_B, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, RETROK_z, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_Y, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, RETROK_a, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_SELECT, RETROK_RSHIFT, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_START, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_START, RETROK_RETURN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_UP, RETROK_UP, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_DOWN, RETROK_DOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_LEFT, RETROK_LEFT, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_RIGHT, RETROK_RIGHT, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_A, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_A, RETROK_x, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_X, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_X, RETROK_s, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_L, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L, RETROK_q, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_R, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R, RETROK_w, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_L2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L2, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_R2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R2, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_L3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L3, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_R3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R3, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_B, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, RETROK_z, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_Y, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, RETROK_a, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_SELECT, RETROK_RSHIFT, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_START, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_START, RETROK_RETURN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_UP, RETROK_UP, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_DOWN, RETROK_DOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_LEFT, RETROK_LEFT, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_RIGHT, RETROK_RIGHT, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_A, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_A, RETROK_x, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_X, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_X, RETROK_s, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_L, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L, RETROK_q, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_R, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R, RETROK_w, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_L2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L2, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_R2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R2, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_L3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L3, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_R3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R3, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_LEFT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_LEFT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_LEFT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_LEFT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_RIGHT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_RIGHT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_RIGHT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_RIGHT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_LEFT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_LEFT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_LEFT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_LEFT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_RIGHT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_RIGHT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_RIGHT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_RIGHT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_TURBO_ENABLE, MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_FAST_FORWARD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_KEY, RETROK_SPACE, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_FAST_FORWARD_HOLD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_HOLD_KEY,RETROK_l, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_LOAD_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, RETROK_F4, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_SAVE_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_SAVE_STATE_KEY, RETROK_F2, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_FULLSCREEN_TOGGLE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FULLSCREEN_TOGGLE_KEY,RETROK_f, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_QUIT_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, RETROK_ESCAPE, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_STATE_SLOT_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS, RETROK_F7, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_STATE_SLOT_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS, RETROK_F6, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_REWIND, MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND, RETROK_r, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_MOVIE_RECORD_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE, RETROK_o, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_PAUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE, RETROK_p, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_FRAMEADVANCE, MENU_ENUM_LABEL_VALUE_INPUT_META_FRAMEADVANCE, RETROK_k, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_RESET, MENU_ENUM_LABEL_VALUE_INPUT_META_RESET, RETROK_h, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_SHADER_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, RETROK_m, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_SHADER_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_PREV, RETROK_n, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_CHEAT_INDEX_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_PLUS, RETROK_y, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_CHEAT_INDEX_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_MINUS, RETROK_t, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_CHEAT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_TOGGLE, RETROK_u, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_SCREENSHOT, MENU_ENUM_LABEL_VALUE_INPUT_META_SCREENSHOT, RETROK_F8, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_MUTE, MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, RETROK_F9, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_OSK, MENU_ENUM_LABEL_VALUE_INPUT_META_OSK, RETROK_F12, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_NETPLAY_FLIP, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_FLIP, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_NETPLAY_GAME_WATCH, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_GAME_WATCH, RETROK_i, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_SLOWMOTION, MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION, RETROK_e, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ENABLE_HOTKEY, MENU_ENUM_LABEL_VALUE_INPUT_META_ENABLE_HOTKEY, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_VOLUME_UP, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_UP, RETROK_KP_PLUS, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_VOLUME_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_DOWN, RETROK_KP_MINUS,NO_BTN, 0, AXIS_NONE }, - { true, RARCH_OVERLAY_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_OVERLAY_NEXT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_DISK_EJECT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_EJECT_TOGGLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_DISK_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_NEXT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_DISK_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_PREV, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_GRAB_MOUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GRAB_MOUSE_TOGGLE, RETROK_F11, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_GAME_FOCUS_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GAME_FOCUS_TOGGLE, RETROK_SCROLLOCK, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_MENU_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, RETROK_F1, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_TRIGGER, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_RELOAD, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_AUX_A, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_AUX_B, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_AUX_C, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_START, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_DPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_DPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_DPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_DPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + + { true, RARCH_TURBO_ENABLE, MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + + { true, RARCH_FAST_FORWARD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_KEY, RETROK_SPACE, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_FAST_FORWARD_HOLD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_HOLD_KEY,RETROK_l, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LOAD_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, RETROK_F4, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_SAVE_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_SAVE_STATE_KEY, RETROK_F2, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_FULLSCREEN_TOGGLE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FULLSCREEN_TOGGLE_KEY,RETROK_f, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_QUIT_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, RETROK_ESCAPE, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_STATE_SLOT_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS, RETROK_F7, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_STATE_SLOT_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS, RETROK_F6, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_REWIND, MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND, RETROK_r, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_MOVIE_RECORD_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE, RETROK_o, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_PAUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE, RETROK_p, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_FRAMEADVANCE, MENU_ENUM_LABEL_VALUE_INPUT_META_FRAMEADVANCE, RETROK_k, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_RESET, MENU_ENUM_LABEL_VALUE_INPUT_META_RESET, RETROK_h, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_SHADER_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, RETROK_m, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_SHADER_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_PREV, RETROK_n, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_CHEAT_INDEX_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_PLUS, RETROK_y, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_CHEAT_INDEX_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_MINUS, RETROK_t, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_CHEAT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_TOGGLE, RETROK_u, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_SCREENSHOT, MENU_ENUM_LABEL_VALUE_INPUT_META_SCREENSHOT, RETROK_F8, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_MUTE, MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, RETROK_F9, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_OSK, MENU_ENUM_LABEL_VALUE_INPUT_META_OSK, RETROK_F12, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_NETPLAY_FLIP, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_FLIP, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_NETPLAY_GAME_WATCH, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_GAME_WATCH, RETROK_i, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_SLOWMOTION, MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION, RETROK_e, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ENABLE_HOTKEY, MENU_ENUM_LABEL_VALUE_INPUT_META_ENABLE_HOTKEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_VOLUME_UP, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_UP, RETROK_KP_PLUS, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_VOLUME_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_DOWN, RETROK_KP_MINUS,NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_OVERLAY_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_OVERLAY_NEXT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_DISK_EJECT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_EJECT_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_DISK_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_NEXT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_DISK_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_PREV, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_GRAB_MOUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GRAB_MOUSE_TOGGLE, RETROK_F11, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_GAME_FOCUS_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GAME_FOCUS_TOGGLE, RETROK_SCROLLOCK, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_MENU_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, RETROK_F1, NO_BTN, NO_BTN, 0, AXIS_NONE }, #endif }; /* Users 2 to MAX_USERS */ static const struct retro_keybind retro_keybinds_rest[] = { - /* | RetroPad button | desc | keyboard key | js btn | js axis | */ - { true, RETRO_DEVICE_ID_JOYPAD_B, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_Y, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_SELECT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_START, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_START, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_UP, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_DOWN, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_LEFT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_RIGHT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_A, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_A, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_X, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_X, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_L, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_R, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_L2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L2, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_R2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R2, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_L3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L3, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RETRO_DEVICE_ID_JOYPAD_R3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R3, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, + /* | RetroPad button | desc | keyboard key | js btn | js axis | */ + { true, RETRO_DEVICE_ID_JOYPAD_B, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_Y, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_SELECT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_START, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_START, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_UP, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_DOWN, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_LEFT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_RIGHT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_A, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_A, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_X, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_X, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_L, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_R, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_L2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L2, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_R2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R2, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_L3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L3, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RETRO_DEVICE_ID_JOYPAD_R3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R3, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_LEFT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_LEFT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_LEFT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_LEFT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_RIGHT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_RIGHT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_RIGHT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_ANALOG_RIGHT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_TURBO_ENABLE, MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_LEFT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_LEFT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_LEFT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_LEFT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_RIGHT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_RIGHT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_RIGHT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_ANALOG_RIGHT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + + { true, RARCH_LIGHTGUN_TRIGGER, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_RELOAD, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_AUX_A, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_AUX_B, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_AUX_C, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_START, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_DPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_DPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_DPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_LIGHTGUN_DPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + + { true, RARCH_TURBO_ENABLE, MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, }; #endif diff --git a/config.features.h b/config.features.h index 5e0ef72b6e..96b06539ba 100644 --- a/config.features.h +++ b/config.features.h @@ -260,12 +260,6 @@ static const bool _sdl_image_supp = true; static const bool _sdl_image_supp = false; #endif -#ifdef HAVE_FBO -static const bool _fbo_supp = true; -#else -static const bool _fbo_supp = false; -#endif - #ifdef HAVE_DYNAMIC static const bool _dynamic_supp = true; #else diff --git a/configuration.c b/configuration.c index 272284602c..8edb392412 100644 --- a/configuration.c +++ b/configuration.c @@ -50,6 +50,12 @@ #include "tasks/tasks_internal.h" +static const char* invalid_filename_chars[] = { + /* https://support.microsoft.com/en-us/help/905231/information-about-the-characters-that-you-cannot-use-in-site-names--fo */ + "~", "#", "%", "&", "*", "{", "}", "\\", ":", "[", "]", "?", "/", "|", "\'", "\"", + NULL +}; + /* All config related settings go here. */ struct config_bool_setting @@ -1108,6 +1114,7 @@ static struct config_bool_setting *populate_settings_bool(settings_t *settings, unsigned count = 0; global_t *global = global_get_ptr(); + SETTING_BOOL("automatically_add_content_to_playlist", &settings->bools.automatically_add_content_to_playlist, true, automatically_add_content_to_playlist, false); SETTING_BOOL("ui_companion_start_on_boot", &settings->bools.ui_companion_start_on_boot, true, ui_companion_start_on_boot, false); SETTING_BOOL("ui_companion_enable", &settings->bools.ui_companion_enable, true, ui_companion_enable, false); SETTING_BOOL("video_gpu_record", &settings->bools.video_gpu_record, true, gpu_record, false); @@ -1248,6 +1255,10 @@ static struct config_bool_setting *populate_settings_bool(settings_t *settings, SETTING_BOOL("cheevos_enable", &settings->bools.cheevos_enable, true, cheevos_enable, false); SETTING_BOOL("cheevos_test_unofficial", &settings->bools.cheevos_test_unofficial, true, false, false); SETTING_BOOL("cheevos_hardcore_mode_enable", &settings->bools.cheevos_hardcore_mode_enable, true, false, false); + SETTING_BOOL("cheevos_leaderboards_enable", &settings->bools.cheevos_leaderboards_enable, true, false, false); +#ifdef HAVE_XMB + SETTING_BOOL("cheevos_badges_enable", &settings->bools.cheevos_badges_enable, true, false, false); +#endif SETTING_BOOL("cheevos_verbose_enable", &settings->bools.cheevos_verbose_enable, true, false, false); #endif #ifdef HAVE_OVERLAY @@ -1857,7 +1868,7 @@ static void config_set_defaults(void) temp_str[0] = '\0'; fill_pathname_expand_special(temp_str, - g_defaults.path.config, + g_defaults.path.config, PATH_MAX_LENGTH * sizeof(char)); path_set(RARCH_PATH_CONFIG, temp_str); free(temp_str); @@ -2133,6 +2144,24 @@ static void read_keybinds_axis(config_file_t *conf, unsigned user, input_config_bind_map_get_base(idx), bind); } +static void read_keybinds_mbutton(config_file_t *conf, unsigned user, + unsigned idx, struct retro_keybind *bind) +{ + const char *prefix = NULL; + + if (!input_config_bind_map_get_valid(idx)) + return; + if (!input_config_bind_map_get_base(idx)) + return; + + prefix = input_config_get_prefix(user, + input_config_bind_map_get_meta(idx)); + + if (prefix) + input_config_parse_mouse_button(conf, prefix, + input_config_bind_map_get_base(idx), bind); +} + static void read_keybinds_user(config_file_t *conf, unsigned user) { unsigned i; @@ -2147,6 +2176,7 @@ static void read_keybinds_user(config_file_t *conf, unsigned user) read_keybinds_keyboard(conf, user, i, bind); read_keybinds_button(conf, user, i, bind); read_keybinds_axis(conf, user, i, bind); + read_keybinds_mbutton(conf, user, i, bind); } } @@ -2255,6 +2285,8 @@ static bool config_load_file(const char *path, bool set_defaults, #ifdef HAVE_NETWORKING char *override_netplay_ip_address = NULL; #endif + const char *path_core = NULL; + const char *path_config = NULL; int bool_settings_size = sizeof(settings->bools) / sizeof(settings->bools.placeholder); int float_settings_size = sizeof(settings->floats) / sizeof(settings->floats.placeholder); int int_settings_size = sizeof(settings->ints) / sizeof(settings->ints.placeholder); @@ -2527,13 +2559,16 @@ static bool config_load_file(const char *path, bool set_defaults, audio_set_float(AUDIO_ACTION_VOLUME_GAIN, settings->floats.audio_volume); audio_set_float(AUDIO_ACTION_MIXER_VOLUME_GAIN, settings->floats.audio_mixer_volume); + path_config = path_get(RARCH_PATH_CONFIG); + path_core = path_get(RARCH_PATH_CORE); + if (string_is_empty(settings->paths.path_content_history)) { if (string_is_empty(settings->paths.directory_content_history)) { fill_pathname_resolve_relative( settings->paths.path_content_history, - path_get(RARCH_PATH_CONFIG), + path_config, file_path_str(FILE_PATH_CONTENT_HISTORY), sizeof(settings->paths.path_content_history)); } @@ -2552,7 +2587,7 @@ static bool config_load_file(const char *path, bool set_defaults, { fill_pathname_resolve_relative( settings->paths.path_content_favorites, - path_get(RARCH_PATH_CONFIG), + path_config, file_path_str(FILE_PATH_CONTENT_FAVORITES), sizeof(settings->paths.path_content_favorites)); } @@ -2571,7 +2606,7 @@ static bool config_load_file(const char *path, bool set_defaults, { fill_pathname_resolve_relative( settings->paths.path_content_music_history, - path_get(RARCH_PATH_CONFIG), + path_config, file_path_str(FILE_PATH_CONTENT_MUSIC_HISTORY), sizeof(settings->paths.path_content_music_history)); } @@ -2590,7 +2625,7 @@ static bool config_load_file(const char *path, bool set_defaults, { fill_pathname_resolve_relative( settings->paths.path_content_video_history, - path_get(RARCH_PATH_CONFIG), + path_config, file_path_str(FILE_PATH_CONTENT_VIDEO_HISTORY), sizeof(settings->paths.path_content_video_history)); } @@ -2609,7 +2644,7 @@ static bool config_load_file(const char *path, bool set_defaults, { fill_pathname_resolve_relative( settings->paths.path_content_image_history, - path_get(RARCH_PATH_CONFIG), + path_config, file_path_str(FILE_PATH_CONTENT_IMAGE_HISTORY), sizeof(settings->paths.path_content_image_history)); } @@ -2635,14 +2670,14 @@ static bool config_load_file(const char *path, bool set_defaults, } #ifdef RARCH_CONSOLE - if (!string_is_empty(path_get(RARCH_PATH_CORE))) + if (!string_is_empty(path_core)) { #endif /* Safe-guard against older behavior. */ - if (path_is_directory(path_get(RARCH_PATH_CORE))) + if (path_is_directory(path_core)) { RARCH_WARN("\"libretro_path\" is a directory, using this for \"libretro_directory\" instead.\n"); - strlcpy(settings->paths.directory_libretro, path_get(RARCH_PATH_CORE), + strlcpy(settings->paths.directory_libretro, path_core, sizeof(settings->paths.directory_libretro)); path_clear(RARCH_PATH_CORE); } @@ -2683,16 +2718,13 @@ static bool config_load_file(const char *path, bool set_defaults, *settings->paths.directory_system = '\0'; if (settings->floats.slowmotion_ratio < 1.0f) - { configuration_set_float(settings, settings->floats.slowmotion_ratio, 1.0f); - } /* Sanitize fastforward_ratio value - previously range was -1 * and up (with 0 being skipped) */ if (settings->floats.fastforward_ratio < 0.0f) - { configuration_set_float(settings, settings->floats.fastforward_ratio, 0.0f); - } + #ifdef HAVE_LAKKA settings->bools.ssh_enable = path_file_exists(LAKKA_SSH_PATH); @@ -2922,7 +2954,7 @@ bool config_load_override(void) /* Restore the libretro_path we're using * since it will be overwritten by the override when reloading. */ path_set(RARCH_PATH_CORE, buf); - runloop_msg_queue_push("Configuration override loaded.", 1, 100, true); + runloop_msg_queue_push(msg_hash_to_str(MSG_CONFIG_OVERRIDE_LOADED), 1, 100, true); /* Reset save paths. */ retroarch_override_setting_set(RARCH_OVERRIDE_SETTING_STATE_PATH, NULL); @@ -3039,7 +3071,7 @@ bool config_load_remap(void) RARCH_LOG("Remaps: game-specific remap found at %s.\n", game_path); if (input_remapping_load_file(new_conf, game_path)) { - runloop_msg_queue_push("Game remap file loaded.", 1, 100, true); + runloop_msg_queue_push(msg_hash_to_str(MSG_GAME_REMAP_FILE_LOADED), 1, 100, true); rarch_ctl(RARCH_CTL_SET_REMAPS_GAME_ACTIVE, NULL); goto success; } @@ -3059,7 +3091,7 @@ bool config_load_remap(void) RARCH_LOG("Remaps: core-specific remap found at %s.\n", core_path); if (input_remapping_load_file(new_conf, core_path)) { - runloop_msg_queue_push("Core remap file loaded.", 1, 100, true); + runloop_msg_queue_push(msg_hash_to_str(MSG_CORE_REMAP_FILE_LOADED), 1, 100, true); rarch_ctl(RARCH_CTL_SET_REMAPS_CORE_ACTIVE, NULL); goto success; } @@ -3336,6 +3368,38 @@ static void save_keybind_axis(config_file_t *conf, const char *prefix, } } +static void save_keybind_mbutton(config_file_t *conf, const char *prefix, + const char *base, const struct retro_keybind *bind, bool save_empty) +{ + char key[64]; + + key[0] = '\0'; + + fill_pathname_join_delim_concat(key, prefix, + base, '_', "_mbtn", sizeof(key)); + + switch ( bind->mbutton ) + { + + case RETRO_DEVICE_ID_MOUSE_LEFT: config_set_uint64(conf, key, 1); break; + case RETRO_DEVICE_ID_MOUSE_RIGHT: config_set_uint64(conf, key, 2); break; + case RETRO_DEVICE_ID_MOUSE_MIDDLE: config_set_uint64(conf, key, 3); break; + case RETRO_DEVICE_ID_MOUSE_BUTTON_4: config_set_uint64(conf, key, 4); break; + case RETRO_DEVICE_ID_MOUSE_BUTTON_5: config_set_uint64(conf, key, 5); break; + + case RETRO_DEVICE_ID_MOUSE_WHEELUP: config_set_string(conf, key, "wu"); break; + case RETRO_DEVICE_ID_MOUSE_WHEELDOWN: config_set_string(conf, key, "wd"); break; + case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP: config_set_string(conf, key, "whu"); break; + case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN: config_set_string(conf, key, "whd"); break; + + default: + if ( save_empty ) { + config_set_string(conf, key, file_path_str(FILE_PATH_NUL)); + } + break; + } +} + /** * save_keybind: * @conf : pointer to config file object @@ -3356,6 +3420,7 @@ static void save_keybind(config_file_t *conf, const char *prefix, save_keybind_key(conf, prefix, base, bind); save_keybind_joykey(conf, prefix, base, bind, save_empty); save_keybind_axis(conf, prefix, base, bind, save_empty); + save_keybind_mbutton(conf, prefix, base, bind, save_empty); } /** @@ -3443,6 +3508,7 @@ bool config_save_autoconf_profile(const char *path, unsigned user) unsigned i; char *buf = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); char *autoconf_file = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); + char *path_new = NULL; size_t path_size = PATH_MAX_LENGTH * sizeof(char); int32_t pid_user = 0; int32_t vid_user = 0; @@ -3454,6 +3520,26 @@ bool config_save_autoconf_profile(const char *path, unsigned user) buf[0] = autoconf_file[0] = '\0'; + if (string_is_empty(path)) + goto error; + + path_new = strdup(path); + + for (i = 0; invalid_filename_chars[i]; i++) + { + while (1) + { + char *tmp = strstr(path_new, invalid_filename_chars[i]); + + if (tmp) + *tmp = '_'; + else + break; + } + } + + path = path_new; + fill_pathname_join(buf, autoconf_dir, joypad_ident, path_size); if(path_is_directory(buf)) @@ -3479,7 +3565,7 @@ bool config_save_autoconf_profile(const char *path, unsigned user) path_size); } - conf = config_file_new(autoconf_file); + conf = config_file_new(autoconf_file); if (!conf) { @@ -3515,11 +3601,14 @@ bool config_save_autoconf_profile(const char *path, unsigned user) config_file_free(conf); free(buf); free(autoconf_file); + free(path_new); return ret; error: free(buf); free(autoconf_file); + if (path_new) + free(path_new); return false; } diff --git a/configuration.h b/configuration.h index 5cb68b115e..c81a53f962 100644 --- a/configuration.h +++ b/configuration.h @@ -29,21 +29,28 @@ #include "input/input_defines.h" #define configuration_set_float(settings, var, newvar) \ +{ \ settings->modified = true; \ - var = newvar + var = newvar; \ +} #define configuration_set_bool(settings, var, newvar) \ +{ \ settings->modified = true; \ - var = newvar + var = newvar; \ +} #define configuration_set_uint(settings, var, newvar) \ +{ \ settings->modified = true; \ - var = newvar + var = newvar; \ +} #define configuration_set_int(settings, var, newvar) \ +{ \ settings->modified = true; \ - var = newvar - + var = newvar; \ +} enum override_type { @@ -183,6 +190,8 @@ typedef struct settings bool cheevos_enable; bool cheevos_test_unofficial; bool cheevos_hardcore_mode_enable; + bool cheevos_leaderboards_enable; + bool cheevos_badges_enable; bool cheevos_verbose_enable; /* Camera */ @@ -241,6 +250,8 @@ typedef struct settings bool ssh_enable; bool samba_enable; bool bluetooth_enable; + + bool automatically_add_content_to_playlist; } bools; struct diff --git a/core_info.c b/core_info.c index 659a71fc6d..c2989d883b 100644 --- a/core_info.c +++ b/core_info.c @@ -389,6 +389,10 @@ static core_info_list_t *core_info_list_new(const char *path) &tmp_bool)) core_info[i].supports_no_game = tmp_bool; + if (config_get_bool(conf, "database_match_archive_member", + &tmp_bool)) + core_info[i].database_match_archive_member = tmp_bool; + core_info[i].config_data = conf; } else @@ -823,6 +827,46 @@ size_t core_info_list_num_info_files(core_info_list_t *core_info_list) return num; } +bool core_info_database_match_archive_member(const char *database_path) +{ + char *database = NULL; + const char *new_path = path_basename(database_path); + + if (string_is_empty(new_path)) + return false; + + database = strdup(new_path); + + if (string_is_empty(database)) + goto error; + + path_remove_extension(database); + + if (core_info_curr_list) + { + size_t i; + + for (i = 0; i < core_info_curr_list->count; i++) + { + const core_info_t *info = &core_info_curr_list->list[i]; + + if (!info->database_match_archive_member) + continue; + + if (!string_list_find_elem(info->databases_list, database)) + continue; + + free(database); + return true; + } + } + +error: + if (database) + free(database); + return false; +} + bool core_info_database_supports_content_path(const char *database_path, const char *path) { char *database = NULL; diff --git a/core_info.h b/core_info.h index 2800cd2edf..a151091673 100644 --- a/core_info.h +++ b/core_info.h @@ -38,6 +38,7 @@ typedef struct typedef struct { bool supports_no_game; + bool database_match_archive_member; size_t firmware_count; char *path; void *config_data; @@ -120,6 +121,8 @@ bool core_info_load(core_info_ctx_find_t *info); bool core_info_database_supports_content_path(const char *database_path, const char *path); +bool core_info_database_match_archive_member(const char *database_path); + bool core_info_unsupported_content_path(const char *path); RETRO_END_DECLS diff --git a/deps/miniupnpc/minissdpc.c b/deps/miniupnpc/minissdpc.c index c015298b97..6cf1570787 100644 --- a/deps/miniupnpc/minissdpc.c +++ b/deps/miniupnpc/minissdpc.c @@ -67,13 +67,13 @@ struct sockaddr_un { #define PRINT_SOCKET_ERROR(x) perror(x) #endif -#if !defined(__DragonFly__) && !defined(__OpenBSD__) && !defined(__NetBSD__) && !defined(__APPLE__) && !defined(_WIN32) && !defined(__CYGWIN__) && !defined(__sun) && !defined(__GNU__) && !defined(__FreeBSD_kernel__) +#if !defined(__DragonFly__) && !defined(__OpenBSD__) && !defined(__NetBSD__) && !defined(__APPLE__) && !defined(_WIN32) && !defined(__CYGWIN__) && !defined(__sun) && !defined(__GNU__) && !defined(__FreeBSD_kernel__) && !defined(__HAIKU__) #define HAS_IP_MREQN #endif #if !defined(HAS_IP_MREQN) && !defined(_WIN32) #include -#if defined(__sun) +#if defined(__sun) || defined(__HAIKU__) #include #endif #endif diff --git a/deps/miniupnpc/portlistingparse.c b/deps/miniupnpc/portlistingparse.c index e864c0eb70..de596698aa 100644 --- a/deps/miniupnpc/portlistingparse.c +++ b/deps/miniupnpc/portlistingparse.c @@ -31,7 +31,7 @@ static const struct { /* Helper function */ static UNSIGNED_INTEGER -atoui(const char * p, int l) +my_atoui(const char * p, int l) { UNSIGNED_INTEGER r = 0; while(l > 0 && *p) @@ -106,7 +106,7 @@ static void portlisting_data(void * d, const char * data, int l) pm->remoteHost[l] = '\0'; break; case NewExternalPort: - pm->externalPort = (unsigned short)atoui(data, l); + pm->externalPort = (unsigned short)my_atoui(data, l); break; case NewProtocol: if(l > 3) @@ -115,21 +115,21 @@ static void portlisting_data(void * d, const char * data, int l) pm->protocol[l] = '\0'; break; case NewInternalPort: - pm->internalPort = (unsigned short)atoui(data, l); + pm->internalPort = (unsigned short)my_atoui(data, l); break; case NewInternalClient: memcpy(pm->internalClient, data, l); pm->internalClient[l] = '\0'; break; case NewEnabled: - pm->enabled = (unsigned char)atoui(data, l); + pm->enabled = (unsigned char)my_atoui(data, l); break; case NewDescription: memcpy(pm->description, data, l); pm->description[l] = '\0'; break; case NewLeaseTime: - pm->leaseTime = atoui(data, l); + pm->leaseTime = my_atoui(data, l); break; default: break; diff --git a/deps/miniupnpc/upnpcommands.c b/deps/miniupnpc/upnpcommands.c index 25483c0c45..017c5cdce6 100644 --- a/deps/miniupnpc/upnpcommands.c +++ b/deps/miniupnpc/upnpcommands.c @@ -14,7 +14,7 @@ #include "portlistingparse.h" static UNSIGNED_INTEGER -my_atoui(const char * s) +my_custom_atoui(const char * s) { return s ? ((UNSIGNED_INTEGER)STRTOUI(s, NULL, 0)) : 0; } @@ -38,7 +38,7 @@ UPNP_GetTotalBytesSent(const char * controlURL, /*DisplayNameValueList(buffer, bufsize);*/ free(buffer); buffer = NULL; p = GetValueFromNameValueList(&pdata, "NewTotalBytesSent"); - r = (unsigned)my_atoui(p); + r = (unsigned)my_custom_atoui(p); ClearNameValueList(&pdata); return r; } @@ -62,7 +62,7 @@ UPNP_GetTotalBytesReceived(const char * controlURL, /*DisplayNameValueList(buffer, bufsize);*/ free(buffer); buffer = NULL; p = GetValueFromNameValueList(&pdata, "NewTotalBytesReceived"); - r = (unsigned)my_atoui(p); + r = (unsigned)my_custom_atoui(p); ClearNameValueList(&pdata); return r; } @@ -86,7 +86,7 @@ UPNP_GetTotalPacketsSent(const char * controlURL, /*DisplayNameValueList(buffer, bufsize);*/ free(buffer); buffer = NULL; p = GetValueFromNameValueList(&pdata, "NewTotalPacketsSent"); - r = (unsigned)my_atoui(p); + r = (unsigned)my_custom_atoui(p); ClearNameValueList(&pdata); return r; } @@ -110,7 +110,7 @@ UPNP_GetTotalPacketsReceived(const char * controlURL, /*DisplayNameValueList(buffer, bufsize);*/ free(buffer); buffer = NULL; p = GetValueFromNameValueList(&pdata, "NewTotalPacketsReceived"); - r = (unsigned)my_atoui(p); + r = (unsigned)my_custom_atoui(p); ClearNameValueList(&pdata); return r; } @@ -903,11 +903,11 @@ UPNP_GetFirewallStatus(const char * controlURL, if(ipa && fe) ret = UPNPCOMMAND_SUCCESS; if(fe) - *firewallEnabled = (int)my_atoui(fe); + *firewallEnabled = (int)my_custom_atoui(fe); /*else *firewallEnabled = 0;*/ if(ipa) - *inboundPinholeAllowed = (int)my_atoui(ipa); + *inboundPinholeAllowed = (int)my_custom_atoui(ipa); /*else *inboundPinholeAllowed = 0;*/ p = GetValueFromNameValueList(&pdata, "errorCode"); @@ -971,7 +971,7 @@ UPNP_GetOutboundPinholeTimeout(const char * controlURL, const char * servicetype ret = UPNPCOMMAND_SUCCESS; p = GetValueFromNameValueList(&pdata, "OutboundPinholeTimeout"); if(p) - *opTimeout = (int)my_atoui(p); + *opTimeout = (int)my_custom_atoui(p); } ClearNameValueList(&pdata); return ret; @@ -1175,7 +1175,7 @@ UPNP_CheckPinholeWorking(const char * controlURL, const char * servicetype, p = GetValueFromNameValueList(&pdata, "IsWorking"); if(p) { - *isWorking = (int)my_atoui(p); + *isWorking = (int)my_custom_atoui(p); ret = UPNPCOMMAND_SUCCESS; } else @@ -1222,7 +1222,7 @@ UPNP_GetPinholePackets(const char * controlURL, const char * servicetype, p = GetValueFromNameValueList(&pdata, "PinholePackets"); if(p) { - *packets = (int)my_atoui(p); + *packets = (int)my_custom_atoui(p); ret = UPNPCOMMAND_SUCCESS; } diff --git a/dist-scripts/dist-cores.sh b/dist-scripts/dist-cores.sh index d1fafaafab..0f10e57e95 100755 --- a/dist-scripts/dist-cores.sh +++ b/dist-scripts/dist-cores.sh @@ -134,32 +134,7 @@ if [ $SALAMANDER = "yes" ]; then vita-mksfoex -s TITLE_ID=RETROVITA "RetroArch" ../pkg/${platform}/retroarch.vpk/vpk/sce_sys/param.sfo cp ../pkg/${platform}/assets/ICON0.PNG ../pkg/${platform}/retroarch.vpk/vpk/sce_sys/icon0.png cp -R ../pkg/${platform}/assets/livearea ../pkg/${platform}/retroarch.vpk/vpk/sce_sys/ - mkdir -p ../pkg/${platform}/retroarch.vpk/vpk/assets - if [ -d ../media/assets/glui ]; then - cp -r ../media/assets/glui ../pkg/${platform}/retroarch.vpk/vpk/assets - fi - if [ -d ../media/assets/xmb ]; then - cp -r ../media/assets/xmb ../pkg/${platform}/retroarch.vpk/vpk/assets - # Strip source SVG files - rm -rf ../pkg/${platform}/retroarch.vpk/vpk/assets/xmb/flatui/src - rm -rf ../pkg/${platform}/retroarch.vpk/vpk/assets/xmb/monochrome/src - rm -rf ../pkg/${platform}/retroarch.vpk/vpk/assets/xmb/retroactive/src - rm -rf ../pkg/${platform}/retroarch.vpk/vpk/assets/xmb/retroactive_marked/src - rm -rf ../pkg/${platform}/retroarch.vpk/vpk/assets/xmb/dot-art/src - fi - if [ -d ../media/libretrodb/rdb ]; then - mkdir -p ../pkg/${platform}/retroarch.vpk/vpk/database/rdb - cp -r ../media/libretrodb/rdb/* ../pkg/${platform}/retroarch.vpk/vpk/database/rdb - fi - if [ -d ../media/libretrodb/cursors ]; then - mkdir -p ../pkg/${platform}/retroarch.vpk/vpk/database/cursors - cp -r ../media/libretrodb/cursors/* ../pkg/${platform}/retroarch.vpk/vpk/database/cursors - fi - if [ -d ../../dist/info ]; then - mkdir -p ../pkg/${platform}/retroarch.vpk/vpk/info - cp -fv ../../dist/info/*.info ../pkg/${platform}/retroarch.vpk/vpk/info/ - fi - make -C ../ -f Makefile.${platform}.salamander clean || exit 1 + make -C ../ -f Makefile.${platform}.salamander clean || exit 1 fi if [ $PLATFORM = "ctr" ] ; then mv -f ../retroarch_3ds_salamander.cia ../pkg/3ds/cia/retroarch_3ds.cia @@ -259,44 +234,10 @@ for f in `ls -v *_${platform}.${EXT}`; do elif [ $PLATFORM = "vita" ] ; then COUNTER=$((COUNTER + 1)) COUNTER_ID=`printf "%05d" ${COUNTER}` - mkdir -p ../pkg/${platform}/${name}_libretro.vpk/vpk/sce_sys/ - mkdir -p ../pkg/${platform}/${name}_libretro.vpk/vpk/sce_sys/livearea - mkdir -p ../pkg/${platform}/${name}_libretro.vpk/vpk/sce_sys/livearea/contents - mkdir -p ../pkg/${platform}/${name}_libretro.vpk/vpk/assets/ - mkdir -p ../pkg/${platform}/${name}_libretro.vpk/vpk/database/rdb - mkdir -p ../pkg/${platform}/${name}_libretro.vpk/vpk/database/cursors - mkdir -p ../pkg/${platform}/${name}_libretro.vpk/vpk/info - cp ../retroarch_${platform}.self ../pkg/${platform}/${name}_libretro.vpk/vpk/eboot.bin - cp ../pkg/${platform}/${name}_libretro.vpk/vpk/eboot.bin ../pkg/${platform}/retroarch.vpk/vpk/${name}_libretro.self - vita-mksfoex -s TITLE_ID=RETR${COUNTER_ID} "RetroArch ${name}" ../pkg/${platform}/${name}_libretro.vpk/vpk/sce_sys/param.sfo - cp ../pkg/${platform}/assets/ICON0.PNG ../pkg/${platform}/${name}_libretro.vpk/vpk/sce_sys/icon0.png - cp ../pkg/${platform}/assets/livearea/contents/bg.png ../pkg/${platform}/${name}_libretro.vpk/vpk/sce_sys/livearea/contents/bg.png - cp ../pkg/${platform}/assets/livearea/contents/startup.png ../pkg/${platform}/${name}_libretro.vpk/vpk/sce_sys/livearea/contents/startup.png - cp ../pkg/${platform}/assets/livearea/contents/website.png ../pkg/${platform}/${name}_libretro.vpk/vpk/sce_sys/livearea/contents/website.png - cp ../pkg/${platform}/assets/livearea/contents/template.xml ../pkg/${platform}/${name}_libretro.vpk/vpk/sce_sys/livearea/contents/template.xml - mkdir -p ../pkg/${platform}/${name}_libretro.vpk/vpk/assets - if [ -d ../media/assets/glui ]; then - cp -r ../media/assets/glui ../pkg/${platform}/${name}_libretro.vpk/vpk/assets - fi - if [ -d ../media/assets/xmb ]; then - cp -r ../media/assets/xmb ../pkg/${platform}/${name}_libretro.vpk/vpk/assets - # Strip source SVG files - rm -rf ../pkg/${platform}/${name}_libretro.vpk/vpk/assets/xmb/flatui/src - rm -rf ../pkg/${platform}/${name}_libretro.vpk/vpk/assets/xmb/monochrome/src - rm -rf ../pkg/${platform}/${name}_libretro.vpk/vpk/assets/xmb/retroactive/src - rm -rf ../pkg/${platform}/${name}_libretro.vpk/vpk/assets/xmb/retroactive_marked/src - fi - if [ -d ../media/libretrodb/rdb ]; then - mkdir -p ../pkg/${platform}/retroarch.vpk/vpk/database/rdb - cp -r ../media/libretrodb/rdb/* ../pkg/${platform}/${name}_libretro.vpk/vpk/database/rdb - fi - if [ -d ../media/libretrodb/cursors ]; then - mkdir -p ../pkg/${platform}/retroarch.vpk/vpk/database/cursors - cp -r ../media/libretrodb/cursors/* ../pkg/${platform}/${name}_libretro.vpk/vpk/database/cursors - fi + cp ../retroarch_${platform}.self ../pkg/${platform}/retroarch.vpk/vpk/${name}_libretro.self if [ -d ../../dist/info ]; then mkdir -p ../pkg/${platform}/retroarch.vpk/vpk/info - cp -fv ../../dist/info/"${name}_libretro.info" ../pkg/${platform}/${name}_libretro.vpk/vpk/info/"${name}_libretro.info" + cp -fv ../../dist/info/"${name}_libretro.info" ../pkg/${platform}/retroarch.vpk/vpk/info/"${name}_libretro.info" fi elif [ $PLATFORM = "ctr" ] ; then mv -f ../retroarch_3ds.cia ../pkg/3ds/cia/${name}_libretro.cia diff --git a/file_path_special.c b/file_path_special.c index 3d5231a63f..9113f27dc6 100644 --- a/file_path_special.c +++ b/file_path_special.c @@ -1,6 +1,6 @@ /* RetroArch - A frontend for libretro. * Copyright (C) 2011-2017 - Daniel De Matteis - * + * * RetroArch is free software: you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Found- * ation, either version 3 of the License, or (at your option) any later version. @@ -28,6 +28,10 @@ #include #endif +#ifdef __HAIKU__ +#include +#endif + #include #include #include @@ -119,7 +123,7 @@ void fill_pathname_abbreviate_special(char *out_path, * Keep application dir in front of home, moving app dir to a * new location inside home would break otherwise. */ - /* ugly hack - use application_dir pointer + /* ugly hack - use application_dir pointer * before filling it in. C89 reasons */ candidates[0] = application_dir; candidates[1] = home; @@ -129,23 +133,23 @@ void fill_pathname_abbreviate_special(char *out_path, notations [1] = "~"; notations [2] = NULL; - fill_pathname_application_path(application_dir, + fill_pathname_application_path(application_dir, PATH_MAX_LENGTH * sizeof(char)); path_basedir_wrapper(application_dir); - + for (i = 0; candidates[i]; i++) { - if (!string_is_empty(candidates[i]) && + if (!string_is_empty(candidates[i]) && strstr(in_path, candidates[i]) == in_path) { size_t src_size = strlcpy(out_path, notations[i], size); retro_assert(src_size < size); - + out_path += src_size; size -= src_size; in_path += strlen(candidates[i]); - + if (!path_char_is_slash(*in_path)) { retro_assert(strlcpy(out_path, @@ -242,7 +246,7 @@ void fill_pathname_application_path(char *s, size_t len) CFStringGetCString(bundle_path, s, len, kCFStringEncodingUTF8); CFRelease(bundle_path); CFRelease(bundle_url); - + retro_assert(strlcat(s, "nobin", len) < len); return; } @@ -269,7 +273,7 @@ void fill_pathname_application_path(char *s, size_t len) char link_path[255]; link_path[0] = *s = '\0'; - pid = getpid(); + pid = getpid(); /* Linux, BSD and Solaris paths. Not standardized. */ for (i = 0; i < ARRAY_SIZE(exts); i++) @@ -287,7 +291,7 @@ void fill_pathname_application_path(char *s, size_t len) } } } - + RARCH_ERR("Cannot resolve application path! This should not happen.\n"); #endif } @@ -335,7 +339,7 @@ void fill_pathname_application_special(char *s, char *s1 = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); s1[0] = '\0'; - fill_pathname_application_special(s1, + fill_pathname_application_special(s1, PATH_MAX_LENGTH * sizeof(char), APPLICATION_SPECIAL_DIRECTORY_ASSETS_ZARCH); fill_pathname_join(s, @@ -349,7 +353,7 @@ void fill_pathname_application_special(char *s, #ifdef HAVE_ZARCH { settings_t *settings = config_get_ptr(); - fill_pathname_join(s, + fill_pathname_join(s, settings->paths.directory_assets, "zarch", len); @@ -501,6 +505,31 @@ void fill_pathname_application_special(char *s, } #endif break; + case APPLICATION_SPECIAL_DIRECTORY_THUMBNAILS_CHEEVOS_BADGES: + { + char *s1 = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); + char *s2 = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); + settings_t *settings = config_get_ptr(); + + s1[0] = s2[0] = '\0'; + + fill_pathname_join(s1, + settings->paths.directory_thumbnails, + "cheevos", + len); + fill_pathname_join(s2, + s1, "badges", + PATH_MAX_LENGTH * sizeof(char) + ); + fill_pathname_slash(s2, + PATH_MAX_LENGTH * sizeof(char) + ); + strlcpy(s, s2, len); + free(s1); + free(s2); + } + break; + case APPLICATION_SPECIAL_NONE: default: break; diff --git a/file_path_special.h b/file_path_special.h index e763f78a7f..4d959e1899 100644 --- a/file_path_special.h +++ b/file_path_special.h @@ -1,7 +1,7 @@ /* RetroArch - A frontend for libretro. * Copyright (C) 2010-2014 - Hans-Kristian Arntzen * Copyright (C) 2011-2016 - Daniel De Matteis - * + * * RetroArch is free software: you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Found- * ation, either version 3 of the License, or (at your option) any later version. @@ -104,7 +104,8 @@ enum application_special_type APPLICATION_SPECIAL_DIRECTORY_ASSETS_XMB_FONT, APPLICATION_SPECIAL_DIRECTORY_ASSETS_ZARCH, APPLICATION_SPECIAL_DIRECTORY_ASSETS_ZARCH_FONT, - APPLICATION_SPECIAL_DIRECTORY_ASSETS_ZARCH_ICONS + APPLICATION_SPECIAL_DIRECTORY_ASSETS_ZARCH_ICONS, + APPLICATION_SPECIAL_DIRECTORY_THUMBNAILS_CHEEVOS_BADGES }; /** diff --git a/frontend/drivers/platform_darwin.m b/frontend/drivers/platform_darwin.m index ee7ec7b7bb..df2ff6c28f 100644 --- a/frontend/drivers/platform_darwin.m +++ b/frontend/drivers/platform_darwin.m @@ -48,6 +48,7 @@ #include #include +#include #include #include #include @@ -335,6 +336,15 @@ static void frontend_darwin_get_environment_settings(int *argc, char *argv[], CFSearchPathForDirectoriesInDomains(CFDocumentDirectory, CFUserDomainMask, 1, home_dir_buf, sizeof(home_dir_buf)); +#if TARGET_OS_IPHONE + char resolved_home_dir_buf[PATH_MAX_LENGTH] = {0}; + if (realpath(home_dir_buf, resolved_home_dir_buf)) { + retro_assert(strlcpy(home_dir_buf, + resolved_home_dir_buf, + sizeof(home_dir_buf)) < sizeof(home_dir_buf)); + } +#endif + strlcat(home_dir_buf, "/RetroArch", sizeof(home_dir_buf)); fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_SHADER], home_dir_buf, "shaders_glsl", diff --git a/frontend/drivers/platform_psp.c b/frontend/drivers/platform_psp.c index 0fc89fd463..6a08e8e1bb 100644 --- a/frontend/drivers/platform_psp.c +++ b/frontend/drivers/platform_psp.c @@ -115,15 +115,15 @@ static void frontend_psp_get_environment_settings(int *argc, char *argv[], /* bundle data*/ fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CORE], g_defaults.dirs[DEFAULT_DIR_PORT], "", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE])); - fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_ASSETS], g_defaults.dirs[DEFAULT_DIR_PORT], - "assets", sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS])); - fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CORE_INFO], g_defaults.dirs[DEFAULT_DIR_CORE], + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CORE_INFO], g_defaults.dirs[DEFAULT_DIR_PORT], "info", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_INFO])); - 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])); /* user data*/ + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_ASSETS], user_path, + "assets", sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_DATABASE], user_path, + "database/rdb", sizeof(g_defaults.dirs[DEFAULT_DIR_DATABASE])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CURSOR], user_path, + "database/cursors", sizeof(g_defaults.dirs[DEFAULT_DIR_CURSOR])); fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CHEATS], user_path, "cheats", sizeof(g_defaults.dirs[DEFAULT_DIR_CHEATS])); fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_MENU_CONFIG], user_path, diff --git a/frontend/drivers/platform_wiiu.c b/frontend/drivers/platform_wiiu.c index c97ec97139..925f820652 100644 --- a/frontend/drivers/platform_wiiu.c +++ b/frontend/drivers/platform_wiiu.c @@ -58,7 +58,9 @@ #include #include -#include "wiiu/controller_patcher/ControllerPatcherWrapper.h" +#if defined(ENABLE_CONTROLLER_PATCHER) + #include "wiiu/controller_patcher/ControllerPatcherWrapper.h" +#endif #include #include @@ -430,7 +432,7 @@ int main(int argc, char **argv) KPADInit(); #endif verbosity_enable(); -#ifndef IS_SALAMANDER +#if !defined(IS_SALAMANDER) && defined(ENABLE_CONTROLLER_PATCHER) ControllerPatcherInit(); #endif fflush(stdout); @@ -492,7 +494,7 @@ int main(int argc, char **argv) } while (1); -#ifndef IS_SALAMANDER +#if !defined(IS_SALAMANDER) && defined(ENABLE_CONTROLLER_PATCHER) ControllerPatcherDeInit(); #endif main_exit(NULL); @@ -523,22 +525,25 @@ void __eabi() __attribute__((weak)) void __init(void) { - extern void(*__CTOR_LIST__[])(void); - void(**ctor)(void) = __CTOR_LIST__; + extern void (*const __CTOR_LIST__)(void); + extern void (*const __CTOR_END__)(void); - while (*ctor) + void (*const *ctor)(void) = &__CTOR_LIST__; + while (ctor < &__CTOR_END__) { (*ctor++)(); + } } - __attribute__((weak)) void __fini(void) { - extern void(*__DTOR_LIST__[])(void); - void(**ctor)(void) = __DTOR_LIST__; + extern void (*const __DTOR_LIST__)(void); + extern void (*const __DTOR_END__)(void); - while (*ctor) - (*ctor++)(); + void (*const *dtor)(void) = &__DTOR_LIST__; + while (dtor < &__DTOR_END__) { + (*dtor++)(); + } } /* libiosuhax related */ @@ -633,7 +638,7 @@ int __entry_menu(int argc, char **argv) int ret = main(argc, argv); fsdev_exit(); -// __fini(); + __fini(); memoryRelease(); return ret; } @@ -648,7 +653,10 @@ void _start(int argc, char **argv) main(argc, argv); fsdev_exit(); -// __fini(); + +/* TODO: fix elf2rpl so it doesn't error with "Could not find matching symbol + for relocation" then uncomment this */ +// __fini(); memoryRelease(); SYSRelaunchTitle(0, 0); exit(0); diff --git a/frontend/drivers/platform_win32.c b/frontend/drivers/platform_win32.c index 02ae1dd7d3..2988b75c4e 100644 --- a/frontend/drivers/platform_win32.c +++ b/frontend/drivers/platform_win32.c @@ -340,7 +340,7 @@ static uint64_t frontend_win32_get_mem_total(void) { /* OSes below 2000 don't have the Ex version, * and non-Ex cannot work with >4GB RAM */ -#if _WIN32_WINNT > 0x0400 +#if _WIN32_WINNT >= 0x0500 MEMORYSTATUSEX mem_info; mem_info.dwLength = sizeof(MEMORYSTATUSEX); GlobalMemoryStatusEx(&mem_info); @@ -357,7 +357,7 @@ static uint64_t frontend_win32_get_mem_used(void) { /* OSes below 2000 don't have the Ex version, * and non-Ex cannot work with >4GB RAM */ -#if _WIN32_WINNT > 0x0400 +#if _WIN32_WINNT >= 0x0500 MEMORYSTATUSEX mem_info; mem_info.dwLength = sizeof(MEMORYSTATUSEX); GlobalMemoryStatusEx(&mem_info); diff --git a/gfx/common/gl_common.h b/gfx/common/gl_common.h index 147e6ddd49..5d5c1fa284 100644 --- a/gfx/common/gl_common.h +++ b/gfx/common/gl_common.h @@ -55,6 +55,7 @@ typedef struct gl bool fbo_feedback_enable; bool hw_render_fbo_init; bool hw_render_depth_init; + bool has_fbo; bool has_srgb_fbo_gles3; bool has_fp_fbo; bool has_srgb_fbo; @@ -140,47 +141,22 @@ typedef struct gl void *renderchain_data; } gl_t; -#ifdef NO_GL_FF_VERTEX -#define gl_ff_vertex(coords) ((void)0) -#else -static INLINE void gl_ff_vertex(const struct video_coords *coords) +static INLINE void gl_bind_texture(GLuint id, GLint wrap_mode, GLint mag_filter, + GLint min_filter) { - /* Fall back to fixed function-style if needed and possible. */ - glClientActiveTexture(GL_TEXTURE1); - glTexCoordPointer(2, GL_FLOAT, 0, coords->lut_tex_coord); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glClientActiveTexture(GL_TEXTURE0); - glVertexPointer(2, GL_FLOAT, 0, coords->vertex); - glEnableClientState(GL_VERTEX_ARRAY); - glColorPointer(4, GL_FLOAT, 0, coords->color); - glEnableClientState(GL_COLOR_ARRAY); - glTexCoordPointer(2, GL_FLOAT, 0, coords->tex_coord); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); + glBindTexture(GL_TEXTURE_2D, id); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrap_mode); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrap_mode); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag_filter); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, min_filter); } -#endif - -#ifdef NO_GL_FF_MATRIX -#define gl_ff_matrix(mat) ((void)0) -#else -static INLINE void gl_ff_matrix(const math_matrix_4x4 *mat) -{ - math_matrix_4x4 ident; - - /* Fall back to fixed function-style if needed and possible. */ - glMatrixMode(GL_PROJECTION); - glLoadMatrixf(mat->data); - glMatrixMode(GL_MODELVIEW); - matrix_4x4_identity(ident); - glLoadMatrixf(ident.data); -} -#endif static INLINE unsigned gl_wrap_type_to_enum(enum gfx_wrap_type type) { switch (type) { #ifndef HAVE_OPENGLES - case RARCH_WRAP_BORDER: + case RARCH_WRAP_BORDER: /* GL_CLAMP_TO_BORDER: Available since GL 1.3 */ return GL_CLAMP_TO_BORDER; #else case RARCH_WRAP_BORDER: diff --git a/gfx/common/x11_common.c b/gfx/common/x11_common.c index a9d2fcb334..1375fd1186 100644 --- a/gfx/common/x11_common.c +++ b/gfx/common/x11_common.c @@ -21,6 +21,9 @@ #include #include +#include +#include + #include #ifdef HAVE_CONFIG_H @@ -155,9 +158,35 @@ static void x11_set_window_class(Display *dpy, Window win) XSetClassHint(dpy, win, &hint); } +static void x11_set_window_pid(Display *dpy, Window win) +{ + long scret; + char *hostname; + pid_t pid = getpid(); + + XChangeProperty(dpy, win, XInternAtom(dpy, "_NET_WM_PID", False), + XA_CARDINAL, 32, PropModeReplace, (unsigned char *)&pid, 1); + + errno = 0; + if((scret = sysconf(_SC_HOST_NAME_MAX)) == -1 && errno) + return; + if((hostname = malloc(scret + 1)) == NULL) + return; + + if(gethostname(hostname, scret + 1) == -1) + RARCH_WARN("Failed to get hostname.\n"); + else + { + XChangeProperty(dpy, win, XA_WM_CLIENT_MACHINE, XA_STRING, 8, + PropModeReplace, (unsigned char *)hostname, strlen(hostname)); + } + free(hostname); +} + void x11_set_window_attr(Display *dpy, Window win) { x11_set_window_class(dpy, win); + x11_set_window_pid(dpy, win); } static void xdg_screensaver_inhibit(Window wnd) diff --git a/gfx/drivers/caca_gfx.c b/gfx/drivers/caca_gfx.c index c558602666..a89cb63ed8 100644 --- a/gfx/drivers/caca_gfx.c +++ b/gfx/drivers/caca_gfx.c @@ -305,6 +305,8 @@ static void caca_set_osd_msg(void *data, } static const video_poke_interface_t caca_poke_interface = { + NULL, /* set_coords */ + NULL, /* set_mvp */ NULL, NULL, NULL, @@ -312,11 +314,7 @@ static const video_poke_interface_t caca_poke_interface = { NULL, NULL, NULL, -#ifdef HAVE_FBO NULL, -#else - NULL, -#endif NULL, NULL, NULL, diff --git a/gfx/drivers/ctr_gfx.c b/gfx/drivers/ctr_gfx.c index da134da326..0aabb51ccd 100644 --- a/gfx/drivers/ctr_gfx.c +++ b/gfx/drivers/ctr_gfx.c @@ -1120,14 +1120,16 @@ static void ctr_set_osd_msg(void *data, } static const video_poke_interface_t ctr_poke_interface = { + NULL, /* set_coords */ + NULL, /* set_mvp */ ctr_load_texture, ctr_unload_texture, NULL, ctr_set_filtering, - NULL, /* get_video_output_size */ - NULL, /* get_video_output_prev */ - NULL, /* get_video_output_next */ - NULL, /* get_current_framebuffer */ + NULL, /* get_video_output_size */ + NULL, /* get_video_output_prev */ + NULL, /* get_video_output_next */ + NULL, /* get_current_framebuffer */ NULL, ctr_set_aspect_ratio, ctr_apply_state_changes, diff --git a/gfx/drivers/d3d.c b/gfx/drivers/d3d.c index 23698d2cfa..48aefd123e 100644 --- a/gfx/drivers/d3d.c +++ b/gfx/drivers/d3d.c @@ -66,6 +66,13 @@ #endif #endif +#ifdef _XBOX +#ifndef HAVE_FBO +#define HAVE_FBO +#endif + +#endif + static LPDIRECT3D g_pD3D; static bool d3d_init_imports(d3d_video_t *d3d) @@ -1057,11 +1064,20 @@ static bool d3d_init_internal(d3d_video_t *d3d, * later. */ type = video_shader_parse_type(settings->paths.path_shader, RARCH_SHADER_NONE); - if (settings->bools.video_shader_enable && type == RARCH_SHADER_CG) + + if (settings->bools.video_shader_enable) { - if (!string_is_empty(d3d->shader_path)) - free(d3d->shader_path); - d3d->shader_path = strdup(settings->paths.path_shader); + switch (type) + { + case RARCH_SHADER_CG: + if (!string_is_empty(d3d->shader_path)) + free(d3d->shader_path); + if (!string_is_empty(settings->paths.path_shader)) + d3d->shader_path = strdup(settings->paths.path_shader); + break; + default: + break; + } } if (!d3d_process_shader(d3d)) @@ -1703,7 +1719,21 @@ static void d3d_unload_texture(void *data, uintptr_t id) d3d_texture_free(texid); } +static void d3d_set_mvp(void *data, + void *shader_data, + const void *mat_data) +{ + d3d_video_t *d3d = (d3d_video_t*)data; + if (d3d && d3d->renderchain_driver->set_mvp) + d3d->renderchain_driver->set_mvp( + d3d->renderchain_data, + data, + 640, 480, 0); +} + static const video_poke_interface_t d3d_poke_interface = { + NULL, /* set_coords */ + d3d_set_mvp, d3d_load_texture, d3d_unload_texture, NULL, diff --git a/gfx/drivers/dispmanx_gfx.c b/gfx/drivers/dispmanx_gfx.c index 9058834402..18afe085ae 100644 --- a/gfx/drivers/dispmanx_gfx.c +++ b/gfx/drivers/dispmanx_gfx.c @@ -631,6 +631,8 @@ static void dispmanx_set_aspect_ratio (void *data, unsigned aspect_ratio_idx) } static const video_poke_interface_t dispmanx_poke_interface = { + 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 7bf088e356..01fb0dec6a 100644 --- a/gfx/drivers/drm_gfx.c +++ b/gfx/drivers/drm_gfx.c @@ -959,6 +959,8 @@ static void drm_set_aspect_ratio (void *data, unsigned aspect_ratio_idx) } static const video_poke_interface_t drm_poke_interface = { + 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 f8b69d7668..4b0476f4b5 100644 --- a/gfx/drivers/exynos_gfx.c +++ b/gfx/drivers/exynos_gfx.c @@ -1478,6 +1478,8 @@ static void exynos_show_mouse(void *data, bool state) } static const video_poke_interface_t exynos_poke_interface = { + 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 663449f1cb..b1ded17fdb 100644 --- a/gfx/drivers/gdi_gfx.c +++ b/gfx/drivers/gdi_gfx.c @@ -356,7 +356,8 @@ static bool gdi_gfx_alive(void *data) unsigned temp_height = 0; bool quit = false; bool resize = false; - + bool ret = false; + /* Needed because some context drivers don't track their sizes */ video_driver_get_size(&temp_width, &temp_height); @@ -365,12 +366,13 @@ static bool gdi_gfx_alive(void *data) size_data.width = &temp_width; size_data.height = &temp_height; - video_context_driver_check_window(&size_data); + if (video_context_driver_check_window(&size_data)) + ret = !quit; if (temp_width != 0 && temp_height != 0) video_driver_set_size(&temp_width, &temp_height); - return true; + return ret; } static bool gdi_gfx_focus(void *data) @@ -531,6 +533,8 @@ static void gdi_set_video_mode(void *data, unsigned width, unsigned height, } static const video_poke_interface_t gdi_poke_interface = { + NULL, /* set_coords */ + NULL, /* set_mvp */ NULL, NULL, gdi_set_video_mode, @@ -538,11 +542,7 @@ static const video_poke_interface_t gdi_poke_interface = { gdi_get_video_output_size, gdi_get_video_output_prev, gdi_get_video_output_next, -#ifdef HAVE_FBO NULL, -#else - NULL, -#endif NULL, NULL, NULL, diff --git a/gfx/drivers/gl.c b/gfx/drivers/gl.c index 5b531f18cd..8c2d230194 100644 --- a/gfx/drivers/gl.c +++ b/gfx/drivers/gl.c @@ -220,9 +220,9 @@ static void gl_render_overlay(gl_t *gl, video_frame_info_t *video_info) coords.handle_data = NULL; coords.data = &gl->coords; - video_shader_driver_set_coords(coords); + video_driver_set_coords(&coords); - video_info->cb_shader_set_mvp(gl, + video_info->cb_set_mvp(gl, video_info->shader_data, &gl->mvp_no_rot); for (i = 0; i < gl->overlays; i++) @@ -377,18 +377,10 @@ static bool gl_shader_init(gl_t *gl, const gfx_ctx_driver_t *ctx_driver, ) { video_shader_ctx_init_t init_data; - enum rarch_shader_type type; settings_t *settings = config_get_ptr(); const char *shader_path = (settings->bools.video_shader_enable && *settings->paths.path_shader) ? settings->paths.path_shader : NULL; - - if (!gl) - { - RARCH_ERR("[GL]: Invalid GL instance passed.\n"); - return false; - } - - type = video_shader_parse_type(shader_path, + enum rarch_shader_type type = video_shader_parse_type(shader_path, gl->core_context_in_use ? RARCH_SHADER_GLSL : DEFAULT_SHADER_TYPE); @@ -449,6 +441,8 @@ GLenum min_filter_to_mag(GLenum type) static uintptr_t gl_get_current_framebuffer(void *data) { gl_t *gl = (gl_t*)data; + if (!gl || !gl->has_fbo) + return 0; return gl->hw_render_fbo[(gl->tex_index + 1) % gl->textures]; } @@ -553,7 +547,7 @@ static void gl_init_textures(gl_t *gl, const video_info_t *video) /* Use regular textures if we use HW render. */ gl->egl_images = !gl->hw_render_use && gl_check_capability(GL_CAPS_EGLIMAGE) && - video_context_driver_init_image_buffer((void*)video); + video_context_driver_init_image_buffer(video); #ifdef HAVE_PSGL if (!gl->pbo) @@ -595,11 +589,8 @@ static void gl_init_textures(gl_t *gl, const video_info_t *video) for (i = 0; i < gl->textures; i++) { - glBindTexture(GL_TEXTURE_2D, gl->texture[i]); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, gl->wrap_mode); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, gl->wrap_mode); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gl->tex_mag_filter); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gl->tex_min_filter); + gl_bind_texture(gl->texture[i], gl->wrap_mode, gl->tex_mag_filter, + gl->tex_min_filter); if (gl->renderchain_driver->init_texture_reference) gl->renderchain_driver->init_texture_reference( @@ -622,6 +613,7 @@ static INLINE void gl_set_shader_viewports(gl_t *gl) shader_info.set_active = true; video_shader_driver_use(shader_info); + gl_set_viewport_wrapper(gl, width, height, false, true); shader_info.data = gl; @@ -687,11 +679,7 @@ void gl_load_texture_data( break; } - glBindTexture(GL_TEXTURE_2D, id); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrap); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrap); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag_filter); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, min_filter); + gl_bind_texture(id, wrap, mag_filter, min_filter); glPixelStorei(GL_UNPACK_ALIGNMENT, alignment); glTexImage2D(GL_TEXTURE_2D, @@ -753,35 +741,27 @@ static void gl_render_osd_background( gl_t *gl, video_frame_info_t *video_info, const char *msg) { - int msg_width; - video_shader_ctx_mvp_t mvp; video_shader_ctx_coords_t coords_data; video_coords_t coords; - video_shader_ctx_info_t shader_info; struct uniform_info uniform_param; float colors[4]; - float x, x2, y, y2, width, height; const unsigned vertices_total = 6; float *dummy = (float*)calloc(4 * vertices_total, sizeof(float)); float *verts = (float*)malloc(2 * vertices_total * sizeof(float)); settings_t *settings = config_get_ptr(); - - if (!gl || !settings) - goto end; - - msg_width = + int msg_width = font_driver_get_message_width(NULL, msg, strlen(msg), 1.0f); /* shader driver expects vertex coords as 0..1 */ - x = video_info->font_msg_pos_x; - y = video_info->font_msg_pos_y; - width = msg_width / (float)video_info->width; - height = + float x = video_info->font_msg_pos_x; + float y = video_info->font_msg_pos_y; + float width = msg_width / (float)video_info->width; + float height = settings->floats.video_font_size / (float)video_info->height; - x2 = 0.005f; /* extend background around text */ - y2 = 0.005f; + float x2 = 0.005f; /* extend background around text */ + float y2 = 0.005f; x -= x2; y -= y2; @@ -822,24 +802,20 @@ static void gl_render_osd_background( coords_data.handle_data = NULL; coords_data.data = &coords; - shader_info.data = NULL; - shader_info.idx = VIDEO_SHADER_STOCK_BLEND; - shader_info.set_active = true; - video_driver_set_viewport(video_info->width, video_info->height, true, false); - video_shader_driver_use(shader_info); - video_shader_driver_set_coords(coords_data); + video_info->cb_shader_use(gl, + video_info->shader_data, VIDEO_SHADER_STOCK_BLEND, true); + + video_driver_set_coords(&coords_data); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendEquation(GL_FUNC_ADD); - mvp.data = gl; - mvp.matrix = &gl->mvp_no_rot; - - video_shader_driver_set_mvp(mvp); + video_info->cb_set_mvp(gl, + video_info->shader_data, &gl->mvp_no_rot); uniform_param.type = UNIFORM_4F; uniform_param.enabled = true; @@ -848,7 +824,7 @@ static void gl_render_osd_background( uniform_param.lookup.type = SHADER_PROGRAM_FRAGMENT; uniform_param.lookup.ident = "bgcolor"; - uniform_param.lookup.idx = shader_info.idx; + uniform_param.lookup.idx = VIDEO_SHADER_STOCK_BLEND; uniform_param.lookup.add_prefix = true; uniform_param.lookup.enable = true; @@ -860,7 +836,7 @@ static void gl_render_osd_background( video_shader_driver_set_parameter(uniform_param); glDrawArrays(GL_TRIANGLES, 0, coords.vertices); -end: + /* reset uniform back to zero so it is not used for anything else */ uniform_param.result.f.v0 = 0.0f; uniform_param.result.f.v1 = 0.0f; @@ -948,25 +924,23 @@ static INLINE void gl_draw_texture(gl_t *gl, video_frame_info_t *video_info) color[14] = 1.0f; color[15] = gl->menu_texture_alpha; - if (!gl->menu_texture) - return; - gl->coords.vertex = vertexes_flipped; gl->coords.tex_coord = tex_coords; gl->coords.color = color; + glBindTexture(GL_TEXTURE_2D, gl->menu_texture); video_info->cb_shader_use(gl, video_info->shader_data, VIDEO_SHADER_STOCK_BLEND, true); - gl->coords.vertices = 4; + gl->coords.vertices = 4; - coords.handle_data = NULL; - coords.data = &gl->coords; + coords.handle_data = NULL; + coords.data = &gl->coords; - video_shader_driver_set_coords(coords); + video_driver_set_coords(&coords); - video_info->cb_shader_set_mvp(gl, + video_info->cb_set_mvp(gl, video_info->shader_data, &gl->mvp_no_rot); glEnable(GL_BLEND); @@ -982,9 +956,9 @@ static INLINE void gl_draw_texture(gl_t *gl, video_frame_info_t *video_info) glDisable(GL_BLEND); - gl->coords.vertex = gl->vertex_ptr; - gl->coords.tex_coord = gl->tex_info.coord; - gl->coords.color = gl->white_color_ptr; + gl->coords.vertex = gl->vertex_ptr; + gl->coords.tex_coord = gl->tex_info.coord; + gl->coords.color = gl->white_color_ptr; } #endif @@ -1146,9 +1120,9 @@ static bool gl_frame(void *data, const void *frame, coords.handle_data = NULL; coords.data = &gl->coords; - video_shader_driver_set_coords(coords); + video_driver_set_coords(&coords); - video_info->cb_shader_set_mvp(gl, video_info->shader_data, &gl->mvp); + video_info->cb_set_mvp(gl, video_info->shader_data, &gl->mvp); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); @@ -1165,7 +1139,7 @@ static bool gl_frame(void *data, const void *frame, { menu_driver_frame(video_info); - if (gl->menu_texture_enable) + if (gl->menu_texture) gl_draw_texture(gl, video_info); } #endif @@ -1318,10 +1292,6 @@ static void gl_free(void *data) scaler_ctx_gen_reset(&gl->pbo_readback_scaler); } - if (gl->renderchain_driver->free) - gl->renderchain_driver->free(gl); - gl_deinit_chain(gl); - if (gl->core_context_in_use) { if (gl->renderchain_driver->unbind_vao) @@ -1330,6 +1300,10 @@ static void gl_free(void *data) gl->renderchain_driver->free_vao(gl); } + if (gl->renderchain_driver->free) + gl->renderchain_driver->free(gl); + gl_deinit_chain(gl); + video_context_driver_free(); gl_destroy_resources(gl); @@ -1357,35 +1331,7 @@ static void gl_set_nonblock_state(void *data, bool state) static bool resolve_extensions(gl_t *gl, const char *context_ident) { - settings_t *settings = config_get_ptr(); - struct retro_hw_render_callback *hwr = - video_driver_get_hw_context(); - - if (hwr->context_type == RETRO_HW_CONTEXT_OPENGL_CORE) - { - gfx_ctx_flags_t flags; - - if (!gl_check_capability(GL_CAPS_VAO)) - { - RARCH_ERR("[GL]: Failed to initialize VAOs.\n"); - return false; - } - - gl_query_core_context_set(true); - gl->core_context_in_use = true; - - /** - * Ensure that the rest of the frontend knows we have a core context - */ - flags.flags = 0; - BIT32_SET(flags.flags, GFX_CTX_FLAGS_GL_CORE_CONTEXT); - - video_context_driver_set_flags(&flags); - - RARCH_LOG("[GL]: Using Core GL context, setting up VAO...\n"); - if (gl->renderchain_driver->new_vao) - gl->renderchain_driver->new_vao(gl); - } + settings_t *settings = config_get_ptr(); /* have_es2_compat - GL_RGB565 internal format support. * Even though ES2 support is claimed, the format @@ -1397,12 +1343,15 @@ static bool resolve_extensions(gl_t *gl, const char *context_ident) * have_sync - Use ARB_sync to reduce latency. */ gl->has_srgb_fbo = false; + gl->has_fbo = gl_check_capability(GL_CAPS_FBO); gl->have_full_npot_support = gl_check_capability(GL_CAPS_FULL_NPOT_SUPPORT); gl->have_mipmap = gl_check_capability(GL_CAPS_MIPMAP); gl->have_es2_compat = gl_check_capability(GL_CAPS_ES2_COMPAT); gl->has_fp_fbo = gl_check_capability(GL_CAPS_FP_FBO); gl->support_unpack_row_length = gl_check_capability(GL_CAPS_UNPACK_ROW_LENGTH); gl->have_sync = gl_check_capability(GL_CAPS_SYNC); + /* GLES3 has unpack_subimage and sRGB in core. */ + gl->has_srgb_fbo_gles3 = gl_check_capability(GL_CAPS_SRGB_FBO_ES3); if (!settings->bools.video_force_srgb_disable) gl->has_srgb_fbo = gl_check_capability(GL_CAPS_SRGB_FBO); @@ -1419,9 +1368,6 @@ static bool resolve_extensions(gl_t *gl, const char *context_ident) RARCH_WARN("[GL]: GLES implementation does not have BGRA8888 extension.\n" "32-bit path will require conversion.\n"); } - - /* GLES3 has unpack_subimage and sRGB in core. */ - gl->has_srgb_fbo_gles3 = gl_check_capability(GL_CAPS_SRGB_FBO_ES3); /* TODO/FIXME - No extensions for float FBO currently. */ #endif @@ -1555,20 +1501,20 @@ static const gfx_ctx_driver_t *gl_get_context(gl_t *gl) unsigned minor = hwr->version_minor; #ifdef HAVE_OPENGLES - api = GFX_CTX_OPENGL_ES_API; - api_name = "OpenGL ES 2.0"; + api = GFX_CTX_OPENGL_ES_API; + api_name = "OpenGL ES 2.0"; if (hwr->context_type == RETRO_HW_CONTEXT_OPENGLES3) { - major = 3; - minor = 0; - api_name = "OpenGL ES 3.0"; + major = 3; + minor = 0; + api_name = "OpenGL ES 3.0"; } else if (hwr->context_type == RETRO_HW_CONTEXT_OPENGLES_VERSION) - api_name = "OpenGL ES 3.1+"; + api_name = "OpenGL ES 3.1+"; #else - api = GFX_CTX_OPENGL_API; - api_name = "OpenGL"; + api = GFX_CTX_OPENGL_API; + api_name = "OpenGL"; #endif (void)api_name; @@ -1796,6 +1742,45 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo rglgen_resolve_symbols(ctx_driver->get_proc_address); #endif + hwr = video_driver_get_hw_context(); + + if (hwr->context_type == RETRO_HW_CONTEXT_OPENGL_CORE) + { + gfx_ctx_flags_t flags; + + gl_query_core_context_set(true); + gl->core_context_in_use = true; + + /** + * Ensure that the rest of the frontend knows we have a core context + */ + flags.flags = 0; + BIT32_SET(flags.flags, GFX_CTX_FLAGS_GL_CORE_CONTEXT); + + video_context_driver_set_flags(&flags); + + RARCH_LOG("[GL]: Using Core GL context, setting up VAO...\n"); + if (!gl_check_capability(GL_CAPS_VAO)) + { + RARCH_ERR("[GL]: Failed to initialize VAOs.\n"); + goto error; + } + } + + if (!renderchain_gl_init_first(&gl->renderchain_driver, + &gl->renderchain_data)) + { + RARCH_ERR("[GL]: Renderchain could not be initialized.\n"); + goto error; + } + + if (gl->renderchain_driver->restore_default_state) + gl->renderchain_driver->restore_default_state(gl); + + if (hwr->context_type == RETRO_HW_CONTEXT_OPENGL_CORE) + if (gl->renderchain_driver->new_vao) + gl->renderchain_driver->new_vao(gl); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendEquation(GL_FUNC_ADD); @@ -1828,8 +1813,6 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo RARCH_LOG("[GL]: Using resolution %ux%u\n", temp_width, temp_height); - hwr = video_driver_get_hw_context(); - gl->vertex_ptr = hwr->bottom_left_origin ? vertexes : vertexes_flipped; @@ -1839,10 +1822,9 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo */ gl->textures = 4; gl->hw_render_use = false; -#ifdef HAVE_FBO - if (hwr->context_type != RETRO_HW_CONTEXT_NONE) + + if (gl->has_fbo && hwr->context_type != RETRO_HW_CONTEXT_NONE) gl->hw_render_use = true; -#endif if (gl->hw_render_use) { @@ -1925,16 +1907,6 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo gl_set_texture_fmts(gl, video->rgb32); - if (!renderchain_gl_init_first(&gl->renderchain_driver, - &gl->renderchain_data)) - { - RARCH_ERR("[GL]: Renderchain could not be initialized.\n"); - return false; - } - - if (gl->renderchain_driver->restore_default_state) - gl->renderchain_driver->restore_default_state(gl); - memcpy(gl->tex_info.coord, tex_coords, sizeof(gl->tex_info.coord)); gl->coords.vertex = gl->vertex_ptr; gl->coords.tex_coord = gl->tex_info.coord; @@ -1957,12 +1929,15 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo if (gl->renderchain_driver->init) gl->renderchain_driver->init(gl, gl->tex_w, gl->tex_h); - if (gl->hw_render_use && - gl->renderchain_driver->init_hw_render && - !gl->renderchain_driver->init_hw_render(gl, gl->tex_w, gl->tex_h)) + if (gl->has_fbo) { - RARCH_ERR("[GL]: Hardware rendering context initialization failed.\n"); - goto error; + if (gl->hw_render_use && + gl->renderchain_driver->init_hw_render && + !gl->renderchain_driver->init_hw_render(gl, gl->tex_w, gl->tex_h)) + { + RARCH_ERR("[GL]: Hardware rendering context initialization failed.\n"); + goto error; + } } inp.input = input; @@ -2089,11 +2064,8 @@ static void gl_update_tex_filter_frame(gl_t *gl) if (!gl->texture[i]) continue; - glBindTexture(GL_TEXTURE_2D, gl->texture[i]); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, gl->wrap_mode); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, gl->wrap_mode); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gl->tex_mag_filter); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gl->tex_min_filter); + gl_bind_texture(gl->texture[i], gl->wrap_mode, gl->tex_mag_filter, + gl->tex_min_filter); } glBindTexture(GL_TEXTURE_2D, gl->texture[gl->tex_index]); @@ -2136,11 +2108,13 @@ static bool gl_set_shader(void *data, goto error; } - if (gl->renderchain_driver->deinit_fbo) - gl->renderchain_driver->deinit_fbo(gl); -#ifdef HAVE_FBO - glBindTexture(GL_TEXTURE_2D, gl->texture[gl->tex_index]); -#endif + if (gl->fbo_inited) + { + if (gl->renderchain_driver->deinit_fbo) + gl->renderchain_driver->deinit_fbo(gl); + + glBindTexture(GL_TEXTURE_2D, gl->texture[gl->tex_index]); + } init_data.shader_type = type; init_data.shader = NULL; @@ -2167,7 +2141,7 @@ static bool gl_set_shader(void *data, if (textures > gl->textures) /* Have to reinit a bit. */ { - if (gl->hw_render_use && + if (gl->hw_render_use && gl->fbo_inited && gl->renderchain_driver->deinit_hw_render) gl->renderchain_driver->deinit_hw_render(gl); @@ -2545,7 +2519,27 @@ static void gl_unload_texture(void *data, uintptr_t id) glDeleteTextures(1, &glid); } +static void gl_set_coords(void *handle_data, void *shader_data, + const struct video_coords *coords) +{ + gl_t *gl = (gl_t*)handle_data; + if (gl && gl->renderchain_driver->set_coords) + gl->renderchain_driver->set_coords(handle_data, + shader_data, coords); +} + +static void gl_set_mvp(void *data, void *shader_data, + const void *mat_data) +{ + gl_t *gl = (gl_t*)data; + if (gl && gl->renderchain_driver->set_mvp) + gl->renderchain_driver->set_mvp(data, + shader_data, mat_data); +} + static const video_poke_interface_t gl_poke_interface = { + gl_set_coords, + gl_set_mvp, gl_load_texture, gl_unload_texture, gl_set_video_mode, @@ -2553,11 +2547,7 @@ static const video_poke_interface_t gl_poke_interface = { gl_get_video_output_size, gl_get_video_output_prev, gl_get_video_output_next, -#ifdef HAVE_FBO gl_get_current_framebuffer, -#else - NULL, -#endif gl_get_proc_address, gl_set_aspect_ratio, gl_apply_state_changes, diff --git a/gfx/drivers/gl_shaders/pipeline_snowflake.glsl.frag.h b/gfx/drivers/gl_shaders/pipeline_snowflake.glsl.frag.h new file mode 100644 index 0000000000..1b048d2223 --- /dev/null +++ b/gfx/drivers/gl_shaders/pipeline_snowflake.glsl.frag.h @@ -0,0 +1,76 @@ +/* credits to: TheTimJames + https://www.shadertoy.com/view/Md2GRw +*/ + +#include "shaders_common.h" + +static const char* stock_fragment_xmb_snowflake = GLSL( + uniform float time; + uniform vec2 OutputSize; + vec2 uv; + + float atime; + + float rand(vec2 co) + { + return fract(sin(dot(co.xy, vec2(12.9898, 78.233))) * 43758.5453); + } + + float rand_float(float x) + { + return rand(vec2(x, 1.0)); + } + + float snow(vec3 pos, vec2 uv, float o) + { + vec2 d = (pos.xy - uv); + float a = atan(d.y,d.x) + sin(atime*1.0 + o) * 10.0; + + float dist = d.x*d.x + d.y*d.y; + + if(dist < pos.z/400.0) + { + float col = 0.0; + if(sin(a * 8.0) < 0.0) + { + col=1.0; + } + if(dist < pos.z/800.0) + { + col+=1.0; + } + return col * pos.z; + } + + return 0.0; + } + + float col(vec2 c) + { + float color = 0.0; + for (int i = 1; i < 15; i++) + { + float o = rand_float(float(i) / 3.0) * 15.0; + float z = rand_float(float(i) + 13.0); + float x = 1.8 - (3.6) * (rand_float(floor((time*((z + 1.0) / 2.0) +o) / 2.0)) + sin(time * o /1000.0) / 10.0); + float y = 1.0 - mod((time * ((z + 1.0)/2.0)) + o, 2.0); + + color += snow(vec3(x,y,z), c, o); + } + + return color; + } + + void main(void) + { + uv = gl_FragCoord.xy / OutputSize.xy; + uv = uv * 2.0 - 1.0; + vec2 p = uv; + p.x *= OutputSize.x / OutputSize.y; + + atime = (time + 1.0) / 4.0; + + gl_FragColor = vec4(col(p)); + } + +); \ No newline at end of file diff --git a/gfx/drivers/gl_symlinks.h b/gfx/drivers/gl_symlinks.h index bf8558a858..8628698f3e 100644 --- a/gfx/drivers/gl_symlinks.h +++ b/gfx/drivers/gl_symlinks.h @@ -27,7 +27,7 @@ #include "config.h" #endif -#if defined(HAVE_FBO) && defined(HAVE_PSGL) +#if defined(HAVE_PSGL) #define glGenFramebuffers glGenFramebuffersOES #define glBindFramebuffer glBindFramebufferOES #define glFramebufferTexture2D glFramebufferTexture2DOES @@ -92,14 +92,10 @@ #define glGenerateMipmap glGenerateMipmapOES #endif -#ifdef HAVE_FBO - #if defined(__APPLE__) || defined(HAVE_PSGL) #define GL_RGBA32F GL_RGBA32F_ARB #endif -#endif - #if defined(HAVE_PSGL) #define RARCH_GL_INTERNAL_FORMAT32 GL_ARGB_SCE #define RARCH_GL_INTERNAL_FORMAT16 GL_RGB5 /* TODO: Verify if this is really 565 or just 555. */ @@ -146,18 +142,6 @@ #define RARCH_GL_FORMAT16_565 GL_UNSIGNED_SHORT_5_6_5 #endif -#if defined(HAVE_OPENGL_MODERN) || defined(HAVE_OPENGLES2) || defined(HAVE_OPENGLES3) || defined(HAVE_OPENGLES_3_1) || defined(HAVE_OPENGLES_3_2) || defined(HAVE_PSGL) - -#ifndef NO_GL_FF_VERTEX -#define NO_GL_FF_VERTEX -#endif - -#ifndef NO_GL_FF_MATRIX -#define NO_GL_FF_MATRIX -#endif - -#endif - #if defined(HAVE_OPENGLES2) /* TODO: Figure out exactly what. */ #define NO_GL_CLAMP_TO_BORDER #endif diff --git a/gfx/drivers/gx_gfx.c b/gfx/drivers/gx_gfx.c index b295c6931b..bf7727909e 100644 --- a/gfx/drivers/gx_gfx.c +++ b/gfx/drivers/gx_gfx.c @@ -1262,6 +1262,8 @@ static void gx_get_video_output_next(void *data) } static const video_poke_interface_t gx_poke_interface = { + 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 1adb488de1..e18d582758 100644 --- a/gfx/drivers/omap_gfx.c +++ b/gfx/drivers/omap_gfx.c @@ -1130,6 +1130,8 @@ static void omap_gfx_set_texture_enable(void *data, bool state, bool full_screen } static const video_poke_interface_t omap_gfx_poke_interface = { + NULL, /* set_coords */ + NULL, /* set_mvp */ NULL, NULL, NULL, diff --git a/gfx/drivers/psp1_gfx.c b/gfx/drivers/psp1_gfx.c index 1789aea993..128fab83b5 100644 --- a/gfx/drivers/psp1_gfx.c +++ b/gfx/drivers/psp1_gfx.c @@ -831,6 +831,8 @@ static void psp_viewport_info(void *data, struct video_viewport *vp) } static const video_poke_interface_t psp_poke_interface = { + NULL, /* set_coords */ + NULL, /* set_mvp */ NULL, NULL, NULL, diff --git a/gfx/drivers/sdl2_gfx.c b/gfx/drivers/sdl2_gfx.c index d7c479d9e1..8431ebb531 100644 --- a/gfx/drivers/sdl2_gfx.c +++ b/gfx/drivers/sdl2_gfx.c @@ -718,6 +718,8 @@ static void sdl2_grab_mouse_toggle(void *data) #endif static video_poke_interface_t sdl2_video_poke_interface = { + NULL, /* set_coords */ + NULL, /* set_mvp */ NULL, NULL, NULL, diff --git a/gfx/drivers/sdl_gfx.c b/gfx/drivers/sdl_gfx.c index 9154acc628..7f2060296c 100644 --- a/gfx/drivers/sdl_gfx.c +++ b/gfx/drivers/sdl_gfx.c @@ -517,6 +517,8 @@ static void sdl_grab_mouse_toggle(void *data) } static const video_poke_interface_t sdl_poke_interface = { + NULL, /* set_coords */ + NULL, /* set_mvp */ NULL, NULL, NULL, diff --git a/gfx/drivers/sunxi_gfx.c b/gfx/drivers/sunxi_gfx.c index 845850b2b8..90a9eadbc5 100644 --- a/gfx/drivers/sunxi_gfx.c +++ b/gfx/drivers/sunxi_gfx.c @@ -932,6 +932,8 @@ static void sunxi_set_aspect_ratio (void *data, unsigned aspect_ratio_idx) } static const video_poke_interface_t sunxi_poke_interface = { + NULL, /* set_coords */ + NULL, /* set_mvp */ NULL, NULL, NULL, /* set_video_mode */ diff --git a/gfx/drivers/vga_gfx.c b/gfx/drivers/vga_gfx.c index fa6e3775a2..9bbf431186 100644 --- a/gfx/drivers/vga_gfx.c +++ b/gfx/drivers/vga_gfx.c @@ -392,6 +392,8 @@ static void vga_set_osd_msg(void *data, } static const video_poke_interface_t vga_poke_interface = { + NULL, /* set_coords */ + NULL, /* set_mvp */ NULL, NULL, NULL, diff --git a/gfx/drivers/vita2d_gfx.c b/gfx/drivers/vita2d_gfx.c index bd8af133e2..8cc1ba72be 100644 --- a/gfx/drivers/vita2d_gfx.c +++ b/gfx/drivers/vita2d_gfx.c @@ -779,6 +779,8 @@ static bool vita_get_current_sw_framebuffer(void *data, } static const video_poke_interface_t vita_poke_interface = { + 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 b954d34cbe..45be4a4e70 100644 --- a/gfx/drivers/vulkan.c +++ b/gfx/drivers/vulkan.c @@ -2242,6 +2242,8 @@ static void vulkan_unload_texture(void *data, uintptr_t handle) } static const video_poke_interface_t vulkan_poke_interface = { + NULL, /* set_coords */ + NULL, /* set_mvp */ vulkan_load_texture, vulkan_unload_texture, vulkan_set_video_mode, diff --git a/gfx/drivers/wiiu_gfx.c b/gfx/drivers/wiiu_gfx.c index 68fda316af..16907200b4 100644 --- a/gfx/drivers/wiiu_gfx.c +++ b/gfx/drivers/wiiu_gfx.c @@ -848,6 +848,8 @@ static void wiiu_gfx_set_osd_msg(void* data, static const video_poke_interface_t wiiu_poke_interface = { + NULL, /* set_coords */ + NULL, /* set_mvp */ wiiu_gfx_load_texture, wiiu_gfx_unload_texture, NULL, /* set_video_mode */ diff --git a/gfx/drivers/xshm_gfx.c b/gfx/drivers/xshm_gfx.c index a2ca8416ec..75882f5f21 100644 --- a/gfx/drivers/xshm_gfx.c +++ b/gfx/drivers/xshm_gfx.c @@ -205,6 +205,8 @@ static void xshm_grab_mouse_toggle(void *data) #endif static video_poke_interface_t xshm_video_poke_interface = { + NULL, /* set_coords */ + NULL, /* set_mvp */ NULL, NULL, NULL, diff --git a/gfx/drivers_context/drm_ctx.c b/gfx/drivers_context/drm_ctx.c index 5c4882bd9d..e5eb203075 100644 --- a/gfx/drivers_context/drm_ctx.c +++ b/gfx/drivers_context/drm_ctx.c @@ -28,13 +28,13 @@ #include #include #include +#include #include #include #include #include -#include #include #include "../../configuration.h" @@ -80,7 +80,7 @@ typedef struct gfx_ctx_drm_data #ifdef HAVE_EGL egl_ctx_data_t egl; #endif - RFILE *drm; + int fd; unsigned interval; unsigned fb_width; unsigned fb_height; @@ -294,12 +294,14 @@ static void free_drm_resources(gfx_ctx_drm_data_t *drm) drm_free(); - if (drm->drm) + if (drm->fd >= 0) + { if (g_drm_fd >= 0) { drmDropMaster(g_drm_fd); - filestream_close(drm->drm); + close(drm->fd); } + } g_gbm_surface = NULL; g_gbm_dev = NULL; @@ -353,6 +355,7 @@ static void *gfx_ctx_drm_init(video_frame_info_t *video_info, void *video_driver if (!drm) return NULL; + drm->fd = -1; gpu_descriptors = dir_list_new("/dev/dri", NULL, false, true, false, false); @@ -366,14 +369,14 @@ nextgpu: } gpu = gpu_descriptors->elems[gpu_index++].data; - drm->drm = filestream_open(gpu, RFILE_MODE_READ_WRITE, -1); - if (!drm->drm) + drm->fd = open(gpu, O_RDWR); + if (drm->fd < 0) { RARCH_WARN("[KMS]: Couldn't open DRM device.\n"); goto nextgpu; } - fd = filestream_get_fd(drm->drm); + fd = drm->fd; if (!drm_get_resources(fd)) goto nextgpu; diff --git a/gfx/drivers_context/mali_fbdev_ctx.c b/gfx/drivers_context/mali_fbdev_ctx.c index 42234bfd56..e9b97dbe78 100644 --- a/gfx/drivers_context/mali_fbdev_ctx.c +++ b/gfx/drivers_context/mali_fbdev_ctx.c @@ -17,13 +17,13 @@ #include #include +#include +#include /* Includes and defines for framebuffer size retrieval */ #include #include -#include - #ifdef HAVE_CONFIG_H #include "../../config.h" #endif @@ -56,8 +56,7 @@ static enum gfx_ctx_api mali_api = GFX_CTX_NONE; static void gfx_ctx_mali_fbdev_destroy(void *data) { - int fb; - RFILE *fd = NULL; + int fd; mali_ctx_data_t *mali = (mali_ctx_data_t*)data; if (mali) @@ -71,12 +70,11 @@ static void gfx_ctx_mali_fbdev_destroy(void *data) } /* Clear framebuffer and set cursor on again */ - fd = filestream_open("/dev/tty", RFILE_MODE_READ_WRITE, -1); - fb = filestream_get_fd(fd); + fd = open("/dev/tty", O_RDWR); + ioctl(fd, VT_ACTIVATE, 5); + ioctl(fd, VT_ACTIVATE, 1); + close(fd); - ioctl(fb, VT_ACTIVATE,5); - ioctl(fb, VT_ACTIVATE,1); - filestream_close(fd); system("setterm -cursor on"); } @@ -160,16 +158,16 @@ static bool gfx_ctx_mali_fbdev_set_video_mode(void *data, EGL_NONE }; mali_ctx_data_t *mali = (mali_ctx_data_t*)data; - RFILE *fd = filestream_open("/dev/fb0", RFILE_MODE_READ_WRITE, -1); - int fb = filestream_get_fd(fd); + int fd = open("/dev/fb0", O_RDWR); - if (ioctl(fb, FBIOGET_VSCREENINFO, &vinfo) < 0) + if (ioctl(fd, FBIOGET_VSCREENINFO, &vinfo) < 0) { RARCH_ERR("Error obtaining framebuffer info.\n"); goto error; } - filestream_close(fd); + close(fd); + fd = -1; width = vinfo.xres; height = vinfo.yres; @@ -196,8 +194,8 @@ static bool gfx_ctx_mali_fbdev_set_video_mode(void *data, return true; error: - if (fd) - filestream_close(fd); + if (fd >= 0) + close(fd); RARCH_ERR("[Mali fbdev]: EGL error: %d.\n", eglGetError()); gfx_ctx_mali_fbdev_destroy(data); return false; diff --git a/gfx/drivers_context/x_ctx.c b/gfx/drivers_context/x_ctx.c index 665d2a75d9..08e6b7bcef 100644 --- a/gfx/drivers_context/x_ctx.c +++ b/gfx/drivers_context/x_ctx.c @@ -113,6 +113,53 @@ static enum gfx_ctx_api x_api = GFX_CTX_NONE; static gfx_ctx_x_data_t *current_context_data = NULL; +const unsigned long retroarch_icon_data[] = { + 16, 16, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, + 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, + 0xffffffff, 0xffffffff, 0x000000ff, 0xffffffff, 0xffffffff, 0x00000000, + 0xffffffff, 0xffffffff, 0x000000ff, 0xffffffff, 0xffffffff, 0xffffffff, + 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x000000ff, 0xffffffff, + 0xffffffff, 0x000000ff, 0xffffffff, 0xffffffff, 0xffffffff, 0x000000ff, + 0xffffffff, 0xffffffff, 0x000000ff, 0xffffffff, 0x00000000, 0x00000000, + 0x00000000, 0xffffffff, 0x000000ff, 0xffffffff, 0x000000ff, 0x000000ff, + 0x000000ff, 0x000000ff, 0x000000ff, 0x000000ff, 0x000000ff, 0xffffffff, + 0x000000ff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, + 0x000000ff, 0x000000ff, 0x000000ff, 0xffffffff, 0x000000ff, 0x000000ff, + 0x000000ff, 0xffffffff, 0x000000ff, 0x000000ff, 0x000000ff, 0xffffffff, + 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x000000ff, 0x000000ff, + 0x000000ff, 0x000000ff, 0x000000ff, 0x000000ff, 0x000000ff, 0x000000ff, + 0x000000ff, 0x000000ff, 0x000000ff, 0xffffffff, 0x00000000, 0x00000000, + 0x00000000, 0xffffffff, 0xffffffff, 0x000000ff, 0x000000ff, 0x000000ff, + 0x000000ff, 0x000000ff, 0x000000ff, 0x000000ff, 0x000000ff, 0x000000ff, + 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xffffffff, 0xffffffff, 0x000000ff, 0xffffffff, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0x000000ff, 0xffffffff, 0xffffffff, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x000000ff, + 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, + 0xffffffff, 0x000000ff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, + 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000 +}; + #ifdef HAVE_OPENGL static PFNGLXCREATECONTEXTATTRIBSARBPROC glx_create_context_attribs; @@ -574,6 +621,8 @@ static bool gfx_ctx_x_set_video_mode(void *data, XSetWindowAttributes swa = {0}; int (*old_handler)(Display*, XErrorEvent*) = NULL; gfx_ctx_x_data_t *x = (gfx_ctx_x_data_t*)data; + Atom net_wm_icon = XInternAtom(g_x11_dpy, "_NET_WM_ICON", False); + Atom cardinal = XInternAtom(g_x11_dpy, "CARDINAL", False); frontend_driver_install_signal_handler(); @@ -661,6 +710,8 @@ static bool gfx_ctx_x_set_video_mode(void *data, (true_full ? CWOverrideRedirect : 0), &swa); XSetWindowBackground(g_x11_dpy, g_x11_win, 0); + XChangeProperty(g_x11_dpy, g_x11_win, net_wm_icon, cardinal, 32, PropModeReplace, (const unsigned char*)retroarch_icon_data, sizeof(retroarch_icon_data) / sizeof(*retroarch_icon_data)); + switch (x_api) { case GFX_CTX_OPENGL_API: @@ -1137,4 +1188,3 @@ const gfx_ctx_driver_t gfx_ctx_x = { #endif gfx_ctx_x_make_current }; - diff --git a/gfx/drivers_font/caca_font.c b/gfx/drivers_font/caca_font.c index af2e17cf29..6d6f37196a 100644 --- a/gfx/drivers_font/caca_font.c +++ b/gfx/drivers_font/caca_font.c @@ -129,12 +129,6 @@ static void caca_render_msg(video_frame_info_t *video_info, caca_refresh_display(*font->caca->caca_display); } -static void caca_font_flush_block(unsigned width, unsigned height, - void* data) -{ - (void)data; -} - static void caca_font_bind_block(void* data, void* userdata) { (void)data; @@ -147,6 +141,6 @@ font_renderer_t caca_font = { "caca font", caca_font_get_glyph, /* get_glyph */ caca_font_bind_block, /* bind_block */ - caca_font_flush_block, /* flush */ + NULL, /* flush */ caca_get_message_width /* get_message_width */ }; diff --git a/gfx/drivers_font/ctr_font.c b/gfx/drivers_font/ctr_font.c index ea3b1e28c5..e78054768b 100644 --- a/gfx/drivers_font/ctr_font.c +++ b/gfx/drivers_font/ctr_font.c @@ -441,11 +441,6 @@ static const struct font_glyph* ctr_font_get_glyph( return font->font_driver->get_glyph((void*)font->font_driver, code); } -static void ctr_font_flush_block(unsigned width, unsigned height, void* data) -{ - (void)data; -} - static void ctr_font_bind_block(void* data, void* userdata) { (void)data; @@ -460,6 +455,6 @@ font_renderer_t ctr_font = "ctrfont", ctr_font_get_glyph, ctr_font_bind_block, - ctr_font_flush_block, + NULL, /* flush_block */ ctr_font_get_message_width, }; diff --git a/gfx/drivers_font/gdi_font.c b/gfx/drivers_font/gdi_font.c index 479a86f4d1..c89eb99df9 100644 --- a/gfx/drivers_font/gdi_font.c +++ b/gfx/drivers_font/gdi_font.c @@ -140,7 +140,8 @@ static void gdi_render_msg( SelectObject(font->gdi->memDC, font->gdi->bmp_old); } -static void gdi_font_flush_block(unsigned width, unsigned height, void* data) +static void gdi_font_flush_block(unsigned width, unsigned height, void* data, + video_frame_info_t *video_info) { (void)data; } diff --git a/gfx/drivers_font/gl_raster_font.c b/gfx/drivers_font/gl_raster_font.c index 7c8878ed4d..16a2bbc55f 100644 --- a/gfx/drivers_font/gl_raster_font.c +++ b/gfx/drivers_font/gl_raster_font.c @@ -190,11 +190,8 @@ static void *gl_raster_font_init_font(void *data, video_context_driver_make_current(false); glGenTextures(1, &font->tex); - glBindTexture(GL_TEXTURE_2D, font->tex); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + + gl_bind_texture(font->tex, GL_CLAMP_TO_EDGE, GL_LINEAR, GL_LINEAR); font->atlas = font->font_driver->get_atlas(font->font_data); font->tex_width = next_pow2(font->atlas->width); @@ -247,9 +244,9 @@ static int gl_get_message_width(void *data, const char *msg, return delta_x * scale; } -static void gl_raster_font_draw_vertices(gl_raster_t *font, const video_coords_t *coords) +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_mvp_t mvp; video_shader_ctx_coords_t coords_data; if (font->atlas->dirty) @@ -261,12 +258,10 @@ static void gl_raster_font_draw_vertices(gl_raster_t *font, const video_coords_t coords_data.handle_data = NULL; coords_data.data = coords; - video_shader_driver_set_coords(coords_data); + video_driver_set_coords(&coords_data); - mvp.data = font->gl; - mvp.matrix = &font->gl->mvp_no_rot; - - video_shader_driver_set_mvp(mvp); + video_info->cb_set_mvp(font->gl, + video_info->shader_data, &font->gl->mvp_no_rot); glDrawArrays(GL_TRIANGLES, 0, coords->vertices); } @@ -274,7 +269,8 @@ static void gl_raster_font_draw_vertices(gl_raster_t *font, const video_coords_t static void gl_raster_font_render_line( gl_raster_t *font, const char *msg, unsigned msg_len, GLfloat scale, const GLfloat color[4], GLfloat pos_x, - GLfloat pos_y, unsigned text_align) + GLfloat pos_y, unsigned text_align, + video_frame_info_t *video_info) { unsigned i; struct video_coords coords; @@ -349,14 +345,15 @@ static void gl_raster_font_render_line( if (font->block) video_coord_array_append(&font->block->carr, &coords, coords.vertices); else - gl_raster_font_draw_vertices(font, &coords); + gl_raster_font_draw_vertices(font, &coords, video_info); } } static void gl_raster_font_render_message( gl_raster_t *font, const char *msg, GLfloat scale, const GLfloat color[4], GLfloat pos_x, GLfloat pos_y, - unsigned text_align) + unsigned text_align, + video_frame_info_t *video_info) { float line_height; int lines = 0; @@ -366,7 +363,8 @@ static void gl_raster_font_render_message( { gl_raster_font_render_line(font, msg, (unsigned)strlen(msg), scale, color, pos_x, - pos_y, text_align); + pos_y, text_align, + video_info); return; } @@ -382,7 +380,8 @@ static void gl_raster_font_render_message( /* Draw the line */ gl_raster_font_render_line(font, msg, msg_len, scale, color, pos_x, - pos_y - (float)lines*line_height, text_align); + pos_y - (float)lines*line_height, text_align, + video_info); if (!delim) break; @@ -490,11 +489,13 @@ static void gl_raster_font_render_msg( if (font->gl) gl_raster_font_render_message(font, msg, scale, color_dark, x + scale * drop_x / font->gl->vp.width, y + - scale * drop_y / font->gl->vp.height, text_align); + scale * drop_y / font->gl->vp.height, text_align, + video_info); } if (font->gl) - gl_raster_font_render_message(font, msg, scale, color, x, y, text_align); + gl_raster_font_render_message(font, msg, scale, color, + x, y, text_align, video_info); } if (!font->block && font->gl) @@ -520,7 +521,7 @@ static const struct font_glyph *gl_raster_font_get_glyph( } static void gl_raster_font_flush_block(unsigned width, unsigned height, - void *data) + void *data, video_frame_info_t *video_info) { gl_raster_t *font = (gl_raster_t*)data; video_font_raster_block_t *block = font ? font->block : NULL; @@ -529,7 +530,8 @@ static void gl_raster_font_flush_block(unsigned width, unsigned height, return; gl_raster_font_setup_viewport(width, height, font, block->fullscreen); - gl_raster_font_draw_vertices(font, (video_coords_t*)&block->carr.coords); + gl_raster_font_draw_vertices(font, (video_coords_t*)&block->carr.coords, + video_info); if (font->gl) { diff --git a/gfx/drivers_font/vga_font.c b/gfx/drivers_font/vga_font.c index 2a8f032602..229186e3c7 100644 --- a/gfx/drivers_font/vga_font.c +++ b/gfx/drivers_font/vga_font.c @@ -129,12 +129,6 @@ static void vga_render_msg(video_frame_info_t *video_info, } } -static void vga_font_flush_block(unsigned width, unsigned height, - void* data) -{ - (void)data; -} - static void vga_font_bind_block(void* data, void* userdata) { (void)data; @@ -147,6 +141,6 @@ font_renderer_t vga_font = { "vga font", vga_font_get_glyph, /* get_glyph */ vga_font_bind_block, /* bind_block */ - vga_font_flush_block, /* flush */ + NULL, /* flush */ vga_get_message_width /* get_message_width */ }; diff --git a/gfx/drivers_font/vita2d_font.c b/gfx/drivers_font/vita2d_font.c index 87f903d27c..7a4777a3eb 100644 --- a/gfx/drivers_font/vita2d_font.c +++ b/gfx/drivers_font/vita2d_font.c @@ -346,12 +346,6 @@ static const struct font_glyph *vita2d_font_get_glyph( return font->font_driver->get_glyph((void*)font->font_driver, code); } -static void vita2d_font_flush_block(unsigned width, unsigned height, - void *data) -{ - (void)data; -} - static void vita2d_font_bind_block(void *data, void *userdata) { (void)data; @@ -364,6 +358,6 @@ font_renderer_t vita2d_vita_font = { "vita2dfont", vita2d_font_get_glyph, vita2d_font_bind_block, - vita2d_font_flush_block, + NULL, /* flush */ vita2d_font_get_message_width, }; diff --git a/gfx/drivers_font/vulkan_raster_font.c b/gfx/drivers_font/vulkan_raster_font.c index 871c5f6e4c..5897637f12 100644 --- a/gfx/drivers_font/vulkan_raster_font.c +++ b/gfx/drivers_font/vulkan_raster_font.c @@ -436,7 +436,7 @@ static const struct font_glyph *vulkan_raster_font_get_glyph( } static void vulkan_raster_font_flush_block(unsigned width, unsigned height, - void *data) + void *data, video_frame_info_t *video_info) { (void)data; } diff --git a/gfx/drivers_font/wiiu_font.c b/gfx/drivers_font/wiiu_font.c index c7a34383dc..4efa3f7148 100644 --- a/gfx/drivers_font/wiiu_font.c +++ b/gfx/drivers_font/wiiu_font.c @@ -401,11 +401,6 @@ static const struct font_glyph* wiiu_font_get_glyph( return font->font_driver->get_glyph((void*)font->font_driver, code); } -static void wiiu_font_flush_block(unsigned width, unsigned height, void* data) -{ - (void)data; -} - static void wiiu_font_bind_block(void* data, void* userdata) { (void)data; @@ -420,6 +415,6 @@ font_renderer_t wiiu_font = "wiiufont", wiiu_font_get_glyph, wiiu_font_bind_block, - wiiu_font_flush_block, + NULL, /* flush */ wiiu_font_get_message_width, }; diff --git a/gfx/drivers_renderchain/d3d8_renderchain.c b/gfx/drivers_renderchain/d3d8_renderchain.c index 2dc9b4dcf9..faef44aee7 100644 --- a/gfx/drivers_renderchain/d3d8_renderchain.c +++ b/gfx/drivers_renderchain/d3d8_renderchain.c @@ -43,13 +43,17 @@ typedef struct d3d8_renderchain uint64_t frame_count; } d3d8_renderchain_t; -static void renderchain_set_mvp(void *data, unsigned vp_width, +static void d3d8_renderchain_set_mvp( + void *chain_data, + void *data, unsigned vp_width, unsigned vp_height, unsigned rotation) { d3d_video_t *d3d = (d3d_video_t*)data; LPDIRECT3DDEVICE d3dr = (LPDIRECT3DDEVICE)d3d->dev; D3DMATRIX p_out, p_rotate, mat; + (void)chain_data; + d3d_matrix_ortho_off_center_lh(&mat, 0, vp_width, vp_height, 0, 0.0f, 1.0f); d3d_matrix_identity(&p_out); d3d_matrix_rotation_z(&p_rotate, rotation * (M_PI / 2.0)); @@ -67,7 +71,7 @@ static void d3d8_renderchain_clear(void *data) d3d_vertex_buffer_free(chain->vertex_buf, chain->vertex_decl); } -static bool renderchain_create_first_pass(void *data, +static bool d3d8_renderchain_create_first_pass(void *data, const video_info_t *info) { d3d_video_t *d3d = (d3d_video_t*)data; @@ -106,7 +110,7 @@ static bool renderchain_create_first_pass(void *data, return true; } -static void renderchain_set_vertices(void *data, unsigned pass, +static void d3d8_renderchain_set_vertices(void *data, unsigned pass, unsigned vert_width, unsigned vert_height, uint64_t frame_count) { unsigned width, height; @@ -171,7 +175,7 @@ static void renderchain_set_vertices(void *data, unsigned pass, } } -static void renderchain_blit_to_texture(void *data, const void *frame, +static void d3d8_renderchain_blit_to_texture(void *data, const void *frame, unsigned width, unsigned height, unsigned pitch) { D3DLOCKED_RECT d3dlr; @@ -254,7 +258,7 @@ static bool d3d8_renderchain_init(void *data, chain->tex_w = link_info->tex_w; chain->tex_h = link_info->tex_h; - if (!renderchain_create_first_pass(d3d, video_info)) + if (!d3d8_renderchain_create_first_pass(d3d, video_info)) return false; /* FIXME */ @@ -283,17 +287,17 @@ static bool d3d8_renderchain_render(void *data, const void *frame, { unsigned i; unsigned width, height; - d3d_video_t *d3d = (d3d_video_t*)data; - LPDIRECT3DDEVICE d3dr = (LPDIRECT3DDEVICE)d3d->dev; - settings_t *settings = config_get_ptr(); + d3d_video_t *d3d = (d3d_video_t*)data; + LPDIRECT3DDEVICE d3dr = (LPDIRECT3DDEVICE)d3d->dev; + settings_t *settings = config_get_ptr(); d3d8_renderchain_t *chain = (d3d8_renderchain_t*)d3d->renderchain_data; chain->frame_count++; video_driver_get_size(&width, &height); - renderchain_blit_to_texture(chain, frame, frame_width, frame_height, pitch); - renderchain_set_vertices(d3d, 1, frame_width, frame_height, chain->frame_count); + d3d8_renderchain_blit_to_texture(chain, frame, frame_width, frame_height, pitch); + d3d8_renderchain_set_vertices(d3d, 1, frame_width, frame_height, chain->frame_count); d3d_set_texture(d3dr, 0, chain->tex); d3d_set_viewports(chain->dev, &d3d->final_viewport); @@ -307,7 +311,7 @@ static bool d3d8_renderchain_render(void *data, const void *frame, d3d_set_stream_source(d3dr, i, chain->vertex_buf, 0, sizeof(Vertex)); d3d_draw_primitive(d3dr, D3DPT_TRIANGLESTRIP, 0, 2); - renderchain_set_mvp(d3d, width, height, d3d->dev_rotation); + d3d8_renderchain_set_mvp(chain, d3d, width, height, d3d->dev_rotation); return true; } @@ -365,7 +369,8 @@ static bool d3d8_renderchain_reinit(void *data, return true; } -static void d3d8_renderchain_viewport_info(void *data, struct video_viewport *vp) +static void d3d8_renderchain_viewport_info(void *data, + struct video_viewport *vp) { unsigned width, height; d3d_video_t *d3d = (d3d_video_t*)data; @@ -385,6 +390,7 @@ static void d3d8_renderchain_viewport_info(void *data, struct video_viewport *vp } d3d_renderchain_driver_t d3d8_d3d_renderchain = { + d3d8_renderchain_set_mvp, d3d8_renderchain_free, d3d8_renderchain_new, d3d8_renderchain_reinit, diff --git a/gfx/drivers_renderchain/d3d9_cg_renderchain.c b/gfx/drivers_renderchain/d3d9_cg_renderchain.c index b153c8f177..5a83b9af75 100644 --- a/gfx/drivers_renderchain/d3d9_cg_renderchain.c +++ b/gfx/drivers_renderchain/d3d9_cg_renderchain.c @@ -1191,13 +1191,14 @@ static void d3d9_cg_renderchain_end_render(cg_renderchain_t *chain) } static void d3d9_cg_renderchain_set_mvp( - cg_renderchain_t *chain, - void *vertex_program, + void *chain_data, + void *data, unsigned vp_width, unsigned vp_height, unsigned rotation) { D3DMATRIX proj, ortho, rot, tmp; - CGprogram vPrg = (CGprogram)vertex_program; + CGprogram vPrg = (CGprogram)data; + cg_renderchain_t *chain = (cg_renderchain_t*)chain_data; d3d_matrix_ortho_off_center_lh(&ortho, 0, vp_width, 0, vp_height, 0, 1); d3d_matrix_identity(&rot); @@ -1686,6 +1687,7 @@ static void d3d9_cg_renderchain_viewport_info( } d3d_renderchain_driver_t cg_d3d9_renderchain = { + d3d9_cg_renderchain_set_mvp, d3d9_cg_renderchain_free, d3d9_cg_renderchain_new, NULL, diff --git a/gfx/drivers_renderchain/d3d9_hlsl_renderchain.c b/gfx/drivers_renderchain/d3d9_hlsl_renderchain.c index f1cafcd775..8d96721d86 100644 --- a/gfx/drivers_renderchain/d3d9_hlsl_renderchain.c +++ b/gfx/drivers_renderchain/d3d9_hlsl_renderchain.c @@ -44,19 +44,22 @@ typedef struct hlsl_d3d9_renderchain /* TODO/FIXME - this forward declaration should not be necesary */ void hlsl_set_proj_matrix(void *data, XMMATRIX rotation_value); -static void renderchain_set_mvp(void *data, unsigned vp_width, +static void hlsl_d3d9_renderchain_set_mvp( + void *chain_data, + void *data, unsigned vp_width, unsigned vp_height, unsigned rotation) { video_shader_ctx_mvp_t mvp; d3d_video_t *d3d = (d3d_video_t*)data; LPDIRECT3DDEVICE d3dr = (LPDIRECT3DDEVICE)d3d->dev; - hlsl_set_proj_matrix((void*)&d3d->shader, XMMatrixRotationZ(rotation * (M_PI / 2.0))); + hlsl_set_proj_matrix((void*)&d3d->shader, + XMMatrixRotationZ(rotation * (M_PI / 2.0))); mvp.data = d3d; mvp.matrix = NULL; - video_shader_driver_set_mvp(mvp); + video_driver_set_mvp(&mvp); } static void hlsl_d3d9_renderchain_clear(void *data) @@ -87,7 +90,7 @@ static bool hlsl_d3d9_renderchain_init_shader_fvf(void *data, void *pass_data) VertexElements, (void**)&chain->vertex_decl); } -static bool renderchain_create_first_pass(void *data, +static bool hlsl_d3d9_renderchain_create_first_pass(void *data, const video_info_t *info) { d3d_video_t *d3d = (d3d_video_t*)data; @@ -126,7 +129,8 @@ static bool renderchain_create_first_pass(void *data, return true; } -static void renderchain_set_vertices(void *data, unsigned pass, +static void hlsl_d3d9_renderchain_set_vertices( + void *data, unsigned pass, unsigned vert_width, unsigned vert_height, uint64_t frame_count) { video_shader_ctx_params_t params; @@ -187,7 +191,8 @@ static void renderchain_set_vertices(void *data, unsigned pass, d3d_vertex_buffer_unlock(chain->vertex_buf); } - renderchain_set_mvp(d3d, width, height, d3d->dev_rotation); + hlsl_d3d9_renderchain_set_mvp(chain, + d3d, width, height, d3d->dev_rotation); shader_info.data = d3d; shader_info.idx = pass; @@ -212,8 +217,9 @@ static void renderchain_set_vertices(void *data, unsigned pass, video_shader_driver_set_parameters(params); } -static void renderchain_blit_to_texture(void *data, const void *frame, - unsigned width, unsigned height, unsigned pitch) +static void hlsl_d3d9_renderchain_blit_to_texture( + void *data, const void *frame, + unsigned width, unsigned height, unsigned pitch) { D3DLOCKED_RECT d3dlr; hlsl_d3d9_renderchain_t *chain = (hlsl_d3d9_renderchain_t*)data; @@ -261,7 +267,6 @@ static void hlsl_d3d9_renderchain_free(void *data) hlsl_d3d9_renderchain_clear(chain->renderchain_data); } - void *hlsl_d3d9_renderchain_new(void) { hlsl_d3d9_renderchain_t *renderchain = @@ -327,7 +332,7 @@ static bool hlsl_d3d9_renderchain_init(void *data, chain->tex_w = link_info->tex_w; chain->tex_h = link_info->tex_h; - if (!renderchain_create_first_pass(d3d, video_info)) + if (!hlsl_d3d9_renderchain_create_first_pass(d3d, video_info)) return false; /* FIXME */ @@ -366,8 +371,10 @@ static bool hlsl_d3d9_renderchain_render(void *data, const void *frame, video_driver_get_size(&width, &height); - renderchain_blit_to_texture(chain, frame, frame_width, frame_height, pitch); - renderchain_set_vertices(d3d, 1, frame_width, frame_height, chain->frame_count); + hlsl_d3d9_renderchain_blit_to_texture(chain, + frame, frame_width, frame_height, pitch); + hlsl_d3d9_renderchain_set_vertices(d3d, + 1, frame_width, frame_height, chain->frame_count); d3d_set_texture(d3dr, 0, chain->tex); d3d_set_viewports(chain->dev, &d3d->final_viewport); @@ -381,12 +388,14 @@ static bool hlsl_d3d9_renderchain_render(void *data, const void *frame, d3d_set_stream_source(d3dr, i, chain->vertex_buf, 0, sizeof(Vertex)); d3d_draw_primitive(d3dr, D3DPT_TRIANGLESTRIP, 0, 2); - renderchain_set_mvp(d3d, width, height, d3d->dev_rotation); + hlsl_d3d9_renderchain_set_mvp( + chain, d3d, width, height, d3d->dev_rotation); return true; } -static bool hlsl_d3d9_renderchain_add_pass(void *data, const void *info_data) +static bool hlsl_d3d9_renderchain_add_pass( + void *data, const void *info_data) { (void)data; (void)info_data; @@ -395,7 +404,8 @@ static bool hlsl_d3d9_renderchain_add_pass(void *data, const void *info_data) return true; } -static void hlsl_d3d9_renderchain_add_state_tracker(void *data, void *tracker_data) +static void hlsl_d3d9_renderchain_add_state_tracker( + void *data, void *tracker_data) { (void)data; (void)tracker_data; @@ -441,7 +451,8 @@ static bool hlsl_d3d9_renderchain_reinit(void *data, return true; } -static void hlsl_d3d9_renderchain_viewport_info(void *data, struct video_viewport *vp) +static void hlsl_d3d9_renderchain_viewport_info( + void *data, struct video_viewport *vp) { unsigned width, height; d3d_video_t *d3d = (d3d_video_t*)data; @@ -461,6 +472,7 @@ static void hlsl_d3d9_renderchain_viewport_info(void *data, struct video_viewpor } d3d_renderchain_driver_t hlsl_d3d9_renderchain = { + hlsl_d3d9_renderchain_set_mvp, hlsl_d3d9_renderchain_free, hlsl_d3d9_renderchain_new, hlsl_d3d9_renderchain_reinit, diff --git a/gfx/drivers_renderchain/gl1_renderchain.c b/gfx/drivers_renderchain/gl1_renderchain.c new file mode 100644 index 0000000000..04e8fa6199 --- /dev/null +++ b/gfx/drivers_renderchain/gl1_renderchain.c @@ -0,0 +1,329 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2010-2014 - Hans-Kristian Arntzen + * Copyright (C) 2011-2017 - Daniel De Matteis + * Copyright (C) 2012-2015 - Michael Lelli + * + * 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 . + */ + +#ifdef _MSC_VER +#pragma comment(lib, "opengl32") +#endif + +#include +#include +#include +#include + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "../video_driver.h" +#include "../video_shader_parse.h" +#include "../common/gl_common.h" + +#include "../../driver.h" +#include "../../configuration.h" +#include "../../verbosity.h" + +typedef struct gl1_renderchain +{ + void *empty; +} gl1_renderchain_t; + +GLenum min_filter_to_mag(GLenum type); + +void gl1_renderchain_free(void *data) +{ + gl_t *gl = (gl_t*)data; + (void)gl; +} + +static void gl1_renderchain_bind_prev_texture( + void *data, + const struct video_tex_info *tex_info) +{ + gl_t *gl = (gl_t*)data; + + memmove(gl->prev_info + 1, gl->prev_info, + sizeof(*tex_info) * (gl->textures - 1)); + memcpy(&gl->prev_info[0], tex_info, + sizeof(*tex_info)); +} + +static void gl1_renderchain_viewport_info( + void *data, struct video_viewport *vp) +{ + unsigned width, height; + unsigned top_y, top_dist; + gl_t *gl = (gl_t*)data; + + video_driver_get_size(&width, &height); + + *vp = gl->vp; + vp->full_width = width; + vp->full_height = height; + + /* Adjust as GL viewport is bottom-up. */ + top_y = vp->y + vp->height; + top_dist = height - top_y; + vp->y = top_dist; +} + +static bool gl1_renderchain_read_viewport( + void *data, uint8_t *buffer, bool is_idle) +{ + unsigned num_pixels = 0; + gl_t *gl = (gl_t*)data; + + if (!gl) + return false; + + num_pixels = gl->vp.width * gl->vp.height; + + /* Use slow synchronous readbacks. Use this with plain screenshots + as we don't really care about performance in this case. */ + + /* GLES2 only guarantees GL_RGBA/GL_UNSIGNED_BYTE + * readbacks so do just that. + * GLES2 also doesn't support reading back data + * from front buffer, so render a cached frame + * and have gl_frame() do the readback while it's + * in the back buffer. + * + * Keep codepath similar for GLES and desktop GL. + */ + gl->readback_buffer_screenshot = malloc(num_pixels * sizeof(uint32_t)); + + if (!gl->readback_buffer_screenshot) + return false; + + if (!is_idle) + video_driver_cached_frame(); + + video_frame_convert_rgba_to_bgr( + (const void*)gl->readback_buffer_screenshot, + buffer, + num_pixels); + + free(gl->readback_buffer_screenshot); + gl->readback_buffer_screenshot = NULL; + + return true; +} + +void gl1_renderchain_free_internal(void *data) +{ + gl1_renderchain_t *cg_data = (gl1_renderchain_t*)data; + + if (!cg_data) + return; + + free(cg_data); +} + +static void *gl1_renderchain_new(void) +{ + gl1_renderchain_t *renderchain = (gl1_renderchain_t*) + calloc(1, sizeof(*renderchain)); + if (!renderchain) + return NULL; + + return renderchain; +} + +static void gl1_renderchain_ff_vertex(const void *data) +{ + const struct video_coords *coords = (const struct video_coords*)data; + /* Fall back to fixed function-style if needed and possible. */ + glClientActiveTexture(GL_TEXTURE1); + glTexCoordPointer(2, GL_FLOAT, 0, coords->lut_tex_coord); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + glClientActiveTexture(GL_TEXTURE0); + glVertexPointer(2, GL_FLOAT, 0, coords->vertex); + glEnableClientState(GL_VERTEX_ARRAY); + glColorPointer(4, GL_FLOAT, 0, coords->color); + glEnableClientState(GL_COLOR_ARRAY); + glTexCoordPointer(2, GL_FLOAT, 0, coords->tex_coord); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); +} + +static void gl1_renderchain_ff_matrix(const void *data) +{ + math_matrix_4x4 ident; + const math_matrix_4x4 *mat = (const math_matrix_4x4*)data; + + /* Fall back to fixed function-style if needed and possible. */ + glMatrixMode(GL_PROJECTION); + glLoadMatrixf(mat->data); + glMatrixMode(GL_MODELVIEW); + matrix_4x4_identity(ident); + glLoadMatrixf(ident.data); +} + +static void gl1_renderchain_disable_client_arrays(void) +{ + if (gl_query_core_context_in_use()) + return; + + glClientActiveTexture(GL_TEXTURE1); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + glClientActiveTexture(GL_TEXTURE0); + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_COLOR_ARRAY); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); +} + +static void gl1_renderchain_restore_default_state(void *data) +{ + gl_t *gl = (gl_t*)data; + if (!gl) + return; + glEnable(GL_TEXTURE_2D); + glDisable(GL_DEPTH_TEST); + glDisable(GL_CULL_FACE); + glDisable(GL_DITHER); +} + +static void gl1_renderchain_copy_frame( + void *data, + video_frame_info_t *video_info, + const void *frame, + unsigned width, unsigned height, unsigned pitch) +{ + gl_t *gl = (gl_t*)data; + const GLvoid *data_buf = frame; + glPixelStorei(GL_UNPACK_ALIGNMENT, video_pixel_get_alignment(pitch)); + + if (gl->base_size == 2 && !gl->have_es2_compat) + { + /* Convert to 32-bit textures on desktop GL. + * + * It is *much* faster (order of magnitude on my setup) + * to use a custom SIMD-optimized conversion routine + * than letting GL do it. */ + video_frame_convert_rgb16_to_rgb32( + &gl->scaler, + gl->conv_buffer, + frame, + width, + height, + pitch); + data_buf = gl->conv_buffer; + } + else + glPixelStorei(GL_UNPACK_ROW_LENGTH, pitch / gl->base_size); + + glTexSubImage2D(GL_TEXTURE_2D, + 0, 0, 0, width, height, gl->texture_type, + gl->texture_fmt, data_buf); + + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); +} + +static void gl1_renderchain_readback(void *data, + unsigned alignment, + unsigned fmt, unsigned type, + void *src) +{ + gl_t *gl = (gl_t*)data; + + glPixelStorei(GL_PACK_ALIGNMENT, alignment); + glPixelStorei(GL_PACK_ROW_LENGTH, 0); + glReadBuffer(GL_BACK); + + glReadPixels(gl->vp.x, gl->vp.y, + gl->vp.width, gl->vp.height, + (GLenum)fmt, (GLenum)type, (GLvoid*)src); +} + +static void gl1_renderchain_set_mvp(void *data, + void *shader_data, const void *mat_data) +{ + math_matrix_4x4 ident; + const math_matrix_4x4 *mat = (const math_matrix_4x4*)mat_data; + + /* Fall back to fixed function-style if needed and possible. */ + glMatrixMode(GL_PROJECTION); + glLoadMatrixf(mat->data); + glMatrixMode(GL_MODELVIEW); + matrix_4x4_identity(ident); + glLoadMatrixf(ident.data); +} + +static void gl1_renderchain_set_coords(void *handle_data, + void *shader_data, const struct video_coords *coords) +{ + /* Fall back to fixed function-style if needed and possible. */ + glClientActiveTexture(GL_TEXTURE1); + glTexCoordPointer(2, GL_FLOAT, 0, coords->lut_tex_coord); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + glClientActiveTexture(GL_TEXTURE0); + glVertexPointer(2, GL_FLOAT, 0, coords->vertex); + glEnableClientState(GL_VERTEX_ARRAY); + glColorPointer(4, GL_FLOAT, 0, coords->color); + glEnableClientState(GL_COLOR_ARRAY); + glTexCoordPointer(2, GL_FLOAT, 0, coords->tex_coord); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); +} + +gl_renderchain_driver_t gl2_renderchain = { + gl1_renderchain_set_coords, + gl1_renderchain_set_mvp, + NULL, /* init_textures_reference */ + NULL, /* fence_iterate */ + NULL, /* fence_free */ + gl1_renderchain_readback, + NULL, /* renderchain_init_pbo */ + NULL, /* renderchain_bind_pbo */ + NULL, /* renderchain_unbind_pbo */ + gl1_renderchain_copy_frame, + gl1_renderchain_restore_default_state, + NULL, /* new_vao */ + NULL, /* free_vao */ + NULL, /* bind_vao */ + NULL, /* unbind_vao */ + gl1_renderchain_disable_client_arrays, /* disable_client_arrays */ + gl1_renderchain_ff_vertex, /* ff_vertex */ + gl1_renderchain_ff_matrix, + NULL, /* bind_backbuffer */ + NULL, /* deinit_fbo */ + gl1_renderchain_viewport_info, + gl1_renderchain_read_viewport, + gl1_renderchain_bind_prev_texture, + gl1_renderchain_free_internal, + gl1_renderchain_new, + NULL, /* renderchain_init */ + NULL, /* init_hw_render */ + gl1_renderchain_free, + NULL, /* deinit_hw_render */ + NULL, /* start_render */ + NULL, /* check_fbo_dimensions */ + NULL, /* recompute_pass_sizes */ + NULL, /* renderchain_render */ + "gl1", +}; diff --git a/gfx/drivers_renderchain/gl2_renderchain.c b/gfx/drivers_renderchain/gl2_renderchain.c index 95d2d67f4a..0c9733e35f 100644 --- a/gfx/drivers_renderchain/gl2_renderchain.c +++ b/gfx/drivers_renderchain/gl2_renderchain.c @@ -50,10 +50,6 @@ #include "../../configuration.h" #include "../../verbosity.h" -#if defined(_WIN32) && !defined(_XBOX) -#include "../common/win32_common.h" -#endif - typedef struct gl2_renderchain { void *empty; @@ -251,7 +247,6 @@ static void gl2_renderchain_render( const struct video_tex_info *feedback_info) { int i; - video_shader_ctx_mvp_t mvp; video_shader_ctx_coords_t coords; video_shader_ctx_params_t params; video_shader_ctx_info_t shader_info; @@ -274,7 +269,6 @@ static void gl2_renderchain_render( * and render all passes from FBOs, to another FBO. */ for (i = 1; i < gl->fbo_pass; i++) { - video_shader_ctx_mvp_t mvp; video_shader_ctx_coords_t coords; video_shader_ctx_params_t params; const struct video_fbo_rect *rect = &gl->fbo_rect[i]; @@ -337,12 +331,10 @@ static void gl2_renderchain_render( coords.handle_data = NULL; coords.data = &gl->coords; - video_shader_driver_set_coords(coords); + video_driver_set_coords(&coords); - mvp.data = gl; - mvp.matrix = &gl->mvp; - - video_shader_driver_set_mvp(mvp); + video_info->cb_set_mvp(gl, + video_info->shader_data, &gl->mvp); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } @@ -414,12 +406,11 @@ static void gl2_renderchain_render( coords.handle_data = NULL; coords.data = &gl->coords; - video_shader_driver_set_coords(coords); + video_driver_set_coords(&coords); - mvp.data = gl; - mvp.matrix = &gl->mvp; + video_info->cb_set_mvp(gl, + video_info->shader_data, &gl->mvp); - video_shader_driver_set_mvp(mvp); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); gl->coords.tex_coord = gl->tex_info.coord; @@ -428,8 +419,6 @@ static void gl2_renderchain_render( static void gl2_renderchain_deinit_fbo(void *data) { gl_t *gl = (gl_t*)data; - if (!gl->fbo_inited) - return; glDeleteTextures(gl->fbo_pass, gl->fbo_texture); glDeleteFramebuffers(gl->fbo_pass, gl->fbo); @@ -526,23 +515,19 @@ error: static void gl_create_fbo_texture(gl_t *gl, unsigned i, GLuint texture) { - unsigned mip_level; - GLenum min_filter, mag_filter, wrap_enum; + GLenum mag_filter, wrap_enum; video_shader_ctx_filter_t filter_type; video_shader_ctx_wrap_t wrap = {0}; bool fp_fbo = false; - bool mipmapped = false; bool smooth = false; settings_t *settings = config_get_ptr(); GLuint base_filt = settings->bools.video_smooth ? GL_LINEAR : GL_NEAREST; GLuint base_mip_filt = settings->bools.video_smooth ? GL_LINEAR_MIPMAP_LINEAR : GL_NEAREST_MIPMAP_NEAREST; + unsigned mip_level = i + 2; + bool mipmapped = video_shader_driver_mipmap_input(&mip_level); + GLenum min_filter = mipmapped ? base_mip_filt : base_filt; - glBindTexture(GL_TEXTURE_2D, texture); - - mip_level = i + 2; - mipmapped = video_shader_driver_mipmap_input(&mip_level); - min_filter = mipmapped ? base_mip_filt : base_filt; filter_type.index = i + 2; filter_type.smooth = &smooth; @@ -560,10 +545,7 @@ static void gl_create_fbo_texture(gl_t *gl, unsigned i, GLuint texture) wrap_enum = gl_wrap_type_to_enum(wrap.type); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag_filter); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, min_filter); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrap_enum); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrap_enum); + gl_bind_texture(texture, wrap_enum, mag_filter, min_filter); fp_fbo = gl->fbo_scale[i].fp_fbo; @@ -785,7 +767,7 @@ void gl2_renderchain_init( if (shader_info.num == 1 && !scale.valid) return; - if (!gl_check_capability(GL_CAPS_FBO)) + if (!gl->has_fbo) { RARCH_ERR("[GL]: Failed to locate FBO functions. Won't be able to use render-to-texture.\n"); return; @@ -884,7 +866,7 @@ static bool gl2_renderchain_init_hw_render( RARCH_LOG("[GL]: Max texture size: %d px, renderbuffer size: %d px.\n", max_fbo_size, max_renderbuffer_size); - if (!gl_check_capability(GL_CAPS_FBO)) + if (!gl->has_fbo) return false; RARCH_LOG("[GL]: Supports FBO (render-to-texture).\n"); @@ -1121,54 +1103,6 @@ static void *gl2_renderchain_new(void) return renderchain; } -#ifndef NO_GL_FF_VERTEX -static void gl2_renderchain_ff_vertex(const void *data) -{ - const struct video_coords *coords = (const struct video_coords*)data; - /* Fall back to fixed function-style if needed and possible. */ - glClientActiveTexture(GL_TEXTURE1); - glTexCoordPointer(2, GL_FLOAT, 0, coords->lut_tex_coord); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glClientActiveTexture(GL_TEXTURE0); - glVertexPointer(2, GL_FLOAT, 0, coords->vertex); - glEnableClientState(GL_VERTEX_ARRAY); - glColorPointer(4, GL_FLOAT, 0, coords->color); - glEnableClientState(GL_COLOR_ARRAY); - glTexCoordPointer(2, GL_FLOAT, 0, coords->tex_coord); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); -} -#endif - -#ifndef NO_GL_FF_MATRIX -static void gl2_renderchain_ff_matrix(const void *data) -{ - math_matrix_4x4 ident; - const math_matrix_4x4 *mat = (const math_matrix_4x4*)data; - - /* Fall back to fixed function-style if needed and possible. */ - glMatrixMode(GL_PROJECTION); - glLoadMatrixf(mat->data); - glMatrixMode(GL_MODELVIEW); - matrix_4x4_identity(ident); - glLoadMatrixf(ident.data); -} -#endif - -#ifndef NO_GL_FF_VERTEX -static void gl2_renderchain_disable_client_arrays(void) -{ - if (gl_query_core_context_in_use()) - return; - - glClientActiveTexture(GL_TEXTURE1); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); - glClientActiveTexture(GL_TEXTURE0); - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_COLOR_ARRAY); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); -} -#endif - #ifndef HAVE_OPENGLES static void gl2_renderchain_bind_vao(void *data) { @@ -1355,28 +1289,24 @@ static void gl2_renderchain_copy_frame( #endif } +#if !defined(HAVE_OPENGLES2) && !defined(HAVE_PSGL) static void gl2_renderchain_bind_pbo(unsigned idx) { -#ifndef HAVE_OPENGLES2 glBindBuffer(GL_PIXEL_PACK_BUFFER, (GLuint)idx); -#endif } static void gl2_renderchain_unbind_pbo(void) { -#ifndef HAVE_OPENGLES2 glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); -#endif } static void gl2_renderchain_init_pbo(unsigned size, const void *data) { -#ifndef HAVE_OPENGLES2 glBufferData(GL_PIXEL_PACK_BUFFER, size, (const GLvoid*)data, GL_STREAM_READ); -#endif } +#endif static void gl2_renderchain_readback(void *data, unsigned alignment, @@ -1459,6 +1389,8 @@ static void gl2_renderchain_init_textures_reference( } gl_renderchain_driver_t gl2_renderchain = { + NULL, /* set_coords */ + NULL, /* set_mvp */ gl2_renderchain_init_textures_reference, #ifdef HAVE_OPENGLES NULL, @@ -1468,9 +1400,15 @@ gl_renderchain_driver_t gl2_renderchain = { gl2_renderchain_fence_free, #endif gl2_renderchain_readback, +#if !defined(HAVE_OPENGLES2) && !defined(HAVE_PSGL) gl2_renderchain_init_pbo, gl2_renderchain_bind_pbo, gl2_renderchain_unbind_pbo, +#else + NULL, + NULL, + NULL, +#endif gl2_renderchain_copy_frame, gl2_renderchain_restore_default_state, #ifdef HAVE_OPENGLES @@ -1484,18 +1422,9 @@ gl_renderchain_driver_t gl2_renderchain = { gl2_renderchain_bind_vao, gl2_renderchain_unbind_vao, #endif -#ifdef NO_GL_FF_VERTEX NULL, NULL, -#else - gl2_renderchain_disable_client_arrays, - gl2_renderchain_ff_vertex, -#endif -#ifdef NO_GL_FF_MATRIX NULL, -#else - gl2_renderchain_ff_matrix, -#endif gl2_renderchain_bind_backbuffer, gl2_renderchain_deinit_fbo, gl2_renderchain_viewport_info, diff --git a/gfx/drivers_renderchain/null_renderchain.c b/gfx/drivers_renderchain/null_renderchain.c index 2bad39d720..a3ed173615 100644 --- a/gfx/drivers_renderchain/null_renderchain.c +++ b/gfx/drivers_renderchain/null_renderchain.c @@ -118,7 +118,8 @@ static void null_renderchain_convert_geometry( (void)final_viewport_data; } -d3d_renderchain_driver_t null_renderchain = { +d3d_renderchain_driver_t null_d3d_renderchain = { + NULL, null_renderchain_free, null_renderchain_new, NULL, diff --git a/gfx/drivers_shader/shader_gl_cg.c b/gfx/drivers_shader/shader_gl_cg.c index a25d46c4f6..e37b40352c 100644 --- a/gfx/drivers_shader/shader_gl_cg.c +++ b/gfx/drivers_shader/shader_gl_cg.c @@ -253,17 +253,18 @@ static void gl_cg_reset_attrib(void *data) cg->attribs_index = 0; } -static bool gl_cg_set_mvp(void *data, void *shader_data, const math_matrix_4x4 *mat) +static bool gl_cg_set_mvp(void *data, void *shader_data, + const void *mat_data) { cg_shader_data_t *cg = (cg_shader_data_t*)shader_data; - if (!cg || !cg->prg[cg->active_idx].mvp) + if (cg && cg->prg[cg->active_idx].mvp) { - gl_ff_matrix(mat); - return false; + const math_matrix_4x4 *mat = (const math_matrix_4x4*)mat_data; + cgGLSetMatrixParameterfc(cg->prg[cg->active_idx].mvp, mat->data); + return true; } - cgGLSetMatrixParameterfc(cg->prg[cg->active_idx].mvp, mat->data); - return true; + return false; } static bool gl_cg_set_coords(void *handle_data, void *shader_data, const struct video_coords *coords) @@ -292,12 +293,6 @@ static bool gl_cg_set_coords(void *handle_data, void *shader_data, const struct return true; } -static bool gl_cg_set_coords_fallback(void *handle_data, void *shader_data, const struct video_coords *coords) -{ - gl_ff_vertex(coords); - return true; -} - static void gl_cg_set_texture_info( cg_shader_data_t *cg, const struct cg_fbo_params *params, @@ -1295,7 +1290,6 @@ const shader_backend_t gl_cg_backend = { gl_cg_wrap_type, gl_cg_shader_scale, gl_cg_set_coords, - gl_cg_set_coords_fallback, gl_cg_set_mvp, gl_cg_get_prev_textures, gl_cg_get_feedback_pass, diff --git a/gfx/drivers_shader/shader_glsl.c b/gfx/drivers_shader/shader_glsl.c index 311011106d..e013c95acf 100644 --- a/gfx/drivers_shader/shader_glsl.c +++ b/gfx/drivers_shader/shader_glsl.c @@ -129,6 +129,7 @@ static const char *glsl_prefixes[] = { #include "../drivers/gl_shaders/modern_pipeline_xmb_ribbon.glsl.vert.h" #include "../drivers/gl_shaders/pipeline_xmb_ribbon.glsl.frag.h" #include "../drivers/gl_shaders/pipeline_bokeh.glsl.frag.h" +#include "../drivers/gl_shaders/pipeline_snowflake.glsl.frag.h" #endif typedef struct glsl_shader_data @@ -137,7 +138,10 @@ typedef struct glsl_shader_data GLint attribs_elems[32 * PREV_TEXTURES + 2 + 4 + GFX_MAX_SHADERS]; unsigned attribs_index; unsigned active_idx; + unsigned current_idx; GLuint lut_textures[GFX_MAX_TEXTURES]; + float current_mat_data[GFX_MAX_SHADERS]; + float* current_mat_data_pointer[GFX_MAX_SHADERS]; struct shader_uniforms uniforms[GFX_MAX_SHADERS]; struct cache_vbo vbo[GFX_MAX_SHADERS]; struct shader_program_glsl_data prg[GFX_MAX_SHADERS]; @@ -148,9 +152,6 @@ typedef struct glsl_shader_data static bool glsl_core; static unsigned glsl_major; static unsigned glsl_minor; -static float* current_mat_data_pointer[GFX_MAX_SHADERS]; -static float current_mat_data[GFX_MAX_SHADERS]; -static unsigned current_idx; static bool gl_glsl_add_lut( const struct video_shader *shader, @@ -735,8 +736,10 @@ static void gl_glsl_destroy_resources(glsl_shader_data_t *glsl) if (!glsl) return; - current_idx = 0; + glsl->current_idx = 0; + glUseProgram(0); + for (i = 0; i < GFX_MAX_SHADERS; i++) { if (glsl->prg[i].id == 0 || (i && glsl->prg[i].id == glsl->prg[0].id)) @@ -1093,6 +1096,21 @@ static void *gl_glsl_init(void *data, const char *path) &shader_prog_info); gl_glsl_find_uniforms(glsl, 0, glsl->prg[VIDEO_SHADER_MENU_5].id, &glsl->uniforms[VIDEO_SHADER_MENU_5]); + +#if defined(HAVE_OPENGLES) + shader_prog_info.vertex = stock_vertex_xmb_snow_modern; +#else + shader_prog_info.vertex = glsl_core ? stock_vertex_xmb_snow_modern : stock_vertex_xmb_snow_legacy; +#endif + shader_prog_info.fragment = stock_fragment_xmb_snowflake; + + gl_glsl_compile_program( + glsl, + VIDEO_SHADER_MENU_6, + &glsl->prg[VIDEO_SHADER_MENU_6], + &shader_prog_info); + gl_glsl_find_uniforms(glsl, 0, glsl->prg[VIDEO_SHADER_MENU_6].id, + &glsl->uniforms[VIDEO_SHADER_MENU_6]); #endif gl_glsl_reset_attrib(glsl); @@ -1432,30 +1450,29 @@ static void gl_glsl_set_params(void *data, void *shader_data, } } -static bool gl_glsl_set_mvp(void *data, void *shader_data, const math_matrix_4x4 *mat) +static bool gl_glsl_set_mvp(void *data, void *shader_data, const void *mat_data) { int loc; - glsl_shader_data_t *glsl = (glsl_shader_data_t*)shader_data; + glsl_shader_data_t *glsl = (glsl_shader_data_t*)shader_data; (void)data; if (!glsl || !glsl->shader->modern) - { - gl_ff_matrix(mat); return false; - } loc = glsl->uniforms[glsl->active_idx].mvp; if (loc >= 0) { - if ( (current_idx != glsl->active_idx) || - (mat->data != current_mat_data_pointer[glsl->active_idx]) || - (*mat->data != current_mat_data[glsl->active_idx])) + const math_matrix_4x4 *mat = (const math_matrix_4x4*)mat_data; + + if ( (glsl->current_idx != glsl->active_idx) || + (mat->data != glsl->current_mat_data_pointer[glsl->active_idx]) || + (*mat->data != glsl->current_mat_data[glsl->active_idx])) { glUniformMatrix4fv(loc, 1, GL_FALSE, mat->data); - current_idx = glsl->active_idx; - current_mat_data_pointer[glsl->active_idx] = (float*)mat->data; - current_mat_data[glsl->active_idx] = *mat->data; + glsl->current_idx = glsl->active_idx; + glsl->current_mat_data_pointer[glsl->active_idx] = (float*)mat->data; + glsl->current_mat_data[glsl->active_idx] = *mat->data; } } @@ -1550,13 +1567,6 @@ static bool gl_glsl_set_coords(void *handle_data, void *shader_data, return true; } -static bool gl_glsl_set_coords_fallback(void *handle_data, void *shader_data, - const struct video_coords *coords) -{ - gl_ff_vertex(coords); - return true; -} - static void gl_glsl_use(void *data, void *shader_data, unsigned idx, bool set_active) { GLuint id; @@ -1683,7 +1693,6 @@ const shader_backend_t gl_glsl_backend = { gl_glsl_wrap_type, gl_glsl_shader_scale, gl_glsl_set_coords, - gl_glsl_set_coords_fallback, gl_glsl_set_mvp, gl_glsl_get_prev_textures, gl_glsl_get_feedback_pass, diff --git a/gfx/drivers_shader/shader_hlsl.c b/gfx/drivers_shader/shader_hlsl.c index 61d44abdba..9ffedf5ef1 100644 --- a/gfx/drivers_shader/shader_hlsl.c +++ b/gfx/drivers_shader/shader_hlsl.c @@ -497,11 +497,12 @@ static void hlsl_shader_scale(void *data, unsigned idx, struct gfx_fbo_scale *sc scale->valid = false; } -static bool hlsl_set_mvp(void *data, void *shader_data, const math_matrix_4x4 *mat) +static bool hlsl_set_mvp(void *data, void *shader_data, const void *mat_data) { d3d_video_t *d3d = (d3d_video_t*)data; LPDIRECT3DDEVICE d3dr = (LPDIRECT3DDEVICE)d3d->dev; hlsl_shader_data_t *hlsl_data = (hlsl_shader_data_t*)shader_data; + const math_matrix_4x4 *mat = (const math_matrix_4x4*)mat_data; if(hlsl_data && hlsl_data->prg[hlsl_data->active_idx].mvp) { @@ -542,7 +543,6 @@ const shader_backend_t hlsl_backend = { NULL, /* hlsl_wrap_type */ hlsl_shader_scale, NULL, /* hlsl_set_coords */ - NULL, /* hlsl_set_coords_fallback */ hlsl_set_mvp, NULL, /* hlsl_get_prev_textures */ hlsl_get_feedback_pass, diff --git a/gfx/drivers_shader/shader_null.c b/gfx/drivers_shader/shader_null.c index 8a2ce6c77f..8ee92bff40 100644 --- a/gfx/drivers_shader/shader_null.c +++ b/gfx/drivers_shader/shader_null.c @@ -88,7 +88,6 @@ const shader_backend_t shader_null_backend = { NULL, NULL, NULL, - NULL, shader_null_get_prev_textures, NULL, NULL, diff --git a/gfx/font_driver.c b/gfx/font_driver.c index eb3bdf8375..1390412f68 100644 --- a/gfx/font_driver.c +++ b/gfx/font_driver.c @@ -452,13 +452,15 @@ void font_driver_bind_block(void *font_data, void *block) font->renderer->bind_block(font->renderer_data, block); } -void font_driver_flush(unsigned width, unsigned height, void *font_data) +void font_driver_flush(unsigned width, unsigned height, void *font_data, + video_frame_info_t *video_info) { font_data_t *font = (font_data_t*)(font_data ? font_data : video_font_driver); if (font && font->renderer && font->renderer->flush) - font->renderer->flush(width, height, font->renderer_data); + font->renderer->flush(width, height, font->renderer_data, video_info); } + int font_driver_get_message_width(void *font_data, const char *msg, unsigned len, float scale) { diff --git a/gfx/font_driver.h b/gfx/font_driver.h index 172f0b586e..eaa3ef6a85 100644 --- a/gfx/font_driver.h +++ b/gfx/font_driver.h @@ -113,7 +113,8 @@ typedef struct font_renderer const struct font_glyph *(*get_glyph)(void *data, uint32_t code); void (*bind_block)(void *data, void *block); - void (*flush)(unsigned width, unsigned height, void *data); + void (*flush)(unsigned width, unsigned height, void *data, + video_frame_info_t *video_info); int (*get_message_width)(void *data, const char *msg, unsigned msg_len_full, float scale); } font_renderer_t; @@ -154,7 +155,8 @@ void font_driver_bind_block(void *font_data, void *block); int font_driver_get_message_width(void *font_data, const char *msg, unsigned len, float scale); -void font_driver_flush(unsigned width, unsigned height, void *font_data); +void font_driver_flush(unsigned width, unsigned height, void *font_data, + video_frame_info_t *video_info); void font_driver_free(void *font_data); diff --git a/gfx/video_driver.c b/gfx/video_driver.c index d2483b8a94..d06252fb90 100644 --- a/gfx/video_driver.c +++ b/gfx/video_driver.c @@ -127,7 +127,7 @@ typedef struct video_pixel_scaler static void (*video_driver_cb_shader_use)(void *data, void *shader_data, unsigned index, bool set_active); static bool (*video_driver_cb_shader_set_mvp)(void *data, - void *shader_data, const math_matrix_4x4 *mat); + void *shader_data, const void *mat_data); bool (*video_driver_cb_has_focus)(void); /* Opaque handles to currently running window. @@ -417,12 +417,12 @@ static const d3d_renderchain_driver_t *renderchain_d3d_drivers[] = { #if defined(_WIN32) && defined(HAVE_D3D8) &d3d8_renderchain, #endif - &null_renderchain, + &null_d3d_renderchain, NULL }; static const gl_renderchain_driver_t *renderchain_gl_drivers[] = { -#if defined(HAVE_OPENGL) +#if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) &gl2_renderchain, #endif NULL @@ -497,10 +497,12 @@ const char* config_get_video_driver_options(void) return char_list_new_special(STRING_LIST_VIDEO_DRIVERS, NULL); } +#ifdef HAVE_VULKAN static bool hw_render_context_is_vulkan(enum retro_hw_context_type type) { return type == RETRO_HW_CONTEXT_VULKAN; } +#endif static bool hw_render_context_is_gl(enum retro_hw_context_type type) { @@ -1796,21 +1798,21 @@ bool video_driver_find_driver(void) current_video = NULL; +#if defined(HAVE_VULKAN) if (hwr && hw_render_context_is_vulkan(hwr->context_type)) { -#if defined(HAVE_VULKAN) RARCH_LOG("[Video]: Using HW render, Vulkan driver forced.\n"); current_video = &video_vulkan; -#endif } +#endif +#if defined(HAVE_OPENGL) if (hwr && hw_render_context_is_gl(hwr->context_type)) { -#if defined(HAVE_OPENGL) && defined(HAVE_FBO) RARCH_LOG("[Video]: Using HW render, OpenGL driver forced.\n"); current_video = &video_gl; -#endif } +#endif if (current_video) return true; @@ -2310,7 +2312,7 @@ void video_driver_frame(const void *data, unsigned width, snprintf(frames_text, sizeof(frames_text), - STRING_REP_UINT64, + "%" PRIu64, (uint64_t)video_driver_frame_count); strlcat(video_driver_window_title, @@ -2328,7 +2330,7 @@ void video_driver_frame(const void *data, unsigned width, snprintf( video_info.fps_text, sizeof(video_info.fps_text), - "FPS: %6.1f || %s: " STRING_REP_UINT64, + "FPS: %6.1f || %s: %" PRIu64, last_fps, msg_hash_to_str(MSG_FRAMES), (uint64_t)video_driver_frame_count); @@ -2407,8 +2409,9 @@ void video_driver_frame(const void *data, unsigned width, video_driver_frame_count++; + /* Display the FPS, with a higher priority. */ if (video_info.fps_show) - runloop_msg_queue_push(video_info.fps_text, 1, 1, false); + runloop_msg_queue_push(video_info.fps_text, 2, 1, true); } void video_driver_display_type_set(enum rarch_display_type type) @@ -2473,6 +2476,17 @@ static void video_shader_driver_use_null(void *data, (void)set_active; } +static bool video_driver_cb_set_coords(void *handle_data, + void *shader_data, const struct video_coords *coords) +{ + video_shader_ctx_coords_t ctx_coords; + ctx_coords.handle_data = handle_data; + ctx_coords.data = coords; + + video_driver_set_coords(&ctx_coords); + return true; +} + void video_driver_build_info(video_frame_info_t *video_info) { bool is_perfcnt_enable = false; @@ -2579,7 +2593,11 @@ void video_driver_build_info(video_frame_info_t *video_info) video_info->cb_set_resize = current_video_context.set_resize; video_info->cb_shader_use = video_driver_cb_shader_use; - video_info->cb_shader_set_mvp = video_driver_cb_shader_set_mvp; + video_info->cb_set_mvp = video_driver_cb_shader_set_mvp; + +#if 0 + video_info->cb_set_coords = video_driver_cb_set_coords; +#endif #ifdef HAVE_THREADS video_driver_threaded_unlock(is_threaded); @@ -3195,39 +3213,16 @@ static enum gfx_wrap_type video_shader_driver_wrap_type_null( return RARCH_WRAP_BORDER; } -static bool video_shader_driver_set_mvp_null(void *data, - void *shader_data, const math_matrix_4x4 *mat) +static bool video_driver_cb_set_mvp(void *data, + void *shader_data, const void *mat_data) { - return false; -} + video_shader_ctx_mvp_t mvp; + mvp.data = data; + mvp.matrix = mat_data; -#ifdef HAVE_OPENGL -#ifndef NO_GL_FF_MATRIX -static bool video_shader_driver_set_mvp_null_gl(void *data, - void *shader_data, const math_matrix_4x4 *mat) -{ - gl_ff_matrix(mat); - return false; + video_driver_set_mvp(&mvp); + return true; } -#endif -#endif - -static bool video_shader_driver_set_coords_null(void *handle_data, - void *shader_data, const struct video_coords *coords) -{ - return false; -} - -#ifdef HAVE_OPENGL -#ifndef NO_GL_FF_VERTEX -static bool video_shader_driver_set_coords_null_gl(void *handle_data, - void *shader_data, const struct video_coords *coords) -{ - gl_ff_vertex(coords); - return false; -} -#endif -#endif static struct video_shader *video_shader_driver_get_current_shader_null(void *data) { @@ -3286,32 +3281,12 @@ static void video_shader_driver_reset_to_defaults(void) video_driver_cb_shader_set_mvp = current_shader->set_mvp; else { -#ifdef HAVE_OPENGL -#ifndef NO_GL_FF_MATRIX - if (string_is_equal_fast(video_driver_get_ident(), "gl", 2)) - { - current_shader->set_mvp = video_shader_driver_set_mvp_null_gl; - video_driver_cb_shader_set_mvp = video_shader_driver_set_mvp_null_gl; - } - else -#endif -#endif - { - current_shader->set_mvp = video_shader_driver_set_mvp_null; - video_driver_cb_shader_set_mvp = video_shader_driver_set_mvp_null; - } + current_shader->set_mvp = video_driver_cb_set_mvp; + video_driver_cb_shader_set_mvp = video_driver_cb_set_mvp; } if (!current_shader->set_coords) - { -#ifdef HAVE_OPENGL -#ifndef NO_GL_FF_VERTEX - if (string_is_equal_fast(video_driver_get_ident(), "gl", 2)) - current_shader->set_coords = video_shader_driver_set_coords_null_gl; - else -#endif -#endif - current_shader->set_coords = video_shader_driver_set_coords_null; - } + current_shader->set_coords = video_driver_cb_set_coords; + if (current_shader->use) video_driver_cb_shader_use = current_shader->use; else @@ -3400,14 +3375,19 @@ bool video_shader_driver_info(video_shader_ctx_info_t *shader_info) bool video_shader_driver_filter_type(video_shader_ctx_filter_t *filter) { - return (filter) ? current_shader->filter_type(shader_data, - filter->index, filter->smooth) : false; + if (filter) + return current_shader->filter_type(shader_data, + filter->index, filter->smooth); + return false; } -bool video_shader_driver_compile_program(struct shader_program_info *program_info) +bool video_shader_driver_compile_program( + struct shader_program_info *program_info) { - return (program_info) ? current_shader->compile_program(program_info->data, - program_info->idx, NULL, program_info) : false; + if (program_info) + return current_shader->compile_program(program_info->data, + program_info->idx, NULL, program_info); + return false; } bool video_shader_driver_wrap_type(video_shader_ctx_wrap_t *wrap) @@ -3416,8 +3396,34 @@ bool video_shader_driver_wrap_type(video_shader_ctx_wrap_t *wrap) return true; } -bool renderchain_d3d_init_first(const d3d_renderchain_driver_t **renderchain_driver, - void **renderchain_handle) +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, 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, 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, shader_data, mvp->matrix); + else + { + if (video_driver_poke && video_driver_poke->set_mvp) + video_driver_poke->set_mvp(mvp->data, shader_data, mvp->matrix); + } +} + +bool renderchain_d3d_init_first( + const d3d_renderchain_driver_t **renderchain_driver, + void **renderchain_handle) { unsigned i; diff --git a/gfx/video_driver.h b/gfx/video_driver.h index de143d1fbf..6836ede817 100644 --- a/gfx/video_driver.h +++ b/gfx/video_driver.h @@ -56,6 +56,7 @@ #define VIDEO_SHADER_MENU_3 (GFX_MAX_SHADERS - 4) #define VIDEO_SHADER_MENU_4 (GFX_MAX_SHADERS - 5) #define VIDEO_SHADER_MENU_5 (GFX_MAX_SHADERS - 6) +#define VIDEO_SHADER_MENU_6 (GFX_MAX_SHADERS - 7) #endif @@ -233,10 +234,8 @@ typedef struct shader_backend unsigned index, struct gfx_fbo_scale *scale); bool (*set_coords)(void *handle_data, void *shader_data, const struct video_coords *coords); - bool (*set_coords_fallback)(void *handle_data, - void *shader_data, const struct video_coords *coords); bool (*set_mvp)(void *data, void *shader_data, - const math_matrix_4x4 *mat); + 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); @@ -301,7 +300,7 @@ typedef struct video_shader_ctx_info typedef struct video_shader_ctx_mvp { void *data; - const math_matrix_4x4 *matrix; + const void *matrix; } video_shader_ctx_mvp_t; typedef struct video_shader_ctx_filter @@ -468,8 +467,12 @@ typedef struct video_frame_info bool (*cb_set_resize)(void*, unsigned, unsigned); void (*cb_shader_use)(void *data, void *shader_data, unsigned index, bool set_active); - bool (*cb_shader_set_mvp)(void *data, void *shader_data, - const math_matrix_4x4 *mat); +#if 0 + bool (*cb_set_coords)(void *handle_data, + void *shader_data, const struct video_coords *coords); +#endif + bool (*cb_set_mvp)(void *data, void *shader_data, + const void *mat_data); void *context_data; void *shader_data; @@ -671,6 +674,10 @@ struct aspect_ratio_elem typedef struct video_poke_interface { + 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); @@ -797,6 +804,9 @@ typedef struct video_driver typedef struct d3d_renderchain_driver { + void (*set_mvp)(void *chain_data, + void *data, unsigned vp_width, + unsigned vp_height, unsigned rotation); void (*chain_free)(void *data); void *(*chain_new)(void); bool (*reinit)(void *data, const void *info_data); @@ -827,6 +837,10 @@ typedef struct d3d_renderchain_driver typedef struct gl_renderchain_driver { + 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); void (*init_texture_reference)( void *data, unsigned i, unsigned internal_fmt, unsigned texture_fmt, @@ -1273,17 +1287,13 @@ bool video_shader_driver_get_feedback_pass(unsigned *data); bool video_shader_driver_mipmap_input(unsigned *index); -#define video_shader_driver_set_coords(coords) \ - if (!current_shader->set_coords(coords.handle_data, shader_data, (const struct video_coords*)coords.data) && current_shader->set_coords_fallback) \ - current_shader->set_coords_fallback(coords.handle_data, shader_data, (const struct video_coords*)coords.data) +void video_driver_set_coords(video_shader_ctx_coords_t *coords); bool video_shader_driver_scale(video_shader_ctx_scale_t *scaler); bool video_shader_driver_info(video_shader_ctx_info_t *shader_info); -#define video_shader_driver_set_mvp(mvp) \ - if (mvp.matrix) \ - current_shader->set_mvp(mvp.data, shader_data, mvp.matrix) \ +void video_driver_set_mvp(video_shader_ctx_mvp_t *mvp); bool video_shader_driver_filter_type(video_shader_ctx_filter_t *filter); @@ -1362,7 +1372,7 @@ extern const shader_backend_t shader_null_backend; extern d3d_renderchain_driver_t d3d8_renderchain; extern d3d_renderchain_driver_t cg_d3d9_renderchain; extern d3d_renderchain_driver_t hlsl_d3d9_renderchain; -extern d3d_renderchain_driver_t null_renderchain; +extern d3d_renderchain_driver_t null_d3d_renderchain; extern gl_renderchain_driver_t gl2_renderchain; diff --git a/gfx/video_thread_wrapper.c b/gfx/video_thread_wrapper.c index 3a35893573..59739117f4 100644 --- a/gfx/video_thread_wrapper.c +++ b/gfx/video_thread_wrapper.c @@ -1257,6 +1257,8 @@ static struct video_shader *thread_get_current_shader(void *data) } static const video_poke_interface_t thread_poke = { + 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 9b4a08f305..2bbb31a47b 100644 --- a/griffin/griffin.c +++ b/griffin/griffin.c @@ -151,6 +151,7 @@ ACHIEVEMENTS #include "../libretro-common/formats/json/jsonsax.c" #include "../network/net_http_special.c" #include "../cheevos/cheevos.c" +#include "../cheevos/badges.c" #include "../cheevos/var.c" #include "../cheevos/cond.c" #endif @@ -821,6 +822,10 @@ FILE #include "../list_special.c" #include "../libretro-common/string/stdstring.c" #include "../libretro-common/file/nbio/nbio_stdio.c" +#include "../libretro-common/file/nbio/nbio_linux.c" +#include "../libretro-common/file/nbio/nbio_unixmmap.c" +#include "../libretro-common/file/nbio/nbio_windowsmmap.c" +#include "../libretro-common/file/nbio/nbio_intf.c" /*============================================================ MESSAGE diff --git a/input/connect/connect_nesusb.c b/input/connect/connect_nesusb.c index 3cfadcdca2..24c5f0532e 100644 --- a/input/connect/connect_nesusb.c +++ b/input/connect/connect_nesusb.c @@ -27,7 +27,7 @@ struct hidpad_nesusb_data struct pad_connection* connection; uint8_t data[64]; uint32_t slot; - uint64_t buttons; + uint32_t buttons; }; static void* hidpad_nesusb_init(void *data, uint32_t slot, send_control_t ptr) @@ -59,12 +59,14 @@ static void hidpad_nesusb_deinit(void *data) free(device); } -static uint64_t hidpad_nesusb_get_buttons(void *data) +static void hidpad_nesusb_get_buttons(void *data, retro_bits_t* state) { - struct hidpad_nesusb_data *device = (struct hidpad_nesusb_data*)data; - if (!device) - return 0; - return device->buttons; + struct hidpad_nesusb_data *device = (struct hidpad_nesusb_data*)data; + if (device) { + RARCH_INPUT_STATE_COPY16_PTR(state, device->buttons); + } else { + RARCH_INPUT_STATE_CLEAR_PTR(state); + } } static int16_t hidpad_nesusb_get_axis(void *data, unsigned axis) @@ -86,10 +88,10 @@ static void hidpad_nesusb_packet_handler(void *data, uint8_t *packet, uint16_t s uint32_t i, pressed_keys; static const uint32_t button_mapping[17] = { - NO_BTN, - NO_BTN, - NO_BTN, - NO_BTN, + RETRO_DEVICE_ID_JOYPAD_L2, + RETRO_DEVICE_ID_JOYPAD_R2, + RETRO_DEVICE_ID_JOYPAD_L, + RETRO_DEVICE_ID_JOYPAD_R, RETRO_DEVICE_ID_JOYPAD_SELECT, RETRO_DEVICE_ID_JOYPAD_START, NO_BTN, @@ -100,9 +102,8 @@ static void hidpad_nesusb_packet_handler(void *data, uint8_t *packet, uint16_t s NO_BTN, RETRO_DEVICE_ID_JOYPAD_B, RETRO_DEVICE_ID_JOYPAD_A, - NO_BTN, - NO_BTN, - 16, /* HOME BUTTON when pressing SELECT+START */ + RETRO_DEVICE_ID_JOYPAD_Y, + RETRO_DEVICE_ID_JOYPAD_X, }; struct hidpad_nesusb_data *device = (struct hidpad_nesusb_data*)data; @@ -113,12 +114,11 @@ static void hidpad_nesusb_packet_handler(void *data, uint8_t *packet, uint16_t s device->buttons = 0; - pressed_keys = device->data[7] | (device->data[6] << 8) | - (((device->data[7] & 0x30) == 0x30) ? (1 << 16) : 0); /* SELECT+START=HOME */ + pressed_keys = device->data[7] | (device->data[6] << 8); - for (i = 0; i < 17; i ++) + for (i = 0; i < 16; i ++) if (button_mapping[i] != NO_BTN) - device->buttons |= (pressed_keys & (1 << i)) ? (UINT64_C(1) << button_mapping[i]) : 0; + device->buttons |= (pressed_keys & (1 << i)) ? (1 << button_mapping[i]) : 0; } static void hidpad_nesusb_set_rumble(void *data, diff --git a/input/connect/connect_ps2adapter.c b/input/connect/connect_ps2adapter.c index 10c922b66c..78c3cf9c92 100644 --- a/input/connect/connect_ps2adapter.c +++ b/input/connect/connect_ps2adapter.c @@ -27,7 +27,7 @@ struct hidpad_ps2adapter_data struct pad_connection* connection; uint8_t data[64]; uint32_t slot; - uint64_t buttons; + uint32_t buttons; }; static void* hidpad_ps2adapter_init(void *data, uint32_t slot, send_control_t ptr) @@ -59,12 +59,14 @@ static void hidpad_ps2adapter_deinit(void *data) free(device); } -static uint64_t hidpad_ps2adapter_get_buttons(void *data) +static void hidpad_ps2adapter_get_buttons(void *data, retro_bits_t *state) { - struct hidpad_ps2adapter_data *device = (struct hidpad_ps2adapter_data*)data; - if (!device) - return 0; - return device->buttons; + struct hidpad_ps2adapter_data *device = (struct hidpad_ps2adapter_data*)data; + if ( device ) { + RARCH_INPUT_STATE_COPY16_PTR(state, device->buttons); + } else { + RARCH_INPUT_STATE_CLEAR_PTR(state); + } } static int16_t hidpad_ps2adapter_get_axis(void *data, unsigned axis) @@ -74,7 +76,7 @@ static int16_t hidpad_ps2adapter_get_axis(void *data, unsigned axis) if (!device || axis >= 4) return 0; - + switch (axis) { case 0: @@ -90,7 +92,7 @@ static int16_t hidpad_ps2adapter_get_axis(void *data, unsigned axis) val = device->data[2]; break; } - + val = (val << 8) - 0x8000; return (abs(val) > 0x1000) ? val : 0; @@ -133,7 +135,7 @@ static void hidpad_ps2adapter_packet_handler(void *data, uint8_t *packet, uint16 /* Check if the data corresponds to the first controller, exit otherwise */ if (packet[1] != 1) return; - + memcpy(device->data, packet, size); device->buttons = 0; @@ -143,7 +145,7 @@ static void hidpad_ps2adapter_packet_handler(void *data, uint8_t *packet, uint16 for (i = 0; i < 16; i ++) if (button_mapping[i] != NO_BTN) device->buttons |= (pressed_keys & (1 << i)) ? (UINT64_C(1) << button_mapping[i]) : 0; - + /* Now process the hat values as if they were pad buttons */ hat_value = PS2_H_GET(device->data[6]); device->buttons |= PS2_H_LEFT(hat_value) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_LEFT) : 0; diff --git a/input/connect/connect_ps3.c b/input/connect/connect_ps3.c index 37ca54b8d2..422a1b02a2 100644 --- a/input/connect/connect_ps3.c +++ b/input/connect/connect_ps3.c @@ -20,6 +20,7 @@ #include #include "joypad_connection.h" +#include "../input_defines.h" struct hidpad_ps3_data { @@ -27,7 +28,7 @@ struct hidpad_ps3_data send_control_t send_control; uint8_t data[512]; uint32_t slot; - uint64_t buttons; + uint32_t buttons; bool have_led; uint16_t motors[2]; }; @@ -104,12 +105,23 @@ static void hidpad_ps3_deinit(void *data) free(device); } -static uint64_t hidpad_ps3_get_buttons(void *data) +static void hidpad_ps3_get_buttons(void *data, retro_bits_t *state) { - struct hidpad_ps3_data *device = (struct hidpad_ps3_data*)data; - if (!device) - return 0; - return device->buttons; + struct hidpad_ps3_data *device = (struct hidpad_ps3_data*)data; + if ( device ) + { + /*copy first 16 bits - standard RetroPad controls*/ + RARCH_INPUT_STATE_COPY16_PTR(state, device->buttons); + + /*PS button?*/ + if ( device->buttons & 0x10000 ) { + RARCH_INPUT_STATE_BIT_SET_PTR( state, RARCH_MENU_TOGGLE ); + } + } + else + { + RARCH_INPUT_STATE_CLEAR_PTR( state ); + } } static int16_t hidpad_ps3_get_axis(void *data, unsigned axis) diff --git a/input/connect/connect_ps4.c b/input/connect/connect_ps4.c index 198107842f..47a9cdabe6 100644 --- a/input/connect/connect_ps4.c +++ b/input/connect/connect_ps4.c @@ -184,35 +184,67 @@ static bool hidpad_ps4_check_dpad(struct ps4 *rpt, unsigned id) return false; } -static uint64_t hidpad_ps4_get_buttons(void *data) +static void hidpad_ps4_get_buttons(void *data, retro_bits_t* state) { - uint64_t buttonstate = 0; struct hidpad_ps4_data *device = (struct hidpad_ps4_data*)data; struct ps4 *rpt = device ? (struct ps4*)&device->data : NULL; if (!device || !rpt) - return 0; + return; - buttonstate |= (rpt->btn.r3 ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_R3) : 0); - buttonstate |= (rpt->btn.l3 ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_L3) : 0); - buttonstate |= (rpt->btn.options ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_START) : 0); - buttonstate |= (rpt->btn.share ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_SELECT) : 0); - buttonstate |= (rpt->btn.r2 ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_R2) : 0); - buttonstate |= (rpt->btn.l2 ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_L2) : 0); - buttonstate |= (rpt->btn.r1 ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_R) : 0); - buttonstate |= (rpt->btn.l1 ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_L) : 0); + RARCH_INPUT_STATE_CLEAR_PTR( state ); - buttonstate |= (rpt->btn.triangle ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_X) : 0); - buttonstate |= (rpt->btn.circle ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_A) : 0); - buttonstate |= (rpt->btn.cross ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_B) : 0); - buttonstate |= (rpt->btn.square ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_Y) : 0); - buttonstate |= ((hidpad_ps4_check_dpad(rpt, RETRO_DEVICE_ID_JOYPAD_LEFT)) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_LEFT) : 0); - buttonstate |= ((hidpad_ps4_check_dpad(rpt, RETRO_DEVICE_ID_JOYPAD_DOWN)) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_DOWN) : 0); - buttonstate |= ((hidpad_ps4_check_dpad(rpt, RETRO_DEVICE_ID_JOYPAD_RIGHT)) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_RIGHT) : 0); - buttonstate |= ((hidpad_ps4_check_dpad(rpt, RETRO_DEVICE_ID_JOYPAD_UP)) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_UP) : 0); - buttonstate |= (rpt->btn.ps ? (UINT64_C(1) << RARCH_MENU_TOGGLE) : 0); - - return buttonstate; + if ( rpt->btn.r3 ) { + RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_R3 ); + } + if ( rpt->btn.l3 ) { + RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_L3 ); + } + if ( rpt->btn.options ) { + RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_START ); + } + if ( rpt->btn.share ) { + RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_SELECT ); + } + if ( rpt->btn.r2 ) { + RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_R2 ); + } + if ( rpt->btn.l2 ) { + RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_L2 ); + } + if ( rpt->btn.r1 ) { + RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_R ); + } + if ( rpt->btn.l1 ) { + RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_L ); + } + if ( rpt->btn.triangle ) { + RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_X ); + } + if ( rpt->btn.circle ) { + RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_A ); + } + if ( rpt->btn.cross ) { + RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_B ); + } + if ( rpt->btn.square ) { + RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_Y ); + } + if ( (hidpad_ps4_check_dpad(rpt, RETRO_DEVICE_ID_JOYPAD_LEFT)) ) { + RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_LEFT ); + } + if ( (hidpad_ps4_check_dpad(rpt, RETRO_DEVICE_ID_JOYPAD_DOWN)) ) { + RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_DOWN ); + } + if ( (hidpad_ps4_check_dpad(rpt, RETRO_DEVICE_ID_JOYPAD_RIGHT)) ) { + RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_RIGHT ); + } + if ( (hidpad_ps4_check_dpad(rpt, RETRO_DEVICE_ID_JOYPAD_UP)) ) { + RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_UP ); + } + if ( rpt->btn.ps ) { + RARCH_INPUT_STATE_BIT_SET_PTR( state, RARCH_MENU_TOGGLE ); + } } static int16_t hidpad_ps4_get_axis(void *data, unsigned axis) diff --git a/input/connect/connect_psxadapter.c b/input/connect/connect_psxadapter.c index 2985d44183..6f77e77f72 100644 --- a/input/connect/connect_psxadapter.c +++ b/input/connect/connect_psxadapter.c @@ -25,9 +25,9 @@ struct hidpad_psxadapter_data { struct pad_connection* connection; - uint8_t data[8]; + uint8_t data[64]; uint32_t slot; - uint64_t buttons; + uint32_t buttons; }; static void* hidpad_psxadapter_init(void *data, uint32_t slot, send_control_t ptr) @@ -59,12 +59,14 @@ static void hidpad_psxadapter_deinit(void *data) free(device); } -static uint64_t hidpad_psxadapter_get_buttons(void *data) +static void hidpad_psxadapter_get_buttons(void *data, retro_bits_t *state) { - struct hidpad_psxadapter_data *device = (struct hidpad_psxadapter_data*)data; - if (!device) - return 0; - return device->buttons; + struct hidpad_psxadapter_data *device = (struct hidpad_psxadapter_data*)data; + if ( device ) { + RARCH_INPUT_STATE_COPY16_PTR(state, device->buttons); + } else { + RARCH_INPUT_STATE_CLEAR_PTR(state); + } } static int16_t hidpad_psxadapter_get_axis(void *data, unsigned axis) @@ -75,7 +77,7 @@ static int16_t hidpad_psxadapter_get_axis(void *data, unsigned axis) if (!device || axis >= 4 || (device->data[2]==0x7F) ) /* digital mode detection */ return 0; - + switch (axis) { case 0: @@ -91,7 +93,7 @@ static int16_t hidpad_psxadapter_get_axis(void *data, unsigned axis) val = device->data[2]; break; } - + val = (val << 8) - 0x8000; return (abs(val) > 0x1000) ? val : 0; /* hard coded deadzone */ @@ -107,7 +109,7 @@ static void hidpad_psxadapter_packet_handler(void *data, uint8_t *packet, uint16 { uint32_t i, pressed_keys; int16_t hat_value; - static const uint32_t button_mapping[17] = + static const uint32_t button_mapping[16] = { RETRO_DEVICE_ID_JOYPAD_L2, RETRO_DEVICE_ID_JOYPAD_R2, @@ -125,7 +127,6 @@ static void hidpad_psxadapter_packet_handler(void *data, uint8_t *packet, uint16 RETRO_DEVICE_ID_JOYPAD_A, RETRO_DEVICE_ID_JOYPAD_B, RETRO_DEVICE_ID_JOYPAD_Y, - 16/* HOME BUTTON when pressing SELECT+START */ }; struct hidpad_psxadapter_data *device = (struct hidpad_psxadapter_data*)data; @@ -136,29 +137,28 @@ static void hidpad_psxadapter_packet_handler(void *data, uint8_t *packet, uint16 device->buttons = 0; - pressed_keys = device->data[7] | (device->data[6] << 8) | - (((device->data[7] & 0x30) == 0x30) ? (1 << 16) : 0); /* SELECT+START = MENU TOGGLE */ + pressed_keys = device->data[7] | (device->data[6] << 8); - for (i = 0; i < 17; i ++) + for (i = 0; i < 16; i ++) if (button_mapping[i] != NO_BTN) - device->buttons |= (pressed_keys & (1 << i)) ? (UINT64_C(1) << button_mapping[i]) : 0; + device->buttons |= (pressed_keys & (1 << i)) ? (1 << button_mapping[i]) : 0; if (device->data[2]==0x7F) /* digital mode detection */ { /* We're in digital mode, process the dpad values */ - device->buttons |= (device->data[4]==0x00) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_LEFT) : 0; - device->buttons |= (device->data[4]==0xFF) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_RIGHT) : 0; - device->buttons |= (device->data[5]==0x00) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_UP) : 0; - device->buttons |= (device->data[5]==0xFF) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_DOWN) : 0; + device->buttons |= (device->data[4]==0x00) ? (1 << RETRO_DEVICE_ID_JOYPAD_LEFT) : 0; + device->buttons |= (device->data[4]==0xFF) ? (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT) : 0; + device->buttons |= (device->data[5]==0x00) ? (1 << RETRO_DEVICE_ID_JOYPAD_UP) : 0; + device->buttons |= (device->data[5]==0xFF) ? (1 << RETRO_DEVICE_ID_JOYPAD_DOWN) : 0; } else { /* We're in analog mode, process the hat values as if they were pad buttons */ hat_value = PSX_H_GET(device->data[6]); - device->buttons |= PSX_H_LEFT(hat_value) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_LEFT) : 0; - device->buttons |= PSX_H_RIGHT(hat_value) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_RIGHT) : 0; - device->buttons |= PSX_H_UP(hat_value) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_UP) : 0; - device->buttons |= PSX_H_DOWN(hat_value) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_DOWN) : 0; + device->buttons |= PSX_H_LEFT(hat_value) ? (1 << RETRO_DEVICE_ID_JOYPAD_LEFT) : 0; + device->buttons |= PSX_H_RIGHT(hat_value) ? (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT) : 0; + device->buttons |= PSX_H_UP(hat_value) ? (1 << RETRO_DEVICE_ID_JOYPAD_UP) : 0; + device->buttons |= PSX_H_DOWN(hat_value) ? (1 << RETRO_DEVICE_ID_JOYPAD_DOWN) : 0; } } diff --git a/input/connect/connect_snesusb.c b/input/connect/connect_snesusb.c index d5cc9e2811..bbc9fb43a4 100644 --- a/input/connect/connect_snesusb.c +++ b/input/connect/connect_snesusb.c @@ -28,7 +28,7 @@ struct hidpad_snesusb_data struct pad_connection* connection; uint8_t data[64]; uint32_t slot; - uint64_t buttons; + uint32_t buttons; }; static void* hidpad_snesusb_init(void *data, uint32_t slot, send_control_t ptr) @@ -60,12 +60,14 @@ static void hidpad_snesusb_deinit(void *data) free(device); } -static uint64_t hidpad_snesusb_get_buttons(void *data) +static void hidpad_snesusb_get_buttons(void *data, retro_bits_t *state) { - struct hidpad_snesusb_data *device = (struct hidpad_snesusb_data*)data; - if (!device) - return 0; - return device->buttons; + struct hidpad_snesusb_data *device = (struct hidpad_snesusb_data*)data; + if ( device ) { + RARCH_INPUT_STATE_COPY16_PTR(state, device->buttons); + } else { + RARCH_INPUT_STATE_CLEAR_PTR(state); + } } static int16_t hidpad_snesusb_get_axis(void *data, unsigned axis) @@ -85,7 +87,7 @@ static int16_t hidpad_snesusb_get_axis(void *data, unsigned axis) static void hidpad_snesusb_packet_handler(void *data, uint8_t *packet, uint16_t size) { uint32_t i, pressed_keys; - static const uint32_t button_mapping[17] = + static const uint32_t button_mapping[16] = { RETRO_DEVICE_ID_JOYPAD_L, RETRO_DEVICE_ID_JOYPAD_R, @@ -102,8 +104,7 @@ static void hidpad_snesusb_packet_handler(void *data, uint8_t *packet, uint16_t RETRO_DEVICE_ID_JOYPAD_X, RETRO_DEVICE_ID_JOYPAD_A, RETRO_DEVICE_ID_JOYPAD_B, - RETRO_DEVICE_ID_JOYPAD_Y, - 16, /* HOME BUTTON when pressing SELECT+START */ + RETRO_DEVICE_ID_JOYPAD_Y }; struct hidpad_snesusb_data *device = (struct hidpad_snesusb_data*)data; @@ -114,12 +115,11 @@ static void hidpad_snesusb_packet_handler(void *data, uint8_t *packet, uint16_t device->buttons = 0; - pressed_keys = device->data[7] | (device->data[6] << 8) | - (((device->data[7] & 0x30) == 0x30) ? (1 << 16) : 0); /* SELECT+START = MENU TOGGLE */ + pressed_keys = device->data[7] | (device->data[6] << 8); - for (i = 0; i < 17; i ++) + for (i = 0; i < 16; i ++) if (button_mapping[i] != NO_BTN) - device->buttons |= (pressed_keys & (1 << i)) ? (UINT64_C(1) << button_mapping[i]) : 0; + device->buttons |= (pressed_keys & (1 << i)) ? (1 << button_mapping[i]) : 0; } static void hidpad_snesusb_set_rumble(void *data, diff --git a/input/connect/connect_wii.c b/input/connect/connect_wii.c index dcf342a5f1..ec4ceaaa72 100644 --- a/input/connect/connect_wii.c +++ b/input/connect/connect_wii.c @@ -25,6 +25,7 @@ #include #include "joypad_connection.h" +#include "../input_defines.h" /* wiimote state flags*/ #define WIIMOTE_STATE_DEV_FOUND 0x0001 @@ -198,7 +199,7 @@ static int wiimote_send(struct connect_wii_wiimote_t* wm, return 1; } -/* +/* * Request the wiimote controller status. * * Controller status includes: battery level, LED status, expansions. @@ -426,13 +427,13 @@ static int wiimote_handshake(struct connect_wii_wiimote_t* wm, switch (wm->handshake_state) { case 0: - /* no ha habido nunca handshake, debemos forzar un + /* no ha habido nunca handshake, debemos forzar un * mensaje de staus para ver que pasa. */ WIIMOTE_ENABLE_STATE(wm, WIIMOTE_STATE_HANDSHAKE); wiimote_set_leds(wm, WIIMOTE_LED_NONE); - /* Request the status of the Wiimote to + /* Request the status of the Wiimote to * see if there is an expansion */ wiimote_status(wm); @@ -440,16 +441,16 @@ static int wiimote_handshake(struct connect_wii_wiimote_t* wm, return 0; case 1: { - /* estamos haciendo handshake o bien se necesita iniciar un + /* estamos haciendo handshake o bien se necesita iniciar un * nuevo handshake ya que se inserta(quita una expansion. */ int attachment = 0; if(event != WM_RPT_CTRL_STATUS) return 0; - /* Is an attachment connected to + /* Is an attachment connected to * the expansion port? */ - if ((data[2] & WM_CTRL_STATUS_BYTE1_ATTACHMENT) == + if ((data[2] & WM_CTRL_STATUS_BYTE1_ATTACHMENT) == WM_CTRL_STATUS_BYTE1_ATTACHMENT) attachment = 1; @@ -473,19 +474,19 @@ static int wiimote_handshake(struct connect_wii_wiimote_t* wm, /* Rehandshake. */ WIIMOTE_DISABLE_STATE(wm, WIIMOTE_STATE_HANDSHAKE_COMPLETE); - /* forzamos un handshake por si venimos + /* forzamos un handshake por si venimos * de un hanshake completo. */ WIIMOTE_ENABLE_STATE(wm, WIIMOTE_STATE_HANDSHAKE); } - /*Old way. initialize the extension was by writing the + /*Old way. initialize the extension was by writing the * single encryption byte 0x00 to 0x(4)A40040. */ #if 0 buf = 0x00; wiimote_write_data(wm, WM_EXP_MEM_ENABLE, &buf, 1); #endif - /* NEW WAY 0x55 to 0x(4)A400F0, then writing + /* NEW WAY 0x55 to 0x(4)A400F0, then writing * 0x00 to 0x(4)A400FB. (support clones) */ buf = 0x55; wiimote_write_data(wm, 0x04A400F0, &buf, 1); @@ -515,7 +516,7 @@ static int wiimote_handshake(struct connect_wii_wiimote_t* wm, printf("rehandshake\n"); #endif WIIMOTE_DISABLE_STATE(wm, WIIMOTE_STATE_HANDSHAKE_COMPLETE); - /* forzamos un handshake por si venimos + /* forzamos un handshake por si venimos * de un hanshake completo. */ WIIMOTE_ENABLE_STATE(wm, WIIMOTE_STATE_HANDSHAKE); } @@ -671,12 +672,15 @@ static int16_t hidpad_wii_get_axis(void *data, unsigned axis) return 0; } -static uint64_t hidpad_wii_get_buttons(void *data) +static void hidpad_wii_get_buttons(void *data, retro_bits_t *state) { - struct connect_wii_wiimote_t* device = (struct connect_wii_wiimote_t*)data; - if (!device) - return 0; - return device->btns | (device->exp.cc.classic.btns << 16); + struct connect_wii_wiimote_t* device = (struct connect_wii_wiimote_t*)data; + if ( device ) + { + uint32_t b; + b = device->btns | (device->exp.cc.classic.btns << 16); /*broken? this doesn't match retropad!!*/ + RARCH_INPUT_STATE_COPY32_PTR(state, b); + } } static void hidpad_wii_packet_handler(void *data, diff --git a/input/connect/connect_wiiugca.c b/input/connect/connect_wiiugca.c index 8f1368fdd7..0f368e01fe 100644 --- a/input/connect/connect_wiiugca.c +++ b/input/connect/connect_wiiugca.c @@ -20,6 +20,7 @@ #include #include "joypad_connection.h" +#include "../input_defines.h" struct hidpad_wiiugca_data { @@ -27,7 +28,7 @@ struct hidpad_wiiugca_data send_control_t send_control; uint8_t data[64]; uint32_t slot; - uint64_t buttons; + uint32_t buttons; }; static void* hidpad_wiiugca_init(void *data, uint32_t slot, send_control_t ptr) @@ -62,12 +63,14 @@ static void hidpad_wiiugca_deinit(void *data) free(device); } -static uint64_t hidpad_wiiugca_get_buttons(void *data) +static void hidpad_wiiugca_get_buttons(void *data, retro_bits_t *state) { - struct hidpad_wiiugca_data *device = (struct hidpad_wiiugca_data*)data; - if (!device) - return 0; - return device->buttons; + struct hidpad_wiiugca_data *device = (struct hidpad_wiiugca_data*)data; + if ( device ) { + RARCH_INPUT_STATE_COPY16_PTR(state, device->buttons); + } else { + RARCH_INPUT_STATE_CLEAR_PTR(state); + } } static int16_t hidpad_wiiugca_get_axis(void *data, unsigned axis) diff --git a/input/connect/connect_wiiupro.c b/input/connect/connect_wiiupro.c index 05d36c240f..d380e119a0 100644 --- a/input/connect/connect_wiiupro.c +++ b/input/connect/connect_wiiupro.c @@ -97,7 +97,7 @@ static void* hidpad_wiiupro_init(void *data, device->connection = connection; device->slot = slot; device->send_control = ptr; - + calib_data->calib_round = 0; /* Without this, the digital buttons won't be reported. */ hidpad_wiiupro_send_control(device); @@ -118,35 +118,67 @@ static void hidpad_wiiupro_deinit(void *data) free(device); } -static uint64_t hidpad_wiiupro_get_buttons(void *data) +static void hidpad_wiiupro_get_buttons(void *data, retro_bits_t *state) { - uint64_t buttonstate = 0; struct hidpad_wiiupro_data *device = (struct hidpad_wiiupro_data*)data; struct wiiupro *rpt = device ? (struct wiiupro*)&device->data : NULL; if (!device || !rpt) - return 0; + return; - buttonstate |= (rpt->btn.r3 ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_R3) : 0); - buttonstate |= (rpt->btn.l3 ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_L3) : 0); - buttonstate |= (rpt->btn.plus ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_START) : 0); - buttonstate |= (rpt->btn.minus ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_SELECT) : 0); - buttonstate |= (rpt->btn.zr ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_R2) : 0); - buttonstate |= (rpt->btn.zl ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_L2) : 0); - buttonstate |= (rpt->btn.r ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_R) : 0); - buttonstate |= (rpt->btn.l ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_L) : 0); + RARCH_INPUT_STATE_CLEAR_PTR( state ); - buttonstate |= (rpt->btn.x ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_X) : 0); - buttonstate |= (rpt->btn.a ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_A) : 0); - buttonstate |= (rpt->btn.b ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_B) : 0); - buttonstate |= (rpt->btn.y ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_Y) : 0); - buttonstate |= (rpt->btn.left ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_LEFT) : 0); - buttonstate |= (rpt->btn.right ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_RIGHT) : 0); - buttonstate |= (rpt->btn.up ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_UP) : 0); - buttonstate |= (rpt->btn.down ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_DOWN) : 0); - buttonstate |= (rpt->btn.home ? (UINT64_C(1) << RARCH_MENU_TOGGLE) : 0); - - return buttonstate; + if ( rpt->btn.r3 ) { + RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_R3 ); + } + if ( rpt->btn.l3 ) { + RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_L3 ); + } + if ( rpt->btn.plus ) { + RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_START ); + } + if ( rpt->btn.minus ) { + RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_SELECT ); + } + if ( rpt->btn.zr ) { + RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_R2 ); + } + if ( rpt->btn.zl ) { + RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_L2 ); + } + if ( rpt->btn.r ) { + RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_R ); + } + if ( rpt->btn.l ) { + RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_L ); + } + if ( rpt->btn.x ) { + RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_X ); + } + if ( rpt->btn.a ) { + RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_A ); + } + if ( rpt->btn.b ) { + RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_B ); + } + if ( rpt->btn.y ) { + RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_Y ); + } + if ( rpt->btn.left ) { + RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_LEFT ); + } + if ( rpt->btn.down ) { + RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_DOWN ); + } + if ( rpt->btn.right ) { + RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_RIGHT ); + } + if ( rpt->btn.up ) { + RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_UP ); + } + if ( rpt->btn.home ) { + RARCH_INPUT_STATE_BIT_SET_PTR( state, RARCH_MENU_TOGGLE ); + } } static int16_t hidpad_wiiupro_get_axis(void *data, unsigned axis) @@ -214,18 +246,18 @@ static void hidpad_wiiupro_packet_handler(void *data, calib_data->hatvalue_calib[1] = (packet[8] | (packet[8 + 1] << 8)); calib_data->hatvalue_calib[2] = (packet[6] | (packet[6 + 1] << 8)); calib_data->hatvalue_calib[3] = (packet[10] | (packet[10 + 1] << 8)); - + calib_data->calib_round++; } else { - device->data.hatvalue[0] = (packet[4] | (packet[4 + 1] << 8)) + device->data.hatvalue[0] = (packet[4] | (packet[4 + 1] << 8)) - calib_data->hatvalue_calib[0]; - device->data.hatvalue[1] = (packet[8] | (packet[8 + 1] << 8)) + device->data.hatvalue[1] = (packet[8] | (packet[8 + 1] << 8)) - calib_data->hatvalue_calib[1]; - device->data.hatvalue[2] = (packet[6] | (packet[6 + 1] << 8)) + device->data.hatvalue[2] = (packet[6] | (packet[6 + 1] << 8)) - calib_data->hatvalue_calib[2]; - device->data.hatvalue[3] = (packet[10] | (packet[10 + 1] << 8)) + device->data.hatvalue[3] = (packet[10] | (packet[10 + 1] << 8)) - calib_data->hatvalue_calib[3]; } } diff --git a/input/connect/joypad_connection.c b/input/connect/joypad_connection.c index 0942505db2..18ae10612d 100644 --- a/input/connect/joypad_connection.c +++ b/input/connect/joypad_connection.c @@ -103,7 +103,7 @@ int32_t pad_connection_pad_init(joypad_connection_t *joyconn, const char *name_match = strstr(pad_map[i].name, name); /* Never change, Nintendo. */ - if(pad_map[i].vid == 1406 && pad_map[i].pid == 816) + if(pad_map[i].vid == 1406 && pad_map[i].pid == 816) { if(!string_is_equal(pad_map[i].name, name)) continue; @@ -133,7 +133,7 @@ int32_t pad_connection_pad_init(joypad_connection_t *joyconn, } } - /* We failed to find a matching pad, + /* We failed to find a matching pad, * set up one without an interface */ if (!s->connected) { @@ -173,11 +173,13 @@ void pad_connection_packet(joypad_connection_t *joyconn, uint32_t pad, joyconn->iface->packet_handler(joyconn->data, data, length); } -uint64_t pad_connection_get_buttons(joypad_connection_t *joyconn, unsigned pad) +void pad_connection_get_buttons(joypad_connection_t *joyconn, unsigned pad, retro_bits_t* state) { - if (!joyconn->iface) - return 0; - return joyconn->iface->get_buttons(joyconn->data); + if (joyconn->iface) { + joyconn->iface->get_buttons(joyconn->data, state); + } else { + RARCH_INPUT_STATE_CLEAR_PTR( state ); + } } int16_t pad_connection_get_axis(joypad_connection_t *joyconn, @@ -190,8 +192,8 @@ int16_t pad_connection_get_axis(joypad_connection_t *joyconn, bool pad_connection_has_interface(joypad_connection_t *joyconn, unsigned pad) { - if ( joyconn && pad < MAX_USERS - && joyconn[pad].connected + if ( joyconn && pad < MAX_USERS + && joyconn[pad].connected && joyconn[pad].iface) return true; return false; diff --git a/input/connect/joypad_connection.h b/input/connect/joypad_connection.h index c0d3669853..75b6dbb633 100644 --- a/input/connect/joypad_connection.h +++ b/input/connect/joypad_connection.h @@ -21,6 +21,7 @@ #include #include +#include typedef void (*send_control_t)(void *data, uint8_t *buf, size_t size); @@ -38,7 +39,7 @@ typedef struct pad_connection_interface void (*packet_handler)(void* device, uint8_t *packet, uint16_t size); void (*set_rumble)(void* device, enum retro_rumble_effect effect, uint16_t strength); - uint64_t (*get_buttons)(void *data); + void (*get_buttons)(void *data, retro_bits_t *state); int16_t (*get_axis)(void *data, unsigned axis); const char* (*get_name)(void *data); } pad_connection_interface_t; @@ -69,8 +70,8 @@ void pad_connection_pad_deinit(joypad_connection_t *joyconn, void pad_connection_packet(joypad_connection_t *joyconn, uint32_t idx, uint8_t* data, uint32_t length); -uint64_t pad_connection_get_buttons(joypad_connection_t *joyconn, - unsigned idx); +void pad_connection_get_buttons(joypad_connection_t *joyconn, + unsigned idx, retro_bits_t* state); int16_t pad_connection_get_axis(joypad_connection_t *joyconn, unsigned idx, unsigned i); diff --git a/input/drivers/cocoa_input.c b/input/drivers/cocoa_input.c index 9b84770b8b..ceeaf417b1 100644 --- a/input/drivers/cocoa_input.c +++ b/input/drivers/cocoa_input.c @@ -1,7 +1,7 @@ /* RetroArch - A frontend for libretro. * Copyright (C) 2011-2017 - Daniel De Matteis * Copyright (C) 2013-2014 - Jason Fetters - * + * * 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. @@ -36,13 +36,13 @@ float get_backing_scale_factor(void); int32_t cocoa_input_find_any_key(void) { cocoa_input_data_t *apple = (cocoa_input_data_t*)input_driver_get_data(); - + if (!apple) return 0; - + if (apple->joypad) apple->joypad->poll(); - + if (apple->sec_joypad) apple->sec_joypad->poll(); @@ -50,13 +50,13 @@ int32_t cocoa_input_find_any_key(void) } static int cocoa_input_find_any_button_ret(cocoa_input_data_t *apple, - unsigned buttons, unsigned port) + retro_bits_t * state, unsigned port) { unsigned i; - if (buttons) - for (i = 0; i < 32; i++) - if (buttons & (1 << i)) + if (state) + for (i = 0; i < 256; i++) + if (RARCH_INPUT_STATE_BIT_GET_PTR(state,i)) return i; return -1; } @@ -68,26 +68,32 @@ int32_t cocoa_input_find_any_button(uint32_t port) if (!apple) return -1; - + if (apple->joypad) { apple->joypad->poll(); if (apple->joypad->get_buttons) - ret = cocoa_input_find_any_button_ret(apple, (unsigned)apple->joypad->get_buttons(port), port); + { + retro_bits_t state; + apple->joypad->get_buttons(port,&state); + ret = cocoa_input_find_any_button_ret(apple, &state, port); + } } if (ret != -1) return ret; - + if (apple->sec_joypad) { apple->sec_joypad->poll(); if (apple->sec_joypad->get_buttons) { + retro_bits_t state; apple->sec_joypad->poll(); - ret = cocoa_input_find_any_button_ret(apple, (unsigned)apple->sec_joypad->get_buttons(port), port); + apple->sec_joypad->get_buttons(port,&state); + ret = cocoa_input_find_any_button_ret(apple, &state, port); } } @@ -101,17 +107,17 @@ int32_t cocoa_input_find_any_axis(uint32_t port) { int i; cocoa_input_data_t *apple = (cocoa_input_data_t*)input_driver_get_data(); - + if (apple && apple->joypad) apple->joypad->poll(); - + if (apple && apple->sec_joypad) apple->sec_joypad->poll(); for (i = 0; i < 6; i++) { int16_t value = apple->joypad ? apple->joypad->axis(port, i) : 0; - + if (abs(value) > 0x4000) return (value < 0) ? -(i + 1) : i + 1; @@ -130,15 +136,15 @@ static void *cocoa_input_init(const char *joypad_driver) cocoa_input_data_t *apple = (cocoa_input_data_t*)calloc(1, sizeof(*apple)); if (!apple) return NULL; - + input_keymaps_init_keyboard_lut(rarch_key_map_apple_hid); apple->joypad = input_joypad_init_driver(joypad_driver, apple); - + #ifdef HAVE_MFI apple->sec_joypad = input_joypad_init_driver("mfi", apple); #endif - + return apple; } @@ -149,14 +155,14 @@ static void cocoa_input_poll(void *data) #ifndef IOS float backing_scale_factor = get_backing_scale_factor(); #endif - + if (!apple) return; for (i = 0; i < apple->touch_count; i++) { struct video_viewport vp; - + vp.x = 0; vp.y = 0; vp.width = 0; @@ -249,13 +255,13 @@ static int16_t cocoa_pointer_state(cocoa_input_data_t *apple, int16_t x, y; const cocoa_touch_data_t *touch = (const cocoa_touch_data_t *) &apple->touches[idx]; - + if (!touch) return 0; - + x = touch->fixed_x; y = touch->fixed_y; - + if (want_full) { x = touch->full_x; @@ -328,16 +334,16 @@ static void cocoa_input_free(void *data) { unsigned i; cocoa_input_data_t *apple = (cocoa_input_data_t*)data; - + if (!apple || !data) return; - + if (apple->joypad) apple->joypad->destroy(); - + if (apple->sec_joypad) apple->sec_joypad->destroy(); - + for (i = 0; i < MAX_KEYS; i++) apple_key_state[i] = 0; @@ -348,7 +354,7 @@ static bool cocoa_input_set_rumble(void *data, unsigned port, enum retro_rumble_effect effect, uint16_t strength) { cocoa_input_data_t *apple = (cocoa_input_data_t*)data; - + if (apple && apple->joypad) return input_joypad_set_rumble(apple->joypad, port, effect, strength); @@ -364,7 +370,7 @@ static uint64_t cocoa_input_get_capabilities(void *data) { (void)data; - return + return (1 << RETRO_DEVICE_JOYPAD) | (1 << RETRO_DEVICE_MOUSE) | (1 << RETRO_DEVICE_KEYBOARD) | @@ -382,7 +388,7 @@ static void cocoa_input_grab_mouse(void *data, bool state) static const input_device_driver_t *cocoa_input_get_sec_joypad_driver(void *data) { cocoa_input_data_t *apple = (cocoa_input_data_t*)data; - + if (apple && apple->sec_joypad) return apple->sec_joypad; return NULL; @@ -391,7 +397,7 @@ static const input_device_driver_t *cocoa_input_get_sec_joypad_driver(void *data static const input_device_driver_t *cocoa_input_get_joypad_driver(void *data) { cocoa_input_data_t *apple = (cocoa_input_data_t*)data; - + if (apple && apple->joypad) return apple->joypad; return NULL; diff --git a/input/drivers/dinput.c b/input/drivers/dinput.c index e376dfb68e..9b2e14f66e 100644 --- a/input/drivers/dinput.c +++ b/input/drivers/dinput.c @@ -49,6 +49,7 @@ #include "../../gfx/video_driver.h" +#include "../../configuration.h" #include "../../verbosity.h" /* Keep track of which pad indexes are 360 controllers. @@ -85,7 +86,7 @@ struct dinput_input int mouse_rel_y; int mouse_x; int mouse_y; - bool mouse_l, mouse_r, mouse_m, mouse_wu, mouse_wd, mouse_hwu, mouse_hwd; + bool mouse_l, mouse_r, mouse_m, mouse_b4, mouse_b5, mouse_wu, mouse_wd, mouse_hwu, mouse_hwd; struct pointer_status pointer_head; /* dummy head for easier iteration */ }; @@ -246,6 +247,8 @@ static void dinput_poll(void *data) di->mouse_l = mouse_state.rgbButtons[0]; di->mouse_r = mouse_state.rgbButtons[1]; di->mouse_m = mouse_state.rgbButtons[2]; + di->mouse_b4 = mouse_state.rgbButtons[3]; + di->mouse_b5 = mouse_state.rgbButtons[4]; /* No simple way to get absolute coordinates * for RETRO_DEVICE_POINTER. Just use Win32 APIs. */ @@ -265,6 +268,58 @@ static bool dinput_keyboard_pressed(struct dinput_input *di, unsigned key) return di->state[sym] & 0x80; } +static bool dinput_mbutton_pressed(struct dinput_input *di, unsigned port, unsigned key) +{ + bool result; + settings_t *settings = config_get_ptr(); + + if (port >= MAX_USERS) + return false; + + /* the driver only supports one mouse */ + if ( settings->uints.input_mouse_index[ port ] != 0 ) { + return false; + } + + switch ( key ) + { + + case RETRO_DEVICE_ID_MOUSE_LEFT: + return di->mouse_l; + case RETRO_DEVICE_ID_MOUSE_RIGHT: + return di->mouse_r; + case RETRO_DEVICE_ID_MOUSE_MIDDLE: + return di->mouse_m; + case RETRO_DEVICE_ID_MOUSE_BUTTON_4: + return di->mouse_b4; + case RETRO_DEVICE_ID_MOUSE_BUTTON_5: + return di->mouse_b5; + + case RETRO_DEVICE_ID_MOUSE_WHEELUP: + result = di->mouse_wu; + di->mouse_wu = false; + return result; + + case RETRO_DEVICE_ID_MOUSE_WHEELDOWN: + result = di->mouse_wd; + di->mouse_wd = false; + return result; + + case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP: + result = di->mouse_hwu; + di->mouse_hwu = false; + return result; + + case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN: + result = di->mouse_hwd; + di->mouse_hwd = false; + return result; + + } + + return false; +} + static bool dinput_is_pressed(struct dinput_input *di, rarch_joypad_info_t joypad_info, const struct retro_keybind *binds, @@ -274,8 +329,13 @@ static bool dinput_is_pressed(struct dinput_input *di, if (!di->blocked && (bind->key < RETROK_LAST) && dinput_keyboard_pressed(di, bind->key)) return true; - if (binds && binds[id].valid && input_joypad_pressed(di->joypad, joypad_info, port, binds, id)) - return true; + if (binds && binds[id].valid) + { + if (dinput_mbutton_pressed(di, port, bind->mbutton)) + return true; + if (input_joypad_pressed(di->joypad, joypad_info, port, binds, id)) + return true; + } return false; } @@ -309,33 +369,83 @@ static bool dinput_meta_key_pressed(void *data, int key) return false; } -static int16_t dinput_lightgun_state(struct dinput_input *di, unsigned id) +static int16_t dinput_lightgun_aiming_state( struct dinput_input *di, unsigned idx, unsigned id ) { - switch (id) - { - case RETRO_DEVICE_ID_LIGHTGUN_X: - return di->mouse_rel_x; - case RETRO_DEVICE_ID_LIGHTGUN_Y: - return di->mouse_rel_y; - case RETRO_DEVICE_ID_LIGHTGUN_TRIGGER: - return di->mouse_l; - case RETRO_DEVICE_ID_LIGHTGUN_CURSOR: - return di->mouse_m; - case RETRO_DEVICE_ID_LIGHTGUN_TURBO: - return di->mouse_r; - case RETRO_DEVICE_ID_LIGHTGUN_START: - return di->mouse_m && di->mouse_r; - case RETRO_DEVICE_ID_LIGHTGUN_PAUSE: - return di->mouse_m && di->mouse_l; - } + const int edge_detect = 32700; + struct video_viewport vp; + bool inside = false; + int x = 0; + int y = 0; + int16_t res_x = 0; + int16_t res_y = 0; + int16_t res_screen_x = 0; + int16_t res_screen_y = 0; + unsigned num = 0; - return 0; + struct pointer_status* check_pos = di->pointer_head.next; + + vp.x = 0; + vp.y = 0; + vp.width = 0; + vp.height = 0; + vp.full_width = 0; + vp.full_height = 0; + + while ( check_pos && num < idx ) + { + num++; + check_pos = check_pos->next; + } + + if ( !check_pos && idx > 0 ) /* idx = 0 has mouse fallback. */ + return 0; + + x = di->mouse_x; + y = di->mouse_y; + + if ( check_pos ) + { + x = check_pos->pointer_x; + y = check_pos->pointer_y; + } + + if ( !( video_driver_translate_coord_viewport_wrap( + &vp, x, y, &res_x, &res_y, &res_screen_x, &res_screen_y ) ) ) + { + return 0; + } + + inside = (res_x >= -edge_detect) && (res_y >= -edge_detect) && (res_x <= edge_detect) && (res_y <= edge_detect); + + switch ( id ) + { + case RETRO_DEVICE_ID_LIGHTGUN_SCREEN_X: + return inside ? res_x : 0; + case RETRO_DEVICE_ID_LIGHTGUN_SCREEN_Y: + return inside ? res_y : 0; + case RETRO_DEVICE_ID_LIGHTGUN_IS_OFFSCREEN: + return !inside; + default: + break; + } + + return 0; } -static int16_t dinput_mouse_state(struct dinput_input *di, unsigned id) +static int16_t dinput_mouse_state(struct dinput_input *di, unsigned port, unsigned id) { int16_t state = 0; + settings_t *settings = config_get_ptr(); + + if (port >= MAX_USERS) + return false; + + /* the driver only supports one mouse */ + if ( settings->uints.input_mouse_index[ port ] != 0 ) { + return 0; + } + switch (id) { case RETRO_DEVICE_ID_MOUSE_X: @@ -368,13 +478,27 @@ static int16_t dinput_mouse_state(struct dinput_input *di, unsigned id) return state; case RETRO_DEVICE_ID_MOUSE_MIDDLE: return di->mouse_m; + case RETRO_DEVICE_ID_MOUSE_BUTTON_4: + return di->mouse_b4; + case RETRO_DEVICE_ID_MOUSE_BUTTON_5: + return di->mouse_b5; } return 0; } -static int16_t dinput_mouse_state_screen(struct dinput_input *di, unsigned id) +static int16_t dinput_mouse_state_screen(struct dinput_input *di, unsigned port, unsigned id) { + settings_t *settings = config_get_ptr(); + + if (port >= MAX_USERS) + return false; + + /* the driver only supports one mouse */ + if ( settings->uints.input_mouse_index[ port ] != 0 ) { + return 0; + } + switch (id) { case RETRO_DEVICE_ID_MOUSE_X: @@ -385,7 +509,7 @@ static int16_t dinput_mouse_state_screen(struct dinput_input *di, unsigned id) break; } - return dinput_mouse_state(di, id); + return dinput_mouse_state(di, port, id); } static int16_t dinput_pointer_state(struct dinput_input *di, @@ -488,10 +612,10 @@ static int16_t dinput_input_state(void *data, return 0; case RETRO_DEVICE_MOUSE: - return dinput_mouse_state(di, id); + return dinput_mouse_state(di, port, id); case RARCH_DEVICE_MOUSE_SCREEN: - return dinput_mouse_state_screen(di, id); + return dinput_mouse_state_screen(di, port, id); case RETRO_DEVICE_POINTER: case RARCH_DEVICE_POINTER_SCREEN: @@ -499,7 +623,48 @@ static int16_t dinput_input_state(void *data, device == RARCH_DEVICE_POINTER_SCREEN); case RETRO_DEVICE_LIGHTGUN: - return dinput_lightgun_state(di, id); + switch ( id ) + { + /*aiming*/ + case RETRO_DEVICE_ID_LIGHTGUN_SCREEN_X: + case RETRO_DEVICE_ID_LIGHTGUN_SCREEN_Y: + case RETRO_DEVICE_ID_LIGHTGUN_IS_OFFSCREEN: + return dinput_lightgun_aiming_state( di, idx, id ); + + /*buttons*/ + case RETRO_DEVICE_ID_LIGHTGUN_TRIGGER: + return dinput_is_pressed(di, joypad_info, binds[port], port, RARCH_LIGHTGUN_TRIGGER); + case RETRO_DEVICE_ID_LIGHTGUN_RELOAD: + return dinput_is_pressed(di, joypad_info, binds[port], port, RARCH_LIGHTGUN_RELOAD); + case RETRO_DEVICE_ID_LIGHTGUN_AUX_A: + return dinput_is_pressed(di, joypad_info, binds[port], port, RARCH_LIGHTGUN_AUX_A); + case RETRO_DEVICE_ID_LIGHTGUN_AUX_B: + return dinput_is_pressed(di, joypad_info, binds[port], port, RARCH_LIGHTGUN_AUX_B); + case RETRO_DEVICE_ID_LIGHTGUN_AUX_C: + return dinput_is_pressed(di, joypad_info, binds[port], port, RARCH_LIGHTGUN_AUX_C); + case RETRO_DEVICE_ID_LIGHTGUN_START: + return dinput_is_pressed(di, joypad_info, binds[port], port, RARCH_LIGHTGUN_START); + case RETRO_DEVICE_ID_LIGHTGUN_SELECT: + return dinput_is_pressed(di, joypad_info, binds[port], port, RARCH_LIGHTGUN_SELECT); + case RETRO_DEVICE_ID_LIGHTGUN_DPAD_UP: + return dinput_is_pressed(di, joypad_info, binds[port], port, RARCH_LIGHTGUN_DPAD_UP); + case RETRO_DEVICE_ID_LIGHTGUN_DPAD_DOWN: + return dinput_is_pressed(di, joypad_info, binds[port], port, RARCH_LIGHTGUN_DPAD_DOWN); + case RETRO_DEVICE_ID_LIGHTGUN_DPAD_LEFT: + return dinput_is_pressed(di, joypad_info, binds[port], port, RARCH_LIGHTGUN_DPAD_LEFT); + case RETRO_DEVICE_ID_LIGHTGUN_DPAD_RIGHT: + return dinput_is_pressed(di, joypad_info, binds[port], port, RARCH_LIGHTGUN_DPAD_RIGHT); + + /*deprecated*/ + case RETRO_DEVICE_ID_LIGHTGUN_X: + return di->mouse_rel_x; + case RETRO_DEVICE_ID_LIGHTGUN_Y: + return di->mouse_rel_y; + case RETRO_DEVICE_ID_LIGHTGUN_PAUSE: + return dinput_is_pressed(di, joypad_info, binds[port], port, RARCH_LIGHTGUN_START); + + } + break; } return 0; diff --git a/input/drivers/sdl_input.c b/input/drivers/sdl_input.c index 83d18551d3..5b462d55ff 100644 --- a/input/drivers/sdl_input.c +++ b/input/drivers/sdl_input.c @@ -38,7 +38,7 @@ typedef struct sdl_input int mouse_x, mouse_y; int mouse_abs_x, mouse_abs_y; - int mouse_l, mouse_r, mouse_m, mouse_wu, mouse_wd, mouse_wl, mouse_wr; + int mouse_l, mouse_r, mouse_m, mouse_b4, mouse_b5, mouse_wu, mouse_wd, mouse_wl, mouse_wr; } sdl_input_t; static void *sdl_input_init(const char *joypad_driver) @@ -131,6 +131,10 @@ static int16_t sdl_mouse_device_state(sdl_input_t *sdl, unsigned id) return sdl->mouse_y; case RETRO_DEVICE_ID_MOUSE_MIDDLE: return sdl->mouse_m; + case RETRO_DEVICE_ID_MOUSE_BUTTON_4: + return sdl->mouse_b4; + case RETRO_DEVICE_ID_MOUSE_BUTTON_5: + return sdl->mouse_b5; } return 0; @@ -310,6 +314,8 @@ static void sdl_poll_mouse(sdl_input_t *sdl) sdl->mouse_l = (SDL_BUTTON(SDL_BUTTON_LEFT) & btn) ? 1 : 0; sdl->mouse_r = (SDL_BUTTON(SDL_BUTTON_RIGHT) & btn) ? 1 : 0; sdl->mouse_m = (SDL_BUTTON(SDL_BUTTON_MIDDLE) & btn) ? 1 : 0; + sdl->mouse_b4 = (SDL_BUTTON(SDL_BUTTON_X1) & btn) ? 1 : 0; + sdl->mouse_b5 = (SDL_BUTTON(SDL_BUTTON_X2) & btn) ? 1 : 0; #ifndef HAVE_SDL2 sdl->mouse_wu = (SDL_BUTTON(SDL_BUTTON_WHEELUP) & btn) ? 1 : 0; sdl->mouse_wd = (SDL_BUTTON(SDL_BUTTON_WHEELDOWN) & btn) ? 1 : 0; diff --git a/input/drivers/udev_input.c b/input/drivers/udev_input.c index 01600ecdea..a22ba8636d 100644 --- a/input/drivers/udev_input.c +++ b/input/drivers/udev_input.c @@ -14,6 +14,19 @@ * If not, see . */ +/* TODO/FIXME - set this once the kqueue codepath is implemented and working properly */ +#if 1 +#define HAVE_EPOLL +#else +#ifdef __linux__ +#define HAVE_EPOLL 1 +#endif + +#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined (__NetBSD__) +#define HAVE_KQUEUE 1 +#endif +#endif + #include #include @@ -25,7 +38,11 @@ #include #include +#if defined(HAVE_EPOLL) #include +#elif defined(HAVE_KQUEUE) +#include +#endif #include #include @@ -117,7 +134,7 @@ struct udev_input const input_device_driver_t *joypad; - int epfd; + int fd; udev_input_device_t **devices; unsigned num_devices; @@ -450,7 +467,11 @@ static bool udev_input_add_device(udev_input_t *udev, { int fd; struct stat st; +#if defined(HAVE_EPOLL) struct epoll_event event; +#elif defined(HAVE_KQUEUE) + struct kevent event; +#endif struct input_absinfo absinfo; udev_input_device_t **tmp; udev_input_device_t *device = NULL; @@ -518,15 +539,24 @@ static bool udev_input_add_device(udev_input_t *udev, tmp[udev->num_devices++] = device; udev->devices = tmp; +#if defined(HAVE_EPOLL) event.events = EPOLLIN; event.data.ptr = device; /* Shouldn't happen, but just check it. */ - if (epoll_ctl(udev->epfd, EPOLL_CTL_ADD, fd, &event) < 0) + if (epoll_ctl(udev->fd, EPOLL_CTL_ADD, fd, &event) < 0) { RARCH_ERR("Failed to add FD (%d) to epoll list (%s).\n", fd, strerror(errno)); } +#elif defined(HAVE_KQUEUE) + EV_SET(&event, fd, EVFILT_READ, EV_ADD, 0, 0, LISTENSOCKET); + if (kevent(udev->fd, &event, 1, NULL, 0, NULL) == -1) + { + RARCH_ERR("Failed to add FD (%d) to kqueue list (%s).\n", + fd, strerror(errno)); + } +#endif return true; @@ -639,7 +669,11 @@ static bool udev_input_poll_hotplug_available(struct udev_monitor *dev) static void udev_input_poll(void *data) { int i, ret; +#if defined(HAVE_EPOLL) struct epoll_event events[32]; +#elif defined(HAVE_KQUEUE) + struct kevent events[32]; +#endif udev_input_mouse_t *mouse = NULL; udev_input_t *udev = (udev_input_t*)data; @@ -666,15 +700,30 @@ static void udev_input_poll(void *data) while (udev->monitor && udev_input_poll_hotplug_available(udev->monitor)) udev_input_handle_hotplug(udev); - ret = epoll_wait(udev->epfd, events, ARRAY_SIZE(events), 0); +#if defined(HAVE_EPOLL) + ret = epoll_wait(udev->fd, events, ARRAY_SIZE(events), 0); +#elif defined(HAVE_KQUEUE) + { + struct timespec timeoutspec; + timeoutspec.tv_sec = timeout; + timeoutspec.tv_nsec = 0; + ret = kevent(udev->fd, NULL, 0, events, + ARRAY_SIZE(events), &timeoutspec); + } +#endif for (i = 0; i < ret; i++) { + /* TODO/FIXME - add HAVE_EPOLL/HAVE_KQUEUE codepaths here */ if (events[i].events & EPOLLIN) { int j, len; struct input_event input_events[32]; +#if defined(HAVE_EPOLL) udev_input_device_t *device = (udev_input_device_t*)events[i].data.ptr; +#elif defined(HAVE_KQUEUE) + udev_input_device_t *device = (udev_input_device_t*)events[i].udata; +#endif while ((len = read(device->fd, input_events, sizeof(input_events))) > 0) @@ -874,10 +923,10 @@ static void udev_input_free(void *data) if (udev->joypad) udev->joypad->destroy(); - if (udev->epfd >= 0) - close(udev->epfd); + if (udev->fd >= 0) + close(udev->fd); - udev->epfd = -1; + udev->fd = -1; for (i = 0; i < udev->num_devices; i++) { @@ -978,14 +1027,23 @@ static void *udev_input_init(const char *joypad_driver) udev->xkb_handling = string_is_equal(ctx_ident.ident, "kms"); #endif +#if defined(HAVE_EPOLL) fd = epoll_create(32); if (fd < 0) { - RARCH_ERR("Failed to create epoll FD.\n"); + RARCH_ERR("Failed to create poll file descriptor.\n"); goto error; } +#elif defined(HAVE_KQUEUE) + fd = kqueue(); + if (fd == -1) + { + RARCH_ERR("Failed to create poll file descriptor.\n"); + goto error; + } +#endif - udev->epfd = fd; + udev->fd = fd; if (!open_devices(udev, UDEV_INPUT_KEYBOARD, udev_handle_keyboard)) { diff --git a/input/drivers/wiiu_input.c b/input/drivers/wiiu_input.c index 9673947317..7cb9444b3c 100644 --- a/input/drivers/wiiu_input.c +++ b/input/drivers/wiiu_input.c @@ -105,7 +105,11 @@ static int16_t wiiu_pointer_device_state(wiiu_input_t* wiiu, unsigned id) switch (id) { case RETRO_DEVICE_ID_POINTER_PRESSED: - return (wiiu->joypad->get_buttons(0) & VPAD_BUTTON_TOUCH) ? 1 : 0; + { + retro_bits_t state; + wiiu->joypad->get_buttons(0,&state); + return RARCH_INPUT_STATE_BIT_GET(state, VPAD_BUTTON_TOUCH) ? 1 : 0; + } case RETRO_DEVICE_ID_POINTER_X: return wiiu->joypad->axis(0, 0xFFFF0004UL); case RETRO_DEVICE_ID_POINTER_Y: diff --git a/input/drivers/winraw_input.c b/input/drivers/winraw_input.c index bb44a0b92e..31f86cadb5 100644 --- a/input/drivers/winraw_input.c +++ b/input/drivers/winraw_input.c @@ -32,7 +32,7 @@ typedef struct HANDLE hnd; LONG x, y, dlt_x, dlt_y; LONG whl_u, whl_d; - bool btn_l, btn_m, btn_r; + bool btn_l, btn_m, btn_r, btn_b4, btn_b5; } winraw_mouse_t; typedef struct @@ -241,6 +241,65 @@ static bool winraw_set_mouse_input(HWND window, bool grab) return true; } +static int16_t winraw_lightgun_aiming_state(winraw_input_t *wr, + unsigned port, unsigned id) +{ + const int edge_detect = 32700; + struct video_viewport vp; + bool inside = false; + unsigned i; + settings_t *settings = config_get_ptr(); + winraw_mouse_t *mouse = NULL; + int16_t res_x = 0; + int16_t res_y = 0; + int16_t res_screen_x = 0; + int16_t res_screen_y = 0; + + if (port >= MAX_USERS) + return 0; + + for (i = 0; i < g_mouse_cnt; ++i) + { + if (i == settings->uints.input_mouse_index[port]) + { + mouse = &wr->mice[i]; + break; + } + } + + if (!mouse) + return 0; + + vp.x = 0; + vp.y = 0; + vp.width = 0; + vp.height = 0; + vp.full_width = 0; + vp.full_height = 0; + + if ( !( video_driver_translate_coord_viewport_wrap( + &vp, mouse->x, mouse->y, &res_x, &res_y, &res_screen_x, &res_screen_y ) ) ) + { + return 0; + } + + inside = (res_x >= -edge_detect) && (res_y >= -edge_detect) && (res_x <= edge_detect) && (res_y <= edge_detect); + + switch ( id ) + { + case RETRO_DEVICE_ID_LIGHTGUN_SCREEN_X: + return inside ? res_x : 0; + case RETRO_DEVICE_ID_LIGHTGUN_SCREEN_Y: + return inside ? res_y : 0; + case RETRO_DEVICE_ID_LIGHTGUN_IS_OFFSCREEN: + return !inside; + default: + break; + } + + return 0; +} + static int16_t winraw_mouse_state(winraw_input_t *wr, unsigned port, bool abs, unsigned id) { @@ -279,23 +338,83 @@ static int16_t winraw_mouse_state(winraw_input_t *wr, return mouse->whl_d ? 1 : 0; case RETRO_DEVICE_ID_MOUSE_MIDDLE: return mouse->btn_m ? 1 : 0; + case RETRO_DEVICE_ID_MOUSE_BUTTON_4: + return mouse->btn_b4 ? 1 : 0; + case RETRO_DEVICE_ID_MOUSE_BUTTON_5: + return mouse->btn_b5 ? 1 : 0; } return 0; } -static int16_t winraw_joypad_state(winraw_input_t *wr, +static bool winraw_keyboard_pressed(winraw_input_t *wr, unsigned key) +{ + unsigned k = rarch_keysym_lut[(enum retro_key)key]; + return wr->keyboard.keys[k]; +} + +static bool winraw_mbutton_pressed(winraw_input_t *wr, unsigned port, unsigned key) +{ + unsigned i; + bool result; + winraw_mouse_t *mouse = NULL; + settings_t *settings = config_get_ptr(); + + if (port >= MAX_USERS) + return false; + + for (i = 0; i < g_mouse_cnt; ++i) + { + if (i == settings->uints.input_mouse_index[port]) + { + mouse = &wr->mice[i]; + break; + } + } + + if (!mouse) + return false; + + switch ( key ) + { + + case RETRO_DEVICE_ID_MOUSE_LEFT: + return mouse->btn_l; + case RETRO_DEVICE_ID_MOUSE_RIGHT: + return mouse->btn_r; + case RETRO_DEVICE_ID_MOUSE_MIDDLE: + return mouse->btn_m; + case RETRO_DEVICE_ID_MOUSE_BUTTON_4: + return mouse->btn_b4; + case RETRO_DEVICE_ID_MOUSE_BUTTON_5: + return mouse->btn_b5; + case RETRO_DEVICE_ID_MOUSE_WHEELUP: + return mouse->whl_u; + case RETRO_DEVICE_ID_MOUSE_WHEELDOWN: + return mouse->whl_d; + } + + return false; +} + +static bool winraw_is_pressed(winraw_input_t *wr, rarch_joypad_info_t joypad_info, const struct retro_keybind *binds, unsigned port, unsigned id) { const struct retro_keybind *bind = &binds[id]; - unsigned key = rarch_keysym_lut[(enum retro_key)bind->key]; - if (!wr->kbd_mapp_block && (bind->key < RETROK_LAST) && wr->keyboard.keys[key]) - return 1; + if (!wr->kbd_mapp_block && (bind->key < RETROK_LAST) && winraw_keyboard_pressed(wr, bind->key)) + return true; + if (binds && binds[id].valid) + { + if (winraw_mbutton_pressed(wr, port, bind->mbutton)) + return true; + if (input_joypad_pressed(wr->joypad, joypad_info, port, binds, id)) + return true; + } - return input_joypad_pressed(wr->joypad, joypad_info, port, binds, id); + return false; } static void winraw_init_mouse_xy_mapping() @@ -323,7 +442,7 @@ static void winraw_init_mouse_xy_mapping() } } -static int16_t winraw_lightgun_state(winraw_input_t *wr, +static int16_t winraw_deprecated_lightgun_state(winraw_input_t *wr, unsigned port, unsigned id) { unsigned i; @@ -351,16 +470,6 @@ static int16_t winraw_lightgun_state(winraw_input_t *wr, return mouse->dlt_x; case RETRO_DEVICE_ID_LIGHTGUN_Y: return mouse->dlt_y; - case RETRO_DEVICE_ID_LIGHTGUN_TRIGGER: - return mouse->btn_l ? 1 : 0; - case RETRO_DEVICE_ID_LIGHTGUN_CURSOR: - return mouse->btn_m ? 1 : 0; - case RETRO_DEVICE_ID_LIGHTGUN_TURBO: - return mouse->btn_r ? 1 : 0; - case RETRO_DEVICE_ID_LIGHTGUN_START: - return (mouse->btn_m && mouse->btn_r) ? 1 : 0; - case RETRO_DEVICE_ID_LIGHTGUN_PAUSE: - return mouse->btn_m && mouse->btn_l ? 1 : 0; } return 0; @@ -419,6 +528,16 @@ static void winraw_update_mouse_state(winraw_mouse_t *mouse, RAWMOUSE *state) else if (state->usButtonFlags & RI_MOUSE_RIGHT_BUTTON_UP) mouse->btn_r = false; + if (state->usButtonFlags & RI_MOUSE_BUTTON_4_DOWN) + mouse->btn_b4 = true; + else if (state->usButtonFlags & RI_MOUSE_BUTTON_4_UP) + mouse->btn_b4 = false; + + if (state->usButtonFlags & RI_MOUSE_BUTTON_5_DOWN) + mouse->btn_b5 = true; + else if (state->usButtonFlags & RI_MOUSE_BUTTON_5_UP) + mouse->btn_b5 = false; + if (state->usButtonFlags & RI_MOUSE_WHEEL) { if ((SHORT)state->usButtonData > 0) @@ -440,7 +559,7 @@ static LRESULT CALLBACK winraw_callback(HWND wnd, UINT msg, WPARAM wpar, LPARAM return DefWindowProcA(wnd, msg, wpar, lpar); /* app is in the background */ - if (GET_RAWINPUT_CODE_WPARAM(wpar) != RIM_INPUT) + if (GET_RAWINPUT_CODE_WPARAM(wpar) != RIM_INPUT) goto end; r = GetRawInputData((HRAWINPUT)lpar, RID_INPUT, @@ -566,6 +685,8 @@ static void winraw_poll(void *d) wr->mice[i].btn_l = g_mice[i].btn_l; wr->mice[i].btn_m = g_mice[i].btn_m; wr->mice[i].btn_r = g_mice[i].btn_r; + wr->mice[i].btn_b4 = g_mice[i].btn_b4; + wr->mice[i].btn_b5 = g_mice[i].btn_b5; } if (wr->joypad) @@ -581,26 +702,62 @@ static int16_t winraw_input_state(void *d, switch (device) { - case RETRO_DEVICE_KEYBOARD: - if (id < RETROK_LAST) - { - unsigned key = rarch_keysym_lut[(enum retro_key)id]; - return wr->keyboard.keys[key]; - } + case RETRO_DEVICE_JOYPAD: + if (id < RARCH_BIND_LIST_END) + return winraw_is_pressed(wr, joypad_info, binds[port], port, id); break; + case RETRO_DEVICE_KEYBOARD: + return (id < RETROK_LAST) && winraw_keyboard_pressed(wr, id); case RETRO_DEVICE_MOUSE: return winraw_mouse_state(wr, port, false, id); case RARCH_DEVICE_MOUSE_SCREEN: return winraw_mouse_state(wr, port, true, id); - case RETRO_DEVICE_JOYPAD: - return winraw_joypad_state(wr, joypad_info, binds[port], port, id); case RETRO_DEVICE_ANALOG: if (binds[port]) return input_joypad_analog(wr->joypad, joypad_info, port, index, id, binds[port]); break; case RETRO_DEVICE_LIGHTGUN: - return winraw_lightgun_state(wr, port, id); + switch ( id ) + { + /*aiming*/ + case RETRO_DEVICE_ID_LIGHTGUN_SCREEN_X: + case RETRO_DEVICE_ID_LIGHTGUN_SCREEN_Y: + case RETRO_DEVICE_ID_LIGHTGUN_IS_OFFSCREEN: + return winraw_lightgun_aiming_state( wr, port, id ); + + /*buttons*/ + case RETRO_DEVICE_ID_LIGHTGUN_TRIGGER: + return winraw_is_pressed(wr, joypad_info, binds[port], port, RARCH_LIGHTGUN_TRIGGER); + case RETRO_DEVICE_ID_LIGHTGUN_RELOAD: + return winraw_is_pressed(wr, joypad_info, binds[port], port, RARCH_LIGHTGUN_RELOAD); + case RETRO_DEVICE_ID_LIGHTGUN_AUX_A: + return winraw_is_pressed(wr, joypad_info, binds[port], port, RARCH_LIGHTGUN_AUX_A); + case RETRO_DEVICE_ID_LIGHTGUN_AUX_B: + return winraw_is_pressed(wr, joypad_info, binds[port], port, RARCH_LIGHTGUN_AUX_B); + case RETRO_DEVICE_ID_LIGHTGUN_AUX_C: + return winraw_is_pressed(wr, joypad_info, binds[port], port, RARCH_LIGHTGUN_AUX_C); + case RETRO_DEVICE_ID_LIGHTGUN_START: + return winraw_is_pressed(wr, joypad_info, binds[port], port, RARCH_LIGHTGUN_START); + case RETRO_DEVICE_ID_LIGHTGUN_SELECT: + return winraw_is_pressed(wr, joypad_info, binds[port], port, RARCH_LIGHTGUN_SELECT); + case RETRO_DEVICE_ID_LIGHTGUN_DPAD_UP: + return winraw_is_pressed(wr, joypad_info, binds[port], port, RARCH_LIGHTGUN_DPAD_UP); + case RETRO_DEVICE_ID_LIGHTGUN_DPAD_DOWN: + return winraw_is_pressed(wr, joypad_info, binds[port], port, RARCH_LIGHTGUN_DPAD_DOWN); + case RETRO_DEVICE_ID_LIGHTGUN_DPAD_LEFT: + return winraw_is_pressed(wr, joypad_info, binds[port], port, RARCH_LIGHTGUN_DPAD_LEFT); + case RETRO_DEVICE_ID_LIGHTGUN_DPAD_RIGHT: + return winraw_is_pressed(wr, joypad_info, binds[port], port, RARCH_LIGHTGUN_DPAD_RIGHT); + + /*deprecated*/ + case RETRO_DEVICE_ID_LIGHTGUN_X: + case RETRO_DEVICE_ID_LIGHTGUN_Y: + return winraw_deprecated_lightgun_state(wr, port, id); + case RETRO_DEVICE_ID_LIGHTGUN_PAUSE: + return winraw_is_pressed(wr, joypad_info, binds[port], port, RARCH_LIGHTGUN_START); + } + break; } return 0; diff --git a/input/drivers/x11_input.c b/input/drivers/x11_input.c index 40842f0719..e21e9a100e 100644 --- a/input/drivers/x11_input.c +++ b/input/drivers/x11_input.c @@ -30,6 +30,7 @@ #include "../../gfx/video_driver.h" #include "../common/input_x11_common.h" +#include "../../configuration.h" #include "../../verbosity.h" typedef struct x11_input @@ -72,6 +73,78 @@ static void *x_input_init(const char *joypad_driver) return x11; } +static bool x_keyboard_pressed(x11_input_t *x11, unsigned key) +{ + int keycode = XKeysymToKeycode(x11->display, rarch_keysym_lut[(enum retro_key)key]); + return x11->state[keycode >> 3] & (1 << (keycode & 7)); +} + +static bool x_mbutton_pressed(x11_input_t *x11, unsigned port, unsigned key) +{ + bool result; + settings_t *settings = config_get_ptr(); + + if (port >= MAX_USERS) + return false; + + /* the driver only supports one mouse */ + if ( settings->uints.input_mouse_index[ port ] != 0 ) + return false; + + switch ( key ) + { + + case RETRO_DEVICE_ID_MOUSE_LEFT: + return x11->mouse_l; + case RETRO_DEVICE_ID_MOUSE_RIGHT: + return x11->mouse_r; + case RETRO_DEVICE_ID_MOUSE_MIDDLE: + return x11->mouse_m; +/* case RETRO_DEVICE_ID_MOUSE_BUTTON_4: + return x11->mouse_b4;*/ +/* case RETRO_DEVICE_ID_MOUSE_BUTTON_5: + return x11->mouse_b5;*/ + + case RETRO_DEVICE_ID_MOUSE_WHEELUP: + case RETRO_DEVICE_ID_MOUSE_WHEELDOWN: + return x_mouse_state_wheel( key ); + +/* case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP: + result = x11->mouse_hwu; + x11->mouse_hwu = false; + return result; + + case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN: + result = x11->mouse_hwd; + x11->mouse_hwd = false; + return result; +*/ + } + + return false; +} + +static bool x_is_pressed(x11_input_t *x11, + rarch_joypad_info_t joypad_info, + const struct retro_keybind *binds, + unsigned port, unsigned id) +{ + const struct retro_keybind *bind = &binds[id]; + + if ( (bind->key < RETROK_LAST) && x_keyboard_pressed(x11, bind->key) ) + return true; + + if (binds && binds[id].valid) + { + if (x_mbutton_pressed(x11, port, bind->mbutton)) + return true; + if (input_joypad_pressed(x11->joypad, joypad_info, port, binds, id)) + return true; + } + + return false; +} + static int16_t x_pressed_analog(x11_input_t *x11, const struct retro_keybind *binds, unsigned idx, unsigned id) { @@ -111,6 +184,44 @@ static bool x_input_meta_key_pressed(void *data, int key) return false; } +static int16_t x_lightgun_aiming_state( x11_input_t *x11, unsigned idx, unsigned id ) +{ + const int edge_detect = 32700; + struct video_viewport vp; + bool inside = false; + int16_t res_x = 0; + int16_t res_y = 0; + int16_t res_screen_x = 0; + int16_t res_screen_y = 0; + + vp.x = 0; + vp.y = 0; + vp.width = 0; + vp.height = 0; + vp.full_width = 0; + vp.full_height = 0; + + if (!(video_driver_translate_coord_viewport_wrap(&vp, x11->mouse_x, x11->mouse_y, + &res_x, &res_y, &res_screen_x, &res_screen_y))) + return 0; + + inside = (res_x >= -edge_detect) && (res_y >= -edge_detect) && (res_x <= edge_detect) && (res_y <= edge_detect); + + switch ( id ) + { + case RETRO_DEVICE_ID_LIGHTGUN_SCREEN_X: + return inside ? res_x : 0; + case RETRO_DEVICE_ID_LIGHTGUN_SCREEN_Y: + return inside ? res_y : 0; + case RETRO_DEVICE_ID_LIGHTGUN_IS_OFFSCREEN: + return !inside; + default: + break; + } + + return 0; +} + static int16_t x_mouse_state(x11_input_t *x11, unsigned id) { switch (id) @@ -193,29 +304,6 @@ static int16_t x_pointer_state(x11_input_t *x11, return 0; } -static int16_t x_lightgun_state(x11_input_t *x11, unsigned id) -{ - switch (id) - { - case RETRO_DEVICE_ID_LIGHTGUN_X: - return x11->mouse_x - x11->mouse_last_x; - case RETRO_DEVICE_ID_LIGHTGUN_Y: - return x11->mouse_y - x11->mouse_last_y; - case RETRO_DEVICE_ID_LIGHTGUN_TRIGGER: - return x11->mouse_l; - case RETRO_DEVICE_ID_LIGHTGUN_CURSOR: - return x11->mouse_m; - case RETRO_DEVICE_ID_LIGHTGUN_TURBO: - return x11->mouse_r; - case RETRO_DEVICE_ID_LIGHTGUN_START: - return x11->mouse_m && x11->mouse_r; - case RETRO_DEVICE_ID_LIGHTGUN_PAUSE: - return x11->mouse_m && x11->mouse_l; - } - - return 0; -} - static int16_t x_input_state(void *data, rarch_joypad_info_t joypad_info, const struct retro_keybind **binds, unsigned port, @@ -227,23 +315,11 @@ static int16_t x_input_state(void *data, switch (device) { case RETRO_DEVICE_JOYPAD: - { - int keycode = XKeysymToKeycode(x11->display, - rarch_keysym_lut[(enum retro_key)binds[port][id].key]); - ret = (binds[port][id].key < RETROK_LAST) && (x11->state[keycode >> 3] & (1 << (keycode & 7))); - if (!ret) - ret = input_joypad_pressed(x11->joypad, - joypad_info, port, binds[port], id); - } - return ret; + if (id < RARCH_BIND_LIST_END) + return x_is_pressed(x11, joypad_info, binds[port], port, id); + break; case RETRO_DEVICE_KEYBOARD: - if (id < RETROK_LAST) - { - int keycode = XKeysymToKeycode(x11->display, - rarch_keysym_lut[(enum retro_key)id]); - ret = x11->state[keycode >> 3] & (1 << (keycode & 7)); - } - return ret; + return (id < RETROK_LAST) && x_keyboard_pressed(x11, id); case RETRO_DEVICE_ANALOG: ret = x_pressed_analog(x11, binds[port], idx, id); if (!ret && binds[port]) @@ -263,7 +339,48 @@ static int16_t x_input_state(void *data, device == RARCH_DEVICE_POINTER_SCREEN); break; case RETRO_DEVICE_LIGHTGUN: - return x_lightgun_state(x11, id); + switch ( id ) + { + /*aiming*/ + case RETRO_DEVICE_ID_LIGHTGUN_SCREEN_X: + case RETRO_DEVICE_ID_LIGHTGUN_SCREEN_Y: + case RETRO_DEVICE_ID_LIGHTGUN_IS_OFFSCREEN: + return x_lightgun_aiming_state( x11, idx, id ); + + /*buttons*/ + case RETRO_DEVICE_ID_LIGHTGUN_TRIGGER: + return x_is_pressed(x11, joypad_info, binds[port], port, RARCH_LIGHTGUN_TRIGGER); + case RETRO_DEVICE_ID_LIGHTGUN_RELOAD: + return x_is_pressed(x11, joypad_info, binds[port], port, RARCH_LIGHTGUN_RELOAD); + case RETRO_DEVICE_ID_LIGHTGUN_AUX_A: + return x_is_pressed(x11, joypad_info, binds[port], port, RARCH_LIGHTGUN_AUX_A); + case RETRO_DEVICE_ID_LIGHTGUN_AUX_B: + return x_is_pressed(x11, joypad_info, binds[port], port, RARCH_LIGHTGUN_AUX_B); + case RETRO_DEVICE_ID_LIGHTGUN_AUX_C: + return x_is_pressed(x11, joypad_info, binds[port], port, RARCH_LIGHTGUN_AUX_C); + case RETRO_DEVICE_ID_LIGHTGUN_START: + return x_is_pressed(x11, joypad_info, binds[port], port, RARCH_LIGHTGUN_START); + case RETRO_DEVICE_ID_LIGHTGUN_SELECT: + return x_is_pressed(x11, joypad_info, binds[port], port, RARCH_LIGHTGUN_SELECT); + case RETRO_DEVICE_ID_LIGHTGUN_DPAD_UP: + return x_is_pressed(x11, joypad_info, binds[port], port, RARCH_LIGHTGUN_DPAD_UP); + case RETRO_DEVICE_ID_LIGHTGUN_DPAD_DOWN: + return x_is_pressed(x11, joypad_info, binds[port], port, RARCH_LIGHTGUN_DPAD_DOWN); + case RETRO_DEVICE_ID_LIGHTGUN_DPAD_LEFT: + return x_is_pressed(x11, joypad_info, binds[port], port, RARCH_LIGHTGUN_DPAD_LEFT); + case RETRO_DEVICE_ID_LIGHTGUN_DPAD_RIGHT: + return x_is_pressed(x11, joypad_info, binds[port], port, RARCH_LIGHTGUN_DPAD_RIGHT); + + /*deprecated*/ + case RETRO_DEVICE_ID_LIGHTGUN_X: + return x11->mouse_x - x11->mouse_last_x; + case RETRO_DEVICE_ID_LIGHTGUN_Y: + return x11->mouse_y - x11->mouse_last_y; + case RETRO_DEVICE_ID_LIGHTGUN_PAUSE: + return x_is_pressed(x11, joypad_info, binds[port], port, RARCH_LIGHTGUN_START); + + } + break; } return 0; diff --git a/input/drivers_hid/btstack_hid.c b/input/drivers_hid/btstack_hid.c index 02e4d0d5fb..83eec68c61 100644 --- a/input/drivers_hid/btstack_hid.c +++ b/input/drivers_hid/btstack_hid.c @@ -1,7 +1,7 @@ /* RetroArch - A frontend for libretro. * Copyright (C) 2013-2014 - Jason Fetters * Copyright (C) 2011-2017 - Daniel De Matteis - * + * * RetroArch is free software: you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Found- * ation, either version 3 of the License, or (at your option) any later version. @@ -44,13 +44,13 @@ #define LINK_KEY_LEN 16 /* The device name type. */ #define DEVICE_NAME_LEN 248 - + /* Type definitions. */ typedef uint16_t hci_con_handle_t; typedef uint8_t bd_addr_t[BD_ADDR_LEN]; typedef uint8_t link_key_t[LINK_KEY_LEN]; typedef uint8_t device_name_t[DEVICE_NAME_LEN+1]; - + /* Packet handler. */ typedef void (*btstack_packet_handler_t) (uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size); @@ -62,7 +62,7 @@ typedef enum HCI_POWER_ON, HCI_POWER_SLEEP } HCI_POWER_MODE; - + /* State of BTstack */ typedef enum { @@ -73,14 +73,14 @@ typedef enum HCI_STATE_SLEEPING, HCI_STATE_FALLING_ASLEEP } HCI_STATE; - + typedef enum { RUN_LOOP_POSIX = 1, RUN_LOOP_COCOA, RUN_LOOP_EMBEDDED } RUN_LOOP_TYPE; - + /* compact HCI Command packet description */ typedef struct { @@ -93,7 +93,7 @@ typedef struct linked_item struct linked_item *next; /* <-- next element in list, or NULL */ void *user_data; /* <-- pointer to struct base */ } linked_item_t; - + typedef linked_item_t *linked_list_t; typedef struct data_source @@ -108,7 +108,7 @@ typedef struct data_source typedef struct timer { - linked_item_t item; + linked_item_t item; /* Next timeout. */ struct timeval timeout; #ifdef HAVE_TICK @@ -167,7 +167,7 @@ BTDIMPORT const hci_cmd_t* l2cap_decline_connection_ptr; /* extension for client/server communication */ #define DAEMON_EVENT_PACKET 0x05 - + /* L2CAP data */ #define L2CAP_DATA_PACKET 0x06 @@ -179,7 +179,7 @@ BTDIMPORT const hci_cmd_t* l2cap_decline_connection_ptr; /* Security Manager protocol data */ #define SM_DATA_PACKET 0x09 - + /* debug log messages */ #define LOG_MESSAGE_PACKET 0xFC @@ -228,7 +228,7 @@ BTDIMPORT const hci_cmd_t* l2cap_decline_connection_ptr; #define HCI_SUBEVENT_LE_CONNECTION_UPDATE_COMPLETE 0x03 #define HCI_SUBEVENT_LE_READ_REMOTE_USED_FEATURES_COMPLETE 0x04 #define HCI_SUBEVENT_LE_LONG_TERM_KEY_REQUEST 0x05 - + /* last used HCI_EVENT in 2.1 is 0x3d */ /* events 0x50-0x5f are used internally */ @@ -257,7 +257,7 @@ BTDIMPORT const hci_cmd_t* l2cap_decline_connection_ptr; #define BTSTACK_EVENT_DISCOVERABLE_ENABLED 0x66 /* L2CAP EVENTS */ - + /* data: event (8), len(8), status (8), address(48), handle (16), psm (16), local_cid(16), remote_cid (16), local_mtu(16), remote_mtu(16) */ #define L2CAP_EVENT_CHANNEL_OPENED 0x70 @@ -277,31 +277,31 @@ BTDIMPORT const hci_cmd_t* l2cap_decline_connection_ptr; #define L2CAP_EVENT_SERVICE_REGISTERED 0x75 /* RFCOMM EVENTS */ - + // data: event(8), len(8), status (8), address (48), handle (16), server channel(8), rfcomm_cid(16), max frame size(16) #define RFCOMM_EVENT_OPEN_CHANNEL_COMPLETE 0x80 - + // data: event(8), len(8), rfcomm_cid(16) #define RFCOMM_EVENT_CHANNEL_CLOSED 0x81 - + // data: event (8), len(8), address(48), channel (8), rfcomm_cid (16) #define RFCOMM_EVENT_INCOMING_CONNECTION 0x82 - + // data: event (8), len(8), rfcommid (16), ... #define RFCOMM_EVENT_REMOTE_LINE_STATUS 0x83 - + /* data: event(8), len(8), rfcomm_cid(16), credits(8) */ #define RFCOMM_EVENT_CREDITS 0x84 - + /* data: event(8), len(8), status (8), rfcomm server channel id (8) */ #define RFCOMM_EVENT_SERVICE_REGISTERED 0x85 - + /* data: event(8), len(8), status (8), rfcomm server channel id (8) */ #define RFCOMM_EVENT_PERSISTENT_CHANNEL 0x86 - + /* data: event(8), len(8), status(8), service_record_handle(32) */ #define SDP_SERVICE_REGISTERED 0x90 - + /* last error code in 2.1 is 0x38 - we start with 0x50 for BTstack errors */ #define BTSTACK_CONNECTION_TO_BTDAEMON_FAILED 0x50 @@ -329,14 +329,14 @@ BTDIMPORT const hci_cmd_t* l2cap_decline_connection_ptr; #define L2CAP_CONFIG_RESPONSE_RESULT_REJECTED 0x68 #define L2CAP_CONFIG_RESPONSE_RESULT_UNKNOWN_OPTIONS 0x69 #define L2CAP_SERVICE_ALREADY_REGISTERED 0x6a - + #define RFCOMM_MULTIPLEXER_STOPPED 0x70 #define RFCOMM_CHANNEL_ALREADY_REGISTERED 0x71 #define RFCOMM_NO_OUTGOING_CREDITS 0x72 #define SDP_HANDLE_ALREADY_REGISTERED 0x80 - -/* Default INQ Mode + +/* Default INQ Mode * 0x9E8B33: General/Unlimited Inquiry Access Code (GIAC) **/ #define HCI_INQUIRY_LAP 0x9E8B33L @@ -350,7 +350,7 @@ extern const hci_cmd_t btstack_get_system_bluetooth_enabled; extern const hci_cmd_t btstack_set_system_bluetooth_enabled; extern const hci_cmd_t btstack_set_discoverable; extern const hci_cmd_t btstack_set_bluetooth_enabled; /* only used by btstack config */ - + extern const hci_cmd_t hci_accept_connection_request; extern const hci_cmd_t hci_authentication_requested; extern const hci_cmd_t hci_change_connection_link_key; @@ -425,7 +425,7 @@ extern const hci_cmd_t hci_le_set_scan_response_data; extern const hci_cmd_t hci_le_start_encryption; extern const hci_cmd_t hci_le_test_end; extern const hci_cmd_t hci_le_transmitter_test; - + extern const hci_cmd_t l2cap_accept_connection; extern const hci_cmd_t l2cap_create_channel; extern const hci_cmd_t l2cap_create_channel_mtu; @@ -487,12 +487,12 @@ void run_loop_set_timer_handler(timer_source_t *ts, void (*process)(timer_source_t *_ts)); /* Add timer source. */ -void run_loop_add_timer(timer_source_t *timer); +void run_loop_add_timer(timer_source_t *timer); /* Remove timer source. */ int run_loop_remove_timer(timer_source_t *timer); -/* Init must be called before any other run_loop call. +/* Init must be called before any other run_loop call. * Use RUN_LOOP_EMBEDDED for embedded devices. */ void run_loop_init(RUN_LOOP_TYPE type); @@ -507,7 +507,7 @@ void run_loop_add_data_source(data_source_t *dataSource); /* Remove data source. */ int run_loop_remove_data_source(data_source_t *dataSource); -/* Execute configured run loop. +/* Execute configured run loop. * This function does not return. */ void run_loop_execute(void); @@ -525,7 +525,7 @@ uint32_t embedded_get_ticks(void); /* Connection handle type. */ - + /* helper for BT little endian format. */ #define READ_BT_16( buffer, pos) ( ((uint16_t) buffer[pos]) | (((uint16_t)buffer[pos+1]) << 8)) #define READ_BT_24( buffer, pos) ( ((uint32_t) buffer[pos]) | (((uint32_t)buffer[pos+1]) << 8) | (((uint32_t)buffer[pos+2]) << 16)) @@ -573,18 +573,18 @@ void hexdump(void *data, int size); void printUUID(uint8_t *uuid); /* Deprecated - please use more convenient bd_addr_to_str. */ -void print_bd_addr( bd_addr_t addr); +void print_bd_addr(bd_addr_t addr); char * bd_addr_to_str(bd_addr_t addr); int sscan_bd_addr(uint8_t * addr_string, bd_addr_t addr); - + uint8_t crc8_check(uint8_t *data, uint16_t len, uint8_t check_sum); uint8_t crc8_calc(uint8_t *data, uint16_t len); /* btstack.h */ - + /* Default TCP port for BTstack daemon. */ #define BTSTACK_PORT 13333 @@ -594,13 +594,13 @@ uint8_t crc8_calc(uint8_t *data, uint16_t len); /* Optional * - * If called before bt_open, TCP socket is used + * If called before bt_open, TCP socket is used * instead of local UNIX socket. * - * note: Address is not copied and must be + * note: Address is not copied and must be * valid during bt_open. */ -void bt_use_tcp(const char * address, uint16_t port); +void bt_use_tcp(const char * address, uint16_t port); /* Init BTstack library. */ int bt_open(void); @@ -611,7 +611,7 @@ int bt_close(void); /* Send HCI cmd packet. */ int bt_send_cmd(const hci_cmd_t *cmd, ...); -/* Register packet handler -- channel only valid +/* Register packet handler -- channel only valid for L2CAP and RFCOMM packets. */ btstack_packet_handler_t bt_register_packet_handler( @@ -783,7 +783,7 @@ static void btpad_queue_process_cmd(struct btpad_queue_command *cmd) { if (!cmd) return; - + if (cmd->command == btstack_set_power_mode_ptr) bt_send_cmd_ptr( cmd->command, @@ -808,7 +808,7 @@ static void btpad_queue_process_cmd(struct btpad_queue_command *cmd) cmd->hci_remote_name_request.page_scan_repetition_mode, cmd->hci_remote_name_request.reserved, cmd->hci_remote_name_request.clock_offset); - + else if (cmd->command == hci_pin_code_request_reply_ptr) bt_send_cmd_ptr( cmd->command, @@ -889,7 +889,7 @@ static void btpad_queue_hci_remote_name_request( cmd->command = hci_remote_name_request_ptr; memcpy(cmd->hci_remote_name_request.bd_addr, bd_addr, sizeof(bd_addr_t)); - cmd->hci_remote_name_request.page_scan_repetition_mode = + cmd->hci_remote_name_request.page_scan_repetition_mode = page_scan_repetition_mode; cmd->hci_remote_name_request.reserved = reserved; cmd->hci_remote_name_request.clock_offset = clock_offset; @@ -1024,7 +1024,7 @@ static void btpad_packet_handler(uint8_t packet_type, if (!connection || connection->state != BTPAD_CONNECTED) continue; - if ( connection->channels[0] == channel + if ( connection->channels[0] == channel || connection->channels[1] == channel) pad_connection_packet(&slots[connection->slot], connection->slot, packet, size); } @@ -1036,14 +1036,14 @@ static void btpad_packet_handler(uint8_t packet_type, RARCH_LOG("[BTstack]: HCI State %d.\n", packet[2]); switch (packet[2]) - { + { case HCI_STATE_WORKING: btpad_queue_reset(); btpad_queue_hci_read_bd_addr(cmd); /* TODO: Where did I get 672 for MTU? */ - bt_send_cmd_ptr(l2cap_register_service_ptr, PSM_HID_CONTROL, 672); + bt_send_cmd_ptr(l2cap_register_service_ptr, PSM_HID_CONTROL, 672); bt_send_cmd_ptr(l2cap_register_service_ptr, PSM_HID_INTERRUPT, 672); btpad_queue_hci_inquiry(cmd, HCI_INQUIRY_LAP, 3, 1); @@ -1052,7 +1052,7 @@ static void btpad_packet_handler(uint8_t packet_type, case HCI_STATE_HALTING: btpad_close_all_connections(); - break; + break; } break; @@ -1100,7 +1100,7 @@ static void btpad_packet_handler(uint8_t packet_type, break; case HCI_EVENT_INQUIRY_COMPLETE: - /* This must be turned off during gameplay + /* This must be turned off during gameplay * as it causes a ton of lag. */ inquiry_running = !inquiry_off; @@ -1363,26 +1363,29 @@ static const char *btstack_hid_joypad_name(void *data, unsigned pad) return NULL; } -static uint64_t btstack_hid_joypad_get_buttons(void *data, unsigned port) +static void btstack_hid_joypad_get_buttons(void *data, unsigned port, retro_bits_t *state) { - btstack_hid_t *hid = (btstack_hid_t*)data; - if (hid) - return pad_connection_get_buttons(&hid->slots[port], port); - return 0; + btstack_hid_t *hid = (btstack_hid_t*)data; + if (hid) + pad_connection_get_buttons(&hid->slots[port], port, state); + else + RARCH_INPUT_STATE_CLEAR_PTR(state); } static bool btstack_hid_joypad_button(void *data, unsigned port, uint16_t joykey) { - uint64_t buttons = btstack_hid_joypad_get_buttons(data, port); + retro_bits_t buttons; + btstack_hid_joypad_get_buttons(data, port, &buttons); - /* Check hat. */ - if (GET_HAT_DIR(joykey)) - return false; + /* Check hat. */ + if (GET_HAT_DIR(joykey)) + return false; - /* Check the button. */ - if ((port < MAX_USERS) && (joykey < 32)) - return ((buttons & (1 << joykey)) != 0); - return false; + /* Check the button. */ + if ((port < MAX_USERS) && (joykey < 32)) + return (RARCH_INPUT_STATE_BIT_GET(buttons, joykey) != 0); + + return false; } static bool btstack_hid_joypad_rumble(void *data, unsigned pad, diff --git a/input/drivers_hid/iohidmanager_hid.c b/input/drivers_hid/iohidmanager_hid.c index e63f3cf7ad..aac33afd56 100644 --- a/input/drivers_hid/iohidmanager_hid.c +++ b/input/drivers_hid/iohidmanager_hid.c @@ -108,21 +108,23 @@ static const char *iohidmanager_hid_joypad_name(void *data, unsigned pad) return NULL; } -static uint64_t iohidmanager_hid_joypad_get_buttons(void *data, unsigned port) +static void iohidmanager_hid_joypad_get_buttons(void *data, unsigned port, retro_bits_t *state) { - iohidmanager_hid_t *hid = (iohidmanager_hid_t*)data; - if (hid) - return pad_connection_get_buttons(&hid->slots[port], port); - return 0; + iohidmanager_hid_t *hid = (iohidmanager_hid_t*)data; + if (hid) + return pad_connection_get_buttons(&hid->slots[port], port, state); + else + RARCH_INPUT_STATE_CLEAR_PTR(state); } static bool iohidmanager_hid_joypad_button(void *data, unsigned port, uint16_t joykey) { - uint64_t buttons = - iohidmanager_hid_joypad_get_buttons(data, port); - iohidmanager_hid_t *hid = (iohidmanager_hid_t*)data; - unsigned hat_dir = GET_HAT_DIR(joykey); + retro_bits_t buttons; + iohidmanager_hid_t *hid = (iohidmanager_hid_t*)data; + unsigned hat_dir = GET_HAT_DIR(joykey); + + iohidmanager_hid_joypad_get_buttons(data, port, &buttons); /* Check hat. */ if (hat_dir) @@ -148,8 +150,9 @@ static bool iohidmanager_hid_joypad_button(void *data, /* Check the button. */ if ((port < MAX_USERS) && (joykey < 32)) - return ((buttons & (1 << joykey)) != 0) + return (RARCH_INPUT_STATE_BIT_GET(buttons, joykey) != 0) || ((hid->buttons[port] & (1 << joykey)) != 0); + return false; } diff --git a/input/drivers_hid/libusb_hid.c b/input/drivers_hid/libusb_hid.c index 357504e46b..257b4819cc 100644 --- a/input/drivers_hid/libusb_hid.c +++ b/input/drivers_hid/libusb_hid.c @@ -16,7 +16,11 @@ #include #include +#ifdef __FreeBSD__ +#include +#else #include +#endif #include #include @@ -38,7 +42,12 @@ typedef struct libusb_hid libusb_context *ctx; joypad_connection_t *slots; sthread_t *poll_thread; + int can_hotplug; +#if defined(__FreeBSD__) && LIBUSB_API_VERSION <= 0x01000102 + libusb_hotplug_callback_handle hp; +#else int hp; /* libusb_hotplug_callback_handle is just int */ +#endif int quit; } libusb_hid_t; @@ -157,7 +166,13 @@ static void libusb_get_description(struct libusb_device *device, unsigned i, k; struct libusb_config_descriptor *config; - libusb_get_config_descriptor(device, 0, &config); + int desc_ret = libusb_get_config_descriptor(device, 0, &config); + + if (desc_ret != 0) + { + RARCH_ERR("Error %d getting libusb config descriptor\n", desc_ret); + return; + } for (i = 0; i < (int)config->bNumInterfaces; i++) { @@ -200,11 +215,12 @@ static void libusb_get_description(struct libusb_device *device, } } } + goto ret; } } - ret: +ret: libusb_free_config_descriptor(config); } @@ -299,7 +315,8 @@ static int add_adapter(void *data, struct libusb_device *dev) if (!pad_connection_has_interface(hid->slots, adapter->slot)) { - RARCH_ERR(" Interface not found (%s).\n", adapter->name); + RARCH_ERR("Interface not found (%s) (VID/PID: %04x:%04x).\n", + adapter->name, desc.idVendor, desc.idProduct); goto error; } @@ -426,18 +443,20 @@ static const char *libusb_hid_joypad_name(void *data, unsigned pad) return NULL; } -static uint64_t libusb_hid_joypad_get_buttons(void *data, unsigned port) +static void libusb_hid_joypad_get_buttons(void *data, unsigned port, retro_bits_t *state) { libusb_hid_t *hid = (libusb_hid_t*)data; if (hid) - return pad_connection_get_buttons(&hid->slots[port], port); - return 0; + return pad_connection_get_buttons(&hid->slots[port], port, state); + else + RARCH_INPUT_STATE_CLEAR_PTR(state); } static bool libusb_hid_joypad_button(void *data, unsigned port, uint16_t joykey) { - uint64_t buttons = libusb_hid_joypad_get_buttons(data, port); + retro_bits_t buttons; + libusb_hid_joypad_get_buttons(data, port, &buttons); /* Check hat. */ if (GET_HAT_DIR(joykey)) @@ -445,7 +464,7 @@ static bool libusb_hid_joypad_button(void *data, /* Check the button. */ if ((port < MAX_USERS) && (joykey < 32)) - return ((buttons & (1 << joykey)) != 0); + return (RARCH_INPUT_STATE_BIT_GET(buttons, joykey) != 0); return false; } @@ -502,9 +521,11 @@ static void libusb_hid_free(void *data) sthread_join(hid->poll_thread); } - pad_connection_destroy(hid->slots); + if (hid->slots) + pad_connection_destroy(hid->slots); - libusb_hotplug_deregister_callback(hid->ctx, hid->hp); + if (hid->can_hotplug) + libusb_hotplug_deregister_callback(hid->ctx, hid->hp); libusb_exit(hid->ctx); free(hid); @@ -537,8 +558,22 @@ static void *libusb_hid_init(void) if (ret < 0) goto error; - if (!libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) - goto error; +#if LIBUSB_API_VERSION <= 0x01000102 + /* API is too old, so libusb_has_capability function does not exist. + * Since we can't be sure, we assume for now there might be hot-plugging + * capability and continue on until we're told otherwise. + */ + hid->can_hotplug = 1; +#else + /* Ask libusb if it supports hotplug and store the result. + * Note: On Windows this will probably be false, see: + * https://github.com/libusb/libusb/issues/86 + */ + if (libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) + hid->can_hotplug = 1; + else + hid->can_hotplug = 0; +#endif hid->slots = pad_connection_init(MAX_USERS); @@ -559,22 +594,29 @@ static void *libusb_hid_init(void) if (count > 0) libusb_free_device_list(devices, 1); - ret = libusb_hotplug_register_callback( - hid->ctx, - (libusb_hotplug_event)(LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED | - LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT), - (libusb_hotplug_flag)LIBUSB_HOTPLUG_ENUMERATE, - LIBUSB_HOTPLUG_MATCH_ANY, - LIBUSB_HOTPLUG_MATCH_ANY, - LIBUSB_HOTPLUG_MATCH_ANY, - libusb_hid_hotplug_callback, - hid, - &hid->hp); - - if (ret != LIBUSB_SUCCESS) + if (hid->can_hotplug) { - RARCH_ERR("Error creating a hotplug callback.\n"); - goto error; + ret = libusb_hotplug_register_callback( + hid->ctx, + (libusb_hotplug_event)(LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED | + LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT), + (libusb_hotplug_flag)LIBUSB_HOTPLUG_ENUMERATE, + LIBUSB_HOTPLUG_MATCH_ANY, + LIBUSB_HOTPLUG_MATCH_ANY, + LIBUSB_HOTPLUG_MATCH_ANY, + libusb_hid_hotplug_callback, + hid, + &hid->hp); + + if (ret != LIBUSB_SUCCESS) + { + /* Creating the hotplug callback has failed. We assume libusb + * is still okay to continue and just update our knowledge of + * the situation accordingly. + */ + RARCH_WARN("[libusb] Failed to create a hotplug callback.\n"); + hid->can_hotplug = 0; + } } hid->poll_thread = sthread_create(poll_thread, hid); diff --git a/input/drivers_hid/null_hid.c b/input/drivers_hid/null_hid.c index 10be0ba7c8..34f8bdb7d6 100644 --- a/input/drivers_hid/null_hid.c +++ b/input/drivers_hid/null_hid.c @@ -1,7 +1,7 @@ /* RetroArch - A frontend for libretro. * Copyright (C) 2013-2014 - Jason Fetters * Copyright (C) 2011-2017 - Daniel De Matteis - * + * * RetroArch is free software: you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Found- * ation, either version 3 of the License, or (at your option) any later version. @@ -38,12 +38,12 @@ static const char *null_hid_joypad_name(void *data, unsigned pad) return NULL; } -static uint64_t null_hid_joypad_get_buttons(void *data, unsigned port) +static void null_hid_joypad_get_buttons(void *data, unsigned port, retro_bits_t *state) { (void)data; (void)port; - return 0; + RARCH_INPUT_STATE_CLEAR_PTR(state); } static bool null_hid_joypad_button(void *data, unsigned port, uint16_t joykey) diff --git a/input/drivers_hid/wiiusb_hid.c b/input/drivers_hid/wiiusb_hid.c index 8c022a12b8..3f0fdb282c 100644 --- a/input/drivers_hid/wiiusb_hid.c +++ b/input/drivers_hid/wiiusb_hid.c @@ -64,7 +64,7 @@ struct wiiusb_adapter int32_t slot; uint8_t *data; - uint8_t send_control_type; + uint8_t send_control_type; uint8_t *send_control_buffer; uint32_t send_control_size; }; @@ -113,10 +113,10 @@ static int32_t wiiusb_hid_read_cb(int32_t size, void *data) pad_connection_packet(&hid->connections[adapter->slot], adapter->slot, adapter->data-1, size+1); - if (adapter) + if (adapter) adapter->busy = false; - return size; + return size; } static void wiiusb_hid_device_send_control(void *data, @@ -398,7 +398,7 @@ static void wiiusb_hid_scan_for_devices(wiiusb_hid_t *hid) for (i = 0; i < count; i++) { - /* first check the device is not already in our list */ + /* first check the device is not already in our list */ if (!wiiusb_hid_new_device(hid, dev_entries[i].device_id)) continue; @@ -461,11 +461,11 @@ static int wiiusb_hid_change_cb(int result, void *usrdata) return -1; /* As it's not coming from the removal callback - then we detected a new device being inserted */ - if (!hid->removal_cb) - hid->device_detected = true; - else - hid->removal_cb = false; + then we detected a new device being inserted */ + if (!hid->removal_cb) + hid->device_detected = true; + else + hid->removal_cb = false; /* Re-submit the change alert */ USB_DeviceChangeNotifyAsync(USB_CLASS_HID, wiiusb_hid_change_cb, usrdata); @@ -478,33 +478,36 @@ static bool wiiusb_hid_joypad_query(void *data, unsigned pad) return pad < MAX_USERS; } -static uint64_t wiiusb_hid_joypad_get_buttons(void *data, unsigned port) +static void wiiusb_hid_joypad_get_buttons(void *data, unsigned port, retro_bits_t *state) { - wiiusb_hid_t *hid = (wiiusb_hid_t*)data; - if (hid) - return pad_connection_get_buttons(&hid->connections[port], port); - return 0; + wiiusb_hid_t *hid = (wiiusb_hid_t*)data; + if (hid) + return pad_connection_get_buttons(&hid->connections[port], port, state); + else + RARCH_INPUT_STATE_CLEAR_PTR(state); } static bool wiiusb_hid_joypad_button(void *data, unsigned port, uint16_t joykey) { - uint64_t buttons = wiiusb_hid_joypad_get_buttons(data, port); + retro_bits_t buttons; - /* Check hat. */ - if (GET_HAT_DIR(joykey)) - return false; + wiiusb_hid_joypad_get_buttons(data, port, &buttons); - /* Check the button. */ - if ((port < MAX_USERS) && (joykey < 32)) - return ((buttons & (1 << joykey)) != 0); + /* Check hat. */ + if (GET_HAT_DIR(joykey)) + return false; - return false; + /* Check the button. */ + if ((port < MAX_USERS) && (joykey < 32)) + return (RARCH_INPUT_STATE_BIT_GET(buttons, joykey) != 0); + + return false; } static bool wiiusb_hid_joypad_rumble(void *data, unsigned pad, enum retro_rumble_effect effect, uint16_t strength) { - wiiusb_hid_t *hid = (wiiusb_hid_t*)data; + wiiusb_hid_t *hid = (wiiusb_hid_t*)data; if (!hid) return false; diff --git a/input/drivers_joypad/ctr_joypad.c b/input/drivers_joypad/ctr_joypad.c index aa1b3efcbe..a31a7511fe 100644 --- a/input/drivers_joypad/ctr_joypad.c +++ b/input/drivers_joypad/ctr_joypad.c @@ -31,7 +31,7 @@ #define MAX_PADS 1 #endif -static uint64_t pad_state; +static uint32_t pad_state; static int16_t analog_state[1][2][2]; extern uint64_t lifecycle_state; @@ -67,12 +67,16 @@ static bool ctr_joypad_button(unsigned port_num, uint16_t key) if (port_num >= MAX_PADS) return false; - return (pad_state & (UINT64_C(1) << key)); + return (pad_state & (1 << key)); } -static uint64_t ctr_joypad_get_buttons(unsigned port_num) +static void ctr_joypad_get_buttons(unsigned port_num, retro_bits_t *state) { - return pad_state; + if ( port_num < MAX_PADS ) { + RARCH_INPUT_STATE_COPY16_PTR( state, pad_state ); + } else { + RARCH_INPUT_STATE_CLEAR_PTR(state); + } } static int16_t ctr_joypad_axis(unsigned port_num, uint32_t joyaxis) @@ -140,20 +144,20 @@ static void ctr_joypad_poll(void) hidTouchRead(&state_tmp_touch); pad_state = 0; - pad_state |= (state_tmp & KEY_DLEFT) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_LEFT) : 0; - pad_state |= (state_tmp & KEY_DDOWN) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_DOWN) : 0; - pad_state |= (state_tmp & KEY_DRIGHT) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_RIGHT) : 0; - pad_state |= (state_tmp & KEY_DUP) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_UP) : 0; - pad_state |= (state_tmp & KEY_START) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_START) : 0; - pad_state |= (state_tmp & KEY_SELECT) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_SELECT) : 0; - pad_state |= (state_tmp & KEY_X) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_X) : 0; - pad_state |= (state_tmp & KEY_Y) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_Y) : 0; - pad_state |= (state_tmp & KEY_B) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_B) : 0; - pad_state |= (state_tmp & KEY_A) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_A) : 0; - pad_state |= (state_tmp & KEY_R) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_R) : 0; - pad_state |= (state_tmp & KEY_L) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_L) : 0; - pad_state |= (state_tmp & KEY_ZR) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_R2) : 0; - pad_state |= (state_tmp & KEY_ZL) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_L2) : 0; + pad_state |= (state_tmp & KEY_DLEFT) ? (1 << RETRO_DEVICE_ID_JOYPAD_LEFT) : 0; + pad_state |= (state_tmp & KEY_DDOWN) ? (1 << RETRO_DEVICE_ID_JOYPAD_DOWN) : 0; + pad_state |= (state_tmp & KEY_DRIGHT) ? (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT) : 0; + pad_state |= (state_tmp & KEY_DUP) ? (1 << RETRO_DEVICE_ID_JOYPAD_UP) : 0; + pad_state |= (state_tmp & KEY_START) ? (1 << RETRO_DEVICE_ID_JOYPAD_START) : 0; + pad_state |= (state_tmp & KEY_SELECT) ? (1 << RETRO_DEVICE_ID_JOYPAD_SELECT) : 0; + pad_state |= (state_tmp & KEY_X) ? (1 << RETRO_DEVICE_ID_JOYPAD_X) : 0; + pad_state |= (state_tmp & KEY_Y) ? (1 << RETRO_DEVICE_ID_JOYPAD_Y) : 0; + pad_state |= (state_tmp & KEY_B) ? (1 << RETRO_DEVICE_ID_JOYPAD_B) : 0; + pad_state |= (state_tmp & KEY_A) ? (1 << RETRO_DEVICE_ID_JOYPAD_A) : 0; + pad_state |= (state_tmp & KEY_R) ? (1 << RETRO_DEVICE_ID_JOYPAD_R) : 0; + pad_state |= (state_tmp & KEY_L) ? (1 << RETRO_DEVICE_ID_JOYPAD_L) : 0; + pad_state |= (state_tmp & KEY_ZR) ? (1 << RETRO_DEVICE_ID_JOYPAD_R2) : 0; + pad_state |= (state_tmp & KEY_ZL) ? (1 << RETRO_DEVICE_ID_JOYPAD_L2) : 0; analog_state[0][RETRO_DEVICE_INDEX_ANALOG_LEFT] [RETRO_DEVICE_ID_ANALOG_X] = ctr_joypad_fix_range(state_tmp_left_analog.dx); analog_state[0][RETRO_DEVICE_INDEX_ANALOG_LEFT] [RETRO_DEVICE_ID_ANALOG_Y] = -ctr_joypad_fix_range(state_tmp_left_analog.dy); diff --git a/input/drivers_joypad/gx_joypad.c b/input/drivers_joypad/gx_joypad.c index 348884e833..318eb637ed 100644 --- a/input/drivers_joypad/gx_joypad.c +++ b/input/drivers_joypad/gx_joypad.c @@ -162,9 +162,13 @@ static bool gx_joypad_button(unsigned port, uint16_t key) return (pad_state[port] & (UINT64_C(1) << key)); } -static uint64_t gx_joypad_get_buttons(unsigned port) +static void gx_joypad_get_buttons(unsigned port, retro_bits_t *state) { - return pad_state[port]; + if ( port < MAX_PADS ) { + RARCH_INPUT_STATE_COPY16_PTR( state, pad_state[port] ); + } else { + RARCH_INPUT_STATE_CLEAR_PTR(state); + } } static int16_t gx_joypad_axis(unsigned port, uint32_t joyaxis) @@ -501,8 +505,8 @@ static void gx_joypad_destroy(void) int i; for (i = 0; i < MAX_PADS; i++) { - /* Commenting this out fixes the Wii - * remote not reconnecting after + /* Commenting this out fixes the Wii + * remote not reconnecting after * core load, exit, etc. */ WPAD_Flush(i); WPADDisconnect(i); diff --git a/input/drivers_joypad/hid_joypad.c b/input/drivers_joypad/hid_joypad.c index 94eaaef7b6..eaed7efbed 100644 --- a/input/drivers_joypad/hid_joypad.c +++ b/input/drivers_joypad/hid_joypad.c @@ -1,7 +1,7 @@ /* RetroArch - A frontend for libretro. * Copyright (C) 2013-2014 - Jason Fetters * Copyright (C) 2011-2017 - Daniel De Matteis - * + * * RetroArch is free software: you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Found- * ation, either version 3 of the License, or (at your option) any later version. @@ -44,7 +44,7 @@ static void hid_joypad_free(void) if (generic_hid->free) generic_hid->free((void*)hid_driver_get_data()); - + generic_hid = NULL; } @@ -55,11 +55,13 @@ static bool hid_joypad_button(unsigned port, uint16_t joykey) return false; } -static uint64_t hid_joypad_get_buttons(unsigned port) +static void hid_joypad_get_buttons(unsigned port, retro_bits_t *state) { - if (generic_hid && generic_hid->get_buttons) - return generic_hid->get_buttons((void*)hid_driver_get_data(), port); - return 0; + if (generic_hid && generic_hid->get_buttons) { + generic_hid->get_buttons((void*)hid_driver_get_data(), port, state); + } else { + RARCH_INPUT_STATE_CLEAR_PTR( state ); + } } static int16_t hid_joypad_axis(unsigned port, uint32_t joyaxis) diff --git a/input/drivers_joypad/linuxraw_joypad.c b/input/drivers_joypad/linuxraw_joypad.c index 4178ffe188..212aeb8adc 100644 --- a/input/drivers_joypad/linuxraw_joypad.c +++ b/input/drivers_joypad/linuxraw_joypad.c @@ -1,7 +1,7 @@ /* RetroArch - A frontend for libretro. * Copyright (C) 2010-2014 - Hans-Kristian Arntzen * Copyright (C) 2011-2017 - Daniel De Matteis - * + * * RetroArch is free software: you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Found- * ation, either version 3 of the License, or (at your option) any later version. @@ -41,7 +41,7 @@ struct linuxraw_joypad { int fd; - uint64_t buttons; + uint32_t buttons; int16_t axes[NUM_AXES]; char *ident; @@ -55,7 +55,7 @@ static bool linuxraw_hotplug = false; static void linuxraw_poll_pad(struct linuxraw_joypad *pad) { struct js_event event; - + while (read(pad->fd, &event, sizeof(event)) == (ssize_t)sizeof(event)) { unsigned type = event.type & ~JS_EVENT_INIT; @@ -66,9 +66,9 @@ static void linuxraw_poll_pad(struct linuxraw_joypad *pad) if (event.number < NUM_BUTTONS) { if (event.value) - BIT64_SET(pad->buttons, event.number); + BIT32_SET(pad->buttons, event.number); else - BIT64_CLEAR(pad->buttons, event.number); + BIT32_CLEAR(pad->buttons, event.number); } break; @@ -200,7 +200,7 @@ retry: input_config_set_device_name(idx, NULL); } } - /* Sometimes, device will be created before + /* Sometimes, device will be created before * access to it is established. */ else if (event->mask & (IN_CREATE | IN_ATTRIB)) { @@ -210,7 +210,7 @@ retry: snprintf(path, sizeof(path), "/dev/input/%s", event->name); - if ( !string_is_empty(linuxraw_pads[idx].ident) + if ( !string_is_empty(linuxraw_pads[idx].ident) && linuxraw_joypad_init_pad(path, &linuxraw_pads[idx])) { if (!input_autoconfigure_connect( @@ -251,7 +251,7 @@ static bool linuxraw_joypad_init(void *data) pad->fd = -1; pad->ident = input_device_names[i]; - + snprintf(path, sizeof(path), "/dev/input/js%u", i); if (!input_autoconfigure_connect( @@ -323,15 +323,17 @@ static bool linuxraw_joypad_button(unsigned port, uint16_t joykey) const struct linuxraw_joypad *pad = (const struct linuxraw_joypad*) &linuxraw_pads[port]; - return joykey < NUM_BUTTONS && BIT64_GET(pad->buttons, joykey); + return joykey < NUM_BUTTONS && BIT32_GET(pad->buttons, joykey); } -static uint64_t linuxraw_joypad_get_buttons(unsigned port) +static void linuxraw_joypad_get_buttons(unsigned port, retro_bits_t *state) { - const struct linuxraw_joypad *pad = (const struct linuxraw_joypad*) - &linuxraw_pads[port]; - - return pad->buttons; + const struct linuxraw_joypad *pad = (const struct linuxraw_joypad*)&linuxraw_pads[port]; + if ( pad ) { + RARCH_INPUT_STATE_COPY16_PTR(state, pad->buttons); + } else { + RARCH_INPUT_STATE_CLEAR_PTR(state); + } } static int16_t linuxraw_joypad_axis(unsigned port, uint32_t joyaxis) diff --git a/input/drivers_joypad/mfi_joypad.m b/input/drivers_joypad/mfi_joypad.m index ef6f025746..10964893f0 100644 --- a/input/drivers_joypad/mfi_joypad.m +++ b/input/drivers_joypad/mfi_joypad.m @@ -221,9 +221,9 @@ static bool apple_gamecontroller_joypad_button(unsigned port, uint16_t joykey) return false; } -static uint64_t apple_gamecontroller_joypad_get_buttons(unsigned port) +static void apple_gamecontroller_joypad_get_buttons(unsigned port, retro_bits_t *state) { - return mfi_buttons[port]; + RARCH_INPUT_STATE_COPY16_PTR(state, mfi_buttons[port]); } static int16_t apple_gamecontroller_joypad_axis(unsigned port, uint32_t joyaxis) diff --git a/input/drivers_joypad/null_joypad.c b/input/drivers_joypad/null_joypad.c index c3377a45d6..d364433e06 100644 --- a/input/drivers_joypad/null_joypad.c +++ b/input/drivers_joypad/null_joypad.c @@ -37,9 +37,9 @@ static bool null_joypad_button(unsigned port_num, uint16_t joykey) return false; } -static uint64_t null_joypad_get_buttons(unsigned port_num) +static void null_joypad_get_buttons(unsigned port_num, retro_bits_t *state) { - return 0; + RARCH_INPUT_STATE_CLEAR_PTR( state ); } static int16_t null_joypad_axis(unsigned port_num, uint32_t joyaxis) diff --git a/input/drivers_joypad/parport_joypad.c b/input/drivers_joypad/parport_joypad.c index c3bc156db3..062e6dd958 100644 --- a/input/drivers_joypad/parport_joypad.c +++ b/input/drivers_joypad/parport_joypad.c @@ -40,7 +40,7 @@ struct parport_joypad { int fd; - uint64_t buttons; + uint32_t buttons; bool button_enable[PARPORT_NUM_BUTTONS]; char saved_data; char saved_control; @@ -97,22 +97,22 @@ static void parport_poll_pad(struct parport_joypad *pad) for (i = 0; i < 8; i++) { if (!(data & UINT8_C(1 << i)) && pad->button_enable[i]) - BIT64_SET(pad->buttons, i); + BIT32_SET(pad->buttons, i); else - BIT64_CLEAR(pad->buttons, i); + BIT32_CLEAR(pad->buttons, i); } for (i = 3; i < 8; i++) { if (!(status & UINT8_C(1 << i)) && pad->button_enable[i + 5]) - BIT64_SET(pad->buttons, i + 5); + BIT32_SET(pad->buttons, i + 5); else - BIT64_CLEAR(pad->buttons, i + 5); + BIT32_CLEAR(pad->buttons, i + 5); } - if (BIT64_GET(pad->buttons, 12) && pad->button_enable[12]) - BIT64_CLEAR(pad->buttons, 12); + if (BIT32_GET(pad->buttons, 12) && pad->button_enable[12]) + BIT32_CLEAR(pad->buttons, 12); else - BIT64_SET(pad->buttons, 12); + BIT32_SET(pad->buttons, 12); } static bool parport_joypad_init_pad(const char *path, struct parport_joypad *pad) @@ -268,7 +268,7 @@ static bool parport_joypad_init(void *data) for (j = 0; j < PARPORT_NUM_BUTTONS; j++) { - if (!(BIT64_GET(pad->buttons, j))) + if (!(BIT32_GET(pad->buttons, j))) { pad->button_enable[j] = true; found_enabled_button = true; @@ -337,13 +337,17 @@ static void parport_joypad_destroy(void) static bool parport_joypad_button(unsigned port, uint16_t joykey) { const struct parport_joypad *pad = (const struct parport_joypad*)&parport_pads[port]; - return joykey < PARPORT_NUM_BUTTONS && BIT64_GET(pad->buttons, joykey); + return joykey < PARPORT_NUM_BUTTONS && BIT32_GET(pad->buttons, joykey); } -static uint64_t parport_joypad_get_buttons(unsigned port) +static void parport_joypad_get_buttons(unsigned port, retro_bits_t *state) { - const struct parport_joypad *pad = (const struct parport_joypad*)&parport_pads[port]; - return pad->buttons; + const struct parport_joypad *pad = (const struct parport_joypad*)&parport_pads[port]; + if ( pad ) { + RARCH_INPUT_STATE_COPY16_PTR(state, pad->buttons); + } else { + RARCH_INPUT_STATE_CLEAR_PTR(state); + } } static int16_t parport_joypad_axis(unsigned port, uint32_t joyaxis) diff --git a/input/drivers_joypad/ps3_joypad.c b/input/drivers_joypad/ps3_joypad.c index 35fc7dadc9..c14277924c 100644 --- a/input/drivers_joypad/ps3_joypad.c +++ b/input/drivers_joypad/ps3_joypad.c @@ -1,7 +1,7 @@ /* RetroArch - A frontend for libretro. * Copyright (C) 2010-2014 - Hans-Kristian Arntzen * Copyright (C) 2011-2017 - Daniel De Matteis - * + * * RetroArch is free software: you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Found- * ation, either version 3 of the License, or (at your option) any later version. @@ -68,9 +68,13 @@ static bool ps3_joypad_button(unsigned port_num, uint16_t joykey) return pad_state[port_num] & (UINT64_C(1) << joykey); } -static uint64_t ps3_joypad_get_buttons(unsigned port_num) +static void ps3_joypad_get_buttons(unsigned port_num, retro_bits_t *state) { - return pad_state[port_num]; + if ( port_num < MAX_PADS ) { + RARCH_INPUT_STATE_COPY16_PTR( state, pad_state[port_num] ); + } else { + RARCH_INPUT_STATE_CLEAR_PTR(state); + } } static int16_t ps3_joypad_axis(unsigned port_num, uint32_t joyaxis) @@ -142,7 +146,7 @@ static void ps3_joypad_poll(void) ps3_joypad_autodetect_add(port); } } - + if (pads_connected[port] == 0) continue; diff --git a/input/drivers_joypad/psp_joypad.c b/input/drivers_joypad/psp_joypad.c index 9e569eeca2..967e9092e8 100644 --- a/input/drivers_joypad/psp_joypad.c +++ b/input/drivers_joypad/psp_joypad.c @@ -124,9 +124,13 @@ static bool psp_joypad_button(unsigned port_num, uint16_t key) return (pad_state[port_num] & (UINT64_C(1) << key)); } -static uint64_t psp_joypad_get_buttons(unsigned port_num) +static void psp_joypad_get_buttons(unsigned port_num, retro_bits_t *state) { - return pad_state[port_num]; + if ( port_num < PSP_MAX_PADS ) { + RARCH_INPUT_STATE_COPY16_PTR( state, pad_state[port_num] ); + } else { + RARCH_INPUT_STATE_CLEAR_PTR(state); + } } static int16_t psp_joypad_axis(unsigned port_num, uint32_t joyaxis) @@ -236,10 +240,10 @@ static void psp_joypad_poll(void) if (curr_ctrl_info.port[p] == SCE_CTRL_TYPE_UNPAIRED) continue; #elif defined(SN_TARGET_PSP2) - /* Dumb hack, but here's the explanation - + /* Dumb hack, but here's the explanation - * sceCtrlPeekBufferPositive's port parameter * can be 0 or 1 to read the first controller on - * a PSTV, but HAS to be 0 for a real VITA and 2 + * a PSTV, but HAS to be 0 for a real VITA and 2 * for the 2nd controller on a PSTV */ unsigned p = (player > 0) ? player+1 : player; #else @@ -256,12 +260,12 @@ static void psp_joypad_poll(void) continue; #endif #if defined(VITA) - if (psp2_model == SCE_KERNEL_MODEL_VITA + if (psp2_model == SCE_KERNEL_MODEL_VITA && settings->bools.input_backtouch_enable) { unsigned i; SceTouchData touch_surface = {0}; - sceTouchPeek(settings->bools.input_backtouch_toggle + sceTouchPeek(settings->bools.input_backtouch_toggle ? SCE_TOUCH_PORT_FRONT : SCE_TOUCH_PORT_BACK, &touch_surface, 1); for (i = 0; i < touch_surface.reportNum; i++) diff --git a/input/drivers_joypad/udev_joypad.c b/input/drivers_joypad/udev_joypad.c index ce3ad8617d..3aa6ba092a 100644 --- a/input/drivers_joypad/udev_joypad.c +++ b/input/drivers_joypad/udev_joypad.c @@ -1,7 +1,7 @@ /* RetroArch - A frontend for libretro. * Copyright (C) 2010-2015 - Hans-Kristian Arntzen * Copyright (C) 2011-2017 - Daniel De Matteis - * + * * RetroArch is free software: you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Found- * ation, either version 3 of the License, or (at your option) any later version. @@ -204,7 +204,7 @@ static int udev_add_pad(struct udev_device *dev, unsigned p, int fd, const char i = ABS_HAT3Y; continue; } - + if (test_bit(i, absbit)) { struct input_absinfo *abs = &pad->absinfo[axes]; @@ -420,11 +420,11 @@ static bool udev_set_rumble(unsigned i, static bool udev_joypad_poll_hotplug_available(struct udev_monitor *dev) { - struct pollfd fds; + struct pollfd fds; - fds.fd = udev_monitor_get_fd(dev); - fds.events = POLLIN; - fds.revents = 0; + fds.fd = udev_monitor_get_fd(dev); + fds.events = POLLIN; + fds.revents = 0; return (poll(&fds, 1, 0) == 1) && (fds.revents & POLLIN); } @@ -604,10 +604,14 @@ static bool udev_joypad_button(unsigned port, uint16_t joykey) return joykey < UDEV_NUM_BUTTONS && BIT64_GET(pad->buttons, joykey); } -static uint64_t udev_joypad_get_buttons(unsigned port) +static void udev_joypad_get_buttons(unsigned port, retro_bits_t *state) { - const struct udev_joypad *pad = (const struct udev_joypad*)&udev_pads[port]; - return pad->buttons; + const struct udev_joypad *pad = (const struct udev_joypad*)&udev_pads[port]; + if ( pad ) { + RARCH_INPUT_STATE_COPY16_PTR( state, pad->buttons ); + } else { + RARCH_INPUT_STATE_CLEAR_PTR(state); + } } static int16_t udev_joypad_axis(unsigned port, uint32_t joyaxis) diff --git a/input/drivers_joypad/wiiu_joypad.c b/input/drivers_joypad/wiiu_joypad.c index 71f23aa99b..ed62f14e09 100644 --- a/input/drivers_joypad/wiiu_joypad.c +++ b/input/drivers_joypad/wiiu_joypad.c @@ -21,7 +21,9 @@ #include #include -#include "wiiu/controller_patcher/ControllerPatcherWrapper.h" +#if defined(ENABLE_CONTROLLER_PATCHER) + #include "wiiu/controller_patcher/ControllerPatcherWrapper.h" +#endif #include "../input_driver.h" @@ -33,8 +35,12 @@ #include "wiiu_dbg.h" -#ifndef MAX_PADS -#define MAX_PADS 16 +#if !defined(MAX_PADS) + #if defined(ENABLE_CONTROLLER_PATCHER) + #define MAX_PADS 16 + #else + #define MAX_PADS 5 + #endif #endif #define WIIUINPUT_TYPE_WIIMOTE 0x00 @@ -45,22 +51,27 @@ #define GAMEPAD_COUNT 1 #define KPAD_COUNT 4 -#define HID_COUNT (MAX_PADS - GAMEPAD_COUNT - KPAD_COUNT) #define GAMEPAD_OFFSET 0 #define KPAD_OFFSET (GAMEPAD_OFFSET + GAMEPAD_COUNT) -#define HID_OFFSET (KPAD_OFFSET + KPAD_COUNT) + +#if defined(ENABLE_CONTROLLER_PATCHER) + #define HID_COUNT (MAX_PADS - GAMEPAD_COUNT - KPAD_COUNT) + #define HID_OFFSET (KPAD_OFFSET + KPAD_COUNT) +#endif static uint64_t pad_state[MAX_PADS]; static uint8_t pad_type[KPAD_COUNT] = {WIIUINPUT_TYPE_NONE, WIIUINPUT_TYPE_NONE, WIIUINPUT_TYPE_NONE, WIIUINPUT_TYPE_NONE}; +#if defined(ENABLE_CONTROLLER_PATCHER) static uint8_t hid_status[HID_COUNT]; static InputData hid_data[HID_COUNT]; +static char hidName[HID_COUNT][255]; +#endif + /* 3 axis - one for touch/future IR support? */ static int16_t analog_state[MAX_PADS][3][2]; static bool wiiu_pad_inited = false; -static char hidName[HID_COUNT][255]; - static const char* wiiu_joypad_name(unsigned pad) { if (pad > MAX_PADS) return "N/A"; @@ -91,12 +102,14 @@ static const char* wiiu_joypad_name(unsigned pad) } } - if (pad >= HID_OFFSET && pad < HID_OFFSET + HID_COUNT) - { - s32 hid_index = pad - HID_OFFSET; - sprintf(hidName[hid_index], "HID %04X/%04X(%02X)", hid_data[hid_index].device_info.vidpid.vid, hid_data[hid_index].device_info.vidpid.pid, hid_data[hid_index].pad); - return hidName[hid_index]; - } + #if defined(ENABLE_CONTROLLER_PATCHER) + if (pad >= HID_OFFSET && pad < HID_OFFSET + HID_COUNT) + { + s32 hid_index = pad - HID_OFFSET; + sprintf(hidName[hid_index], "HID %04X/%04X(%02X)", hid_data[hid_index].device_info.vidpid.vid, hid_data[hid_index].device_info.vidpid.pid, hid_data[hid_index].pad); + return hidName[hid_index]; + } + #endif //defined(ENABLE_CONTROLLER_PATCHER) return "unknown"; } @@ -122,9 +135,13 @@ static bool wiiu_joypad_button(unsigned port_num, uint16_t key) return (pad_state[port_num] & (UINT64_C(1) << key)); } -static uint64_t wiiu_joypad_get_buttons(unsigned port_num) +static void wiiu_joypad_get_buttons(unsigned port_num, retro_bits_t *state) { - return pad_state[port_num]; + if ( port_num < MAX_PADS ) { + RARCH_INPUT_STATE_COPY16_PTR( state, pad_state[port_num] ); + } else { + RARCH_INPUT_STATE_CLEAR_PTR(state); + } } static int16_t wiiu_joypad_axis(unsigned port_num, uint32_t joyaxis) @@ -190,9 +207,12 @@ static int16_t scaleTP(int16_t oldMin, int16_t oldMax, int16_t newMin, int16_t n static void wiiu_joypad_poll(void) { - int i, c, result; + int i, c; VPADStatus vpad; VPADReadError vpadError; + #if defined(ENABLE_CONTROLLER_PATCHER) + int result; + #endif VPADRead(0, &vpad, 1, &vpadError); @@ -212,33 +232,33 @@ static void wiiu_joypad_poll(void) if (vpad.tpNormal.touched && vpad.tpNormal.validity == VPAD_VALID) { struct video_viewport vp = {0}; video_driver_get_viewport_info(&vp); - VPADTouchData cal = {0}; + VPADTouchData cal720p = {0}; /* Calibrates data to a 720p screen, seems to clamp outer 12px */ - VPADGetTPCalibratedPoint(0, &cal, &(vpad.tpNormal)); + VPADGetTPCalibratedPoint(0, &cal720p, &(vpad.tpNormal)); + /* Recalibrate to match video driver's coordinate system */ + VPADTouchData calNative = {0}; + calNative.x = scaleTP(12, 1268, 0, vp.full_width, cal720p.x); + calNative.y = scaleTP(12, 708, 0, vp.full_height, cal720p.y); /* Clamp to actual game image */ + VPADTouchData calClamped = calNative; bool touchClamped = false; - if (cal.x < vp.x) { - cal.x = vp.x; + if (calClamped.x < vp.x) { + calClamped.x = vp.x; touchClamped = true; - } else if (cal.x > vp.x + vp.width) { - cal.x = vp.x + vp.width; + } else if (calClamped.x > vp.x + vp.width) { + calClamped.x = vp.x + vp.width; touchClamped = true; } - if (cal.y < vp.y) { - cal.y = vp.y; + if (calClamped.y < vp.y) { + calClamped.y = vp.y; touchClamped = true; - } else if (cal.y > vp.y + vp.height) { - cal.y = vp.y + vp.height; + } else if (calClamped.y > vp.y + vp.height) { + calClamped.y = vp.y + vp.height; touchClamped = true; } - /* Account for 12px clamp on VPADGetTPCalibratedPoint */ - if (vp.x < 12) vp.x = 12; - if (vp.y < 12) vp.y = 12; - if (vp.x + vp.width > 1268) vp.width = 1268 - vp.x; - if (vp.y + vp.height > 708) vp.height = 708 - vp.y; /* Calibrate to libretro spec and save as axis 2 (idx 4,5) */ - analog_state[0][2][0] = scaleTP(vp.x, vp.x + vp.width, -0x7fff, 0x7fff, cal.x); - analog_state[0][2][1] = scaleTP(vp.y, vp.y + vp.height, -0x7fff, 0x7fff, cal.y); + analog_state[0][2][0] = scaleTP(vp.x, vp.x + vp.width, -0x7fff, 0x7fff, calClamped.x); + analog_state[0][2][1] = scaleTP(vp.y, vp.y + vp.height, -0x7fff, 0x7fff, calClamped.y); /* Emulating a button (#19) for touch; lets people assign it to menu for that traditional RetroArch Wii U feel */ @@ -307,41 +327,46 @@ static void wiiu_joypad_poll(void) } } - memset(hid_data,0,sizeof(hid_data)); - result = gettingInputAllDevices(hid_data,HID_COUNT); + #if defined(ENABLE_CONTROLLER_PATCHER) + memset(hid_data,0,sizeof(hid_data)); + result = gettingInputAllDevices(hid_data,HID_COUNT); - if (result + HID_OFFSET > MAX_PADS) - result = MAX_PADS - HID_OFFSET; + if (result + HID_OFFSET > MAX_PADS) + result = MAX_PADS - HID_OFFSET; - for(i = HID_OFFSET;i < result + HID_OFFSET; i++) - { - int hid_index = i-HID_OFFSET; - uint8_t old_status = hid_status[hid_index]; - uint8_t new_status = hid_data[hid_index].status;/* TODO: defines for the status. */ - - if (old_status == 1 || new_status == 1) + for(i = HID_OFFSET;i < result + HID_OFFSET; i++) { - hid_status[hid_index] = new_status; - if (old_status == 0 && new_status == 1) /* Pad was attached */ - wiiu_joypad_autodetect_add(i); - else if (old_status == 1 && new_status == 0) /* Pad was detached */ - input_autoconfigure_disconnect(i, wiiu_joypad.ident); - else if (old_status == 1 && new_status == 1) /* Pad still connected */ + int hid_index = i-HID_OFFSET; + uint8_t old_status = hid_status[hid_index]; + uint8_t new_status = hid_data[hid_index].status;/* TODO: defines for the status. */ + + if (old_status == 1 || new_status == 1) { - pad_state[i] = hid_data[hid_index].button_data.hold & ~0x7F800000; /* clear out emulated analog sticks */ - analog_state[i][RETRO_DEVICE_INDEX_ANALOG_LEFT] [RETRO_DEVICE_ID_ANALOG_X] = hid_data[hid_index].stick_data.leftStickX * 0x7FF0; - analog_state[i][RETRO_DEVICE_INDEX_ANALOG_LEFT] [RETRO_DEVICE_ID_ANALOG_Y] = hid_data[hid_index].stick_data.leftStickY * 0x7FF0; - analog_state[i][RETRO_DEVICE_INDEX_ANALOG_RIGHT] [RETRO_DEVICE_ID_ANALOG_X] = hid_data[hid_index].stick_data.rightStickX * 0x7FF0; - analog_state[i][RETRO_DEVICE_INDEX_ANALOG_RIGHT] [RETRO_DEVICE_ID_ANALOG_Y] = hid_data[hid_index].stick_data.rightStickY * 0x7FF0; + hid_status[hid_index] = new_status; + if (old_status == 0 && new_status == 1) /* Pad was attached */ + wiiu_joypad_autodetect_add(i); + else if (old_status == 1 && new_status == 0) /* Pad was detached */ + input_autoconfigure_disconnect(i, wiiu_joypad.ident); + else if (old_status == 1 && new_status == 1) /* Pad still connected */ + { + pad_state[i] = hid_data[hid_index].button_data.hold & ~0x7F800000; /* clear out emulated analog sticks */ + analog_state[i][RETRO_DEVICE_INDEX_ANALOG_LEFT] [RETRO_DEVICE_ID_ANALOG_X] = hid_data[hid_index].stick_data.leftStickX * 0x7FF0; + analog_state[i][RETRO_DEVICE_INDEX_ANALOG_LEFT] [RETRO_DEVICE_ID_ANALOG_Y] = hid_data[hid_index].stick_data.leftStickY * 0x7FF0; + analog_state[i][RETRO_DEVICE_INDEX_ANALOG_RIGHT] [RETRO_DEVICE_ID_ANALOG_X] = hid_data[hid_index].stick_data.rightStickX * 0x7FF0; + analog_state[i][RETRO_DEVICE_INDEX_ANALOG_RIGHT] [RETRO_DEVICE_ID_ANALOG_Y] = hid_data[hid_index].stick_data.rightStickY * 0x7FF0; + } } } - } + #endif //defined(ENABLE_CONTROLLER_PATCHER) } static bool wiiu_joypad_init(void* data) { wiiu_joypad_autodetect_add(0); - memset(hid_status,0,sizeof(hid_status)); + + #if defined(ENABLE_CONTROLLER_PATCHER) + memset(hid_status,0,sizeof(hid_status)); + #endif wiiu_joypad_poll(); wiiu_pad_inited = true; diff --git a/input/drivers_joypad/xdk_joypad.c b/input/drivers_joypad/xdk_joypad.c index 6bdb3d25b3..b9e25268b4 100644 --- a/input/drivers_joypad/xdk_joypad.c +++ b/input/drivers_joypad/xdk_joypad.c @@ -1,7 +1,7 @@ /* RetroArch - A frontend for libretro. * Copyright (C) 2010-2014 - Hans-Kristian Arntzen * Copyright (C) 2011-2017 - Daniel De Matteis - * + * * RetroArch is free software: you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Found- * ation, either version 3 of the License, or (at your option) any later version. @@ -19,7 +19,7 @@ #include "../input_driver.h" #include "../../tasks/tasks_internal.h" -static uint64_t pad_state[MAX_PADS]; +static uint32_t pad_state[MAX_PADS]; static int16_t analog_state[MAX_PADS][2][2]; #ifdef _XBOX1 static HANDLE gamepads[MAX_PADS]; @@ -73,12 +73,16 @@ static bool xdk_joypad_button(unsigned port_num, uint16_t joykey) if (port_num >= MAX_PADS) return false; - return pad_state[port_num] & (UINT64_C(1) << joykey); + return pad_state[port_num] & (1 << joykey); } -static uint64_t xdk_joypad_get_buttons(unsigned port_num) +static void xdk_joypad_get_buttons(unsigned port_num, retro_bits_t *state) { - return pad_state[port_num]; + if ( port_num < MAX_PADS ) { + RARCH_INPUT_STATE_COPY16_PTR( state, pad_state[port_num] ); + } else { + RARCH_INPUT_STATE_CLEAR_PTR(state); + } } static int16_t xdk_joypad_axis(unsigned port_num, uint32_t joyaxis) @@ -154,7 +158,7 @@ static void xdk_joypad_poll(void) if(bRemoved[port]) { - /* if the controller was removed after + /* if the controller was removed after * XGetDeviceChanges but before * XInputOpen, the device handle will be NULL. */ if(gamepads[port]) @@ -178,14 +182,14 @@ static void xdk_joypad_poll(void) m_pollingParameters.bOutputInterval = 8; gamepads[port] = XInputOpen(XDEVICE_TYPE_GAMEPAD, port, XDEVICE_NO_SLOT, NULL); - + xdk_joypad_autodetect_add(port); } if (!gamepads[port]) continue; - /* if the controller is removed after + /* if the controller is removed after * XGetDeviceChanges but before XInputOpen, * the device handle will be NULL. */ #endif diff --git a/input/include/blissbox.h b/input/include/blissbox.h new file mode 100644 index 0000000000..4ec18e500d --- /dev/null +++ b/input/include/blissbox.h @@ -0,0 +1,101 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2010-2014 - Hans-Kristian Arntzen + * Copyright (C) 2011-2016 - Daniel De Matteis + * Copyright (C) 2016-2017 - Brad Parker + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + +#ifndef __BLISSBOX_H +#define __BLISSBOX_H + +#include + +#define BLISSBOX_VID 0x16d0 /* requires firmware 2.0 */ +#define BLISSBOX_PID 0x0d04 /* first of 4 controllers, each one increments PID by 1 */ +#define BLISSBOX_UPDATE_MODE_PID 0x0a5f +#define BLISSBOX_OLD_PID 0x0a60 +#define BLISSBOX_MAX_PADS 4 +#define BLISSBOX_MAX_PAD_INDEX (BLISSBOX_MAX_PADS - 1) + +#define BLISSBOX_USB_FEATURE_REPORT_ID 17 + +RETRO_BEGIN_DECLS + +typedef struct { + const char *name; + int index; +} blissbox_pad_type_t; + +const blissbox_pad_type_t blissbox_pad_types[] = +{ + {"A5200", 6}, + {"A5200_TB", 50}, + {"A7800", 4}, + {"ATARI_KEYPAD", 43}, + {"ATARI", 0}, + {"ATMARK", 10}, + {"BALLY", 42}, + {"CD32", 24}, + {"CDI", 33}, + {"COL", 1}, + {"DC_ASCI", 15}, + {"DC_PAD", 16}, + {"FC_ARKANOID", 53}, + {"FC_NES", 52}, + {"GC", 9}, + {"GC_WHEEL", 18}, + {"GEN_3", 20}, + {"GEN_6", 21}, + {"GRAVIS_EX", 38}, + {"gx4000", 2}, + {"HAMMERHEAD", 40}, + {"HPD", 7}, + {"INTELI", 14}, + {"JAG", 11}, + {"MSSW", 39}, + {"N64", 19}, + {"NEO", 49}, + {"NES", 17}, + {"PADDLES", 41}, + {"PC_FX", 26}, + {"PC_GAMEPAD", 46}, + {"PSX_DIGITAL", 65}, + {"PSX_DS", 115}, + {"PSX_DS2", 121}, + {"PSX_FS", 83}, + {"PSX_NEGCON", 51}, + {"PSX_WHEEL", 12}, + {"SAC", 34}, + {"SATURN_ANALOG", 8}, + {"SATURN_DIGITAL", 3}, + {"SMS", 22}, + {"SPEEK", 45}, + {"TG16", 23}, + {"THREE_DO", 25}, + {"THREE_DO_ANALOG", 37}, + {"VEC", 5}, + {"WII_NUNCHUK", 13}, + {"ZXSINC", 44}, + {"NES_ARKANOID", 30}, + {"NES_GUN", 28}, + {"NES_POWERPAD", 36}, + {"SNES", 27}, + {"V_BOY", 29}, + {"WII_CLASSIC", 31}, + {"WII_MPLUS", 32}, + {NULL, 0}, /* used to mark unconnected ports, do not remove */ +}; + +RETRO_END_DECLS + +#endif diff --git a/input/input_autodetect_builtin.c b/input/input_autodetect_builtin.c index ba55e1ecbd..bd6fdaf768 100644 --- a/input/input_autodetect_builtin.c +++ b/input/input_autodetect_builtin.c @@ -544,16 +544,16 @@ const char* const input_builtin_autoconfs[] = #endif #ifdef WIIU DECL_AUTOCONF_DEVICE("WIIU Gamepad", "wiiu", WIIUINPUT_GAMEPAD_DEFAULT_BINDS), - DECL_AUTOCONF_DEVICE("HID Controller", "wiiu", WIIUINPUT_GAMEPAD_DEFAULT_BINDS), DECL_AUTOCONF_DEVICE("WIIU Pro Controller", "wiiu", WIIUINPUT_PRO_CONTROLLER_DEFAULT_BINDS), DECL_AUTOCONF_DEVICE("Wiimote Controller", "wiiu", WIIUINPUT_WIIMOTE_DEFAULT_BINDS), DECL_AUTOCONF_DEVICE("Nunchuk Controller", "wiiu", WIIUINPUT_NUNCHUK_DEFAULT_BINDS), DECL_AUTOCONF_DEVICE("Classic Controller", "wiiu", WIIUINPUT_CLASSIC_CONTROLLER_DEFAULT_BINDS), + #if defined(ENABLE_CONTROLLER_PATCHER) + DECL_AUTOCONF_DEVICE("HID Controller", "wiiu", WIIUINPUT_GAMEPAD_DEFAULT_BINDS), + #endif #endif #ifdef __CELLOS_LV2__ DECL_AUTOCONF_DEVICE("SixAxis Controller", "ps3", PS3INPUT_DEFAULT_BINDS), #endif NULL }; - - diff --git a/input/input_defines.h b/input/input_defines.h index 2d1d88d3f3..fa697c54a4 100644 --- a/input/input_defines.h +++ b/input/input_defines.h @@ -1,7 +1,7 @@ /* RetroArch - A frontend for libretro. * Copyright (C) 2010-2014 - Hans-Kristian Arntzen * Copyright (C) 2011-2017 - Daniel De Matteis - * + * * RetroArch is free software: you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Found- * ation, either version 3 of the License, or (at your option) any later version. @@ -18,6 +18,7 @@ #define __INPUT_DEFINES__H #include +#include #include @@ -26,6 +27,8 @@ RETRO_BEGIN_DECLS #define MAX_USERS 16 #define RARCH_FIRST_CUSTOM_BIND 16 +#define RARCH_FIRST_LIGHTGUN_BIND RARCH_ANALOG_BIND_LIST_END +#define RARCH_FIRST_MISC_CUSTOM_BIND RARCH_LIGHTGUN_BIND_LIST_END #define RARCH_FIRST_META_KEY RARCH_CUSTOM_BIND_LIST_END /* RetroArch specific bind IDs. */ @@ -42,9 +45,24 @@ enum RARCH_ANALOG_RIGHT_X_MINUS, RARCH_ANALOG_RIGHT_Y_PLUS, RARCH_ANALOG_RIGHT_Y_MINUS, + RARCH_ANALOG_BIND_LIST_END, + + /* Lightgun */ + RARCH_LIGHTGUN_TRIGGER = RARCH_FIRST_LIGHTGUN_BIND, + RARCH_LIGHTGUN_RELOAD, + RARCH_LIGHTGUN_AUX_A, + RARCH_LIGHTGUN_AUX_B, + RARCH_LIGHTGUN_AUX_C, + RARCH_LIGHTGUN_START, + RARCH_LIGHTGUN_SELECT, + RARCH_LIGHTGUN_DPAD_UP, + RARCH_LIGHTGUN_DPAD_DOWN, + RARCH_LIGHTGUN_DPAD_LEFT, + RARCH_LIGHTGUN_DPAD_RIGHT, + RARCH_LIGHTGUN_BIND_LIST_END, /* Turbo */ - RARCH_TURBO_ENABLE, + RARCH_TURBO_ENABLE = RARCH_FIRST_MISC_CUSTOM_BIND, RARCH_CUSTOM_BIND_LIST_END, @@ -140,6 +158,30 @@ enum analog_dpad_mode #define GET_HAT_DIR(x) (x & HAT_MASK) #define GET_HAT(x) (x & (~HAT_MASK)) +#define RARCH_INPUT_STATE_BIT_SET(a,bit) ((a).data [((bit) >> 5)] |= (1 << ((bit) & 31))) +#define RARCH_INPUT_STATE_BIT_SET_PTR(a,bit) ((a)->data[((bit) >> 5)] |= (1 << ((bit) & 31))) +#define RARCH_INPUT_STATE_BIT_GET(a,bit) ((a).data [((bit) >> 5)] & (1 << ((bit) & 31))) +#define RARCH_INPUT_STATE_BIT_GET_PTR(a,bit) ((a)->data[((bit) >> 5)] & (1 << ((bit) & 31))) +#define RARCH_INPUT_STATE_CLEAR(a) memset(&a, 0, sizeof(a)); +#define RARCH_INPUT_STATE_CLEAR_PTR(a) memset(a, 0, sizeof(retro_bits_t)); +#define RARCH_INPUT_STATE_ANY_SET(a) ( ((a).data[0])||((a).data[1])||((a).data[2])||((a).data[3])|| \ + ((a).data[4])||((a).data[5])||((a).data[6])||((a).data[7]) ) +#define RARCH_INPUT_STATE_ANY_SET_PTR(a) ( ((a)->data[0])||((a)->data[1])||((a)->data[2])||((a)->data[3])|| \ + ((a)->data[4])||((a)->data[5])||((a)->data[6])||((a)->data[7]) ) +#define RARCH_INPUT_STATE_CLEAR_BITS(a,b) \ + ((a).data[0])&=(~((b).data[0])); \ + ((a).data[1])&=(~((b).data[1])); \ + ((a).data[2])&=(~((b).data[2])); \ + ((a).data[3])&=(~((b).data[3])); \ + ((a).data[4])&=(~((b).data[4])); \ + ((a).data[5])&=(~((b).data[5])); \ + ((a).data[6])&=(~((b).data[6])); \ + ((a).data[7])&=(~((b).data[7])); + +#define RARCH_INPUT_STATE_COPY16_PTR(a,bits) {memset(a, 0, sizeof(retro_bits_t));((a)->data[0] = (bits)&0xffff);} +#define RARCH_INPUT_STATE_COPY32_PTR(a,bits) {memset(a, 0, sizeof(retro_bits_t));((a)->data[0] = (bits));} + + RETRO_END_DECLS #endif diff --git a/input/input_driver.c b/input/input_driver.c index c28b4d42da..abfba95a91 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -267,6 +267,18 @@ const struct input_bind_map input_config_bind_map[RARCH_BIND_LIST_END_NULL] = { DECLARE_BIND(r_y_plus, RARCH_ANALOG_RIGHT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS), DECLARE_BIND(r_y_minus, RARCH_ANALOG_RIGHT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS), + DECLARE_BIND( gun_trigger, RARCH_LIGHTGUN_TRIGGER, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER ), + DECLARE_BIND( gun_offscreen_shot, RARCH_LIGHTGUN_RELOAD, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD ), + DECLARE_BIND( gun_aux_a, RARCH_LIGHTGUN_AUX_A, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A ), + DECLARE_BIND( gun_aux_b, RARCH_LIGHTGUN_AUX_B, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B ), + DECLARE_BIND( gun_aux_c, RARCH_LIGHTGUN_AUX_C, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C ), + DECLARE_BIND( gun_start, RARCH_LIGHTGUN_START, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START ), + DECLARE_BIND( gun_select, RARCH_LIGHTGUN_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT ), + DECLARE_BIND( gun_dpad_up, RARCH_LIGHTGUN_DPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP ), + DECLARE_BIND( gun_dpad_down, RARCH_LIGHTGUN_DPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN ), + DECLARE_BIND( gun_dpad_left, RARCH_LIGHTGUN_DPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT ), + DECLARE_BIND( gun_dpad_right, RARCH_LIGHTGUN_DPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT ), + DECLARE_BIND(turbo, RARCH_TURBO_ENABLE, MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE), DECLARE_META_BIND(1, toggle_fast_forward, RARCH_FAST_FORWARD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_KEY), @@ -381,6 +393,7 @@ static const void *hid_data = NULL; #define check_input_driver_block_hotkey(normal_bind, autoconf_bind) \ ( \ (((normal_bind)->key != RETROK_UNKNOWN) \ + || ((normal_bind)->mbutton != NO_BTN) \ || ((normal_bind)->joykey != NO_BTN) \ || ((normal_bind)->joyaxis != AXIS_NONE) \ || ((autoconf_bind)->key != RETROK_UNKNOWN ) \ @@ -467,9 +480,9 @@ const input_device_driver_t *input_driver_get_joypad_driver(void) const input_device_driver_t *input_driver_get_sec_joypad_driver(void) { - if (!current_input || !current_input->get_sec_joypad_driver) - return NULL; - return current_input->get_sec_joypad_driver(current_input_data); + if (!current_input || !current_input->get_sec_joypad_driver) + return NULL; + return current_input->get_sec_joypad_driver(current_input_data); } uint64_t input_driver_get_capabilities(void) @@ -486,7 +499,7 @@ void input_driver_set(const input_driver_t **input, void **input_data) *input = current_input; *input_data = current_input_data; } - + input_driver_set_own_driver(); } @@ -535,7 +548,7 @@ void input_poll(void) size_t i; settings_t *settings = config_get_ptr(); uint8_t max_users = (uint8_t)input_driver_max_users; - + current_input->poll(current_input_data); input_driver_turbo_btns.count++; @@ -669,7 +682,8 @@ int16_t input_state(unsigned port, unsigned device, #ifdef HAVE_KEYMAPPER if (input_driver_mapper) - input_mapper_state(&res, port, device, idx, id); + input_mapper_state(input_driver_mapper, + &res, port, device, idx, id); #endif /* Don't allow turbo for D-pad. */ @@ -778,25 +792,22 @@ void state_tracker_update_input(uint16_t *input1, uint16_t *input2) * Grab an input sample for this frame. We exclude * keyboard input here. * - * TODO: In case RARCH_BIND_LIST_END starts exceeding 64, - * and you need a bitmask of more than 64 entries, reimplement - * it to use something like rarch_bits_t. - * * Returns: Input sample containing a mask of all pressed keys. */ -uint64_t input_menu_keys_pressed(void *data, uint64_t last_input) +void input_menu_keys_pressed(void *data, retro_bits_t* p_new_state) { unsigned i, port; rarch_joypad_info_t joypad_info; - uint64_t ret = 0; const struct retro_keybind *binds[MAX_USERS] = {NULL}; settings_t *settings = (settings_t*)data; const struct retro_keybind *binds_norm = NULL; const struct retro_keybind *binds_auto = NULL; uint8_t max_users = (uint8_t)input_driver_max_users; uint8_t port_max = - settings->bools.input_all_users_control_menu - ? max_users : 1; + settings->bools.input_all_users_control_menu + ? max_users : 1; + + RARCH_INPUT_STATE_CLEAR_PTR( p_new_state ); input_driver_block_libretro_input = false; input_driver_block_hotkey = false; @@ -871,7 +882,7 @@ uint64_t input_menu_keys_pressed(void *data, uint64_t last_input) ? input_config_binds[port][i].joykey : joypad_info.auto_binds[i].joykey; joyaxis = (input_config_binds[port][i].joyaxis != AXIS_NONE) ? input_config_binds[port][i].joyaxis : joypad_info.auto_binds[i].joyaxis; - + if (sec) { if ((uint16_t)joykey == NO_BTN || !sec->button(joypad_info.joy_idx, (uint16_t)joykey)) @@ -898,7 +909,7 @@ uint64_t input_menu_keys_pressed(void *data, uint64_t last_input) if (pressed) { - BIT64_SET(ret, i); + RARCH_INPUT_STATE_BIT_SET_PTR(p_new_state, i); continue; } } @@ -908,7 +919,7 @@ uint64_t input_menu_keys_pressed(void *data, uint64_t last_input) { if (current_input->meta_key_pressed(current_input_data, i)) { - BIT64_SET(ret, i); + RARCH_INPUT_STATE_BIT_SET_PTR(p_new_state, i); continue; } } @@ -916,7 +927,7 @@ uint64_t input_menu_keys_pressed(void *data, uint64_t last_input) #ifdef HAVE_OVERLAY if (overlay_ptr && input_overlay_key_pressed(overlay_ptr, i)) { - BIT64_SET(ret, i); + RARCH_INPUT_STATE_BIT_SET_PTR(p_new_state, i); continue; } #endif @@ -931,7 +942,7 @@ uint64_t input_menu_keys_pressed(void *data, uint64_t last_input) if (command_get(&handle)) { - BIT64_SET(ret, i); + RARCH_INPUT_STATE_BIT_SET_PTR(p_new_state, i); continue; } } @@ -940,7 +951,7 @@ uint64_t input_menu_keys_pressed(void *data, uint64_t last_input) #ifdef HAVE_NETWORKGAMEPAD if (input_driver_remote && input_remote_key_pressed(i, 0)) { - BIT64_SET(ret, i); + RARCH_INPUT_STATE_BIT_SET_PTR(p_new_state, i); continue; } #endif @@ -995,11 +1006,9 @@ uint64_t input_menu_keys_pressed(void *data, uint64_t last_input) { if (current_input->input_state(current_input_data, joypad_info, binds, 0, RETRO_DEVICE_KEYBOARD, 0, ids[i][0])) - BIT64_SET(ret, ids[i][1]); + RARCH_INPUT_STATE_BIT_SET_PTR(p_new_state, ids[i][1]); } } - - return ret; } #endif @@ -1008,17 +1017,12 @@ uint64_t input_menu_keys_pressed(void *data, uint64_t last_input) * * Grab an input sample for this frame. * - * TODO: In case RARCH_BIND_LIST_END starts exceeding 64, - * and you need a bitmask of more than 64 entries, reimplement - * it to use something like rarch_bits_t. - * * Returns: Input sample containing a mask of all pressed keys. */ -uint64_t input_keys_pressed(void *data, uint64_t last_input) +void input_keys_pressed(void *data, retro_bits_t* p_new_state) { unsigned i; rarch_joypad_info_t joypad_info; - uint64_t ret = 0; settings_t *settings = (settings_t*)data; const struct retro_keybind *binds = input_config_binds[0]; const struct retro_keybind *binds_auto = &input_autoconf_binds[0][RARCH_ENABLE_HOTKEY]; @@ -1029,10 +1033,12 @@ uint64_t input_keys_pressed(void *data, uint64_t last_input) const struct retro_keybind *enable_hotkey = &input_config_binds[0][RARCH_ENABLE_HOTKEY]; bool game_focus_toggle_valid = false; + RARCH_INPUT_STATE_CLEAR_PTR( p_new_state ); + joypad_info.joy_idx = settings->uints.input_joypad_map[0]; joypad_info.auto_binds = input_autoconf_binds[joypad_info.joy_idx]; joypad_info.axis_threshold = input_driver_axis_threshold; - + input_driver_block_libretro_input = false; input_driver_block_hotkey = false; @@ -1046,9 +1052,9 @@ uint64_t input_keys_pressed(void *data, uint64_t last_input) && current_input->input_state( current_input_data, joypad_info, &binds, 0, RETRO_DEVICE_JOYPAD, 0, RARCH_ENABLE_HOTKEY)) - input_driver_block_libretro_input = true; - else - input_driver_block_hotkey = true; + input_driver_block_libretro_input = true; + else + input_driver_block_hotkey = true; } game_focus_toggle_valid = binds[RARCH_GAME_FOCUS_TOGGLE].valid; @@ -1067,21 +1073,21 @@ uint64_t input_keys_pressed(void *data, uint64_t last_input) { if ( ((!input_driver_block_libretro_input && ((i < RARCH_FIRST_META_KEY))) - || !input_driver_block_hotkey) && + || !input_driver_block_hotkey) && binds[i].valid && current_input->input_state(current_input_data, joypad_info, &binds, 0, RETRO_DEVICE_JOYPAD, 0, i) ) { - BIT64_SET(ret, i); + RARCH_INPUT_STATE_BIT_SET_PTR(p_new_state, i); continue; } if ((i >= RARCH_FIRST_META_KEY) && current_input->meta_key_pressed(current_input_data, i) - ) + ) { - BIT64_SET(ret, i); + RARCH_INPUT_STATE_BIT_SET_PTR(p_new_state, i); continue; } @@ -1089,7 +1095,7 @@ uint64_t input_keys_pressed(void *data, uint64_t last_input) if (overlay_ptr && input_overlay_key_pressed(overlay_ptr, i)) { - BIT64_SET(ret, i); + RARCH_INPUT_STATE_BIT_SET_PTR(p_new_state, i); continue; } #endif @@ -1104,7 +1110,7 @@ uint64_t input_keys_pressed(void *data, uint64_t last_input) if (command_get(&handle)) { - BIT64_SET(ret, i); + RARCH_INPUT_STATE_BIT_SET_PTR(p_new_state, i); continue; } } @@ -1114,13 +1120,11 @@ uint64_t input_keys_pressed(void *data, uint64_t last_input) if (input_driver_remote && input_remote_key_pressed(i, 0)) { - BIT64_SET(ret, i); + RARCH_INPUT_STATE_BIT_SET_PTR(p_new_state, i); continue; } #endif } - - return ret; } @@ -1313,7 +1317,7 @@ bool input_driver_init_command(void) } input_driver_command = command_new(); - + if (command_network_new( input_driver_command, stdin_cmd_enable && !grab_stdin, @@ -1578,7 +1582,7 @@ bool input_joypad_set_rumble(const input_device_driver_t *drv, if (!input_config_get_bind_idx(port, &joy_idx)) return false; - + if (!drv || !drv->set_rumble) return false; @@ -1609,50 +1613,96 @@ int16_t input_joypad_analog(const input_device_driver_t *drv, unsigned port, unsigned idx, unsigned ident, const struct retro_keybind *binds) { - uint32_t axis_minus, axis_plus; - int16_t pressed_minus, pressed_plus, res; - unsigned ident_minus = 0; - unsigned ident_plus = 0; - const struct retro_keybind *bind_minus = NULL; - const struct retro_keybind *bind_plus = NULL; + int16_t res; - input_conv_analog_id_to_bind_id(idx, ident, &ident_minus, &ident_plus); - - bind_minus = &binds[ident_minus]; - bind_plus = &binds[ident_plus]; - - if (!bind_minus->valid || !bind_plus->valid) - return 0; - - axis_minus = bind_minus->joyaxis; - axis_plus = bind_plus->joyaxis; - - if (axis_minus == AXIS_NONE) - axis_minus = joypad_info.auto_binds[ident_minus].joyaxis; - if (axis_plus == AXIS_NONE) - axis_plus = joypad_info.auto_binds[ident_plus].joyaxis; - - pressed_minus = abs(drv->axis(joypad_info.joy_idx, axis_minus)); - pressed_plus = abs(drv->axis(joypad_info.joy_idx, axis_plus)); - res = pressed_plus - pressed_minus; - - if (res == 0) + if ( idx == RETRO_DEVICE_INDEX_ANALOG_BUTTON ) { - int16_t digital_left = 0; - int16_t digital_right = 0; - uint64_t key_minus = bind_minus->joykey; - uint64_t key_plus = bind_plus->joykey; + /* A RETRO_DEVICE_JOYPAD button? */ + if ( ident < RARCH_FIRST_CUSTOM_BIND ) + { + uint32_t axis = 0; + const struct retro_keybind *bind = NULL; - if (key_minus == NO_BTN) - key_minus = joypad_info.auto_binds[ident_minus].joykey; - if (key_plus == NO_BTN) - key_plus = joypad_info.auto_binds[ident_plus].joykey; + bind = &binds[ ident ]; + if (!bind->valid) + return 0; - if (drv->button(joypad_info.joy_idx, (uint16_t)key_minus)) - digital_left = -0x7fff; - if (drv->button(joypad_info.joy_idx, (uint16_t)key_plus)) - digital_right = 0x7fff; - return digital_right + digital_left; + axis = bind->joyaxis; + if ( axis == AXIS_NONE ) + axis = joypad_info.auto_binds[ ident ].joyaxis; + + /* Analog button. */ + res = abs( drv->axis( joypad_info.joy_idx, axis ) ); + + /* If the result is zero, it's got a digital button attached to it */ + if ( res == 0 ) + { + uint64_t key = bind->joykey; + + if ( key == NO_BTN ) + key = joypad_info.auto_binds[ ident ].joykey; + + if ( drv->button(joypad_info.joy_idx, (uint16_t)key)) + res = 0x7fff; + } + } + else + { + /* not a suitable button */ + res = 0; + } + } + else + { + /* Analog sticks. Either RETRO_DEVICE_INDEX_ANALOG_LEFT + * or RETRO_DEVICE_INDEX_ANALOG_RIGHT */ + + uint32_t axis_minus, axis_plus; + int16_t pressed_minus, pressed_plus; + unsigned ident_minus = 0; + unsigned ident_plus = 0; + const struct retro_keybind *bind_minus = NULL; + const struct retro_keybind *bind_plus = NULL; + + input_conv_analog_id_to_bind_id(idx, ident, &ident_minus, &ident_plus); + + bind_minus = &binds[ident_minus]; + bind_plus = &binds[ident_plus]; + + if (!bind_minus->valid || !bind_plus->valid) + return 0; + + axis_minus = bind_minus->joyaxis; + axis_plus = bind_plus->joyaxis; + + if (axis_minus == AXIS_NONE) + axis_minus = joypad_info.auto_binds[ident_minus].joyaxis; + if (axis_plus == AXIS_NONE) + axis_plus = joypad_info.auto_binds[ident_plus].joyaxis; + + pressed_minus = abs(drv->axis(joypad_info.joy_idx, axis_minus)); + pressed_plus = abs(drv->axis(joypad_info.joy_idx, axis_plus)); + res = pressed_plus - pressed_minus; + + if (res == 0) + { + int16_t digital_left = 0; + int16_t digital_right = 0; + uint64_t key_minus = bind_minus->joykey; + uint64_t key_plus = bind_plus->joykey; + + if (key_minus == NO_BTN) + key_minus = joypad_info.auto_binds[ident_minus].joykey; + if (key_plus == NO_BTN) + key_plus = joypad_info.auto_binds[ident_plus].joykey; + + if (drv->button(joypad_info.joy_idx, (uint16_t)key_minus)) + digital_left = -0x7fff; + if (drv->button(joypad_info.joy_idx, (uint16_t)key_plus)) + digital_right = 0x7fff; + + return digital_right + digital_left; + } } return res; @@ -1707,6 +1757,39 @@ bool input_joypad_hat_raw(const input_device_driver_t *drv, return drv->button(port, HAT_MAP(hat, hat_dir)); } +/** + * input_mouse_button_raw: + * @port : Mouse number. + * @button : Identifier of key (libretro mouse constant). + * + * Checks if key (@button) was being pressed by user + * with mouse number @port. + * + * Returns: true (1) if key was pressed, otherwise + * false (0). + **/ +bool input_mouse_button_raw(unsigned port, unsigned id) +{ + int16_t res; + rarch_joypad_info_t joypad_info; + settings_t *settings = config_get_ptr(); + + /*ignore axes*/ + if ( id == RETRO_DEVICE_ID_MOUSE_X || id == RETRO_DEVICE_ID_MOUSE_Y ) + return false; + + joypad_info.axis_threshold = input_driver_axis_threshold; + joypad_info.joy_idx = settings->uints.input_joypad_map[port]; + joypad_info.auto_binds = input_autoconf_binds[joypad_info.joy_idx]; + + res = current_input->input_state(current_input_data, + joypad_info, libretro_input_binds, port, RETRO_DEVICE_MOUSE, 0, id); + + if (res) + return true; + return false; +} + /** * input_conv_analog_id_to_bind_id: * @idx : Analog key index. @@ -1941,8 +2024,8 @@ bool input_keyboard_line_append(const char *word) unsigned i = 0; unsigned len = (unsigned)strlen(word); char *newbuf = (char*) - realloc(g_keyboard_line->buffer, - g_keyboard_line->size + len*2); + realloc(g_keyboard_line->buffer, + g_keyboard_line->size + len*2); if (!newbuf) return false; @@ -2373,6 +2456,74 @@ void input_config_parse_joy_axis(void *data, const char *prefix, } } +void input_config_parse_mouse_button(void *data, const char *prefix, + const char *btn, struct retro_keybind *bind) +{ + int val; + char str[256]; + char tmp[64]; + char key[64]; + config_file_t *conf = (config_file_t*)data; + + str[0] = tmp[0] = key[0] = '\0'; + + fill_pathname_join_delim(str, prefix, btn, + '_', sizeof(str)); + fill_pathname_join_delim(key, str, + "mbtn", '_', sizeof(key)); + + if ( bind && config_get_array(conf, key, tmp, sizeof(tmp)) ) + { + bind->mbutton = NO_BTN; + + if ( tmp[0]=='w' ) + { + switch ( tmp[1] ) + { + case 'u': + bind->mbutton = RETRO_DEVICE_ID_MOUSE_WHEELUP; + break; + case 'd': + bind->mbutton = RETRO_DEVICE_ID_MOUSE_WHEELDOWN; + break; + case 'h': + switch ( tmp[2] ) + { + case 'u': + bind->mbutton = RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP; + break; + case 'd': + bind->mbutton = RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN; + break; + } + break; + } + } + else + { + val = atoi(tmp); + switch ( val ) + { + case 1: + bind->mbutton = RETRO_DEVICE_ID_MOUSE_LEFT; + break; + case 2: + bind->mbutton = RETRO_DEVICE_ID_MOUSE_RIGHT; + break; + case 3: + bind->mbutton = RETRO_DEVICE_ID_MOUSE_MIDDLE; + break; + case 4: + bind->mbutton = RETRO_DEVICE_ID_MOUSE_BUTTON_4; + break; + case 5: + bind->mbutton = RETRO_DEVICE_ID_MOUSE_BUTTON_5; + break; + } + } + } +} + static void input_config_get_bind_string_joykey( char *buf, const char *prefix, const struct retro_keybind *bind, size_t size) @@ -2415,9 +2566,9 @@ static void input_config_get_bind_string_joykey( { if (bind->joykey_label && !string_is_empty(bind->joykey_label) && label_show) - snprintf(buf, size, "%s%s (btn) ", prefix, bind->joykey_label); + snprintf(buf, size, "%s%s (btn)", prefix, bind->joykey_label); else - snprintf(buf, size, "%s%u (%s) ", prefix, (unsigned)bind->joykey, + snprintf(buf, size, "%s%u (%s)", prefix, (unsigned)bind->joykey, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE)); } } @@ -2445,7 +2596,7 @@ static void input_config_get_bind_string_joyaxis(char *buf, const char *prefix, dir = '+'; axis = AXIS_POS_GET(bind->joyaxis); } - snprintf(buf, size, "%s%c%u (%s) ", prefix, dir, axis, + snprintf(buf, size, "%s%c%u (%s)", prefix, dir, axis, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE)); } } @@ -2453,6 +2604,7 @@ static void input_config_get_bind_string_joyaxis(char *buf, const char *prefix, void input_config_get_bind_string(char *buf, const struct retro_keybind *bind, const struct retro_keybind *auto_bind, size_t size) { + int delim = 0; #ifndef RARCH_CONSOLE char key[64]; char keybuf[64]; @@ -2470,14 +2622,69 @@ void input_config_get_bind_string(char *buf, const struct retro_keybind *bind, else if (auto_bind && auto_bind->joyaxis != AXIS_NONE) input_config_get_bind_string_joyaxis(buf, "Auto: ", auto_bind, size); + if (*buf) + delim = 1; + #ifndef RARCH_CONSOLE input_keymaps_translate_rk_to_str(bind->key, key, sizeof(key)); if (string_is_equal(key, file_path_str(FILE_PATH_NUL))) *key = '\0'; - - snprintf(keybuf, sizeof(keybuf), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_KEY), key); - strlcat(buf, keybuf, size); + /*empty?*/ + if (*key != '\0') + { + if (delim ) + strlcat(buf, ", ", size); + snprintf(keybuf, sizeof(keybuf), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_KEY), key); + strlcat(buf, keybuf, size); + delim = 1; + } #endif + + if ( bind->mbutton != NO_BTN ) + { + int tag = 0; + switch ( bind->mbutton ) + { + case RETRO_DEVICE_ID_MOUSE_LEFT: + tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT; + break; + case RETRO_DEVICE_ID_MOUSE_RIGHT: + tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT; + break; + case RETRO_DEVICE_ID_MOUSE_MIDDLE: + tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE; + break; + case RETRO_DEVICE_ID_MOUSE_BUTTON_4: + tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4; + break; + case RETRO_DEVICE_ID_MOUSE_BUTTON_5: + tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5; + break; + case RETRO_DEVICE_ID_MOUSE_WHEELUP: + tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP; + break; + case RETRO_DEVICE_ID_MOUSE_WHEELDOWN: + tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN; + break; + case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP: + tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP; + break; + case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN: + tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN; + break; + } /* switch ( bind->mbutton ) */ + + if (tag != 0) + { + if (delim) + strlcat(buf, ", ", size); + strlcat(buf, msg_hash_to_str((enum msg_hash_enums)tag), size ); + } + } + + /*completely empty?*/ + if ( *buf == '\0' ) + strlcat(buf, "---", size); } const char *input_config_get_device_name(unsigned port) @@ -2490,11 +2697,9 @@ const char *input_config_get_device_name(unsigned port) void input_config_set_device_name(unsigned port, const char *name) { if (!string_is_empty(name)) - { strlcpy(input_device_names[port], name, sizeof(input_device_names[port])); - } } void input_config_clear_device_name(unsigned port) @@ -2534,7 +2739,8 @@ bool input_config_get_bind_idx(unsigned port, unsigned *joy_idx_real) return true; } -const struct retro_keybind *input_config_get_bind_auto(unsigned port, unsigned id) +const struct retro_keybind *input_config_get_bind_auto( + unsigned port, unsigned id) { settings_t *settings = config_get_ptr(); unsigned joy_idx = settings->uints.input_joypad_map[port]; @@ -2576,7 +2782,7 @@ void input_config_reset(void) for (i = 1; i < MAX_USERS; i++) memcpy(input_config_binds[i], retro_keybinds_rest, sizeof(retro_keybinds_rest)); - + for (i = 0; i < MAX_USERS; i++) { input_config_vid[i] = 0; diff --git a/input/input_driver.h b/input/input_driver.h index 17d135402d..3222237a41 100644 --- a/input/input_driver.h +++ b/input/input_driver.h @@ -1,7 +1,7 @@ /* RetroArch - A frontend for libretro. * Copyright (C) 2010-2014 - Hans-Kristian Arntzen * Copyright (C) 2011-2017 - Daniel De Matteis - * + * * RetroArch is free software: you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Found- * ation, either version 3 of the License, or (at your option) any later version. @@ -30,6 +30,7 @@ #include #include #include +#include #include "input_defines.h" @@ -78,7 +79,7 @@ enum rarch_input_keyboard_ctl_state RARCH_INPUT_KEYBOARD_CTL_LINE_FREE, /* - * Waits for keys to be pressed (used for binding + * Waits for keys to be pressed (used for binding * keys in the menu). * Callback returns false when all polling is done. **/ @@ -95,19 +96,21 @@ struct retro_keybind enum msg_hash_enums enum_idx; enum retro_key key; - /* Joypad key. Joypad POV (hats) + uint16_t mbutton; + + /* Joypad key. Joypad POV (hats) * are embedded into this key as well. */ uint64_t joykey; - /* Default key binding value - + /* Default key binding value - * for resetting bind to default */ uint64_t def_joykey; - /* Joypad axis. Negative and positive axes + /* Joypad axis. Negative and positive axes * are embedded into this variable. */ uint32_t joyaxis; - /* Default joy axis binding value - + /* Default joy axis binding value - * for resetting bind to default */ uint32_t def_joyaxis; @@ -127,7 +130,7 @@ typedef struct rarch_joypad_info typedef struct input_driver { - /* Inits input driver. + /* Inits input driver. */ void *(*init)(const char *joypad_driver); @@ -171,7 +174,7 @@ struct rarch_joypad_driver bool (*query_pad)(unsigned); void (*destroy)(void); bool (*button)(unsigned, uint16_t); - uint64_t (*get_buttons)(unsigned); + void (*get_buttons)(unsigned, retro_bits_t *); int16_t (*axis)(unsigned, uint32_t); void (*poll)(void); bool (*set_rumble)(unsigned, enum retro_rumble_effect, uint16_t); @@ -186,7 +189,7 @@ struct hid_driver bool (*query_pad)(void *, unsigned); void (*free)(void *); bool (*button)(void *, unsigned, uint16_t); - uint64_t (*get_buttons)(void *, unsigned); + void (*get_buttons)(void *, unsigned, retro_bits_t *); int16_t (*axis)(void *, unsigned, uint32_t); void (*poll)(void *); bool (*set_rumble)(void *, unsigned, enum retro_rumble_effect, uint16_t); @@ -333,10 +336,10 @@ void input_poll(void); int16_t input_state(unsigned port, unsigned device, unsigned idx, unsigned id); -uint64_t input_keys_pressed(void *data, uint64_t last_input); +void input_keys_pressed(void *data, retro_bits_t* new_state); #ifdef HAVE_MENU -uint64_t input_menu_keys_pressed(void *data, uint64_t last_input); +void input_menu_keys_pressed(void *data, retro_bits_t* new_state); #endif void *input_driver_get_data(void); @@ -444,7 +447,7 @@ const char* config_get_joypad_driver_options(void); * * Initialize a joypad driver of name @ident. * - * If ident points to NULL or a zero-length string, + * If ident points to NULL or a zero-length string, * equivalent to calling input_joypad_init_first(). * * Returns: joypad driver if found, otherwise NULL. @@ -463,7 +466,7 @@ const input_device_driver_t *input_joypad_init_first(void *data); /** * input_conv_analog_id_to_bind_id: * @idx : Analog key index. - * E.g.: + * E.g.: * - RETRO_DEVICE_INDEX_ANALOG_LEFT * - RETRO_DEVICE_INDEX_ANALOG_RIGHT * @ident : Analog key identifier. @@ -502,7 +505,7 @@ static INLINE bool input_joypad_pressed( /* Auto-binds are per joypad, not per user. */ uint64_t joykey = (binds[key].joykey != NO_BTN) ? binds[key].joykey : joypad_info.auto_binds[key].joykey; - uint32_t joyaxis = (binds[key].joyaxis != AXIS_NONE) + uint32_t joyaxis = (binds[key].joyaxis != AXIS_NONE) ? binds[key].joyaxis : joypad_info.auto_binds[key].joyaxis; if ((uint16_t)joykey != NO_BTN && drv->button(joypad_info.joy_idx, (uint16_t)joykey)) @@ -517,9 +520,10 @@ static INLINE bool input_joypad_pressed( * @drv : Input device driver handle. * @port : User number. * @idx : Analog key index. - * E.g.: + * E.g.: * - RETRO_DEVICE_INDEX_ANALOG_LEFT * - RETRO_DEVICE_INDEX_ANALOG_RIGHT + * - RETRO_DEVICE_INDEX_ANALOG_BUTTON * @ident : Analog key identifier. * E.g.: * - RETRO_DEVICE_ID_ANALOG_X @@ -551,12 +555,12 @@ bool input_joypad_set_rumble(const input_device_driver_t *driver, unsigned port, enum retro_rumble_effect effect, uint16_t strength); /** - * input_joypad_axis_raw: + * input_joypad_axis_raw: * @drv : Input device driver handle. * @port : Joystick number. * @axis : Identifier of axis. * - * Checks if axis (@axis) was being pressed by user + * Checks if axis (@axis) was being pressed by user * with joystick number @port. * * Returns: true (1) if axis was pressed, otherwise @@ -584,7 +588,20 @@ bool input_joypad_hat_raw(const input_device_driver_t *driver, unsigned joypad, unsigned hat_dir, unsigned hat); /** - * input_joypad_name: + * input_mouse_button_raw: + * @port : Mouse number. + * @button : Identifier of key (libretro mouse constant). + * + * Checks if key (@button) was being pressed by user + * with mouse number @port. + * + * Returns: true (1) if key was pressed, otherwise + * false (0). + **/ +bool input_mouse_button_raw(unsigned port, unsigned button); + +/** + * input_joypad_name: * @drv : Input device driver handle. * @port : Joystick number. * @@ -637,7 +654,7 @@ const hid_driver_t *input_hid_init_first(void); const void *hid_driver_get_data(void); #endif -/** Line complete callback. +/** Line complete callback. * Calls back after return is pressed with the completed line. * Line can be NULL. **/ @@ -674,8 +691,8 @@ bool input_keyboard_line_append(const char *word); * * Sets function pointer for keyboard line handle. * - * The underlying buffer can be reallocated at any time - * (or be NULL), but the pointer to it remains constant + * The underlying buffer can be reallocated at any time + * (or be NULL), but the pointer to it remains constant * throughout the objects lifetime. * * Returns: underlying buffer of the keyboard line. @@ -722,7 +739,7 @@ const char *input_config_get_prefix(unsigned user, bool meta); * * Translate string representation to bind ID. * - * Returns: Bind ID value on success, otherwise + * Returns: Bind ID value on success, otherwise * RARCH_BIND_LIST_END on not found. **/ unsigned input_config_translate_str_to_bind_id(const char *str); @@ -737,6 +754,9 @@ void input_config_parse_joy_button(void *data, const char *prefix, void input_config_parse_joy_axis(void *data, const char *prefix, const char *axis, struct retro_keybind *bind); +void input_config_parse_mouse_button(void *data, const char *prefix, + const char *btn, struct retro_keybind *bind); + void input_config_set_device_name(unsigned port, const char *name); void input_config_clear_device_name(unsigned port); diff --git a/input/input_mapper.c b/input/input_mapper.c index e0b20bdcc0..0cfd365c30 100644 --- a/input/input_mapper.c +++ b/input/input_mapper.c @@ -48,90 +48,97 @@ struct input_mapper { /* The controller port that will be polled*/ uint8_t port; - /* This is a bitmask of (1 << key_bind_id). */ - uint64_t buttons; /* Left X, Left Y, Right X, Right Y */ int16_t analog[4]; /* the whole keyboard state */ uint32_t keys[RETROK_LAST / 32 + 1]; + /* This is a bitmask of (1 << key_bind_id). */ + uint64_t buttons; }; -static input_mapper_t *mapper_ptr; - input_mapper_t *input_mapper_new(uint16_t port) { - settings_t *settings = config_get_ptr(); input_mapper_t* handle = (input_mapper_t*) calloc(1, sizeof(*handle)); if (!handle) return NULL; + handle->port = port; - mapper_ptr = handle; + return handle; } void input_mapper_free(input_mapper_t *handle) { + if (!handle) + return; free (handle); } void input_mapper_poll(input_mapper_t *handle) { + int i; settings_t *settings = config_get_ptr(); - unsigned device = settings->uints.input_libretro_device[handle->port]; - device &= RETRO_DEVICE_MASK; + unsigned device = settings->uints.input_libretro_device[handle->port]; + + device &= RETRO_DEVICE_MASK; /* for now we only handle keyboard inputs */ - if (device == RETRO_DEVICE_KEYBOARD) - { - int i; - memset(handle->keys, 0, sizeof(handle->keys)); + if (device != RETRO_DEVICE_KEYBOARD) + return; - for (i = 0; i < RARCH_CUSTOM_BIND_LIST_END; i++) + memset(handle->keys, 0, sizeof(handle->keys)); + + for (i = 0; i < RARCH_CUSTOM_BIND_LIST_END; i++) + { + if (i < RETROK_LAST) { - if (i < RETROK_LAST) + if (input_state(handle->port, RETRO_DEVICE_JOYPAD, 0, i)) { - if (input_state(handle->port, RETRO_DEVICE_JOYPAD, 0, i)) - { - MAPPER_SET_KEY (handle, settings->uints.input_keymapper_ids[i]); - input_keyboard_event(true, settings->uints.input_keymapper_ids[i], 0, 0, RETRO_DEVICE_KEYBOARD); - } - else - input_keyboard_event(false, settings->uints.input_keymapper_ids[i], 0, 0, RETRO_DEVICE_KEYBOARD); + MAPPER_SET_KEY (handle, + settings->uints.input_keymapper_ids[i]); + input_keyboard_event(true, + settings->uints.input_keymapper_ids[i], + 0, 0, RETRO_DEVICE_KEYBOARD); } + else + input_keyboard_event(false, + settings->uints.input_keymapper_ids[i], + 0, 0, RETRO_DEVICE_KEYBOARD); } } - return; } void input_mapper_state( + input_mapper_t *handle, int16_t *ret, unsigned port, unsigned device, unsigned idx, unsigned id) { + if (!handle) + return; - settings_t *settings = config_get_ptr(); switch (device) { case RETRO_DEVICE_KEYBOARD: if (id < RETROK_LAST) { /* - RARCH_LOG("State: UDLR %u %u %u %u\n", - MAPPER_GET_KEY(mapper_ptr, RETROK_UP), - MAPPER_GET_KEY(mapper_ptr, RETROK_DOWN), - MAPPER_GET_KEY(mapper_ptr, RETROK_LEFT), - MAPPER_GET_KEY(mapper_ptr, RETROK_RIGHT) - );*/ + RARCH_LOG("State: UDLR %u %u %u %u\n", + MAPPER_GET_KEY(handle, RETROK_UP), + MAPPER_GET_KEY(handle, RETROK_DOWN), + MAPPER_GET_KEY(handle, RETROK_LEFT), + MAPPER_GET_KEY(handle, RETROK_RIGHT) + );*/ - if (MAPPER_GET_KEY(mapper_ptr, id)) + if (MAPPER_GET_KEY(handle, id)) *ret |= 1; } break; + default: + break; } - - return; } diff --git a/input/input_mapper.h b/input/input_mapper.h index b23b37e6a1..500faab4a0 100644 --- a/input/input_mapper.h +++ b/input/input_mapper.h @@ -40,6 +40,7 @@ void input_mapper_poll(input_mapper_t *handle); bool input_mapper_key_pressed(int key); void input_mapper_state( + input_mapper_t *handle, int16_t *ret, unsigned port, unsigned device, diff --git a/input/input_overlay.c b/input/input_overlay.c index 507b1c4309..01bea5f40c 100644 --- a/input/input_overlay.c +++ b/input/input_overlay.c @@ -39,31 +39,32 @@ typedef struct input_overlay_state { - /* This is a bitmask of (1 << key_bind_id). */ - uint64_t buttons; /* Left X, Left Y, Right X, Right Y */ int16_t analog[4]; - uint32_t keys[RETROK_LAST / 32 + 1]; + /* This is a bitmask of (1 << key_bind_id). */ + uint64_t buttons; } input_overlay_state_t; struct input_overlay { - void *iface_data; - const video_overlay_interface_t *iface; - input_overlay_state_t overlay_state; - bool enable; + enum overlay_status state; + bool enable; bool blocked; bool alive; - struct overlay *overlays; - const struct overlay *active; + unsigned next_index; + size_t index; size_t size; - unsigned next_index; - enum overlay_status state; + struct overlay *overlays; + const struct overlay *active; + void *iface_data; + const video_overlay_interface_t *iface; + + input_overlay_state_t overlay_state; }; input_overlay_t *overlay_ptr = NULL; diff --git a/intl/msg_hash_chs.h b/intl/msg_hash_chs.h index 9fcdf549a7..8879be108e 100644 --- a/intl/msg_hash_chs.h +++ b/intl/msg_hash_chs.h @@ -1,4 +1,4 @@ -MSG_HASH( +MSG_HASH( MSG_COMPILER, "编译器" ) @@ -682,6 +682,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, "右摇杆Y- (上)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, "右摇杆Y+ (下)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "启用自动配置") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, @@ -744,6 +766,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, "Y键(左侧)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(键: %s)") /*FIXME:"(Key: %s)"*/ +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "Mouse 1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "Mouse 2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "Mouse 3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "Mouse 4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "Mouse 5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "Wheel Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "Wheel Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "Wheel Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "键盘控制器映射类型") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, @@ -1674,6 +1714,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, "Pixel") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "RetroActive") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "Dot-Art") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, @@ -2163,6 +2205,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "跳过 SRAM 加载。") MSG_HASH(MSG_SLOW_MOTION, "慢动作。") +MSG_HASH(MSG_FAST_FORWARD, + "快进。") MSG_HASH(MSG_SLOW_MOTION_REWIND, "慢动作回溯。") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, @@ -3157,3 +3201,9 @@ 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_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, + "Automatically add content to playlist") +MSG_HASH(MENU_ENUM_SUBLABEL_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, + "Automatically scans loaded content so they appear inside playlists.") +MSG_HASH(MSG_SCANNING_OF_FILE_FINISHED, + "Scanning of file finished") diff --git a/intl/msg_hash_cht.h b/intl/msg_hash_cht.h index 5ada1e2891..33c9c5947d 100644 --- a/intl/msg_hash_cht.h +++ b/intl/msg_hash_cht.h @@ -1,4 +1,4 @@ -MSG_HASH( +MSG_HASH( MSG_COMPILER, "編譯器" ) @@ -682,6 +682,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, "右搖桿Y- (上)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, "右搖桿Y+ (下)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "啟用自動設定") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, @@ -744,6 +766,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, "Y鍵(左側)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(鍵: %s)") /*FIXME:"(Key: %s)"*/ +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "Mouse 1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "Mouse 2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "Mouse 3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "Mouse 4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "Mouse 5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "Wheel Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "Wheel Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "Wheel Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "鍵盤控制器映射類型") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, @@ -1674,6 +1714,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, "Pixel") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "RetroActive") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "Dot-Art") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, @@ -2163,6 +2205,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "跳過 SRAM 戴入。") MSG_HASH(MSG_SLOW_MOTION, "慢動作。") +MSG_HASH(MSG_FAST_FORWARD, + "快進。") MSG_HASH(MSG_SLOW_MOTION_REWIND, "慢動作回溯。") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, @@ -3157,3 +3201,9 @@ 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_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, + "Automatically add content to playlist") +MSG_HASH(MENU_ENUM_SUBLABEL_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, + "Automatically scans loaded content so they appear inside playlists.") +MSG_HASH(MSG_SCANNING_OF_FILE_FINISHED, + "Scanning of file finished") diff --git a/intl/msg_hash_de.h b/intl/msg_hash_de.h index f5388aebd2..26ac4331ac 100644 --- a/intl/msg_hash_de.h +++ b/intl/msg_hash_de.h @@ -687,6 +687,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, "Rechter Analogstick Y- (nach oben)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, "Rechter Analogstick Y+ (nach unten)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Automatische Konfiguration aktivieren") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, @@ -751,6 +773,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, "Y-Knopf (links)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Taste: %s)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "Mouse 1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "Mouse 2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "Mouse 3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "Mouse 4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "Mouse 5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "Wheel Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "Wheel Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "Wheel Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "Typ der Keyboard-Controller-Abbildung") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, @@ -1263,6 +1303,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_RIGHT_ANALOG, "Rechter Analogstick") MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES, "Zu Favoriten hinzufügen") +MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES_PLAYLIST, + "Zu Favoriten hinzufügen") MSG_HASH(MENU_ENUM_LABEL_VALUE_RUN, "Starten") MSG_HASH(MENU_ENUM_LABEL_VALUE_RUN_MUSIC, @@ -1723,6 +1765,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, "Pixel") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "RetroActive") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "Dot-Art") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, @@ -2225,6 +2269,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Überspringe Laden des SRAM.") MSG_HASH(MSG_SLOW_MOTION, "Zeitlupe.") +MSG_HASH(MSG_FAST_FORWARD, + "Snel vooruit.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "In Zeitlupe zurückspulen.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, @@ -2818,6 +2864,8 @@ MSG_HASH(MENU_ENUM_SUBLABEL_INFORMATION, "Zeige weiterführende Informationen über diesen Inhalt an.") MSG_HASH(MENU_ENUM_SUBLABEL_ADD_TO_FAVORITES, "Füge diesen Eintrag zu deinen Favoriten hinzu.") +MSG_HASH(MENU_ENUM_SUBLABEL_ADD_TO_FAVORITES_PLAYLIST, + "Füge diesen Eintrag zu deinen Favoriten hinzu.") MSG_HASH(MENU_ENUM_SUBLABEL_RUN, "Starte den Inhalt.") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_FILE_BROWSER_SETTINGS, @@ -3263,3 +3311,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_COLOR_BLUE, "Blau-Anteil der Bildschirmmeldungen") MSG_HASH(MENU_ENUM_LABEL_VALUE_FRAMECOUNT_SHOW, "Zeige die aktuelle Anzahl an Einzelbildern an") +MSG_HASH(MENU_ENUM_LABEL_VALUE_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, + "Automatically add content to playlist") +MSG_HASH(MENU_ENUM_SUBLABEL_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, + "Automatically scans loaded content so they appear inside playlists.") +MSG_HASH(MSG_SCANNING_OF_FILE_FINISHED, + "Scanning of file finished") diff --git a/intl/msg_hash_eo.h b/intl/msg_hash_eo.h index 14d56c01a5..d5d1d0258b 100644 --- a/intl/msg_hash_eo.h +++ b/intl/msg_hash_eo.h @@ -598,6 +598,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, "Right analog Y- (up)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, "Right analog Y+ (down)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Autoconfig Enable") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, @@ -660,6 +682,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, "Y button (left)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Key: %s)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "Mouse 1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "Mouse 2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "Mouse 3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "Mouse 4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "Mouse 5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "Wheel Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "Wheel Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "Wheel Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "Keyboard Gamepad Mapping Type") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, @@ -1570,6 +1610,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, "Pixel") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "RetroActive") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "Dot-Art") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, @@ -2052,6 +2094,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Skipping SRAM load.") MSG_HASH(MSG_SLOW_MOTION, "Slow motion.") +MSG_HASH(MSG_FAST_FORWARD, + "Fast forward.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Slow motion rewind.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, @@ -3020,3 +3064,9 @@ 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_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, + "Automatically add content to playlist") +MSG_HASH(MENU_ENUM_SUBLABEL_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, + "Automatically scans loaded content so they appear inside playlists.") +MSG_HASH(MSG_SCANNING_OF_FILE_FINISHED, + "Scanning of file finished") diff --git a/intl/msg_hash_es.c b/intl/msg_hash_es.c index 5f8ddab95a..631d53b609 100644 --- a/intl/msg_hash_es.c +++ b/intl/msg_hash_es.c @@ -1469,6 +1469,8 @@ const char *msg_hash_to_str_es(enum msg_hash_enums msg) return "Omitiendo carga de SRAM."; case MSG_SLOW_MOTION: return "Cámara lenta."; + case MSG_FAST_FORWARD: + return "Avance rápido."; case MSG_SLOW_MOTION_REWIND: return "Rebobinar cámara lenta."; case MSG_SRAM_WILL_NOT_BE_SAVED: diff --git a/intl/msg_hash_fr.h b/intl/msg_hash_fr.h index 94bd0f9bbb..7fe0883274 100644 --- a/intl/msg_hash_fr.h +++ b/intl/msg_hash_fr.h @@ -681,6 +681,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, "Analogique droit Y- (haut)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, "Analogique droit Y+ (bas)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Activer l'autoconfiguration") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, @@ -745,6 +767,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, "Bouton Y (gauche)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Touche : %s)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "Mouse 1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "Mouse 2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "Mouse 3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "Mouse 4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "Mouse 5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "Wheel Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "Wheel Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "Wheel Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "Type de mappage manette/clavier") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, @@ -1695,6 +1735,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, "Pixel") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "RetroActive") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "Dot-Art") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, @@ -2183,6 +2225,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Ignore le chargement de la SRAM.") MSG_HASH(MSG_SLOW_MOTION, "Ralenti.") +MSG_HASH(MSG_FAST_FORWARD, + "Avance rapide.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Rembobinage ralenti.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, @@ -3189,3 +3233,9 @@ 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_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, + "Automatically add content to playlist") +MSG_HASH(MENU_ENUM_SUBLABEL_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, + "Automatically scans loaded content so they appear inside playlists.") +MSG_HASH(MSG_SCANNING_OF_FILE_FINISHED, + "Scanning of file finished") diff --git a/intl/msg_hash_it.h b/intl/msg_hash_it.h index 6d85124076..d6b420f08b 100644 --- a/intl/msg_hash_it.h +++ b/intl/msg_hash_it.h @@ -687,6 +687,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, "Analogico Destro Y- (su)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, "Analogico Destro Y+ (giù)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Abilita Autoconfigurazione") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, @@ -751,6 +773,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, "Pulsante Y (sinistro)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Tasto: %s)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "Mouse 1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "Mouse 2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "Mouse 3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "Mouse 4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "Mouse 5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "Wheel Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "Wheel Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "Wheel Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "Tipo di mappatura del gamepad della tastiera") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, @@ -1263,6 +1303,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_RIGHT_ANALOG, "Analogico Destro") MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES, "Aggiungi a Preferiti") +MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES_PLAYLIST, + "Aggiungi a Preferiti") MSG_HASH(MENU_ENUM_LABEL_VALUE_RUN, "Avvia") MSG_HASH(MENU_ENUM_LABEL_VALUE_RUN_MUSIC, @@ -1721,6 +1763,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, "Pixel") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "RetroAttivo") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "Dot-Art") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, @@ -2223,6 +2267,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Skipping SRAM load.") MSG_HASH(MSG_SLOW_MOTION, "Slow motion.") +MSG_HASH(MSG_FAST_FORWARD, + "Avanzamento rapido.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Riavvolgimento lento.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, @@ -2816,6 +2862,8 @@ MSG_HASH(MENU_ENUM_SUBLABEL_INFORMATION, "Visualizza ulteriori informazioni sul contenuto.") MSG_HASH(MENU_ENUM_SUBLABEL_ADD_TO_FAVORITES, "Aggiunge il titolo ai tuoi preferiti.") +MSG_HASH(MENU_ENUM_SUBLABEL_ADD_TO_FAVORITES_PLAYLIST, + "Aggiunge il titolo ai tuoi preferiti.") MSG_HASH(MENU_ENUM_SUBLABEL_RUN, "Avvia il contenuto.") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_FILE_BROWSER_SETTINGS, @@ -3243,3 +3291,9 @@ MSG_HASH(MSG_INPUT_KIOSK_MODE_PASSWORD_OK, "Password corretta.") MSG_HASH(MSG_INPUT_KIOSK_MODE_PASSWORD_NOK, "Password non corretta.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, + "Aggiungi automaticamente il contenuto alla playlist") +MSG_HASH(MENU_ENUM_SUBLABEL_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, + "Esegue automaticamente la scansione dei contenuti caricati in modo che vengano visualizzati all'interno delle playlist.") +MSG_HASH(MSG_SCANNING_OF_FILE_FINISHED, + "Scansione del file completata") diff --git a/intl/msg_hash_ja.h b/intl/msg_hash_ja.h index 22371e5296..c1087e8ede 100644 --- a/intl/msg_hash_ja.h +++ b/intl/msg_hash_ja.h @@ -1,4 +1,4 @@ -#if defined(_MSC_VER) && !defined(_XBOX) +#if defined(_MSC_VER) && !defined(_XBOX) /* https://support.microsoft.com/en-us/kb/980263 */ #pragma execution_character_set("utf-8") #endif @@ -705,6 +705,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, "右アナログY- (上)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, "右アナログY+ (下)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "自動コンフィグを有効") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, @@ -769,6 +791,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, "Yボタン(左)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(キー: %s)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "Mouse 1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "Mouse 2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "Mouse 3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "Mouse 4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "Mouse 5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "Wheel Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "Wheel Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "Wheel Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "キーボードのゲームパッドマッピング式") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, @@ -1737,6 +1777,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, "ピクセル") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "レトロアクティブ") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "ドット絵") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, @@ -2160,7 +2202,7 @@ MSG_HASH(MSG_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, "一時停止。") MSG_HASH(MSG_PROGRAM, @@ -2180,7 +2222,9 @@ MSG_HASH(MSG_REDIRECTING_SAVEFILE_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, + "リマップファイルを削除しました。") MSG_HASH(MSG_REMOVED_DISK_FROM_TRAY, "Removed disk from tray.") MSG_HASH(MSG_REMOVING_TEMPORARY_CONTENT_FILE, @@ -2235,6 +2279,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Skipping SRAM load.") MSG_HASH(MSG_SLOW_MOTION, "スローモーション。") +MSG_HASH(MSG_FAST_FORWARD, + "早送り。") MSG_HASH(MSG_SLOW_MOTION_REWIND, "スローモーション巻き戻し。") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, @@ -3163,6 +3209,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_OPACITY, "OSDメッセージ背景の不透明性") MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES, "お気に入りに追加") +MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES_PLAYLIST, + "お気に入りに追加") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_DISABLE_KIOSK_MODE, "キオスクモードを無効") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_DISABLE_KIOSK_MODE, @@ -3189,3 +3237,15 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_COLOR_BLUE, "OSDメッセージの青色値") MSG_HASH(MENU_ENUM_LABEL_VALUE_FRAMECOUNT_SHOW, "フレームレート表示でフレーム数を表示") +MSG_HASH(MSG_CONFIG_OVERRIDE_LOADED, + "優先ファイルをロードしました。") +MSG_HASH(MSG_GAME_REMAP_FILE_LOADED, + "ゲームの優先ファイルをロードしました。") +MSG_HASH(MSG_CORE_REMAP_FILE_LOADED, + "コアの優先ファイルをロードしました。") +MSG_HASH(MENU_ENUM_LABEL_VALUE_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, + "Automatically add content to playlist") +MSG_HASH(MENU_ENUM_SUBLABEL_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, + "Automatically scans loaded content so they appear inside playlists.") +MSG_HASH(MSG_SCANNING_OF_FILE_FINISHED, + "Scanning of file finished") diff --git a/intl/msg_hash_ko.h b/intl/msg_hash_ko.h index a0db09d6f7..46c001d5aa 100644 --- a/intl/msg_hash_ko.h +++ b/intl/msg_hash_ko.h @@ -1,4 +1,4 @@ -MSG_HASH( +MSG_HASH( MSG_COMPILER, "컴파일러" ) @@ -669,6 +669,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, "우 아날로그 Y- (상)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, "우 아날로그 Y+ (하)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "자동설정 사용") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, @@ -731,6 +753,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, "Y 버튼 (좌)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(키: %s)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "Mouse 1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "Mouse 2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "Mouse 3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "Mouse 4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "Mouse 5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "Wheel Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "Wheel Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "Wheel Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "키보드 게임패드 설정 형식") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, @@ -1671,6 +1711,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, "Pixel") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "RetroActive") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "Dot-Art") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, @@ -2163,6 +2205,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "SRAM 불러오기 건너뛰는 중.") MSG_HASH(MSG_SLOW_MOTION, "슬로우 모션.") +MSG_HASH(MSG_FAST_FORWARD, + "빨리 감기.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "슬로우 모션 되감기.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, @@ -3152,3 +3196,9 @@ 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_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, + "Automatically add content to playlist") +MSG_HASH(MENU_ENUM_SUBLABEL_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, + "Automatically scans loaded content so they appear inside playlists.") +MSG_HASH(MSG_SCANNING_OF_FILE_FINISHED, + "Scanning of file finished") diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index f454ba44d6..a097ee5c90 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -134,6 +134,10 @@ MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_ENABLE, "cheevos_enable") MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_HARDCORE_MODE_ENABLE, "cheevos_hardcore_mode_enable") +MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_LEADERBOARDS_ENABLE, + "cheevos_leaderboards_enable") +MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_BADGES_ENABLE, + "cheevos_badges_enable") MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_LOCKED_ACHIEVEMENTS, "cheevos_locked_achievements") MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY, @@ -146,6 +150,8 @@ MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ACHIEVEMENTS, "cheevos_unlocked_achievements") MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY, "cheevos_unlocked_entry") +MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY_HARDCORE, + "cheevos_unlocked_entry_hardcore") MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_USERNAME, "cheevos_username") MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_VERBOSE_ENABLE, @@ -871,6 +877,8 @@ MSG_HASH(MENU_ENUM_LABEL_RGUI_SHOW_START_SCREEN, "rgui_show_start_screen") MSG_HASH(MENU_ENUM_LABEL_ADD_TO_FAVORITES, "favorites_add") +MSG_HASH(MENU_ENUM_LABEL_ADD_TO_FAVORITES_PLAYLIST, + "favorites_add_playlist") MSG_HASH(MENU_ENUM_LABEL_RUN, "collection") MSG_HASH(MENU_ENUM_LABEL_RUN_MUSIC, @@ -1367,3 +1375,5 @@ MSG_HASH(MENU_ENUM_LABEL_VIDEO_MESSAGE_COLOR_BLUE, "video_msg_color_blue") MSG_HASH(MENU_ENUM_LABEL_FRAMECOUNT_SHOW, "framecount_show") +MSG_HASH(MENU_ENUM_LABEL_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, + "automatically_add_content_to_playlist") diff --git a/intl/msg_hash_nl.h b/intl/msg_hash_nl.h index 251c32c283..f912f35260 100644 --- a/intl/msg_hash_nl.h +++ b/intl/msg_hash_nl.h @@ -598,6 +598,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, "Right analog Y- (up)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, "Right analog Y+ (down)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Autoconfiguratie Activeren") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, @@ -660,6 +682,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, "Y knop (left)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Key: %s)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "Mouse 1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "Mouse 2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "Mouse 3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "Mouse 4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "Mouse 5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "Wheel Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "Wheel Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "Wheel Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "Keyboard Gamepad Mapping Type") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, @@ -1568,6 +1608,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, "Pixel") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "RetroActive") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "Dot-Art") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, @@ -2050,6 +2092,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Skipping SRAM load.") MSG_HASH(MSG_SLOW_MOTION, "Slow motion.") +MSG_HASH(MSG_FAST_FORWARD, + "Snel vooruit.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Slow motion rewind.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, @@ -3020,3 +3064,9 @@ MSG_HASH(MSG_INPUT_KIOSK_MODE_PASSWORD_OK, "Wachtwoord correct.") MSG_HASH(MSG_INPUT_KIOSK_MODE_PASSWORD_NOK, "Verkeerde wachtwoord.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, + "Automatically add content to playlist") +MSG_HASH(MENU_ENUM_SUBLABEL_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, + "Automatically scans loaded content so they appear inside playlists.") +MSG_HASH(MSG_SCANNING_OF_FILE_FINISHED, + "Scanning of file finished") diff --git a/intl/msg_hash_pl.c b/intl/msg_hash_pl.c index cf5300785a..6aceda10d8 100644 --- a/intl/msg_hash_pl.c +++ b/intl/msg_hash_pl.c @@ -982,6 +982,8 @@ const char *msg_hash_to_str_pl(enum msg_hash_enums msg) return "Pomijanie wczytywania SRAM."; case MSG_SLOW_MOTION: return "Spowolnione tempo."; + case MSG_FAST_FORWARD: + return "Szybko do przodu."; case MSG_SLOW_MOTION_REWIND: return "Przewijanie w spowolnionym tempie."; case MSG_SRAM_WILL_NOT_BE_SAVED: diff --git a/intl/msg_hash_pt_br.h b/intl/msg_hash_pt_br.h index bf472714fb..c2b0ae58f5 100644 --- a/intl/msg_hash_pt_br.h +++ b/intl/msg_hash_pt_br.h @@ -661,6 +661,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, "Analógico Direito Y+ (baixo)" ) +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gatinho da Pistola") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Recarregar Pistola") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Aux A da Pistola") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Aux B da Pistola") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Aux C da Pistola") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Start da Pistola") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Select da Pistola") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "D-pad Cima da Pistola") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "D-pad Baixo da Pistola") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "D-pad Esquerdo da Pistola") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "D-pad Direito da Pistola") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Habilitar Autoconfiguração" ) @@ -757,6 +779,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Tecla: %s)" ) +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "Mouse 1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "Mouse 2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "Mouse 3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "Mouse 4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "Mouse 5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "Roda do Mouse para Cima") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "Roda do Mouse para Baixo") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "Roda do Mouse para Esquerda") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "Roda do Mouse para Diretira") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "Tipo de Mapeamento para Gamepad no Teclado" ) @@ -857,10 +897,10 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION, "Câmera Lenta" ) MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS, - "Posição do Estado de Jogo -" + "Compartimento do Estado de Jogo -" ) MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS, - "Posição do Estado de Jogo +" + "Compartimento do Estado de Jogo +" ) MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_DOWN, "Volume -" @@ -1525,6 +1565,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_RIGHT_ANALOG, MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES, "Adicionar aos Favoritos" ) +MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES_PLAYLIST, + "Adicionar aos Favoritos" + ) MSG_HASH(MENU_ENUM_LABEL_VALUE_RUN, "Executar" ) @@ -1661,7 +1704,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_START_VIDEO_PROCESSOR, "Iniciar Processador de Vídeo" ) MSG_HASH(MENU_ENUM_LABEL_VALUE_STATE_SLOT, - "Posição do Estado de Jogo" + "Compartimento do Estado de Jogo" ) MSG_HASH(MENU_ENUM_LABEL_VALUE_STATUS, "Condição" @@ -2212,6 +2255,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "RetroActive" ) +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem" + ) MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "Dot-Art" ) @@ -2729,7 +2775,7 @@ MSG_HASH(MSG_FOUND_FIRST_DATA_TRACK_ON_FILE, "Encontrada primeira faixa de dados no arquivo" ) MSG_HASH(MSG_FOUND_LAST_STATE_SLOT, - "Encontrada última posição de Estado de Jogo" + "Encontrada último compartimento de Estado de Jogo" ) MSG_HASH(MSG_FOUND_SHADER, "Shader encontrado" @@ -2798,10 +2844,10 @@ MSG_HASH(MSG_LIBRETRO_FRONTEND, "Frontend para Libretro" ) MSG_HASH(MSG_LOADED_STATE_FROM_SLOT, - "Estado de Jogo carregado da posição #%d." + "Estado de Jogo carregado do compartimento #%d." ) MSG_HASH(MSG_LOADED_STATE_FROM_SLOT_AUTO, - "Estado de Jogo carregado da posição #-1 (automático)." + "Estado de Jogo carregado do compartimento #-1 (automático)." ) MSG_HASH(MSG_LOADING, "Carregando" @@ -2927,10 +2973,10 @@ MSG_HASH(MSG_SAVED_NEW_CONFIG_TO, "Nova configuração salva em" ) MSG_HASH(MSG_SAVED_STATE_TO_SLOT, - "Estado de Jogo salvo na posição #%d." + "Estado de Jogo salvo no compartimento #%d." ) MSG_HASH(MSG_SAVED_STATE_TO_SLOT_AUTO, - "Estado de Jogo salvo na posição #-1 (automático)." + "Estado de Jogo salvo no compartimento #-1 (automático)." ) MSG_HASH(MSG_SAVED_SUCCESSFULLY_TO, "Salvo com sucesso em" @@ -2965,6 +3011,9 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, MSG_HASH(MSG_SLOW_MOTION, "Câmera Lenta." ) +MSG_HASH(MSG_FAST_FORWARD, + "Avanço rápido." + ) MSG_HASH(MSG_SLOW_MOTION_REWIND, "Voltar Atrás em Câmera Lenta." ) @@ -2981,7 +3030,7 @@ MSG_HASH(MSG_STATE_SIZE, "Tamanho do Estado de Jogo" ) MSG_HASH(MSG_STATE_SLOT, - "Posição do Estado de Jogo" + "Compartimento do Estado de Jogo" ) MSG_HASH(MSG_TAKING_SCREENSHOT, "Fazendo captura de tela" @@ -3553,6 +3602,9 @@ MSG_HASH(MENU_ENUM_SUBLABEL_INFORMATION, MSG_HASH(MENU_ENUM_SUBLABEL_ADD_TO_FAVORITES, "Adicionar o item aos seus favoritos." ) +MSG_HASH(MENU_ENUM_SUBLABEL_ADD_TO_FAVORITES_PLAYLIST, + "Adicionar o item aos seus favoritos." + ) MSG_HASH(MENU_ENUM_SUBLABEL_RUN, "Iniciar o conteúdo." ) @@ -3584,10 +3636,10 @@ MSG_HASH(MENU_ENUM_SUBLABEL_CLOSE_CONTENT, "Fecha o conteúdo atual. Alterações não salvas serão perdidas." ) MSG_HASH(MENU_ENUM_SUBLABEL_LOAD_STATE, - "Carregar um Estado de Jogo da posição selecionado atualmente." + "Carregar um Estado de Jogo do compartimento selecionado atualmente." ) MSG_HASH(MENU_ENUM_SUBLABEL_SAVE_STATE, - "Salvar um Estado de Jogo na posição selecionado atualmente." + "Salvar um Estado de Jogo no compartimento selecionado atualmente." ) MSG_HASH(MENU_ENUM_SUBLABEL_RESUME, "Retomar a execução do conteúdo atual e sair do Menu Rápido." @@ -3596,7 +3648,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_RESUME_CONTENT, "Retomar a execução do conteúdo atual e sair do Menu Rápido." ) MSG_HASH(MENU_ENUM_SUBLABEL_STATE_SLOT, - "Altera a posição do Estado de Jogo selecionado atualmente." + "Altera o compartimento do Estado de Jogo selecionado atualmente." ) MSG_HASH(MENU_ENUM_SUBLABEL_UNDO_LOAD_STATE, "Se um Estado de Jogo for carregado, o conteúdo voltará ao estado anterior ao carregamento." @@ -4129,3 +4181,9 @@ MSG_HASH(MSG_INPUT_KIOSK_MODE_PASSWORD_OK, MSG_HASH(MSG_INPUT_KIOSK_MODE_PASSWORD_NOK, "Password incorrect." ) +MSG_HASH(MENU_ENUM_LABEL_VALUE_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, + "Automatically add content to playlist") +MSG_HASH(MENU_ENUM_SUBLABEL_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, + "Automatically scans loaded content so they appear inside playlists.") +MSG_HASH(MSG_SCANNING_OF_FILE_FINISHED, + "Scanning of file finished") diff --git a/intl/msg_hash_pt_pt.h b/intl/msg_hash_pt_pt.h index 4815a6e8b1..b48e9717cd 100644 --- a/intl/msg_hash_pt_pt.h +++ b/intl/msg_hash_pt_pt.h @@ -669,6 +669,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, "Analógico Direito Y- (cima)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, "Analógico Direito Y+ (baixo)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Habilitar Auto-configuração") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, @@ -731,6 +753,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, "Botão Y (esquerda)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Tecla: %s)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "Mouse 1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "Mouse 2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "Mouse 3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "Mouse 4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "Mouse 5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "Wheel Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "Wheel Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "Wheel Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "Tipo de Mapeamento do Gamepad no Teclado") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, @@ -1663,6 +1703,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, "Pixel") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "RetroActive") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "Dot-Art") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, @@ -2153,6 +2195,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Ignorando carregamento de SRAM.") MSG_HASH(MSG_SLOW_MOTION, "Câmera lenta.") +MSG_HASH(MSG_FAST_FORWARD, + "Avanço rápido.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Função rewind em câmera lenta.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, @@ -3127,3 +3171,9 @@ 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_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, + "Automatically add content to playlist") +MSG_HASH(MENU_ENUM_SUBLABEL_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, + "Automatically scans loaded content so they appear inside playlists.") +MSG_HASH(MSG_SCANNING_OF_FILE_FINISHED, + "Scanning of file finished") diff --git a/intl/msg_hash_ru.c b/intl/msg_hash_ru.c index 6bfec695cc..9a48e61b7e 100644 --- a/intl/msg_hash_ru.c +++ b/intl/msg_hash_ru.c @@ -1,4 +1,4 @@ -/* RetroArch - A frontend for libretro. +/* RetroArch - A frontend for libretro. * Copyright (C) 2011-2017 - Daniel De Matteis * * RetroArch is free software: you can redistribute it and/or modify it under the terms diff --git a/intl/msg_hash_ru.h b/intl/msg_hash_ru.h index 8f734f92a1..4eac6397c2 100644 --- a/intl/msg_hash_ru.h +++ b/intl/msg_hash_ru.h @@ -1,4 +1,4 @@ -#if defined(_MSC_VER) && !defined(_XBOX) +#if defined(_MSC_VER) && !defined(_XBOX) /* https://support.microsoft.com/en-us/kb/980263 */ #pragma execution_character_set("utf-8") #endif @@ -25,11 +25,11 @@ MSG_HASH( ) MSG_HASH( MSG_GOT_CONNECTION_FROM, - "Установленно соединение с: \"%s\"" + "Установлено соединение с: \"%s\"" ) MSG_HASH( MSG_GOT_CONNECTION_FROM_NAME, - "Установленно соединение с: \"%s (%s)\"" + "Установлено соединение с: \"%s (%s)\"" ) MSG_HASH( MSG_PUBLIC_ADDRESS, @@ -41,7 +41,7 @@ MSG_HASH( ) MSG_HASH( MSG_NETPLAY_USERS_HAS_FLIPPED, - "Netplay users has flipped" + "Пользователи Netplay отключились" ) MSG_HASH( MSG_SETTING_DISK_IN_TRAY, @@ -49,7 +49,7 @@ MSG_HASH( ) MSG_HASH( MSG_WAITING_FOR_CLIENT, - "Ожидание клиента ..." + "Ожидание клиента..." ) MSG_HASH( MSG_NETPLAY_YOU_HAVE_LEFT_THE_GAME, @@ -61,7 +61,7 @@ MSG_HASH( ) MSG_HASH( MSG_NETPLAY_IMPLEMENTATIONS_DIFFER, - "Реализации различаются. Убедитесь, что вы используете точные версии RetroArch и выбранного ядра." + "Реализации различаются. Убедитесь, что вы используете одинаковые версии RetroArch и выбранного ядра." ) MSG_HASH( MSG_NETPLAY_ENDIAN_DEPENDENT, @@ -93,7 +93,7 @@ MSG_HASH( ) MSG_HASH( MSG_NETPLAY_CANNOT_PLAY_UNPRIVILEGED, - "У вас недостаточно прав чтобы играть" + "У вас недостаточно прав, чтобы играть" ) MSG_HASH( MSG_NETPLAY_CANNOT_PLAY_NO_SLOTS, @@ -105,7 +105,7 @@ MSG_HASH( ) MSG_HASH( MSG_NETPLAY_PEER_PAUSED, - "Netplay peer \"%s\" paused" + "Пир netplay \"%s\" приостановил игру" ) MSG_HASH( MSG_NETPLAY_CHANGED_NICK, @@ -121,11 +121,11 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_HARD_SYNC, - "Синхронизируйте CPU и GPU.Это улучшит производительность." + "Синхронизируйте CPU и GPU. Это улучшит производительность." ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_THREADED, - "Повышает производительность за счёт понижения количества кадров в секунду. Использовать только когда другие способы не сработали." + "Повышает производительность за счёт понижения количества кадров в секунду. Использовать только тогда, когда другие способы не сработали." ) MSG_HASH( MSG_AUDIO_VOLUME, @@ -157,7 +157,7 @@ MSG_HASH( ) MSG_HASH( MSG_SORRY_UNIMPLEMENTED_CORES_DONT_DEMAND_CONTENT_NETPLAY, - "Sorry, unimplemented: cores that don't demand content cannot participate in netplay." + "К сожалению, данная функция не работает: ядра, не запрашивающие контент, не могут участвовать в netplay." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ACCOUNTS_CHEEVOS_PASSWORD, @@ -189,7 +189,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_LIST_HARDCORE, - "Список достижений (Hardcore)" + "Список достижений (хардкор)" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ADD_CONTENT_LIST, @@ -221,15 +221,15 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_DEVICE, - "Аудио-устройство" + "Аудиоустройство" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_DRIVER, - "Аудио драйвер" + "Аудиодрайвер" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_DSP_PLUGIN, - "Аудио плагин DSP" + "Аудиоплагин DSP" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_ENABLE, @@ -237,7 +237,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_FILTER_DIR, - "Аудио фильтр" + "Аудиофильтр" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_TURBO_DEADZONE_LIST, @@ -257,7 +257,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_OUTPUT_RATE, - "Частота аудиовыхода (KHz)" + "Частота аудиовыхода (КГц)" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_RATE_CONTROL_DELTA, @@ -277,7 +277,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_VOLUME, - "Уровень громкости звука (dB)" + "Уровень громкости звука (дБ)" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_WASAPI_EXCLUSIVE_MODE, @@ -285,15 +285,15 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_WASAPI_FLOAT_FORMAT, - "WASAPI Float Format" + "Формат WASAPI с плавающей точкой" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_WASAPI_SH_BUFFER_LENGTH, - "WASAPI Shared Buffer Length" + "Длина общего буфера WASAPI" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUTOSAVE_INTERVAL, - "Интервал авто-сохранений" + "Интервал автосохранений" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUTO_OVERRIDES_ENABLE, @@ -301,7 +301,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUTO_REMAPS_ENABLE, - "Load Remap Files Automatically" + "Загружать файлы Remap автоматически" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUTO_SHADERS_ENABLE, @@ -433,11 +433,11 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_HARDCORE_MODE_ENABLE, - "Достижения в Hardcore Mode" + "Достижения в хардкорном режиме" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_LOCKED_ACHIEVEMENTS, - "Заблокированные Достижения:" + "Заблокированные достижения:" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_LOCKED_ENTRY, @@ -449,11 +449,11 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_TEST_UNOFFICIAL, - "Тестовые Неофициальные Достижения" + "Тестовые неофициальные достижения" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_VERBOSE_ENABLE, - "Achievements Verbose Mode" + "Режим подробного протоколирования достижений" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ACHIEVEMENTS, @@ -489,7 +489,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_DATABASE_DIRECTORY, - "База Данных контента" + "База данных контента" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_DIR, @@ -547,7 +547,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_SET_SUPPORTS_NO_CONTENT_ENABLE, MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_UPDATER_AUTO_EXTRACT_ARCHIVE, "Автоматически извлечь загруженный архив") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_UPDATER_BUILDBOT_URL, - "Создание ботов URL") + "URL билдбота ядер") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_UPDATER_LIST, "Обновить ядро") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_UPDATER_SETTINGS, @@ -599,17 +599,17 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_DOWNLOAD_CORE_CONTENT, MSG_HASH(MENU_ENUM_LABEL_VALUE_DPI_OVERRIDE_ENABLE, "Разрешить переопределение DPI") MSG_HASH(MENU_ENUM_LABEL_VALUE_DPI_OVERRIDE_VALUE, - "DPI Переопределение") + "Переопределение DPI") MSG_HASH(MENU_ENUM_LABEL_VALUE_DRIVER_SETTINGS, "Драйвер") MSG_HASH(MENU_ENUM_LABEL_VALUE_DUMMY_ON_CORE_SHUTDOWN, "Загрузка макета при выключении ядра") MSG_HASH(MENU_ENUM_LABEL_VALUE_CHECK_FOR_MISSING_FIRMWARE, - "Проверять в отсутствие firmware перед загрузкой") + "Проверять отсутствие firmware перед загрузкой") MSG_HASH(MENU_ENUM_LABEL_VALUE_DYNAMIC_WALLPAPER, "Динамические обои") MSG_HASH(MENU_ENUM_LABEL_VALUE_DYNAMIC_WALLPAPERS_DIRECTORY, - "Динамические обои") + "Каталог с динамическими обоями") MSG_HASH(MENU_ENUM_LABEL_VALUE_CHEEVOS_ENABLE, "Включить достижения") MSG_HASH(MENU_ENUM_LABEL_VALUE_ENTRY_HOVER_COLOR, @@ -637,7 +637,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_OPTIONS_IN_USE, MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP, "Помощь") MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_AUDIO_VIDEO_TROUBLESHOOTING, - "Устранение проблем с аудио / видео") + "Устранение проблем с аудио/видео") MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_CHANGE_VIRTUAL_GAMEPAD, "Изменение обложки виртуального геймпада") MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_CONTROLS, @@ -659,47 +659,69 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_HORIZONTAL_MENU, MSG_HASH(MENU_ENUM_LABEL_VALUE_IMAGES_TAB, "Образ") MSG_HASH(MENU_ENUM_LABEL_VALUE_INFORMATION, - "информация") + "Информация") MSG_HASH(MENU_ENUM_LABEL_VALUE_INFORMATION_LIST, "Информация") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ADC_TYPE, - "Аналого-цифровой тип") + "Аналогово-цифровой тип") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ALL_USERS_CONTROL_MENU, "Все пользователи управляют меню") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X, - "Левый аналог ось - X") + "Левый аналоговый стик - ось X") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS, - "Левый аналог ось - X (влево)") + "Левый аналоговый стик - ось X (влево)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS, - "Левый аналог ось - X+ (вправо)") + "Левый аналоговый стик - ось X+ (вправо)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y, - "Левый аналог ось - Y") + "Левый аналоговый стик - ось Y") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_MINUS, - "Левый аналог ось - Y- (вверх)") + "Левый аналоговый стик - ось Y- (вверх)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS, - "Левый аналог ось - Y+ (вниз)") + "Левый аналоговый стик - ось Y+ (вниз)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X, - "Правый аналог ось - X") + "Правый аналоговый стик - ось X") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS, - "Правый аналог ось - X- (влево)") + "Правый аналоговый стик - ось X- (влево)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_PLUS, - "Правый аналог ось - X + (вправо)") + "Правый аналоговый стик - ось X + (вправо)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y, - "Правый аналог ось - Y") + "Правый аналоговый стик - ось Y") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, - "Правый аналог ось - Y- (вверх)") + "Правый аналоговый стик - ось Y- (вверх)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, - "Правый аналог ось - Y+ (вниз)") + "Правый аналоговый стик - ось Y+ (вниз)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, - "Авто-конфигурация включена") + "Автоматическая настройка включена") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, "Мертвая зона у стиков") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "Сменить функции кнопок OK и Отмена") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_BIND_ALL, - "Скрепить всё") + "Привязать всё") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_BIND_DEFAULT_ALL, - "Скрепить все по умолчанию") + "Привязать всё по умолчанию") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_BIND_TIMEOUT, "Тайм-аут привязки") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_DESCRIPTOR_HIDE_UNBOUND, @@ -754,6 +776,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, "Кнопка Y") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Клавиша: %s)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "Mouse 1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "Mouse 2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "Mouse 3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "Mouse 4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "Mouse 5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "Wheel Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "Wheel Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "Wheel Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "Тип отображения клавиатуры для геймпада") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, @@ -761,9 +801,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MENU_ENUM_TOGGLE_GAMEPAD_COMBO, "Переключать меню геймпадом") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_MINUS, - "Cheat index -") + "Индекс чита -") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_PLUS, - "Cheat index +") + "Индекс чита +") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_TOGGLE, "Переключить чит") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_EJECT_TOGGLE, @@ -795,9 +835,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, "Отключения звука") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_FLIP, - "Netplay отразить пользователей") + "Отключить пользователей Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_GAME_WATCH, - "Переключить режим игры / наблюдателя Netplay") + "Переключить режим игры/наблюдателя Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_OSK, "Переключение экранной клавиатуры") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_OVERLAY_NEXT, @@ -847,7 +887,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_REMAPPING_DIRECTORY, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_REMAP_BINDS_ENABLE, "Включить замену привязок") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_SAVE_AUTOCONFIG, - "Сохранить авто-конфигурацию") + "Сохранить автоматическую настройку") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_SETTINGS, "Ввод") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_SMALL_KEYBOARD_ENABLE, @@ -855,15 +895,15 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_SMALL_KEYBOARD_ENABLE, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_TOUCH_ENABLE, "Включить касание") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, - "Турбо-режим включить") + "Включить турборежим") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_TURBO_PERIOD, - "Турбо-период") + "Период турборежима") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_USER_BINDS, - "Вход пользователя% u Binds") + "Привязки ввода пользователя %u") MSG_HASH(MENU_ENUM_LABEL_VALUE_INTERNAL_STORAGE_STATUS, "Состояние внутренней памяти") MSG_HASH(MENU_ENUM_LABEL_VALUE_JOYPAD_AUTOCONFIG_DIR, - "Ввод авто-конфига") + "Ввод автоматической настройки") MSG_HASH(MENU_ENUM_LABEL_VALUE_JOYPAD_DRIVER, "Драйвер геймпада") MSG_HASH(MENU_ENUM_LABEL_VALUE_LAKKA_SERVICES, @@ -877,7 +917,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_DUTCH, MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_ENGLISH, "Английский") MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_ESPERANTO, - "Esperanto") + "Эсперанто") MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_FRENCH, "Французский") MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_GERMAN, @@ -891,9 +931,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_KOREAN, MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_POLISH, "Польский") MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_PORTUGUESE_BRAZIL, - "португальский (Бразилия)") + "Португальский (Бразилия)") MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_PORTUGUESE_PORTUGAL, - "португальский (Португалия)") + "Португальский (Португалия)") MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_RUSSIAN, "Русский") MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_SPANISH, @@ -901,11 +941,11 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_SPANISH, MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_VIETNAMESE, "Вьетнамский") MSG_HASH(MENU_ENUM_LABEL_VALUE_LEFT_ANALOG, - "Левый аналог") + "Левый аналоговый стик") MSG_HASH(MENU_ENUM_LABEL_VALUE_LIBRETRO_DIR_PATH, "Ядро") MSG_HASH(MENU_ENUM_LABEL_VALUE_LIBRETRO_INFO_PATH, - "Информация ядра") + "Информация о ядре") MSG_HASH(MENU_ENUM_LABEL_VALUE_LIBRETRO_LOG_LEVEL, "Уровень ведения журнала") MSG_HASH(MENU_ENUM_LABEL_VALUE_LINEAR, @@ -919,7 +959,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_LIST, MSG_HASH(MENU_ENUM_LABEL_VALUE_LOAD_STATE, "Состояние загрузки") MSG_HASH(MENU_ENUM_LABEL_VALUE_LOCATION_ALLOW, - "Разрешить местоположение") + "Разрешить определение местоположения") MSG_HASH(MENU_ENUM_LABEL_VALUE_LOCATION_DRIVER, "Местоположение") MSG_HASH(MENU_ENUM_LABEL_VALUE_LOGGING_SETTINGS, @@ -971,7 +1011,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_MORE, MSG_HASH(MENU_ENUM_LABEL_VALUE_MOUSE_ENABLE, "Поддержка мыши") MSG_HASH(MENU_ENUM_LABEL_VALUE_MULTIMEDIA_SETTINGS, - "Мультимедия") + "Мультимедиа") MSG_HASH(MENU_ENUM_LABEL_VALUE_MUSIC_TAB, "Музыка") MSG_HASH(MENU_ENUM_LABEL_VALUE_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE, @@ -983,13 +1023,13 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_NEAREST, MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY, "Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_ALLOW_SLAVES, - "Allow Slave-Mode Clients") + "Разрешать клиентов в режиме Slave") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_CHECK_FRAMES, "Проверка фреймов Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_INPUT_LATENCY_FRAMES_MIN, - "Input Latency Frames") + "Кадры задержки ввода") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_INPUT_LATENCY_FRAMES_RANGE, - "Input Latency Frames Range") + "Диапазон кадров задержки ввода") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_CLIENT_SWAP_INPUT, "Netplay P2 использует C1") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_DELAY_FRAMES, @@ -1017,13 +1057,13 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_PASSWORD, MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_PUBLIC_ANNOUNCE, "Публично анонсировать Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_REQUIRE_SLAVES, - "Disallow Non-Slave-Mode Clients") + "Запретить клиентов не в режиме Slave") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_SETTINGS, "Настройки Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_START_AS_SPECTATOR, - "Netplay режим наблюдателя") + "Режим наблюдателя Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_STATELESS_MODE, - "Netplay Stateless Mode") + "Режим без состояния Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_SPECTATE_PASSWORD, "Пароль сервера режима Spectate-Only") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_SPECTATOR_MODE_ENABLE, @@ -1031,7 +1071,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_SPECTATOR_MODE_ENABLE, MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_TCP_UDP_PORT, "Порт Netplay TCP / UDP") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_NAT_TRAVERSAL, - "Netplay NAT Traversal") + "Пересечение NAT в Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_CMD_ENABLE, "Сетевые команды") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_CMD_PORT, @@ -1069,9 +1109,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_INFORMATION_AVAILABLE, MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_ITEMS, "Нет элементов.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_NETPLAY_HOSTS_FOUND, - "Сетевыех хостов не найдено.") + "Сетевые хосты не найдены.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_NETWORKS_FOUND, - "Сетей не найдено.") + "Сети не найдены.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_PERFORMANCE_COUNTERS, "Нет счетчиков производительности.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_PLAYLISTS, @@ -1211,7 +1251,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORD_DRIVER, MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORD_ENABLE, "Включить запись") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORD_PATH, - "Сохранить запись вывода как ...") + "Сохранить запись вывода как...") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORD_USE_OUTPUT_DIRECTORY, "Сохранить записи в выходном каталоге") MSG_HASH(MENU_ENUM_LABEL_VALUE_REMAP_FILE, @@ -1331,9 +1371,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SORT_SAVESTATES_ENABLE, MSG_HASH(MENU_ENUM_LABEL_VALUE_SSH_ENABLE, "SSH включён") MSG_HASH(MENU_ENUM_LABEL_VALUE_START_CORE, - "запустить ядро") + "Запустить ядро") MSG_HASH(MENU_ENUM_LABEL_VALUE_START_NET_RETROPAD, - "Запустить удаленный Ретро-геймпад") + "Запустить удаленный ретро-геймпад") MSG_HASH(MENU_ENUM_LABEL_VALUE_START_VIDEO_PROCESSOR, "Запустить видеопроцессор") MSG_HASH(MENU_ENUM_LABEL_VALUE_STATE_SLOT, @@ -1349,7 +1389,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SUSPEND_SCREENSAVER_ENABLE, MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_BGM_ENABLE, "Включен режим BGM") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_DIRECTORY, - "Система / BIOS") + "Система/BIOS") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFORMATION, "Системная информация") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_7ZIP_SUPPORT, @@ -1371,9 +1411,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_CPU_FEATURES, MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DISPLAY_METRIC_DPI, "Отображать индекс DPI") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DISPLAY_METRIC_MM_HEIGHT, - "Отображать высоту (mm)") + "Отображать высоту (мм)") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DISPLAY_METRIC_MM_WIDTH, - "Отображать ширину (mm)") + "Отображать ширину (мм)") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DSOUND_SUPPORT, "Поддержка DirectSound") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_WASAPI_SUPPORT, @@ -1439,7 +1479,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE, MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_CHARGED, "Заряжена") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_CHARGING, - "Заряжается ") + "Заряжается") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_DISCHARGING, "Разряжается") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_NO_SOURCE, @@ -1501,13 +1541,13 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAILS_DIRECTORY, MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAILS_UPDATER_LIST, "Обновление эскизов") MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAIL_MODE_BOXARTS, - "Артбоксы") + "Бокс-арты") MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAIL_MODE_SCREENSHOTS, "Скриншоты") MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAIL_MODE_TITLE_SCREENS, "Экраны заголовков") MSG_HASH(MENU_ENUM_LABEL_VALUE_TIMEDATE_ENABLE, - "Показать время/дату") + "Показать дату/время") MSG_HASH(MENU_ENUM_LABEL_VALUE_TITLE_COLOR, "Цвет заголовков в меню") MSG_HASH(MENU_ENUM_LABEL_VALUE_TRUE, @@ -1531,7 +1571,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATER_SETTINGS, MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_ASSETS, "Обновить активы") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_AUTOCONFIG_PROFILES, - "Обновить профили авто-конфигурации") + "Обновить профили автоматической настройки") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_CG_SHADERS, "Обновление Cg шейдеров") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_CHEATS, @@ -1559,9 +1599,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_USER_SETTINGS, MSG_HASH(MENU_ENUM_LABEL_VALUE_USE_BUILTIN_IMAGE_VIEWER, "Использовать встроенный просмотрщик изображений") MSG_HASH(MENU_ENUM_LABEL_VALUE_USE_BUILTIN_PLAYER, - "Использовать встроенный медиа-плеер") + "Использовать встроенный медиаплеер") MSG_HASH(MENU_ENUM_LABEL_VALUE_USE_THIS_DIRECTORY, - "<Использовать этот катало>") + "<Использовать этот каталог>") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ALLOW_ROTATE, "Разрешить вращение") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO, @@ -1571,17 +1611,17 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_AUTO, MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_INDEX, "Соотношение сторон") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION, - "Вставка черного кадра") + "Вставка чёрного кадра") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_CROP_OVERSCAN, "Обрезка обрезки (перезагрузка)") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DISABLE_COMPOSITION, "Отключить компоновку рабочего стола") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DRIVER, - "Видео драйвер") + "Видеодрайвер") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FILTER, - "Видео фильтр") + "Видеофильтр") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FILTER_DIR, - "Видео фильтр") + "Видеофильтр") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FILTER_FLICKER, "Мерцающий фильтр") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FONT_ENABLE, @@ -1599,7 +1639,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FRAME_DELAY, MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FULLSCREEN, "Использовать полноэкранный режим") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_GAMMA, - "Видео гамма") + "Видеогамма") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_GPU_RECORD, "Использовать GPU Recording") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT, @@ -1631,7 +1671,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SCALE_INTEGER, MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SETTINGS, "Видео") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_DIR, - "Видео шейдер") + "Видеошейдер") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_NUM_PASSES, "Шейдерные проходы") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PARAMETERS, @@ -1683,7 +1723,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FULLSCREEN_X, MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FULLSCREEN_Y, "Полноэкранная высота") MSG_HASH(MENU_ENUM_LABEL_VALUE_WIFI_DRIVER, - "Wi-Fi драйвер") + "Драйвер Wi-Fi") MSG_HASH(MENU_ENUM_LABEL_VALUE_WIFI_SETTINGS, "Wi-Fi") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ALPHA_FACTOR, @@ -1704,6 +1744,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, "Пиксель") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "RetroActive") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "Dot-Art") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, @@ -1711,9 +1753,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_APPLE_GREEN, "Зеленое яблоко") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_DARK, - "Темно") + "Тёмный") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_DARK_PURPLE, - "Темно фиолетовый") + "Тёмно-фиолетовый") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_ELECTRIC_BLUE, "Электрический синий") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_GOLDEN, @@ -1721,7 +1763,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_GOLDEN, MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_LEGACY_RED, "Красный") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_MIDNIGHT_BLUE, - "Темно-синий") + "Тёмно-синий") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_PLAIN, "Обычный") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_UNDERSEA, @@ -1757,37 +1799,37 @@ MSG_HASH(MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_TWO, MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_ENABLE, "Включение или отключение достижений. Для получения дополнительной информации посетите страницу http://retroachievements.org") MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_TEST_UNOFFICIAL, - "Включение или отключение неофициальных достижений и / или бета-функций в целях тестирования.") + "Включение или отключение неофициальных достижений и/или бета-функций в целях тестирования.") MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_HARDCORE_MODE_ENABLE, - "Включить или отключить сохранения, читы, перемотка назад, перемотка вперед, пауза и замедленное воспроизведение для всех игр.") + "Включить или отключить сохранения, читы, перемотку назад, перемотку вперед, паузу и замедленное воспроизведение для всех игр.") MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_VERBOSE_ENABLE, - "Enable or disable OSD verbosity for achievements.") + "Включить или отключить экран OSD для достижений.") MSG_HASH(MENU_ENUM_SUBLABEL_DRIVER_SETTINGS, - "Изменение драйверов для этой системы.") + "Изменить драйвера для этой системы.") MSG_HASH(MENU_ENUM_SUBLABEL_RETRO_ACHIEVEMENTS_SETTINGS, - "Изменение настроек для достижений.") + "Изменить настройки достижений.") MSG_HASH(MENU_ENUM_SUBLABEL_CORE_SETTINGS, - "Изменить настройки для ядра.") + "Изменить настройки ядра.") MSG_HASH(MENU_ENUM_SUBLABEL_RECORDING_SETTINGS, - "Изменить настройки для записи.") + "Изменить настройки записи.") MSG_HASH(MENU_ENUM_SUBLABEL_ONSCREEN_DISPLAY_SETTINGS, "Измените настройки отображения перекрытия, наложения клавиатуры и уведомлений на экране.") MSG_HASH(MENU_ENUM_SUBLABEL_FRAME_THROTTLE_SETTINGS, - "Измените настройки для перемотки, быстрой перемотки и замедленного воспроизведения.") + "Измените настройки перемотки, быстрой перемотки и замедленного воспроизведения.") MSG_HASH(MENU_ENUM_SUBLABEL_SAVING_SETTINGS, - "Измените настройки для сохранения.") + "Измените настройки сохранения.") MSG_HASH(MENU_ENUM_SUBLABEL_LOGGING_SETTINGS, - "Изменить настройки для ведения журнала.") + "Изменить настройки ведения журнала.") MSG_HASH(MENU_ENUM_SUBLABEL_USER_INTERFACE_SETTINGS, - "Изменить настройки для пользовательского интерфейса.") + "Изменить настройки пользовательского интерфейса.") MSG_HASH(MENU_ENUM_SUBLABEL_USER_SETTINGS, - "Измените учетные записи, имя пользователя и язык.") + "Изменить учетные записи, имя пользователя и язык.") MSG_HASH(MENU_ENUM_SUBLABEL_PRIVACY_SETTINGS, - "Измените настройки конфиденциальности.") + "Изменить настройки конфиденциальности.") MSG_HASH(MENU_ENUM_SUBLABEL_DIRECTORY_SETTINGS, "Изменение каталогов по умолчанию для этой системы.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_SETTINGS, - "Изменить настройки для списков воспроизведения.") + "Изменить настройки списков воспроизведения.") MSG_HASH(MENU_ENUM_SUBLABEL_NETWORK_SETTINGS, "Настроить параметры сервера и сети.") MSG_HASH(MENU_ENUM_SUBLABEL_ADD_CONTENT_LIST, @@ -1817,7 +1859,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_USER_BINDS, MSG_HASH(MENU_ENUM_SUBLABEL_LOG_VERBOSITY, "Включить или отключить ведение журнала в терминале.") MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY, - "Присоединиться или создать сеанс netplay.") + "Присоединиться или создать сеанс Netplay.") MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_LAN_SCAN_SETTINGS, "Поиск и подключение к серверу по локальной сети.") MSG_HASH(MENU_ENUM_SUBLABEL_INFORMATION_LIST_LIST, @@ -1829,7 +1871,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_SAMBA_ENABLE, MSG_HASH(MENU_ENUM_SUBLABEL_SERVICES_SETTINGS, "Управление службами операционной системы.") MSG_HASH(MENU_ENUM_SUBLABEL_SHOW_HIDDEN_FILES, - "Показывать скрытые файлы / каталоги внутри файлового менеджера.") + "Показывать скрытые файлы/каталоги внутри файлового менеджера.") MSG_HASH(MENU_ENUM_SUBLABEL_SSH_ENABLE, "Включить или отключить удаленный доступ к командной строке.") MSG_HASH(MENU_ENUM_SUBLABEL_SUSPEND_SCREENSAVER_ENABLE, @@ -1845,7 +1887,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FRAME_DELAY, MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_HARD_SYNC_FRAMES, "Устанавливает, сколько кадров процессор может запустить перед графическим процессором при использовании« Hard GPU Sync.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_MAX_SWAPCHAIN_IMAGES, - "Указывает видеодрайверу какой режим буферизации использовать.") + "Указывает видеодрайверу, какой режим буферизации использовать.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_MONITOR_INDEX, "Выбирает, какой экран дисплея использовать.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_REFRESH_RATE_AUTO, @@ -1869,13 +1911,13 @@ MSG_HASH(MSG_AUDIO_MUTED, MSG_HASH(MSG_AUDIO_UNMUTED, "Звук вкл.") MSG_HASH(MSG_AUTOCONFIG_FILE_ERROR_SAVING, - "Ошибка при сохранении файла авто-конфигурации.") + "Ошибка при сохранении файла автоматической настройки.") MSG_HASH(MSG_AUTOCONFIG_FILE_SAVED_SUCCESSFULLY, - "Файл авто-конфигурации успешно сохранен.") + "Файл автоматической настройки успешно сохранен.") MSG_HASH(MSG_AUTOSAVE_FAILED, "Ошибка автосохранения.") MSG_HASH(MSG_AUTO_SAVE_STATE_TO, - "Процесс авто-сохранения") + "Процесс автосохранения") MSG_HASH(MSG_BLOCKING_SRAM_OVERWRITE, "Перезапись SRAM запрещена.") MSG_HASH(MSG_BRINGING_UP_COMMAND_INTERFACE_ON_PORT, @@ -1885,9 +1927,9 @@ MSG_HASH(MSG_BYTES, MSG_HASH(MSG_CANNOT_INFER_NEW_CONFIG_PATH, "Вывод командного интерфейса на порт.") MSG_HASH(MSG_CHEEVOS_HARDCORE_MODE_ENABLE, - "Режим Hardcore включен, ваши сохранения и функция перемотки отключены.") + "Хардкорный режим включен, ваши сохранения и функция перемотки отключены.") MSG_HASH(MSG_COMPARING_WITH_KNOWN_MAGIC_NUMBERS, - "Сравнение с известными магическими числами ...") + "Сравнение с известными магическими числами...") MSG_HASH(MSG_COMPILED_AGAINST_API, "Скомпилирован против API") MSG_HASH(MSG_CONFIG_DIRECTORY_NOT_SET, @@ -1899,7 +1941,7 @@ MSG_HASH(MSG_CONTENT_CRC32S_DIFFER, MSG_HASH(MSG_CONTENT_LOADING_SKIPPED_IMPLEMENTATION_WILL_DO_IT, "Загрузка контента пропущена, реализация будет загружена сама по себе.") MSG_HASH(MSG_CORE_DOES_NOT_SUPPORT_SAVESTATES, - "Ядро не поддерживает быстрые сохранение.") + "Ядро не поддерживает быстрые сохранения.") MSG_HASH(MSG_CORE_OPTIONS_FILE_CREATED_SUCCESSFULLY, "Файл основных настроек успешно создан.") MSG_HASH(MSG_COULD_NOT_FIND_ANY_NEXT_DRIVER, @@ -1913,9 +1955,9 @@ MSG_HASH(MSG_COULD_NOT_OPEN_DATA_TRACK, MSG_HASH(MSG_COULD_NOT_READ_CONTENT_FILE, "Не удалось прочитать файл контента") MSG_HASH(MSG_COULD_NOT_READ_MOVIE_HEADER, - "Не удалось прочитать заголовок видео ролика.") + "Не удалось прочитать заголовок видеоролика.") MSG_HASH(MSG_COULD_NOT_READ_STATE_FROM_MOVIE, - "Не удалось прочитать состояние видео ролика.") + "Не удалось прочитать состояние видеоролика.") MSG_HASH(MSG_CRC32_CHECKSUM_MISMATCH, "Ошибка контрольной суммы CRC32 между файлом содержимого и контрольной суммой сохраненного содержимого в заголовке файла воспроизведения), что, скорее всего, приведет к рассинхронизации при воспроизведении.") MSG_HASH(MSG_CUSTOM_TIMING_GIVEN, @@ -2157,9 +2199,9 @@ MSG_HASH(MSG_RESTORED_OLD_SAVE_STATE, MSG_HASH(MSG_RESTORING_DEFAULT_SHADER_PRESET_TO, "Шейдеры: восстановление стандартных настроек шейдера") MSG_HASH(MSG_REVERTING_SAVEFILE_DIRECTORY_TO, - "Возврат каталога savefile на") + "Возврат каталога карт памяти на") MSG_HASH(MSG_REVERTING_SAVESTATE_DIRECTORY_TO, - "Возврат каталога savestate к") + "Возврат каталога сохранений к") MSG_HASH(MSG_REWINDING, "Перемотка.") MSG_HASH(MSG_REWIND_INIT, @@ -2198,6 +2240,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Пропуск загрузки SRAM.") MSG_HASH(MSG_SLOW_MOTION, "Замедление.") +MSG_HASH(MSG_FAST_FORWARD, + "Перемотка вперед.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Замедленная перемотка.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, @@ -2245,7 +2289,7 @@ MSG_HASH(MSG_VIRTUAL_DISK_TRAY, MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_LATENCY, "Требуемая длительность звукового сигнала в миллисекундах. Невозможно удостовериться, что звуковой драйвер не может обеспечить заданную задержку.") MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_MUTE, - "Отключить / включить звук.") + "Отключить/включить звук.") MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_RATE_CONTROL_DELTA, "Помогает сгладить недостатки времени при синхронизации аудио и видео в одно и то же время. Имейте в виду, что если отключено, правильную синхронизацию получить почти невозможно." @@ -2276,15 +2320,15 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_WASAPI_EXCLUSIVE_MODE, - "Allow the WASAPI driver to take exclusive control of the audio device. If disabled, it will use shared mode instead." + "Разрешить драйверу WASAPI получать полный контроль над аудиоустройством. При отключении будет использоваться общий режим." ) MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_WASAPI_FLOAT_FORMAT, - "Use float format for the WASAPI driver, if supported by your audio device." + "Использовать формат с плавающей точкой для драйвера WASAPI, если он поддерживается вашим аудиоустройством." ) MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_WASAPI_SH_BUFFER_LENGTH, - "The intermediate buffer length (in frames) when using the WASAPI driver in shared mode." + "Длина промежуточного буфера (в кадрах) при использовании драйвера WASAPI в общем режиме." ) MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_SYNC, @@ -2300,11 +2344,11 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_TURBO_PERIOD, - "Описывает период, в котором переключаются турбо кнопки. Значение описывается в кадрах." + "Описывает период, в котором переключаются турбокнопки. Значение описывается в кадрах." ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_DUTY_CYCLE, - "Описывает, как долго должен действовать период турбо кнопки. Значение описывается в кадрах." + "Описывает, как долго должен действовать период турбокнопки. Значение описывается в кадрах." ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_VSYNC, @@ -2312,19 +2356,19 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_ALLOW_ROTATE, - "Разрешить ядрам задавать поворот, при отключении, запросы на поворот игнорируются, что полезно при настройках, когда один из них поворачивает экран вручную." + "Разрешить ядрам задавать поворот, при отключении запросы на поворот игнорируются, что полезно при настройках, когда один из них поворачивает экран вручную." ) MSG_HASH( MENU_ENUM_SUBLABEL_DUMMY_ON_CORE_SHUTDOWN, - "Некоторые ядра могут иметь функцию отключения, если она включена, это предотвратит остановку ядра от RetroArch, вместо этого он загрузит фиктивное ядро." + "Некоторые ядра могут иметь функцию отключения. Если она включена, это предотвратит остановку ядра от RetroArch, вместо этого он загрузит фиктивное ядро." ) MSG_HASH( MENU_ENUM_SUBLABEL_CHECK_FOR_MISSING_FIRMWARE, - "Проверьте, все ли необходимые микропрограммы присутствуют, прежде чем пытаться загрузить контент." + "Перед загрузкой контента проверьте, все ли необходимые микропрограммы присутствуют." ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_REFRESH_RATE, - "Вертикальная частота обновления экрана. Используется для расчета подходящей скорости ввода аудиосигнала. ПРИМЕЧАНИЕ: Это будет проигнорировано, если включено« Потоковое видео." + "Вертикальная частота обновления экрана. Используется для расчета подходящей скорости ввода аудиосигнала. ПРИМЕЧАНИЕ: Это будет проигнорировано, если включено потоковое видео." ) MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_ENABLE, @@ -2336,7 +2380,7 @@ MSG_HASH( ) MSG_HASH( MSG_FAILED, - "Не вышло" + "Не удалось" ) MSG_HASH( MSG_SUCCEEDED, @@ -2356,11 +2400,11 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_DEVELOPER, - "База данных - Фильтр: Разработчик" + "База данных - фильтр: разработчик" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_PUBLISHER, - "База данных - Фильтр: Издатель" + "База данных - фильтр: издатель" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DISABLED, @@ -2376,41 +2420,41 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_ORIGIN, - "База Данных - Фильтр : по происхождению") + "База данных - фильтр: по происхождению") MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_FRANCHISE, - "База Данных - Фильтр : по франчайзу") + "База данных - фильтр: по франчайзу") MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_ESRB_RATING, - "База Данных - Фильтр : по рейтингу ESRB") + "База данных - фильтр: по рейтингу ESRB") MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_ELSPA_RATING, - "База Данных - Фильтр : по рейтингу ELSPA") + "База данных - фильтр: по рейтингу ELSPA") MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_PEGI_RATING, - "База Данных - Фильтрr : по рейтингу PEGI") + "База данных - фильтр: по рейтингу PEGI") MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_CERO_RATING, - "База Данных - Фильтр : по рейтингу CERO") + "База данных - фильтр: по рейтингу CERO") MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_BBFC_RATING, - "База Данных - Фильтр : по рейтингу BBFC") + "База данных - фильтр: по рейтингу BBFC") MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_MAX_USERS, - "База Данных - Фильтр : по кол-во игроков") + "База данных - фильтр: по кол-во игроков") MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_RELEASEDATE_BY_MONTH, - "База Данных - Фильтр : Вышедшие по месяцам") + "База данных - фильтр: Вышедшие по месяцам") MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_RELEASEDATE_BY_YEAR, - "База Данных - Фильтр : Вышедшие по годам") + "База данных - фильтр: Вышедшие по годам") MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_EDGE_MAGAZINE_ISSUE, - "База Данных - Фильтр : ошибки журнела Edge") + "База данных - фильтр: ошибки журнела Edge") MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_EDGE_MAGAZINE_RATING, - "База Данных - Фильтрr : рейтинг журнала Edge") + "База данных - фильтр: рейтинг журнала Edge") MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_DATABASE_INFO, "Информация базы данных") MSG_HASH(MSG_WIFI_SCAN_COMPLETE, - "Сканирование Wi-Fi успешно завершен.") + "Сканирование Wi-Fi успешно завершено.") MSG_HASH(MSG_SCANNING_WIRELESS_NETWORKS, - "Scanning wireless networks...") + "Сканирование беспроводных сетей...") MSG_HASH(MSG_NETPLAY_LAN_SCAN_COMPLETE, - "Netplay scan complete.") + "Сканирование Netplay завершено.") MSG_HASH(MSG_NETPLAY_LAN_SCANNING, - "Scanning for netplay hosts...") + "Сканирование хостов Netplay...") MSG_HASH(MENU_ENUM_SUBLABEL_PAUSE_NONACTIVE, - "Ставить на паузу когда окно теряет фокус.") + "Ставить на паузу, когда окно теряет фокус.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_DISABLE_COMPOSITION, "Включить или отключить композицию (только для Windows).") MSG_HASH(MENU_ENUM_SUBLABEL_HISTORY_LIST_ENABLE, @@ -2420,11 +2464,11 @@ MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_HISTORY_SIZE, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_UNIFIED_MENU_CONTROLS, "Унифицировать управление в меню") MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_UNIFIED_MENU_CONTROLS, - "Использовать управление в меню, такое же как в игре (для клавиатуры).") + "Использовать такое же управление в меню, как в игре (для клавиатуры).") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FONT_ENABLE, "Показывать сообщения на экране.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_USER_REMOTE_ENABLE, - "User %d Remote Enable") + "Включить удаленного пользователя %d") MSG_HASH(MENU_ENUM_LABEL_VALUE_BATTERY_LEVEL_ENABLE, "Показать заряд батареи") MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FILE, @@ -2438,7 +2482,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SCALE, MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_START_WHEN_LOADED, "Netplay заработает, когда вы запустите игру.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_LOAD_CONTENT_MANUALLY, - "Couldn't find a suitable core or content file, load manually.") + "Не удается найти требуемое ядро или файл контента, загрузите его вручную.") MSG_HASH( MENU_ENUM_LABEL_VALUE_BROWSE_URL_LIST, "Просмотр URL" @@ -2452,7 +2496,7 @@ MSG_HASH( "Старт" ) MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_BOKEH, - "Bokeh") + "Боке") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_REFRESH_ROOMS, "Обновить список комнат") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME, @@ -2466,13 +2510,13 @@ MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_CROP_OVERSCAN, MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SMOOTH, "Добавляет небольшое смазывание к изображению, чтобы избавиться от острых пикселей. Эта настройка мало влияет на производительность.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FILTER, - "Применяется CPU-powered видеофильтр. ПРИМЕЧАНИЕ: Возможна высокая нагрузка на производительность. Некоторые фильтры могут работать только на некоторых ядер, которые используют 32bit или 16bit палитру.") + "Применяется видеофильтр, работающий на CPU. ПРИМЕЧАНИЕ: Возможна высокая нагрузка на производительность. Некоторые фильтры могут работать только на некоторых ядрах, использующих 32-битную или 16-битную палитру.") MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_USERNAME, "Введите имя пользователя от вашего аккаунта Retro Achievements.") MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_PASSWORD, "Введите пароль от вашего аккаунта Retro Achievements.") MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_NICKNAME, - "Введите ваш никнейм. Он будет использоваться в netplay сесиях и т.д.") + "Введите ваш никнейм. Он будет использоваться в сессиях Netplay и т.д.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_POST_FILTER_RECORD, "Записывать процесс игры с выбранными фильтрами (неработает с шейдерами). Ваше видео будет выглядить красивым =)") MSG_HASH(MENU_ENUM_SUBLABEL_CORE_LIST, @@ -2490,9 +2534,9 @@ MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_WINDOW_WIDTH, MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_WINDOW_HEIGHT, "Изменить размер высоты для окна дисплея. Если вы поменяете параметр на 0, то программа будет пытаться масштабировать окно как можно больше.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FULLSCREEN_X, - "Set the custom width size for the non-windowed fullscreen mode. Leaving it at 0 will use the desktop resolution.") + "Установить свой размер ширины для неоконного полноэкранного режима. Если оставить его значение на 0, то будет использовано разрешение рабочего стола.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FULLSCREEN_Y, - "Set the custom height size for the non-windowed fullscreen mode. Leaving it at 0 will use the desktop resolution") + "Установить свой размер высоты для неоконного полноэкранного режима. Если оставить его значение на 0, то будет использовано разрешение рабочего стола.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_MESSAGE_POS_X, "Изменить положение оповещение по горизонтали.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_MESSAGE_POS_Y, @@ -2500,26 +2544,26 @@ MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_MESSAGE_POS_Y, MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FONT_SIZE, "Изменить размер шрифта уведомления.") MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_OVERLAY_HIDE_IN_MENU, - "Спрятать наложения в меню интерфеся, и показывать снова после выхода из него.") + "Спрятать наложения в меню интерфейса, и показывать снова после выхода из него.") MSG_HASH( MENU_ENUM_SUBLABEL_CONTENT_COLLECTION_LIST, - "После сканирование контента он появится в этом списке ." + "После сканирования контента он появится в этом списке ." ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SCALE_INTEGER, - "Only scales video in integer steps. The base size depends on system-reported geometry and aspect ratio. If 'Force Aspect' is not set, X/Y will be integer scaled independently." + "Только масштабирует видео с целочисленным интервалом. Базовый размер зависит от системной геометрии экрана и соотношения сторон. Если 'Принудительная установка' не включена, значения X/Y будут изменяться независимо друг от друга." ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_GPU_SCREENSHOT, - "Screenshots output of GPU shaded material if available." + "Вывод скриншотов с затененным материалом с помощью GPU, если доступно." ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_ROTATION, - "Forces a certain rotation of the screen. The rotation is added to rotations which the core sets." + "Принудительно задает определенный поворот экрана. Он добавляется к поворотам, уже заданным ядром." ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_FORCE_SRGB_DISABLE, - "Forcibly disable sRGB FBO support. Some Intel OpenGL drivers on Windows have video problems with sRGB FBO support if this is enabled. Enabling this can work around it." + "Принудительно отключить поддержку sRGB FBO. Некоторые драйвера Intel OpenGL на Windows испытывают проблемы с включенной поддержкой sRGB FBO. Включение этой настройки может обойти эту проблему." ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_FULLSCREEN, @@ -2531,39 +2575,39 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_GPU_RECORD, - "Records output of GPU shaded material if available." + "Записывает вывод с затененным материалом с помощью GPU, если доступно." ) MSG_HASH( MENU_ENUM_SUBLABEL_SAVESTATE_AUTO_INDEX, - "When making a savestate, save state index is automatically increased before it is saved. When loading content, the index will be set to the highest existing index." + "Перед сохранением автоматически увеличивается его индекс. При загрузке индекс будет установлен на максимальный существующий." ) MSG_HASH( MENU_ENUM_SUBLABEL_BLOCK_SRAM_OVERWRITE, - "Block Save RAM from being overwritten when loading save states. Might potentially lead to buggy games." + "Блокировать сохранение ОЗУ от перезаписи при загрузке сохранений. Может привести к багам в играх." ) MSG_HASH( MENU_ENUM_SUBLABEL_FASTFORWARD_RATIO, - "The maximum rate at which content will be run when using fast forward (e.g., 5.0x for 60 fps content = 300 fps cap). If set to 0.0x, fastforward ratio is unlimited (no FPS cap)." + "Максимальный множитель, на котором контент будет запущен при перемотке вперед (например, 5.0x для 60 кадров в секунду контента = ограничение 300 кадров в секунду). Если установлен на 0.0x - скорость перемотки вперед будет неограниченной (нет лимита кадров в секунду)." ) MSG_HASH( MENU_ENUM_SUBLABEL_SLOWMOTION_RATIO, - "When in slow motion, content will slow down by the factor specified/set." + "При снижении скорости контент будет замедляться в соответствии с заданными факторами/настройками." ) MSG_HASH( MENU_ENUM_SUBLABEL_REWIND_ENABLE, - "Enable rewinding. This will take a performance hit when playing." + "Включить перемотку. Это может снижать производительность при воспроизведении." ) MSG_HASH( MENU_ENUM_SUBLABEL_REWIND_GRANULARITY, - "When rewinding a defined number of frames, you can rewind several frames at a time, increasing the rewind speed." + "При перемотке на определенное количество кадров, вы можете перематывать несколько кадров сразу, увеличивая скорость перемотки." ) MSG_HASH( MENU_ENUM_SUBLABEL_LIBRETRO_LOG_LEVEL, - "Sets log level for cores. If a log level issued by a core is below this value, it is ignored." + "Устанавливает уровень ведения журнала для ядер. Если уровень ведения журнала, заданный ядром, ниже его значения, то он игнорируется." ) MSG_HASH( MENU_ENUM_SUBLABEL_PERFCNT_ENABLE, - "Enable performance counters for RetroArch (and cores)." + "Включить счетчики производительности для RetroArch (и ядер)." ) MSG_HASH( MENU_ENUM_SUBLABEL_SAVESTATE_AUTO_SAVE, @@ -2579,87 +2623,87 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_AUTOSAVE_INTERVAL, - "Autosaves the non-volatile Save RAM at a regular interval. This is disabled by default unless set otherwise. The interval is measured in seconds. A value of 0 disables autosave." + "Автоматически сохраняет энергонезависимую ОЗУ сохранений через регулярные промежутки времени. По умолчанию отключено, если не включено явно. Интервал измеряется в секундах. Значение 0 отключает автосохранение." ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_REMAP_BINDS_ENABLE, - "If enabled, overrides the input binds with the remapped binds set for the current core." + "Если включено, перезаписывает привязки ввода переназначенными для текущего ядра." ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_AUTODETECT_ENABLE, - "Enable input auto-detection. Will attempt to autoconfigure joypads, Plug-and-Play style." + "Включить автоматическое обнаружение ввода. Будет производена попытка автоматической настройки геймпадов Plug-and-Play." ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_INPUT_SWAP_OK_CANCEL, - "Swap buttons for OK/Cancel. Disabled is the Japanese button orientation, enabled is the western orientation." + "Поменять местами кнопки OK/Отмена. Отключено — японское расположение кнопок, включено — западное расположение." ) MSG_HASH( MENU_ENUM_SUBLABEL_PAUSE_LIBRETRO, - "If disabled, the content will keep running in the background when RetroArch's menu is toggled." + "Если включено, контент будет запущен в фоне при включении меню RetroArch." ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_DRIVER, - "Video driver to use." + "Используемый видеодрайвер." ) MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_DRIVER, - "Audio driver to use." + "Используемый аудиодрайвер." ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_DRIVER, - "Input driver to use. Depending on the video driver, it might force a different input driver." + "Используемый драйвер ввода. В зависимости от видеодрайвера драйвер ввода может быть установлен принудительно." ) MSG_HASH( MENU_ENUM_SUBLABEL_JOYPAD_DRIVER, - "Joypad driver to use." + "Используемый драйвер геймпада." ) MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_RESAMPLER_DRIVER, - "Audio resampler driver to use." + "Используемый драйвер аудиоресэмплера." ) MSG_HASH( MENU_ENUM_SUBLABEL_CAMERA_DRIVER, - "Camera driver to use." + "Используемый драйвер камеры." ) MSG_HASH( MENU_ENUM_SUBLABEL_LOCATION_DRIVER, - "Location driver to use." + "Используемый драйвер местоположения." ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_DRIVER, - "Menu driver to use." + "Используемый драйвер меню." ) MSG_HASH( MENU_ENUM_SUBLABEL_RECORD_DRIVER, - "Record driver to use." + "Используемый драйвер записи." ) MSG_HASH( MENU_ENUM_SUBLABEL_WIFI_DRIVER, - "WiFi driver to use." + "Используемый драйвер Wi-Fi." ) MSG_HASH( MENU_ENUM_SUBLABEL_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE, - "Filter files being shown in filebrowser by supported extensions." + "Фильтровать файлы в файловом менеджере по поддерживаемым расширениям." ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_WALLPAPER, - "Select an image to set as menu wallpaper." + "Выберите изображение для установки в качестве обоев меню." ) MSG_HASH( MENU_ENUM_SUBLABEL_DYNAMIC_WALLPAPER, - "Dynamically load a new wallpaper depending on context." + "Динамически загружать новые обои в зависимости от контекста." ) MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_DEVICE, - "Override the default audio device the audio driver uses. This is driver dependent." + "Перебивать аудиоустройство по умолчанию, используя аудиодрайвер. Эта настройка зависит от драйвера." ) MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_DSP_PLUGIN, - "Audio DSP plugin that processes audio before it's sent to the driver." + "Аудиоплагин DSP, обрабатывающий аудио до отправки драйверу." ) MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_OUTPUT_RATE, - "Audio output sample rate." + "Частота дискретизации аудиовывода." ) MSG_HASH( MENU_ENUM_SUBLABEL_OVERLAY_OPACITY, @@ -2683,7 +2727,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_TCP_UDP_PORT, - "The port of the host IP address. Can be either a TCP or UDP port." + "Порт IP-адреса хоста. Может быть порт TCP или UDP." ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_PASSWORD, @@ -2691,39 +2735,39 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_PUBLIC_ANNOUNCE, - "Whether to announce netplay games publicly. If unset, clients must manually connect rather than using the public lobby." + "Анонсировать игру netplay публично. Если не установлено, клиенту придется подключаться вручную, не используя публичное лобби." ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_SPECTATE_PASSWORD, - "The password for connecting to the netplay host with only spectator privileges. Used only in host mode." + "Пароль для подключения к хосту netplay только с правами наблюдателя. Используется только в режиме хоста." ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_START_AS_SPECTATOR, - "Whether to start netplay in spectator mode." + "Начинать netplay в режиме наблюдателя." ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_ALLOW_SLAVES, - "Whether to allow connections in slave mode. Slave-mode clients require very little processing power on either side, but will suffer significantly from network latency." + "Разрешать подключения в режиме slave. Клиенты в режиме slave требуют немного вычислительной мощности со своей стороны, но задержка сети может значительно увеличиться." ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_REQUIRE_SLAVES, - "Whether to disallow connections not in slave mode. Not recommended except for very fast networks with very weak machines." + "Запрещать подключения не в режиме slave. Не рекомендуется, за исключением очень быстрых сетей с очень слабыми машинами." ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_STATELESS_MODE, - "Whether to run netplay in a mode not requiring save states. If set to true, a very fast network is required, but no rewinding is performed, so there will be no netplay jitter." + "Запускать netplay в режиме, не требующем сохранения. Если включено, потребуется очень быстрая сеть, но netplay будет без заиканий, поскольку нет повторов." ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_CHECK_FRAMES, - "The frequency in frames with which netplay will verify that the host and client are in sync." + "Частота кадров, с которой netplay будет проверять синхронизацию хоста и клиента." ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_NAT_TRAVERSAL, - "When hosting, attempt to listen for connections from the public Internet, using UPnP or similar technologies to escape LANs." + "В режиме хоста, пытаться слушать подключения из публичного Интернета, используя UPnP или похожие технологии для избежания локальных сетей." ) MSG_HASH( MENU_ENUM_SUBLABEL_STDIN_CMD_ENABLE, - "Enable stdin command interface." + "Включить интерфейс команды stdin." ) MSG_HASH( MENU_ENUM_SUBLABEL_MOUSE_ENABLE, @@ -2747,58 +2791,58 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_NAVIGATION_WRAPAROUND, - "Wrap-around to beginning and/or end if boundary of list is reached horizontally or vertically." + "Сортировка к началу и/или концу, если достигнута горизонтальная или вертикальная граница списка." ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_ENABLE_HOST, - "Запустить netplay на хосте (сервера)." + "Запустить netplay на хосте (сервере)." ) MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_ENABLE_CLIENT, "Включить netplay в режиме клиента.") MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_DISCONNECT, "Отключить активное соединение Netplay.") MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_DIRECTORY, - "Scans a directory for compatible files and add them to the collection.") + "Сканирует каталог для поиска совместимых файлов и добавляет их в коллекцию.") MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_FILE, - "Scans a compatible file and add it to the collection.") + "Сканирует совместимый файл и добавляет его в коллекцию.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SWAP_INTERVAL, - "Uses a custom swap interval for Vsync. Set this to effectively halve monitor refresh rate." + "Использует заданный интервал обновления для вертикальной синхронизации. Установите для эффективной частоты обновления монитора." ) MSG_HASH(MENU_ENUM_SUBLABEL_SORT_SAVEFILES_ENABLE, - "Sort save files in folders named after the core used." + "Сортировать карты памяти в каталогах, названные после использования ядра." ) MSG_HASH(MENU_ENUM_SUBLABEL_SORT_SAVESTATES_ENABLE, - "Sort save states in folders named after the core used." + "Сортировать файлы сохранений в каталогах, названные после использования ядра." ) MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_CLIENT_SWAP_INPUT, - "When being client over netplay, use keybinds for Player 1.") + "Будучи клиентом netplay, использовать привязки клавиш для Игрока 1.") MSG_HASH(MENU_ENUM_SUBLABEL_CORE_UPDATER_BUILDBOT_URL, - "URL to core updater directory on the Libretro buildbot.") + "URL каталога обновлений ядра на билдботе Libretro.") MSG_HASH(MENU_ENUM_SUBLABEL_BUILDBOT_ASSETS_URL, - "URL to assets updater directory on the Libretro buildbot.") + "URL каталога обновлений содержимого на билдботе Libretro.") MSG_HASH(MENU_ENUM_SUBLABEL_CORE_UPDATER_AUTO_EXTRACT_ARCHIVE, - "After downloading, automatically extract files contained in the downloaded archives." + "После загрузки, автоматически извлекать файлы из загруженных архивов." ) MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_REFRESH_ROOMS, - "Scan for new rooms.") + "Сканировать для поиска новых комнат.") MSG_HASH(MENU_ENUM_SUBLABEL_DELETE_ENTRY, - "Remove this entry from the collection.") + "Удалить эту запись из коллекции.") MSG_HASH(MENU_ENUM_SUBLABEL_INFORMATION, - "View more information about the content.") + "Просмотреть больше информации о содержимом.") MSG_HASH(MENU_ENUM_SUBLABEL_RUN, - "Start the content.") + "Запустить содержимое.") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_FILE_BROWSER_SETTINGS, - "Adjusts filebrowser settings.") + "Задает настройки файлового менеджера.") MSG_HASH( MENU_ENUM_SUBLABEL_AUTO_REMAPS_ENABLE, - "Enable customized controls by default at startup." + "Включить измененное управление по умолчанию при запуске." ) MSG_HASH( MENU_ENUM_SUBLABEL_AUTO_OVERRIDES_ENABLE, - "Enable customized configuration by default at startup." + "Включить измененную конфигурацию по умолчанию при запуске." ) MSG_HASH(MENU_ENUM_SUBLABEL_GAME_SPECIFIC_OPTIONS, - "Enable customized core options by default at startup.") + "Включить измененные настройки ядра по умолчанию при запуске.") MSG_HASH(MENU_ENUM_SUBLABEL_CORE_ENABLE, "Показывать название ядра в главном меню.") MSG_HASH(MENU_ENUM_SUBLABEL_DATABASE_MANAGER, @@ -2809,73 +2853,73 @@ MSG_HASH(MENU_ENUM_SUBLABEL_TAKE_SCREENSHOT, "Сделать скриншот экрана.") MSG_HASH( MENU_ENUM_SUBLABEL_CLOSE_CONTENT, - "Выход из игры. Все несохраненные файлы возможно пропадут." + "Выход из игры. Все несохраненные файлы, возможно, пропадут." ) MSG_HASH(MENU_ENUM_SUBLABEL_LOAD_STATE, - "Load a saved state from the currently selected slot.") + "Загрузить сохранение из текущего выбранного слота.") MSG_HASH(MENU_ENUM_SUBLABEL_SAVE_STATE, - "Save a state to the currently selected slot.") + "Сохранить в текущий выбранный слот.") MSG_HASH(MENU_ENUM_SUBLABEL_RESUME, - "Resume the currently running content and leave the Quick Menu.") + "Продолжить контент, запущенный в данный момент, и выйти в быстрое меню.") MSG_HASH(MENU_ENUM_SUBLABEL_RESUME_CONTENT, - "Resume the currently running content and leave the Quick Menu.") + "Продолжить контент, запущенный в данный момент, и выйти в быстрое меню.") MSG_HASH(MENU_ENUM_SUBLABEL_STATE_SLOT, - "Changes the currently selected state slot.") + "Изменяет выбранный слот сохранения.") MSG_HASH(MENU_ENUM_SUBLABEL_UNDO_LOAD_STATE, - "If a state was loaded, content will go back to the state prior to loading.") + "При загруженном сохранении, контент изменит свое состояние на предшествующее загруженному.") MSG_HASH(MENU_ENUM_SUBLABEL_UNDO_SAVE_STATE, - "If a state was overwritten, it will roll back to the previous save state.") + "Если сохранение было перезаписано, будет произведен откат на предшествующее.") MSG_HASH( MENU_ENUM_SUBLABEL_ACCOUNTS_RETRO_ACHIEVEMENTS, "Сервис Retro Achievements. Для дополнительной информации, посетите страницу http://retroachievements.org" ) MSG_HASH( MENU_ENUM_SUBLABEL_ACCOUNTS_LIST, - "Manages currently configured accounts." + "Управляет настроенными профилями." ) MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_META_REWIND, "Управление настройками перемотки.") MSG_HASH(MENU_ENUM_SUBLABEL_RESTART_CONTENT, "Перезапустить игру.") MSG_HASH(MENU_ENUM_SUBLABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CORE, - "Saves an override configuration file which will apply for all content loaded with this core. Will take precedence over the main configuration.") + "Сохраняет файл настроек, который будет применен ко всему контенту, загруженному с этим ядром. Он будет иметь более высокий приоритет над основной конфигурацией.") MSG_HASH(MENU_ENUM_SUBLABEL_SAVE_CURRENT_CONFIG_OVERRIDE_GAME, - "Saves an override configuration file which will apply for the current content only. Will take precedence over the main configuration.") + "Сохраняет файл настроек, который будет применен только к текущему контенту. Он будет иметь более высокий приоритет над основной конфигурацией.") MSG_HASH(MENU_ENUM_SUBLABEL_CORE_CHEAT_OPTIONS, - "Set up cheat codes.") + "Настроить чит-коды.") MSG_HASH(MENU_ENUM_SUBLABEL_SHADER_OPTIONS, - "Set up shaders to visually augment the image.") + "Настроить шейдеры для визуального улучшения изображения.") MSG_HASH(MENU_ENUM_SUBLABEL_CORE_INPUT_REMAPPING_OPTIONS, - "Change the controls for the currently running content.") + "Изменить управление для контента, запущенного в данный момент.") MSG_HASH(MENU_ENUM_SUBLABEL_CORE_OPTIONS, - "Change the options for the currently running content.") + "Изменить настройки для контента, запущенного в данный момент.") MSG_HASH(MENU_ENUM_SUBLABEL_SHOW_ADVANCED_SETTINGS, "Показывать расширенные настройки для опытных пользователей (скрыто по умолчанию).") MSG_HASH(MENU_ENUM_SUBLABEL_THREADED_DATA_RUNLOOP_ENABLE, - "Perform tasks on a separate thread.") + "Выполнять задачи в отдельном потоке.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_REMOVE, - "Allow the user to remove entries from collections.") + "Разрешить пользователю удалять отдельные записи из коллекции.") MSG_HASH(MENU_ENUM_SUBLABEL_SYSTEM_DIRECTORY, - "Sets the System directory. Cores can query for this directory to load BIOSes, system-specific configs, etc.") + "Устанавливает каталог System. Ядра могут запрашивать его для загрузки BIOS, системных настроек и т.д.") MSG_HASH(MENU_ENUM_SUBLABEL_RGUI_BROWSER_DIRECTORY, "Установить начальный каталог для файлового браузера.") MSG_HASH( MENU_ENUM_SUBLABEL_CONTENT_DIR, - "Usually set by developers who bundle libretro/RetroArch apps to point to assets." + "Обычно настраивается разработчиками, составляющими комплекты приложений libretro/RetroArch для указания содержимого." ) MSG_HASH(MENU_ENUM_SUBLABEL_DYNAMIC_WALLPAPERS_DIRECTORY, - "Directory to store wallpapers dynamically loaded by the menu depending on context.") + "Каталог для хранения обоев, динамически загружающихся в меню в зависимости от контекста.") MSG_HASH(MENU_ENUM_SUBLABEL_THUMBNAILS_DIRECTORY, - "Supplementary thumbnails (boxarts/misc. images, etc.) are stored here." + "Дополнительные миниатюры (бокс-арты/другие изображения и т.д.) хранятся здесь." ) MSG_HASH(MENU_ENUM_SUBLABEL_RGUI_CONFIG_DIRECTORY, - "Sets start directory for menu configuration browser.") + "Задает стартовый каталог для браузера настройки меню.") MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_INPUT_LATENCY_FRAMES_MIN, - "The number of frames of input latency for netplay to use to hide network latency. Reduces jitter and makes netplay less CPU-intensive, at the expense of noticeable input lag.") + "Количество кадров задержки ввода для netplay для сокрытия задержки сети. Уменьшает лаги и делает netplay менее требовательным к CPU, ценой значительной задержки ввода.") MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_INPUT_LATENCY_FRAMES_RANGE, - "The range of frames of input latency that may be used to hide network latency. Reduces jitter and makes netplay less CPU-intensive, at the expense of unpredictable input lag.") + "Диапазон кадров задержки ввода для netplay для сокрытия задержки сети. Уменьшает лаги и делает netplay менее требовательным к CPU, ценой непредсказуемой задержки ввода.") MSG_HASH(MENU_ENUM_SUBLABEL_DISK_CYCLE_TRAY_STATUS, - "Cycle the current disk. If the disk is inserted, it will eject the disk. If the disk has not been inserted, it will be inserted. ") + "Зацикливать текущий диск. Если вставлен диск, он будет извлечен. Если диск не вставлен, он будет вставлен.") MSG_HASH(MENU_ENUM_SUBLABEL_DISK_INDEX, "Изменить индекс диска.") MSG_HASH(MENU_ENUM_SUBLABEL_DISK_OPTIONS, @@ -2887,7 +2931,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_MENU_ENUM_THROTTLE_FRAMERATE, MSG_HASH(MENU_ENUM_SUBLABEL_XMB_THEME, "Выберите другую тему для значка. Изменения заработают после перезагрузки.") MSG_HASH(MENU_ENUM_SUBLABEL_XMB_SHADOWS_ENABLE, - "Включить тени для всех значков. Это приведет к незначительному нагрузке.") + "Включить тени для всех значков. Это приведет к незначительной нагрузке.") MSG_HASH(MENU_ENUM_SUBLABEL_MATERIALUI_MENU_COLOR_THEME, "Выберите другую тему цветового градиента.") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_WALLPAPER_OPACITY, @@ -2895,7 +2939,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_MENU_WALLPAPER_OPACITY, MSG_HASH(MENU_ENUM_SUBLABEL_XMB_MENU_COLOR_THEME, "Выберите другую тему цветового градиента.") MSG_HASH(MENU_ENUM_SUBLABEL_XMB_RIBBON_ENABLE, - "Выберите анимированный фоновый эффект. Может быть GPU-intensive в зависимости от эффекта. Если производительность не тянет на это, то либо выключите это, либо вернитесь к более простому эффекту.") + "Выберите анимированный фоновый эффект. Может быть требовательным к GPU в зависимости от эффекта. Если производительность не тянет на это, то либо выключите это, либо вернитесь к более простому эффекту.") MSG_HASH(MENU_ENUM_SUBLABEL_XMB_FONT, "Выбрать основной шрифт для меню интерфейса.") MSG_HASH(MENU_ENUM_SUBLABEL_XMB_SHOW_IMAGES, @@ -2927,11 +2971,11 @@ MSG_HASH(MENU_ENUM_SUBLABEL_CORE_ASSETS_DIRECTORY, MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_REMAPPING_DIRECTORY, "Сохранить все переназначенные элементы управления в этой папке.") MSG_HASH(MENU_ENUM_SUBLABEL_LIBRETRO_DIR_PATH, - "путь к папке, в котором программа ищет контент / ядра.") + "путь к папке, в котором программа ищет контент/ядра.") MSG_HASH(MENU_ENUM_SUBLABEL_LIBRETRO_INFO_PATH, - "Здесь хранятся файлы информации контента / ядра.") + "Здесь хранятся файлы информации контента/ядра.") MSG_HASH(MENU_ENUM_SUBLABEL_JOYPAD_AUTOCONFIG_DIR, - "Если игровой джойстик подключен, то джойстик будет автомотически подстроен, если существует одходящий файл авто-конфигурации.") + "Если игровой джойстик подключен, то джойстик будет автомотически подстроен, если существует подходящий файл автоматической настройки.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_DIRECTORY, "Сохранять все коллекции в выбранной папке.") MSG_HASH( @@ -2939,10 +2983,10 @@ MSG_HASH( "Если выбрана папка, содержимое, которое временно извлечено (например, из архивов), будет извлечено в этой папке." ) MSG_HASH(MENU_ENUM_SUBLABEL_CURSOR_DIRECTORY, - "Выберите папку, где хранятся saved queries..") + "Сохраненные запросы находятся в этом каталоге.") MSG_HASH( MENU_ENUM_SUBLABEL_CONTENT_DATABASE_DIRECTORY, - "Выберите папку для хранения базы данных." + "Базы данных находятся в этом каталоге." ) MSG_HASH( MENU_ENUM_SUBLABEL_ASSETS_DIRECTORY, @@ -2966,10 +3010,10 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_FILTER_DIR, - "Выберите папку, где будут находиться GPU-based фильтры." + "Выберите папку, где будут находиться фильтры, обрабатываемые GPU." ) MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHADER_DIR, - "Выберите папку, где будут находиться GPU-based шейдеры.") + "Выберите папку, где будут находиться шейдеры, обрабатываемые GPU.") MSG_HASH(MENU_ENUM_SUBLABEL_RECORDING_OUTPUT_DIRECTORY, "Выберите папку, где будут сохраняться ваши записи.") MSG_HASH(MENU_ENUM_SUBLABEL_RECORDING_CONFIG_DIRECTORY, @@ -2987,7 +3031,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET, MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_SAVE_AS, "Сохраните текущие настройки шейдера в качестве нового предустановленного шейдера.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_SAVE_CORE, - "Сохраните текущие настройки шейдера как настройки по умолчанию для этого игры / ядра.") + "Сохраните текущие настройки шейдера как настройки по умолчанию для этого игры/ядра.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_SAVE_GAME, "Сохраните текущие настройки шейдера в качестве настроек по умолчанию для игры.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHADER_PARAMETERS, @@ -2996,10 +3040,10 @@ MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_PARAMETERS, "Изменяет настройки шейдера, которая в настоящее время используется в меню.") MSG_HASH( MENU_ENUM_SUBLABEL_CHEAT_NUM_PASSES, - "Увеличение или уменьшение кол-во используемых чит-кодов." + "Увеличение или уменьшение количества используемых чит-кодов." ) MSG_HASH(MENU_ENUM_SUBLABEL_CHEAT_APPLY_CHANGES, - "Изменения чит-кодов заработают сиюсекундно.") + "Изменения чит-кодов заработают немедленно.") MSG_HASH( MENU_ENUM_SUBLABEL_CHEAT_FILE_LOAD, "Открыть чит-файл." @@ -3042,7 +3086,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_MIXER_VOLUME, - "Уровень громкости звукового микшера (dB)" + "Уровень громкости звукового микшера (дБ)" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_MIXER_MUTE, @@ -3099,114 +3143,120 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_ICONS_ENABLE, MSG_HASH(MENU_ENUM_SUBLABEL_MATERIALUI_ICONS_ENABLE, "Отображать или скрывать иконки интерфейса, отображающиеся в левой части меню.") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MAIN_MENU_ENABLE_SETTINGS, - "Enable Settings Tab") + "Включить вкладку Настройки") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_SHOW_SETTINGS_PASSWORD, - "Set Password For Enabling Settings Tab") + "Задать пароль для включения вкладки Настройки") MSG_HASH(MSG_INPUT_ENABLE_SETTINGS_PASSWORD, - "Enter Password") + "Введите пароль") MSG_HASH(MSG_INPUT_ENABLE_SETTINGS_PASSWORD_OK, - "Password correct.") + "Пароль верен.") MSG_HASH(MSG_INPUT_ENABLE_SETTINGS_PASSWORD_NOK, - "Password incorrect.") + "Пароль неверен.") MSG_HASH(MENU_ENUM_SUBLABEL_XMB_MAIN_MENU_ENABLE_SETTINGS, - "Enables the Settings tab. A restart is required for the tab to appear.") + "Включает вкладку Настройки. Для появления вкладки требуется перезапуск.") MSG_HASH(MENU_ENUM_SUBLABEL_XMB_SHOW_SETTINGS_PASSWORD, - "Supplying a password when hiding the settings tab makes it possible to later restore it from the menu, by going to the Main Menu tab, selecting Enable Settings Tab and entering the password.") + "Применение пароля при скрытии вкладки Настройки может позже восстановить ее из меню. Для этого нужно перейти на вкладку Главное меню, выбрать Включить вкладку Настройки и ввести пароль.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_RENAME, - "Allow the user to rename entries in collections.") + "Разрешить пользователю переименовывать записи в коллекции.") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_RENAME, - "Allow to rename entries") + "Разрешить переименовывать записи") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_LOAD_CORE, - "Show Load Core") + "Показать Загрузить ядро") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_LOAD_CORE, - "Show/hide the 'Load Core' option.") + "Показать/скрыть настройку 'Загрузить ядро'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_LOAD_CONTENT, - "Show Load Content") + "Показать Загрузить содержимое") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_LOAD_CONTENT, - "Show/hide the 'Load Content' option.") + "Показать/скрыть настройку 'Загрузить содержимое'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_INFORMATION, - "Show Information") + "Показать Информация") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_INFORMATION, - "Show/hide the 'Information' option.") + "Показать/скрыть настройку 'Информация'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_CONFIGURATIONS, - "Show Configurations") + "Показать Настройки") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_CONFIGURATIONS, - "Show/hide the 'Configurations' option.") + "Показать/скрыть настройку 'Настройки'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_HELP, - "Show Help") + "Показать Помощь") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_HELP, - "Show/hide the 'Help' option.") + "Показать/скрыть настройку 'Помощь'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_QUIT_RETROARCH, - "Show Quit RetroArch") + "Показать Выйти из RetroArch") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_QUIT_RETROARCH, - "Show/hide the 'Quit RetroArch' option.") + "Показать/скрыть настройку 'Выйти из RetroArch'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_REBOOT, - "Show Reboot") + "Показать Перезагрузить") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_REBOOT, - "Show/hide the 'Reboot' option.") + "Показать/скрыть настройку 'Перезагрузить'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_VIEWS_SETTINGS, - "Quick Menu") + "Быстрое меню") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_VIEWS_SETTINGS, - "Show or hide elements on the Quick Menu screen.") + "Показать/скрыть элементы на экране быстрого меню.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_TAKE_SCREENSHOT, - "Show Take Screenshot") + "Показать Сделать скриншот") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_TAKE_SCREENSHOT, - "Show/hide the 'Take Screenshot' option.") + "Показать/скрыть настройку 'Сделать скриншот'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SAVE_LOAD_STATE, - "Show Save/Load State") + "Показать Сохранить/Загрузить") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SAVE_LOAD_STATE, - "Show/hide the options for saving/loading state.") + "Показать/скрыть настройки для сохранения/загрузки.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_UNDO_SAVE_LOAD_STATE, - "Show Undo Save/Load State") + "Показать отменить сохранение/загрузку") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_UNDO_SAVE_LOAD_STATE, - "Show/hide the options for undoing save/load state.") + "Показать/скрыть настройки для отмены сохранения загрузки.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_ADD_TO_FAVORITES, - "Show Add to Favorites") + "Показать Добавить в избранное") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_ADD_TO_FAVORITES, - "Show/hide the 'Add to Favorites' option.") + "Показать/скрыть настройку 'Добавить в избранное'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_OPTIONS, - "Show Options") + "Показать Настройки") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_OPTIONS, - "Show/hide the 'Options' option.") + "Показать/скрыть настройку 'Настройки'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_CONTROLS, - "Show Controls") + "Показать Управление") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_CONTROLS, - "Show/hide the 'Controls' option.") + "Показать/скрыть настройку 'Управление'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_CHEATS, - "Show Cheats") + "Показать Чит-коды") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_CHEATS, - "Show/hide the 'Cheats' option.") + "Показать/скрыть настройку 'Чит-коды'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SHADERS, - "Show Shaders") + "Показать Шейдеры") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SHADERS, - "Show/hide the 'Shaders' option.") + "Показать/скрыть настройку 'Шейдеры'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SAVE_CORE_OVERRIDES, - "Show Save Core Overrides") + "Показать Сохранить переопределения ядра") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SAVE_CORE_OVERRIDES, - "Show/hide the 'Save Core Overrides' option.") + "Показать/скрыть настройку 'Сохранить переопределения ядра'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SAVE_GAME_OVERRIDES, - "Show Save Game Overrides") + "Показать Сохранить переопределения игры") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SAVE_GAME_OVERRIDES, - "Show/hide the 'Save Game Overrides' option.") + "Показать/скрыть настройку 'Сохранить переопределения игры.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_INFORMATION, - "Show Information") + "Показать Информация") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_INFORMATION, - "Show/hide the 'Information' option.") + "Показать/скрыть настройку 'Информация'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_DISABLE_KIOSK_MODE, - "Disable Kiosk Mode") + "Отключить режим киоска") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_DISABLE_KIOSK_MODE, - "Disables kiosk mode. A restart is required for the change to take full effect.") + "Отключает режим киоска. Для достижения нужного эффекта требуется перезапуск.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_ENABLE_KIOSK_MODE, - "Enable Kiosk Mode") + "Включить режим киоска") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_ENABLE_KIOSK_MODE, - "Protects the setup by hiding all configuration related settings.") + "Защищает конфигурацию путем скрытия всех настроек.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_KIOSK_MODE_PASSWORD, - "Set Password For Disabling Kiosk Mode") + "Задать пароль для отключения режима киоска") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_KIOSK_MODE_PASSWORD, - "Supplying a password when enabling kiosk mode makes it possible to later disable it from the menu, by going to the Main Menu, selecting Disable Kiosk Mode and entering the password.") + "Поддержка пароля при включенном режиме киоска дает возможность позже отключить его из меню. Для этого нежно перейти в главное меню, выбрать Отключить режим киоска и ввести пароль.") MSG_HASH(MSG_INPUT_KIOSK_MODE_PASSWORD, - "Enter Password") + "Введите пароль") MSG_HASH(MSG_INPUT_KIOSK_MODE_PASSWORD_OK, - "Password correct.") + "Пароль верен.") MSG_HASH(MSG_INPUT_KIOSK_MODE_PASSWORD_NOK, - "Password incorrect.") + "Пароль неверен.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, + "Automatically add content to playlist") +MSG_HASH(MENU_ENUM_SUBLABEL_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, + "Automatically scans loaded content so they appear inside playlists.") +MSG_HASH(MSG_SCANNING_OF_FILE_FINISHED, + "Scanning of file finished") diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index cf615043f0..25a36dda4f 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -176,7 +176,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ACCOUNTS_RETRO_ACHIEVEMENTS, - "Retro Achievements" + "RetroAchievements" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_LIST, @@ -430,6 +430,14 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_HARDCORE_MODE_ENABLE, "Achievements Hardcore Mode" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_LEADERBOARDS_ENABLE, + "Leaderboards" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_BADGES_ENABLE, + "Achievement Badges" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_LOCKED_ACHIEVEMENTS, "Locked Achievements:" @@ -440,16 +448,12 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_SETTINGS, - "Retro Achievements" + "RetroAchievements" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_TEST_UNOFFICIAL, "Test Unofficial Achievements" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CHEEVOS_VERBOSE_ENABLE, - "Achievements Verbose Mode" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ACHIEVEMENTS, "Unlocked Achievements:" @@ -458,6 +462,14 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ENTRY, "Unlocked" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ENTRY_HARDCORE, + "Hardcore" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_VERBOSE_ENABLE, + "Achievements Verbose Mode" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CLOSE_CONTENT, "Close Content" @@ -687,6 +699,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, "Right analog Y- (up)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, "Right analog Y+ (down)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Autoconfig Enable") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, @@ -751,6 +785,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, "Y button (left)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Key: %s)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "Mouse 1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "Mouse 2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "Mouse 3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "Mouse 4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "Mouse 5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "Wheel Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "Wheel Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "Wheel Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "Keyboard Gamepad Mapping Type") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, @@ -1263,6 +1315,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_RIGHT_ANALOG, "Right Analog") MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES, "Add to Favorites") +MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES_PLAYLIST, + "Add to Favorites") MSG_HASH(MENU_ENUM_LABEL_VALUE_RUN, "Run") MSG_HASH(MENU_ENUM_LABEL_VALUE_RUN_MUSIC, @@ -1606,9 +1660,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FILTER_FLICKER, MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FONT_ENABLE, "Enable Onscreen Notifications") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FONT_PATH, - "Onscreen Notification Font") + "Notification Font") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FONT_SIZE, - "Onscreen Notification Size") + "Notification Size") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_ASPECT, "Force aspect ratio") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_SRGB_DISABLE, @@ -1630,9 +1684,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_HARD_SYNC_FRAMES, MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MAX_SWAPCHAIN_IMAGES, "Max swapchain images") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_POS_X, - "Onscreen Notification X Position") + "Notification X Position") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_POS_Y, - "Onscreen Notification Y Position") + "Notification Y Position") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MONITOR_INDEX, "Monitor Index") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_POST_FILTER_RECORD, @@ -1723,6 +1777,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, "Pixel") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "RetroActive") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "Dot-Art") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, @@ -1781,6 +1837,10 @@ MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_TEST_UNOFFICIAL, "Enable or disable unofficial achievements and/or beta features for testing purposes.") MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_HARDCORE_MODE_ENABLE, "Enable or disable savestates, cheats, rewind, fast-forward, pause, and slow-motion for all games.") +MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_LEADERBOARDS_ENABLE, + "Enable or disable in-game leaderboards. Has no effect if Hardcore Mode is disabled.") +MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_BADGES_ENABLE, + "Enable or disable badge display in Achievement List.") MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_VERBOSE_ENABLE, "Enable or disable OSD verbosity for achievements.") MSG_HASH(MENU_ENUM_SUBLABEL_DRIVER_SETTINGS, @@ -2225,6 +2285,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Skipping SRAM load.") MSG_HASH(MSG_SLOW_MOTION, "Slow motion.") +MSG_HASH(MSG_FAST_FORWARD, + "Fast forward.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Slow motion rewind.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, @@ -2480,6 +2542,8 @@ MSG_HASH( ) 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, @@ -2495,9 +2559,9 @@ MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SMOOTH, MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FILTER, "Apply a CPU-powered video filter. 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, - "Input the username of your Retro Achievements account.") + "Input the username of your RetroAchievements account.") MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_PASSWORD, - "Input the password of your Retro Achievements account.") + "Input the password of your RetroAchievements account.") MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_NICKNAME, "Input your user name here. This will be used for netplay sessions, among other things.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_POST_FILTER_RECORD, @@ -2818,6 +2882,8 @@ MSG_HASH(MENU_ENUM_SUBLABEL_INFORMATION, "View more information about the content.") MSG_HASH(MENU_ENUM_SUBLABEL_ADD_TO_FAVORITES, "Add the entry to your favorites.") +MSG_HASH(MENU_ENUM_SUBLABEL_ADD_TO_FAVORITES_PLAYLIST, + "Add the entry to your favorites.") MSG_HASH(MENU_ENUM_SUBLABEL_RUN, "Start the content.") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_FILE_BROWSER_SETTINGS, @@ -2860,7 +2926,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_UNDO_SAVE_STATE, "If a state was overwritten, it will roll back to the previous save state.") MSG_HASH( MENU_ENUM_SUBLABEL_ACCOUNTS_RETRO_ACHIEVEMENTS, - "Retro Achievements service. For more information, visit http://retroachievements.org" + "RetroAchievements service. For more information, visit http://retroachievements.org" ) MSG_HASH( MENU_ENUM_SUBLABEL_ACCOUNTS_LIST, @@ -3228,15 +3294,15 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_INFORMATION, MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_INFORMATION, "Show/hide the 'Information' option.") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_ENABLE, - "Onscreen Notification Background Enable") + "Notification Background Enable") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_RED, - "Onscreen Notification Background Red Color") + "Notification Background Red Color") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_GREEN, - "Onscreen Notification Background Green Color") + "Notification Background Green Color") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_BLUE, - "Onscreen Notification Background Blue Color") + "Notification Background Blue Color") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_OPACITY, - "Onscreen Notification Background Opacity") + "Notification Background Opacity") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_DISABLE_KIOSK_MODE, "Disable Kiosk Mode") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_DISABLE_KIOSK_MODE, @@ -3256,10 +3322,22 @@ MSG_HASH(MSG_INPUT_KIOSK_MODE_PASSWORD_OK, MSG_HASH(MSG_INPUT_KIOSK_MODE_PASSWORD_NOK, "Password incorrect.") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_COLOR_RED, - "Onscreen Notification Red Color") + "Notification Red Color") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_COLOR_GREEN, - "Onscreen Notification Green Color") + "Notification Green Color") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_COLOR_BLUE, - "Onscreen Notification Blue Color") + "Notification Blue Color") MSG_HASH(MENU_ENUM_LABEL_VALUE_FRAMECOUNT_SHOW, "Show frame count on FPS display") +MSG_HASH(MSG_CONFIG_OVERRIDE_LOADED, + "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(MENU_ENUM_LABEL_VALUE_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, + "Automatically add content to playlist") +MSG_HASH(MENU_ENUM_SUBLABEL_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, + "Automatically scans loaded content so they appear inside playlists.") +MSG_HASH(MSG_SCANNING_OF_FILE_FINISHED, + "Scanning of file finished") diff --git a/intl/msg_hash_vn.h b/intl/msg_hash_vn.h index 08c362344d..9c68ac8d89 100644 --- a/intl/msg_hash_vn.h +++ b/intl/msg_hash_vn.h @@ -1,4 +1,4 @@ -MSG_HASH( +MSG_HASH( MSG_COMPILER, "Compiler" ) @@ -681,6 +681,28 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, "Right analog Y- (up)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, "Right analog Y+ (down)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + "Gun Trigger") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + "Gun Reload") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + "Gun Aux A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + "Gun Aux B") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + "Gun Aux C") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + "Gun Start") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + "Gun Select") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + "Gun D-pad Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + "Gun D-pad Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + "Gun D-pad Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, + "Gun D-pad Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, "Kích hoạt Autoconfig") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, @@ -743,6 +765,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, "Y button (left)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Key: %s)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + "Mouse 1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + "Mouse 2") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + "Mouse 3") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + "Mouse 4") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + "Mouse 5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + "Wheel Up") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + "Wheel Down") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + "Wheel Left") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, + "Wheel Right") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, "Keyboard Gamepad Mapping Type") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, @@ -1689,6 +1729,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, "Pixel") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "RetroActive") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "Dot-Art") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, @@ -2181,6 +2223,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Skipping SRAM load.") MSG_HASH(MSG_SLOW_MOTION, "Slow motion.") +MSG_HASH(MSG_FAST_FORWARD, + "Nhanh về phía trước.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Slow motion rewind.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, @@ -3181,3 +3225,9 @@ 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_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, + "Automatically add content to playlist") +MSG_HASH(MENU_ENUM_SUBLABEL_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, + "Automatically scans loaded content so they appear inside playlists.") +MSG_HASH(MSG_SCANNING_OF_FILE_FINISHED, + "Scanning of file finished") diff --git a/libretro-common/compat/compat_strl.c b/libretro-common/compat/compat_strl.c index 668b3d9236..9886b22ed2 100644 --- a/libretro-common/compat/compat_strl.c +++ b/libretro-common/compat/compat_strl.c @@ -20,6 +20,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +#include #include #include @@ -60,3 +61,10 @@ size_t strlcat(char *dest, const char *source, size_t size) return len + strlcpy(dest, source, size); } #endif + +char *strldup(const char *s, size_t n) +{ + char *dst = (char*)malloc(sizeof(char) * (n + 1)); + strlcpy(dst, s, n); + return dst; +} diff --git a/libretro-common/file/config_file.c b/libretro-common/file/config_file.c index 302cebd3fc..70f7b64aab 100644 --- a/libretro-common/file/config_file.c +++ b/libretro-common/file/config_file.c @@ -389,14 +389,13 @@ static config_file_t *config_file_new_internal( goto error; conf->include_depth = depth; - file = filestream_open(path, RFILE_MODE_READ_TEXT, -1); + file = filestream_open(path, RFILE_MODE_READ_TEXT, 0x4000); if (!file) { free(conf->path); goto error; } - setvbuf(filestream_get_fp(file), NULL, _IOFBF, 0x4000); while (!filestream_eof(file)) { @@ -893,7 +892,7 @@ void config_set_uint64(config_file_t *conf, const char *key, uint64_t val) char buf[128]; buf[0] = '\0'; - snprintf(buf, sizeof(buf), STRING_REP_UINT64, val); + snprintf(buf, sizeof(buf), "%" PRIu64, val); config_set_string(conf, key, buf); } @@ -917,15 +916,9 @@ bool config_file_write(config_file_t *conf, const char *path) if (!string_is_empty(path)) { - file = filestream_open(path, RFILE_MODE_WRITE, -1); + file = filestream_open(path, RFILE_MODE_WRITE, 0x4000); if (!file) return false; -#ifdef WIIU - /* TODO: use FBF everywhere once https://i.imgur.com/muVhNeF.jpg is fixed */ - setvbuf(filestream_get_fp(file), NULL, _IONBF, 0x4000); -#else - setvbuf(filestream_get_fp(file), NULL, _IOFBF, 0x4000); -#endif config_file_dump(conf, filestream_get_fp(file)); } else diff --git a/libretro-common/file/file_path.c b/libretro-common/file/file_path.c index 8acd372e08..62ee9f20e7 100644 --- a/libretro-common/file/file_path.c +++ b/libretro-common/file/file_path.c @@ -72,10 +72,6 @@ #include #endif -#ifdef __HAIKU__ -#include -#endif - #if defined(__CELLOS_LV2__) #include #endif @@ -223,6 +219,17 @@ int32_t path_get_size(const char *path) return -1; } +static bool path_mkdir_error(int ret) +{ +#if defined(VITA) + return (ret == SCE_ERROR_ERRNO_EEXIST); +#elif defined(PSP) || defined(_3DS) || defined(WIIU) + return (ret == -1); +#else + return (ret < 0 && errno == EEXIST); +#endif +} + /** * path_mkdir: * @dir : directory @@ -234,10 +241,13 @@ int32_t path_get_size(const char *path) bool path_mkdir(const char *dir) { /* Use heap. Real chance of stack overflow if we recurse too hard. */ - char *basedir = strdup(dir); const char *target = NULL; bool sret = false; bool norecurse = false; + char *basedir = NULL; + + if (dir && *dir) + basedir = strdup(dir); if (!basedir) return false; @@ -253,8 +263,8 @@ bool path_mkdir(const char *dir) } else { - target = basedir; - sret = path_mkdir(basedir); + target = basedir; + sret = path_mkdir(basedir); if (sret) { @@ -278,16 +288,9 @@ bool path_mkdir(const char *dir) #endif /* Don't treat this as an error. */ -#if defined(VITA) - if ((ret == SCE_ERROR_ERRNO_EEXIST) && path_is_directory(dir)) + if (path_mkdir_error(ret) && path_is_directory(dir)) ret = 0; -#elif defined(PSP) || defined(_3DS) || defined(WIIU) - if ((ret == -1) && path_is_directory(dir)) - ret = 0; -#else - if (ret < 0 && errno == EEXIST && path_is_directory(dir)) - ret = 0; -#endif + if (ret < 0) printf("mkdir(%s) error: %s.\n", dir, strerror(errno)); sret = (ret == 0); diff --git a/libretro-common/file/nbio/nbio_intf.c b/libretro-common/file/nbio/nbio_intf.c new file mode 100644 index 0000000000..57d3eb6484 --- /dev/null +++ b/libretro-common/file/nbio/nbio_intf.c @@ -0,0 +1,85 @@ +/* Copyright (C) 2010-2017 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (nbio_intf.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include +#include + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +extern nbio_intf_t nbio_linux; +extern nbio_intf_t nbio_mmap_unix; +extern nbio_intf_t nbio_mmap_win32; +extern nbio_intf_t nbio_stdio; + +#if defined(_linux__) +static nbio_intf_t *internal_nbio = &nbio_linux; +#elif defined(HAVE_MMAP) && defined(BSD) +static nbio_intf_t *internal_nbio = &nbio_mmap_unix; +#elif defined(_WIN32) && !defined(_XBOX) +static nbio_intf_t *internal_nbio = &nbio_mmap_win32; +#else +static nbio_intf_t *internal_nbio = &nbio_stdio; +#endif + +void *nbio_open(const char * filename, unsigned mode) +{ + return internal_nbio->open(filename, mode); +} + +void nbio_begin_read(void *data) +{ + internal_nbio->begin_read(data); +} + +void nbio_begin_write(void *data) +{ + internal_nbio->begin_write(data); +} + +bool nbio_iterate(void *data) +{ + return internal_nbio->iterate(data); +} + +void nbio_resize(void *data, size_t len) +{ + internal_nbio->resize(data, len); +} + +void *nbio_get_ptr(void *data, size_t* len) +{ + return internal_nbio->get_ptr(data, len); +} + +void nbio_cancel(void *data) +{ + internal_nbio->cancel(data); +} + +void nbio_free(void *data) +{ + internal_nbio->free(data); +} diff --git a/libretro-common/file/nbio/nbio_linux.c b/libretro-common/file/nbio/nbio_linux.c new file mode 100644 index 0000000000..3395a2cef7 --- /dev/null +++ b/libretro-common/file/nbio/nbio_linux.c @@ -0,0 +1,245 @@ +/* Copyright (C) 2010-2017 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (nbio_linux.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include + +#if defined(__linux__) + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif +#include +#include +#include +#include + + +#include +#include +#include +#include + +struct nbio_linux_t +{ + int fd; + bool busy; + + aio_context_t ctx; + struct iocb cb; + + void* ptr; + size_t len; +}; + +/* there's also a Unix AIO thingy, but it's not in glibc + * and we don't want more dependencies */ + +static int io_setup(unsigned nr, aio_context_t * ctxp) +{ + return syscall(__NR_io_setup, nr, ctxp); +} + +static int io_destroy(aio_context_t ctx) +{ + return syscall(__NR_io_destroy, ctx); +} + +static int io_submit(aio_context_t ctx, long nr, struct iocb ** cbp) +{ + return syscall(__NR_io_submit, ctx, nr, cbp); +} + +static int io_cancel(aio_context_t ctx, struct iocb * iocb, struct io_event * result) +{ + return syscall(__NR_io_cancel, ctx, iocb, result); +} + +static int io_getevents(aio_context_t ctx, long min_nr, long nr, + struct io_event * events, struct timespec * timeout) +{ + return syscall(__NR_io_getevents, ctx, min_nr, nr, events, timeout); +} + +static void nbio_begin_op(struct nbio_linux_t* handle, uint16_t op) +{ + struct iocb * cbp = &handle->cb; + + memset(&handle->cb, 0, sizeof(handle->cb)); + + handle->cb.aio_fildes = handle->fd; + handle->cb.aio_lio_opcode = op; + + handle->cb.aio_buf = (uint64_t)(uintptr_t)handle->ptr; + handle->cb.aio_offset = 0; + handle->cb.aio_nbytes = handle->len; + + if (io_submit(handle->ctx, 1, &cbp) != 1) + { + puts("ERROR - io_submit() failed"); + abort(); + } + + handle->busy = true; +} + +static void *nbio_linux_open(const char * filename, unsigned mode) +{ + static const int o_flags[] = { O_RDONLY, O_RDWR|O_CREAT|O_TRUNC, O_RDWR, O_RDONLY, O_RDWR|O_CREAT|O_TRUNC }; + + aio_context_t ctx = 0; + struct nbio_linux_t* handle = NULL; + int fd = open(filename, o_flags[mode]|O_CLOEXEC, 0644); + if (fd < 0) + return NULL; + + if (io_setup(128, &ctx) < 0) + { + close(fd); + return NULL; + } + + handle = malloc(sizeof(struct nbio_linux_t)); + handle->fd = fd; + handle->ctx = ctx; + handle->len = lseek(fd, 0, SEEK_END); + handle->ptr = malloc(handle->len); + handle->busy = false; + + return handle; +} + +static void nbio_linux_begin_read(void *data) +{ + struct nbio_linux_t* handle = (struct nbio_linux_t*)data; + if (handle) + nbio_begin_op(handle, IOCB_CMD_PREAD); +} + +static void nbio_linux_begin_write(void *data) +{ + struct nbio_linux_t* handle = (struct nbio_linux_t*)data; + if (handle) + nbio_begin_op(handle, IOCB_CMD_PWRITE); +} + +static bool nbio_linux_iterate(void *data) +{ + struct nbio_linux_t* handle = (struct nbio_linux_t*)data; + if (!handle) + return false; + if (handle->busy) + { + struct io_event ev; + if (io_getevents(handle->ctx, 0, 1, &ev, NULL) == 1) + handle->busy = false; + } + return !handle->busy; +} + +static void nbio_linux_resize(void *data, size_t len) +{ + struct nbio_linux_t* handle = (struct nbio_linux_t*)data; + if (!handle) + return; + + if (len < handle->len) + { + /* this works perfectly fine if this check is removed, but it + * won't work on other nbio implementations */ + /* therefore, it's blocked so nobody accidentally relies on it */ + puts("ERROR - attempted file shrink operation, not implemented"); + abort(); + } + + if (ftruncate(handle->fd, len) != 0) + { + puts("ERROR - couldn't resize file (ftruncate)"); + abort(); /* this one returns void and I can't find any other way + for it to report failure */ + } + handle->ptr = realloc(handle->ptr, len); + handle->len = len; +} + +static void *nbio_linux_get_ptr(void *data, size_t* len) +{ + struct nbio_linux_t* handle = (struct nbio_linux_t*)data; + if (!handle) + return NULL; + if (len) + *len = handle->len; + if (!handle->busy) + return handle->ptr; + return NULL; +} + +static void nbio_linux_cancel(void *data) +{ + struct nbio_linux_t* handle = (struct nbio_linux_t*)data; + if (!handle) + return; + + if (handle->busy) + { + struct io_event ev; + io_cancel(handle->ctx, &handle->cb, &ev); + handle->busy = false; + } +} + +static void nbio_linux_free(void *data) +{ + struct nbio_linux_t* handle = (struct nbio_linux_t*)data; + if (!handle) + return; + + io_destroy(handle->ctx); + close(handle->fd); + free(handle->ptr); + free(handle); +} + +nbio_intf_t nbio_linux = { + nbio_linux_open, + nbio_linux_begin_read, + nbio_linux_begin_write, + nbio_linux_iterate, + nbio_linux_resize, + nbio_linux_get_ptr, + nbio_linux_cancel, + nbio_linux_free, + "nbio_linux", +}; +#else +nbio_intf_t nbio_linux = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "nbio_linux", +}; + +#endif diff --git a/libretro-common/file/nbio/nbio_stdio.c b/libretro-common/file/nbio/nbio_stdio.c index f7c46a48e5..3e6f4094f1 100644 --- a/libretro-common/file/nbio/nbio_stdio.c +++ b/libretro-common/file/nbio/nbio_stdio.c @@ -1,227 +1,268 @@ -#include -#include - -#include -#include - -/* Assume W-functions do not work below VC2005 and Xbox platforms */ -#if defined(_MSC_VER) && _MSC_VER < 1400 || defined(_XBOX) - -#ifndef LEGACY_WIN32 -#define LEGACY_WIN32 -#endif - -#endif - -struct nbio_t -{ - FILE* f; - void* data; - size_t progress; - size_t len; - /* - * possible values: - * NBIO_READ, NBIO_WRITE - obvious - * -1 - currently doing nothing - * -2 - the pointer was reallocated since the last operation - */ - signed char op; - signed char mode; -}; - -#if !defined(_WIN32) || defined(LEGACY_WIN32) -static const char * modes[]={ "rb", "wb", "r+b", "rb", "wb", "r+b" }; -#else -static const wchar_t * modes[]={ L"rb", L"wb", L"r+b", L"rb", L"wb", L"r+b" }; -#endif - -struct nbio_t* nbio_open(const char * filename, unsigned mode) -{ - void *buf = NULL; - struct nbio_t* handle = NULL; - size_t len = 0; -#if !defined(_WIN32) || defined(LEGACY_WIN32) - FILE* f = fopen(filename, modes[mode]); -#else - wchar_t *filename_wide = utf8_to_utf16_string_alloc(filename); - FILE* f = _wfopen(filename_wide, modes[mode]); - - if (filename_wide) - free(filename_wide); -#endif - if (!f) - return NULL; - - handle = (struct nbio_t*)malloc(sizeof(struct nbio_t)); - - if (!handle) - goto error; - - handle->f = f; - - switch (mode) - { - case NBIO_WRITE: - case BIO_WRITE: - break; - default: - fseek(handle->f, 0, SEEK_END); - len = ftell(handle->f); - break; - } - - handle->mode = mode; - - if (len) - buf = malloc(len); - - if (!buf) - goto error; - - handle->data = buf; - handle->len = len; - handle->progress = handle->len; - handle->op = -2; - - return handle; - -error: - if (handle) - free(handle); - fclose(f); - return NULL; -} - -void nbio_begin_read(struct nbio_t* handle) -{ - if (!handle) - return; - - if (handle->op >= 0) - { - puts("ERROR - attempted file read operation while busy"); - abort(); - } - - fseek(handle->f, 0, SEEK_SET); - - handle->op = NBIO_READ; - handle->progress = 0; -} - -void nbio_begin_write(struct nbio_t* handle) -{ - if (!handle) - return; - - if (handle->op >= 0) - { - puts("ERROR - attempted file write operation while busy"); - abort(); - } - - fseek(handle->f, 0, SEEK_SET); - handle->op = NBIO_WRITE; - handle->progress = 0; -} - -bool nbio_iterate(struct nbio_t* handle) -{ - size_t amount = 65536; - - if (!handle) - return false; - - if (amount > handle->len - handle->progress) - amount = handle->len - handle->progress; - - switch (handle->op) - { - case NBIO_READ: - if (handle->mode == BIO_READ) - { - amount = handle->len; - fread((char*)handle->data, 1, amount, handle->f); - } - else - fread((char*)handle->data + handle->progress, 1, amount, handle->f); - break; - case NBIO_WRITE: - if (handle->mode == BIO_WRITE) - { - size_t written = 0; - amount = handle->len; - written = fwrite((char*)handle->data, 1, amount, handle->f); - if (written != amount) - return false; - } - else - fwrite((char*)handle->data + handle->progress, 1, amount, handle->f); - break; - } - - handle->progress += amount; - - if (handle->progress == handle->len) - handle->op = -1; - return (handle->op < 0); -} - -void nbio_resize(struct nbio_t* handle, size_t len) -{ - if (!handle) - return; - - if (handle->op >= 0) - { - puts("ERROR - attempted file resize operation while busy"); - abort(); - } - if (len < handle->len) - { - puts("ERROR - attempted file shrink operation, not implemented"); - abort(); - } - - handle->len = len; - handle->data = realloc(handle->data, handle->len); - handle->op = -1; - handle->progress = handle->len; -} - -void* nbio_get_ptr(struct nbio_t* handle, size_t* len) -{ - if (!handle) - return NULL; - if (len) - *len = handle->len; - if (handle->op == -1) - return handle->data; - return NULL; -} - -void nbio_cancel(struct nbio_t* handle) -{ - if (!handle) - return; - - handle->op = -1; - handle->progress = handle->len; -} - -void nbio_free(struct nbio_t* handle) -{ - if (!handle) - return; - if (handle->op >= 0) - { - puts("ERROR - attempted free() while busy"); - abort(); - } - fclose(handle->f); - free(handle->data); - - handle->f = NULL; - handle->data = NULL; - free(handle); -} +/* Copyright (C) 2010-2017 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (nbio_stdio.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include +#include + +#include +#include + +/* Assume W-functions do not work below VC2005 and Xbox platforms */ +#if defined(_MSC_VER) && _MSC_VER < 1400 || defined(_XBOX) + +#ifndef LEGACY_WIN32 +#define LEGACY_WIN32 +#endif + +#endif + +struct nbio_stdio_t +{ + FILE* f; + void* data; + size_t progress; + size_t len; + /* + * possible values: + * NBIO_READ, NBIO_WRITE - obvious + * -1 - currently doing nothing + * -2 - the pointer was reallocated since the last operation + */ + signed char op; + signed char mode; +}; + +#if !defined(_WIN32) || defined(LEGACY_WIN32) +static const char *stdio_modes[] = { "rb", "wb", "r+b", "rb", "wb", "r+b" }; +#else +static const wchar_t *stdio_modes[] = { L"rb", L"wb", L"r+b", L"rb", L"wb", L"r+b" }; +#endif + +static void *nbio_stdio_open(const char * filename, unsigned mode) +{ + void *buf = NULL; + struct nbio_stdio_t* handle = NULL; + size_t len = 0; +#if !defined(_WIN32) || defined(LEGACY_WIN32) + FILE* f = fopen(filename, stdio_modes[mode]); +#else + wchar_t *filename_wide = utf8_to_utf16_string_alloc(filename); + FILE* f = _wfopen(filename_wide, stdio_modes[mode]); + + if (filename_wide) + free(filename_wide); +#endif + if (!f) + return NULL; + + handle = (struct nbio_stdio_t*)malloc(sizeof(struct nbio_stdio_t)); + + if (!handle) + goto error; + + handle->f = f; + + switch (mode) + { + case NBIO_WRITE: + case BIO_WRITE: + break; + default: + fseek(handle->f, 0, SEEK_END); + len = ftell(handle->f); + break; + } + + handle->mode = mode; + + if (len) + buf = malloc(len); + + if (len && !buf) + goto error; + + handle->data = buf; + handle->len = len; + handle->progress = handle->len; + handle->op = -2; + + return handle; + +error: + if (handle) + free(handle); + fclose(f); + return NULL; +} + +static void nbio_stdio_begin_read(void *data) +{ + struct nbio_stdio_t *handle = (struct nbio_stdio_t*)data; + if (!handle) + return; + + if (handle->op >= 0) + { + puts("ERROR - attempted file read operation while busy"); + abort(); + } + + fseek(handle->f, 0, SEEK_SET); + + handle->op = NBIO_READ; + handle->progress = 0; +} + +static void nbio_stdio_begin_write(void *data) +{ + struct nbio_stdio_t *handle = (struct nbio_stdio_t*)data; + if (!handle) + return; + + if (handle->op >= 0) + { + puts("ERROR - attempted file write operation while busy"); + abort(); + } + + fseek(handle->f, 0, SEEK_SET); + handle->op = NBIO_WRITE; + handle->progress = 0; +} + +static bool nbio_stdio_iterate(void *data) +{ + size_t amount = 65536; + struct nbio_stdio_t *handle = (struct nbio_stdio_t*)data; + + if (!handle) + return false; + + if (amount > handle->len - handle->progress) + amount = handle->len - handle->progress; + + switch (handle->op) + { + case NBIO_READ: + if (handle->mode == BIO_READ) + { + amount = handle->len; + fread((char*)handle->data, 1, amount, handle->f); + } + else + fread((char*)handle->data + handle->progress, 1, amount, handle->f); + break; + case NBIO_WRITE: + if (handle->mode == BIO_WRITE) + { + size_t written = 0; + amount = handle->len; + written = fwrite((char*)handle->data, 1, amount, handle->f); + if (written != amount) + return false; + } + else + fwrite((char*)handle->data + handle->progress, 1, amount, handle->f); + break; + } + + handle->progress += amount; + + if (handle->progress == handle->len) + handle->op = -1; + return (handle->op < 0); +} + +static void nbio_stdio_resize(void *data, size_t len) +{ + struct nbio_stdio_t *handle = (struct nbio_stdio_t*)data; + if (!handle) + return; + + if (handle->op >= 0) + { + puts("ERROR - attempted file resize operation while busy"); + abort(); + } + if (len < handle->len) + { + puts("ERROR - attempted file shrink operation, not implemented"); + abort(); + } + + handle->len = len; + handle->data = realloc(handle->data, handle->len); + handle->op = -1; + handle->progress = handle->len; +} + +static void *nbio_stdio_get_ptr(void *data, size_t* len) +{ + struct nbio_stdio_t *handle = (struct nbio_stdio_t*)data; + if (!handle) + return NULL; + if (len) + *len = handle->len; + if (handle->op == -1) + return handle->data; + return NULL; +} + +static void nbio_stdio_cancel(void *data) +{ + struct nbio_stdio_t *handle = (struct nbio_stdio_t*)data; + if (!handle) + return; + + handle->op = -1; + handle->progress = handle->len; +} + +static void nbio_stdio_free(void *data) +{ + struct nbio_stdio_t *handle = (struct nbio_stdio_t*)data; + if (!handle) + return; + if (handle->op >= 0) + { + puts("ERROR - attempted free() while busy"); + abort(); + } + fclose(handle->f); + free(handle->data); + + handle->f = NULL; + handle->data = NULL; + free(handle); +} + +nbio_intf_t nbio_stdio = { + nbio_stdio_open, + nbio_stdio_begin_read, + nbio_stdio_begin_write, + nbio_stdio_iterate, + nbio_stdio_resize, + nbio_stdio_get_ptr, + nbio_stdio_cancel, + nbio_stdio_free, + "nbio_stdio", +}; diff --git a/libretro-common/file/nbio/nbio_unixmmap.c b/libretro-common/file/nbio/nbio_unixmmap.c new file mode 100644 index 0000000000..40703ae138 --- /dev/null +++ b/libretro-common/file/nbio/nbio_unixmmap.c @@ -0,0 +1,177 @@ +/* Copyright (C) 2010-2017 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (nbio_unixmmap.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include +#include + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#if defined(HAVE_MMAP) && defined(BSD) + +#ifdef _WIN32 +#include +#else +#include +#endif +#include +#include + +struct nbio_mmap_unix_t +{ + int fd; + int map_flags; + size_t len; + void* ptr; +}; + +static void *nbio_mmap_unix_open(const char * filename, unsigned mode) +{ + static const int o_flags[] = { O_RDONLY, O_RDWR|O_CREAT|O_TRUNC, O_RDWR, O_RDONLY, O_RDWR|O_CREAT|O_TRUNC }; + static const int map_flags[] = { PROT_READ, PROT_WRITE|PROT_READ, PROT_WRITE|PROT_READ, PROT_READ, PROT_WRITE|PROT_READ }; + + size_t len; + void* ptr = NULL; + struct nbio_mmap_unix_t* handle = NULL; + int fd = open(filename, o_flags[mode]|O_CLOEXEC, 0644); + if (fd < 0) + return NULL; + + len = lseek(fd, 0, SEEK_END); + if (len != 0) + ptr = mmap(NULL, len, map_flags[mode], MAP_SHARED, fd, 0); + + if (ptr == MAP_FAILED) + { + close(fd); + return NULL; + } + + handle = malloc(sizeof(struct nbio_mmap_unix_t)); + handle->fd = fd; + handle->map_flags = map_flags[mode]; + handle->len = len; + handle->ptr = ptr; + return handle; +} + +static void nbio_mmap_unix_begin_read(void *data) +{ + /* not needed */ +} + +static void nbio_mmap_unix_begin_write(void *data) +{ + /* not needed */ +} + +static bool nbio_mmap_unix_iterate(void *data) +{ + return true; /* not needed */ +} + +static void nbio_mmap_unix_resize(void *data, size_t len) +{ + struct nbio_mmap_unix_t* handle = (struct nbio_mmap_unix_t*)data; + if (!handle) + return; + if (len < handle->len) + { + /* this works perfectly fine if this check is removed, but it + * won't work on other nbio implementations */ + /* therefore, it's blocked so nobody accidentally relies on it */ + puts("ERROR - attempted file shrink operation, not implemented"); + abort(); + } + + if (ftruncate(handle->fd, len) != 0) + { + puts("ERROR - couldn't resize file (ftruncate)"); + abort(); /* this one returns void and I can't find any other + way for it to report failure */ + } + + munmap(handle->ptr, handle->len); + + handle->ptr = mmap(NULL, len, handle->map_flags, MAP_SHARED, handle->fd, 0); + handle->len = len; + + if (handle->ptr == MAP_FAILED) + { + puts("ERROR - couldn't resize file (mmap)"); + abort(); + } +} + +static void *nbio_mmap_unix_get_ptr(void *data, size_t* len) +{ + struct nbio_mmap_unix_t* handle = (struct nbio_mmap_unix_t*)data; + if (!handle) + return NULL; + if (len) + *len = handle->len; + return handle->ptr; +} + +static void nbio_mmap_unix_cancel(void *data) +{ + /* not needed */ +} + +static void nbio_mmap_unix_free(void *data) +{ + struct nbio_mmap_unix_t* handle = (struct nbio_mmap_unix_t*)data; + if (!handle) + return; + close(handle->fd); + munmap(handle->ptr, handle->len); + free(handle); +} + +nbio_intf_t nbio_mmap_unix = { + nbio_mmap_unix_open, + nbio_mmap_unix_begin_read, + nbio_mmap_unix_begin_write, + nbio_mmap_unix_iterate, + nbio_mmap_unix_resize, + nbio_mmap_unix_get_ptr, + nbio_mmap_unix_cancel, + nbio_mmap_unix_free, + "nbio_mmap_unix", +}; +#else +nbio_intf_t nbio_mmap_unix = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "nbio_mmap_unix", +}; + +#endif diff --git a/libretro-common/file/nbio/nbio_windowsmmap.c b/libretro-common/file/nbio/nbio_windowsmmap.c new file mode 100644 index 0000000000..caf0d72514 --- /dev/null +++ b/libretro-common/file/nbio/nbio_windowsmmap.c @@ -0,0 +1,224 @@ +/* Copyright (C) 2010-2017 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (nbio_windowsmmap.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include + +#if defined(_WIN32) && !defined(_XBOX) + +#include +#include + +#include + +#include + +/* Assume W-functions do not work below VC2005 and Xbox platforms */ +#if defined(_MSC_VER) && _MSC_VER < 1400 || defined(_XBOX) + +#ifndef LEGACY_WIN32 +#define LEGACY_WIN32 +#endif + +#endif + +#ifndef FILE_SHARE_ALL +#define FILE_SHARE_ALL (FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE) +#endif + +struct nbio_mmap_win32_t +{ + HANDLE file; + bool is_write; + size_t len; + void* ptr; +}; + +static void *nbio_mmap_win32_open(const char * filename, unsigned mode) +{ + static const DWORD dispositions[] = { OPEN_EXISTING, CREATE_ALWAYS, OPEN_ALWAYS, OPEN_EXISTING, CREATE_ALWAYS }; + HANDLE mem; +#if defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0500 + LARGE_INTEGER len; +#else + SIZE_T len; +#endif + struct nbio_mmap_win32_t* handle = NULL; + void* ptr = NULL; + bool is_write = (mode == NBIO_WRITE || mode == NBIO_UPDATE || mode == BIO_WRITE); + DWORD access = (is_write ? GENERIC_READ|GENERIC_WRITE : GENERIC_READ); +#if !defined(_WIN32) || defined(LEGACY_WIN32) + HANDLE file = CreateFile(filename, access, FILE_SHARE_ALL, NULL, dispositions[mode], FILE_ATTRIBUTE_NORMAL, NULL); +#else + wchar_t *filename_wide = utf8_to_utf16_string_alloc(filename); + HANDLE file = CreateFileW(filename_wide, access, FILE_SHARE_ALL, NULL, dispositions[mode], FILE_ATTRIBUTE_NORMAL, NULL); + + if (filename_wide) + free(filename_wide); +#endif + + if (file == INVALID_HANDLE_VALUE) + return NULL; + +#if defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0500 + /* GetFileSizeEx is new for Windows 2000 */ + GetFileSizeEx(file, &len); + mem = CreateFileMapping(file, NULL, is_write ? PAGE_READWRITE : PAGE_READONLY, 0, 0, NULL); + ptr = MapViewOfFile(mem, is_write ? (FILE_MAP_READ|FILE_MAP_WRITE) : FILE_MAP_READ, 0, 0, len.QuadPart); +#else + GetFileSize(file, &len); + mem = CreateFileMapping(file, NULL, is_write ? PAGE_READWRITE : PAGE_READONLY, 0, 0, NULL); + ptr = MapViewOfFile(mem, is_write ? (FILE_MAP_READ|FILE_MAP_WRITE) : FILE_MAP_READ, 0, 0, len); +#endif + + CloseHandle(mem); + + handle = (struct nbio_mmap_win32_t*)malloc(sizeof(struct nbio_mmap_win32_t)); + + handle->file = file; + handle->is_write = is_write; +#if defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0500 + handle->len = len.QuadPart; +#else + handle->len = len; +#endif + handle->ptr = ptr; + + return handle; +} + +static void nbio_mmap_win32_begin_read(void *data) +{ + /* not needed */ +} + +static void nbio_mmap_win32_begin_write(void *data) +{ + /* not needed */ +} + +static bool nbio_mmap_win32_iterate(void *data) +{ + /* not needed */ + return true; +} + +static void nbio_mmap_win32_resize(void *data, size_t len) +{ +#if defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0500 + LARGE_INTEGER len_li; +#else + SIZE_T len_li; +#endif + HANDLE mem; + struct nbio_mmap_win32_t* handle = (struct nbio_mmap_win32_t*)data; + + if (!handle) + return; + + if (len < handle->len) + { + /* this works perfectly fine if this check is removed, + * but it won't work on other nbio implementations */ + /* therefore, it's blocked so nobody accidentally + * relies on it. */ + puts("ERROR - attempted file shrink operation, not implemented"); + abort(); + } + +#if defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0500 + /* SetFilePointerEx is new for Windows 2000 */ + len_li.QuadPart = len; + SetFilePointerEx(handle->file, len_li, NULL, FILE_BEGIN); +#else + len_li = len; + SetFilePointer(handle->file, len_li, NULL, FILE_BEGIN); +#endif + + if (!SetEndOfFile(handle->file)) + { + puts("ERROR - couldn't resize file (SetEndOfFile)"); + abort(); /* this one returns void and I can't find any other way for it to report failure */ + } + handle->len = len; + + UnmapViewOfFile(handle->ptr); + mem = CreateFileMapping(handle->file, NULL, handle->is_write ? PAGE_READWRITE : PAGE_READONLY, 0, 0, NULL); + handle->ptr = MapViewOfFile(mem, handle->is_write ? (FILE_MAP_READ|FILE_MAP_WRITE) : FILE_MAP_READ, 0, 0, len); + CloseHandle(mem); + + if (!handle->ptr) + { + puts("ERROR - couldn't resize file (MapViewOfFile)"); + abort(); + } +} + +static void *nbio_mmap_win32_get_ptr(void *data, size_t* len) +{ + struct nbio_mmap_win32_t* handle = (struct nbio_mmap_win32_t*)data; + if (!handle) + return NULL; + if (len) + *len = handle->len; + return handle->ptr; +} + +static void nbio_mmap_win32_cancel(void *data) +{ + /* not needed */ +} + +static void nbio_mmap_win32_free(void *data) +{ + struct nbio_mmap_win32_t* handle = (struct nbio_mmap_win32_t*)data; + if (!handle) + return; + CloseHandle(handle->file); + UnmapViewOfFile(handle->ptr); + free(handle); +} + +nbio_intf_t nbio_mmap_win32 = { + nbio_mmap_win32_open, + nbio_mmap_win32_begin_read, + nbio_mmap_win32_begin_write, + nbio_mmap_win32_iterate, + nbio_mmap_win32_resize, + nbio_mmap_win32_get_ptr, + nbio_mmap_win32_cancel, + nbio_mmap_win32_free, + "nbio_mmap_win32", +}; +#else +nbio_intf_t nbio_mmap_win32 = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + "nbio_mmap_win32", +}; + +#endif diff --git a/libretro-common/formats/png/rpng.c b/libretro-common/formats/png/rpng.c index 794f229006..e6d4f49b6e 100644 --- a/libretro-common/formats/png/rpng.c +++ b/libretro-common/formats/png/rpng.c @@ -999,8 +999,6 @@ bool rpng_iterate_image(rpng_t *rpng) if (!read_chunk_header(buf, &chunk)) return false; - *buf += 8; - #if 0 for (i = 0; i < 4; i++) { diff --git a/libretro-common/gfx/gl_capabilities.c b/libretro-common/gfx/gl_capabilities.c index 0cc8eda592..221aa2a0b7 100644 --- a/libretro-common/gfx/gl_capabilities.c +++ b/libretro-common/gfx/gl_capabilities.c @@ -173,8 +173,9 @@ bool gl_check_capability(enum gl_capability_enum enum_idx) case GL_CAPS_FBO: #if defined(HAVE_PSGL) || defined(HAVE_OPENGLES2) || defined(HAVE_OPENGLES3) || defined(HAVE_OPENGLES_3_1) || defined(HAVE_OPENGLES_3_2) return true; -#elif defined(HAVE_FBO) - if (!gl_query_core_context_in_use() && !gl_query_extension("ARB_framebuffer_object") +#else + if ( !gl_query_core_context_in_use() + && !gl_query_extension("ARB_framebuffer_object") && !gl_query_extension("EXT_framebuffer_object")) return false; @@ -190,8 +191,6 @@ bool gl_check_capability(enum gl_capability_enum enum_idx) && glDeleteRenderbuffers) return true; break; -#else - break; #endif case GL_CAPS_ARGB8: #ifdef HAVE_OPENGLES @@ -280,21 +279,25 @@ bool gl_check_capability(enum gl_capability_enum enum_idx) #if defined(HAVE_OPENGLES) if (major >= 3 || gl_query_extension("EXT_sRGB")) return true; -#elif defined(HAVE_FBO) - if (gl_query_core_context_in_use() || - (gl_query_extension("EXT_texture_sRGB") - && gl_query_extension("ARB_framebuffer_sRGB"))) - return true; #endif + if (gl_check_capability(GL_CAPS_FBO)) + { + if ( gl_query_core_context_in_use() || + (gl_query_extension("EXT_texture_sRGB") + && gl_query_extension("ARB_framebuffer_sRGB")) + ) + return true; + } break; case GL_CAPS_FP_FBO: /* GLES - No extensions for float FBO currently. */ #ifndef HAVE_OPENGLES -#ifdef HAVE_FBO - /* Float FBO is core in 3.2. */ - if (gl_query_core_context_in_use() || gl_query_extension("ARB_texture_float")) - return true; -#endif + if (gl_check_capability(GL_CAPS_FBO)) + { + /* Float FBO is core in 3.2. */ + if (gl_query_core_context_in_use() || gl_query_extension("ARB_texture_float")) + return true; + } #endif break; case GL_CAPS_BGRA8888: diff --git a/libretro-common/include/compat/strl.h b/libretro-common/include/compat/strl.h index a68005ac2f..1b72f7db0a 100644 --- a/libretro-common/include/compat/strl.h +++ b/libretro-common/include/compat/strl.h @@ -52,6 +52,8 @@ size_t strlcat(char *dest, const char *source, size_t size); #endif +char *strldup(const char *s, size_t n); + RETRO_END_DECLS #endif diff --git a/libretro-common/include/file/nbio.h b/libretro-common/include/file/nbio.h index 011eef55e6..2aec848994 100644 --- a/libretro-common/include/file/nbio.h +++ b/libretro-common/include/file/nbio.h @@ -42,6 +42,7 @@ RETRO_BEGIN_DECLS #define NBIO_UPDATE 2 #endif +/* these two are blocking; nbio_iterate always returns true, but that operation (or something earlier) may take arbitrarily long */ #ifndef BIO_READ #define BIO_READ 3 #endif @@ -50,52 +51,73 @@ RETRO_BEGIN_DECLS #define BIO_WRITE 4 #endif -struct nbio_t; +typedef struct nbio_intf +{ + void *(*open)(const char * filename, unsigned mode); + + void (*begin_read)(void *data); + + void (*begin_write)(void *data); + + bool (*iterate)(void *data); + + void (*resize)(void *data, size_t len); + + void *(*get_ptr)(void *data, size_t* len); + + void (*cancel)(void *data); + + void (*free)(void *data); + + /* Human readable string. */ + const char *ident; +} nbio_intf_t; /* - * Creates an nbio structure for performing the given operation on the given file. + * Creates an nbio structure for performing the + * given operation on the given file. */ -struct nbio_t* nbio_open(const char * filename, unsigned mode); +void *nbio_open(const char * filename, unsigned mode); /* * Starts reading the given file. When done, it will be available in nbio_get_ptr. - * Can not be done if the structure was created with nbio_write. + * Can not be done if the structure was created with {N,}BIO_WRITE. */ -void nbio_begin_read(struct nbio_t* handle); +void nbio_begin_read(void *data); /* * Starts writing to the given file. Before this, you should've copied the data to nbio_get_ptr. - * Can not be done if the structure was created with nbio_read. + * Can not be done if the structure was created with {N,}BIO_READ. */ -void nbio_begin_write(struct nbio_t* handle); +void nbio_begin_write(void *data); /* * Performs part of the requested operation, or checks how it's going. * When it returns true, it's done. */ -bool nbio_iterate(struct nbio_t* handle); +bool nbio_iterate(void *data); /* * Resizes the file up to the given size; cannot shrink. - * Can not be done if the structure was created with nbio_read. + * Can not be done if the structure was created with {N,}BIO_READ. */ -void nbio_resize(struct nbio_t* handle, size_t len); +void nbio_resize(void *data, size_t len); /* - * Returns a pointer to the file data. Writable only if structure was not created with nbio_read. + * Returns a pointer to the file data. Writable only if structure was not created with {N,}BIO_READ. * If any operation is in progress, the pointer will be NULL, but len will still be correct. */ -void* nbio_get_ptr(struct nbio_t* handle, size_t* len); +void* nbio_get_ptr(void *data, size_t* len); /* * Stops any pending operation, allowing the object to be freed. */ -void nbio_cancel(struct nbio_t* handle); +void nbio_cancel(void *data); /* * Deletes the nbio structure and its associated pointer. */ -void nbio_free(struct nbio_t* handle); +void nbio_free(void *data); RETRO_END_DECLS diff --git a/libretro-common/include/libretro.h b/libretro-common/include/libretro.h index 74820e7a3c..b900ac93e6 100644 --- a/libretro-common/include/libretro.h +++ b/libretro-common/include/libretro.h @@ -126,16 +126,23 @@ extern "C" { */ #define RETRO_DEVICE_KEYBOARD 3 -/* Lightgun X/Y coordinates are reported relatively to last poll, - * similar to mouse. */ +/* LIGHTGUN device is similar to Guncon-2 for PlayStation 2. + * It reports X/Y coordinates in screen space (similar to the pointer) + * in the range [-0x8000, 0x7fff] in both axes, with zero being center. + * As well as reporting on/off screen state. It features a trigger, + * start/select buttons, auxiliary action buttons and a + * directional pad. A forced off-screen shot can be requested for + * auto-reloading function in some games. + */ #define RETRO_DEVICE_LIGHTGUN 4 /* The ANALOG device is an extension to JOYPAD (RetroPad). - * Similar to DualShock it adds two analog sticks. - * This is treated as a separate device type as it returns values in the - * full analog range of [-0x8000, 0x7fff]. Positive X axis is right. - * Positive Y axis is down. - * Only use ANALOG type when polling for analog values of the axes. + * Similar to DualShock2 it adds two analog sticks and all buttons can + * be analog. This is treated as a separate device type as it returns + * axis values in the full analog range of [-0x8000, 0x7fff]. + * Positive X axis is right. Positive Y axis is down. + * Buttons are returned in the range [0, 0x7fff]. + * Only use ANALOG type when polling for analog values. */ #define RETRO_DEVICE_ANALOG 5 @@ -174,7 +181,8 @@ extern "C" { /* Buttons for the RetroPad (JOYPAD). * The placement of these is equivalent to placements on the * Super Nintendo controller. - * L2/R2/L3/R3 buttons correspond to the PS1 DualShock. */ + * L2/R2/L3/R3 buttons correspond to the PS1 DualShock. + * Also used as id values for RETRO_DEVICE_INDEX_ANALOG_BUTTON */ #define RETRO_DEVICE_ID_JOYPAD_B 0 #define RETRO_DEVICE_ID_JOYPAD_Y 1 #define RETRO_DEVICE_ID_JOYPAD_SELECT 2 @@ -193,10 +201,11 @@ extern "C" { #define RETRO_DEVICE_ID_JOYPAD_R3 15 /* Index / Id values for ANALOG device. */ -#define RETRO_DEVICE_INDEX_ANALOG_LEFT 0 -#define RETRO_DEVICE_INDEX_ANALOG_RIGHT 1 -#define RETRO_DEVICE_ID_ANALOG_X 0 -#define RETRO_DEVICE_ID_ANALOG_Y 1 +#define RETRO_DEVICE_INDEX_ANALOG_LEFT 0 +#define RETRO_DEVICE_INDEX_ANALOG_RIGHT 1 +#define RETRO_DEVICE_INDEX_ANALOG_BUTTON 2 +#define RETRO_DEVICE_ID_ANALOG_X 0 +#define RETRO_DEVICE_ID_ANALOG_Y 1 /* Id values for MOUSE. */ #define RETRO_DEVICE_ID_MOUSE_X 0 @@ -208,15 +217,30 @@ extern "C" { #define RETRO_DEVICE_ID_MOUSE_MIDDLE 6 #define RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP 7 #define RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN 8 +#define RETRO_DEVICE_ID_MOUSE_BUTTON_4 9 +#define RETRO_DEVICE_ID_MOUSE_BUTTON_5 10 -/* Id values for LIGHTGUN types. */ -#define RETRO_DEVICE_ID_LIGHTGUN_X 0 -#define RETRO_DEVICE_ID_LIGHTGUN_Y 1 -#define RETRO_DEVICE_ID_LIGHTGUN_TRIGGER 2 -#define RETRO_DEVICE_ID_LIGHTGUN_CURSOR 3 -#define RETRO_DEVICE_ID_LIGHTGUN_TURBO 4 -#define RETRO_DEVICE_ID_LIGHTGUN_PAUSE 5 -#define RETRO_DEVICE_ID_LIGHTGUN_START 6 +/* Id values for LIGHTGUN. */ +#define RETRO_DEVICE_ID_LIGHTGUN_SCREEN_X 13 /*Absolute Position*/ +#define RETRO_DEVICE_ID_LIGHTGUN_SCREEN_Y 14 /*Absolute*/ +#define RETRO_DEVICE_ID_LIGHTGUN_IS_OFFSCREEN 15 /*Status Check*/ +#define RETRO_DEVICE_ID_LIGHTGUN_TRIGGER 2 +#define RETRO_DEVICE_ID_LIGHTGUN_RELOAD 16 /*Forced off-screen shot*/ +#define RETRO_DEVICE_ID_LIGHTGUN_AUX_A 3 +#define RETRO_DEVICE_ID_LIGHTGUN_AUX_B 4 +#define RETRO_DEVICE_ID_LIGHTGUN_START 6 +#define RETRO_DEVICE_ID_LIGHTGUN_SELECT 7 +#define RETRO_DEVICE_ID_LIGHTGUN_AUX_C 8 +#define RETRO_DEVICE_ID_LIGHTGUN_DPAD_UP 9 +#define RETRO_DEVICE_ID_LIGHTGUN_DPAD_DOWN 10 +#define RETRO_DEVICE_ID_LIGHTGUN_DPAD_LEFT 11 +#define RETRO_DEVICE_ID_LIGHTGUN_DPAD_RIGHT 12 +/* deprecated */ +#define RETRO_DEVICE_ID_LIGHTGUN_X 0 /*Relative Position*/ +#define RETRO_DEVICE_ID_LIGHTGUN_Y 1 /*Relative*/ +#define RETRO_DEVICE_ID_LIGHTGUN_CURSOR 3 /*Use Aux:A*/ +#define RETRO_DEVICE_ID_LIGHTGUN_TURBO 4 /*Use Aux:B*/ +#define RETRO_DEVICE_ID_LIGHTGUN_PAUSE 5 /*Use Start*/ /* Id values for POINTER. */ #define RETRO_DEVICE_ID_POINTER_X 0 diff --git a/libretro-common/include/retro_common_api.h b/libretro-common/include/retro_common_api.h index 659f90d76e..ef0860bbad 100644 --- a/libretro-common/include/retro_common_api.h +++ b/libretro-common/include/retro_common_api.h @@ -75,19 +75,18 @@ typedef int ssize_t; #include #endif -#ifdef _WIN32 -#define STRING_REP_INT64 "%I64d" -#define STRING_REP_UINT64 "%I64u" -#define STRING_REP_USIZE "%Iu" -#elif defined(__STDC_VERSION__) && __STDC_VERSION__>=199901L && !defined(VITA) && !defined(WIIU) -#define STRING_REP_INT64 "%lld" -#define STRING_REP_UINT64 "%llu" -#define STRING_REP_USIZE "%zu" -#else -#define STRING_REP_INT64 "%lld" -#define STRING_REP_UINT64 "%llu" -#define STRING_REP_USIZE "%lu" +#ifdef _MSC_VER +#ifndef PRId64 +#define PRId64 "I64d" +#define PRIu64 "I64u" +#define PRIuPTR "Iu" #endif +#else +#include +#endif +#define STRING_REP_INT64 "%" PRId64 +#define STRING_REP_UINT64 "%" PRIu64 +#define STRING_REP_USIZE "%" PRIuPTR /* I would like to see retro_inline.h moved in here; possibly boolean too. diff --git a/libretro-common/include/streams/file_stream.h b/libretro-common/include/streams/file_stream.h index 2a0d6950d7..e6d6bbca1c 100644 --- a/libretro-common/include/streams/file_stream.h +++ b/libretro-common/include/streams/file_stream.h @@ -56,7 +56,17 @@ void filestream_set_size(RFILE *stream); const char *filestream_get_ext(RFILE *stream); -RFILE *filestream_open(const char *path, unsigned mode, ssize_t len); +/** + * filestream_open: + * @path : path to file + * @mode : file mode to use when opening (read/write) + * @bufsize : optional buffer size (-1 or 0 to use default) + * + * Opens a file for reading or writing, depending on the requested mode. + * If bufsize is > 0 for unbuffered modes (like RFILE_MODE_WRITE), file will instead be fully buffered. + * Returns a pointer to an RFILE if opened successfully, otherwise NULL. + **/ +RFILE *filestream_open(const char *path, unsigned mode, ssize_t bufsize); ssize_t filestream_seek(RFILE *stream, ssize_t offset, int whence); diff --git a/libretro-common/memmap/memmap.c b/libretro-common/memmap/memmap.c index a2b56d7070..f1e16b374c 100644 --- a/libretro-common/memmap/memmap.c +++ b/libretro-common/memmap/memmap.c @@ -48,7 +48,8 @@ #endif #ifdef _WIN32 -void* mmap(void *addr, size_t len, int prot, int flags, int fildes, size_t offset) +void* mmap(void *addr, size_t len, int prot, int flags, + int fildes, size_t offset) { void *map = (void*)NULL; HANDLE handle = INVALID_HANDLE_VALUE; @@ -57,36 +58,34 @@ void* mmap(void *addr, size_t len, int prot, int flags, int fildes, size_t offse { case PROT_READ: default: - { - handle = CreateFileMapping((HANDLE) _get_osfhandle(fildes), 0, PAGE_READONLY, 0, - len, 0); - if (!handle) - break; - map = (void*)MapViewOfFile(handle, FILE_MAP_READ, 0, 0, len); - CloseHandle(handle); + handle = CreateFileMapping((HANDLE) + _get_osfhandle(fildes), 0, PAGE_READONLY, 0, + len, 0); + if (!handle) break; - } + map = (void*)MapViewOfFile(handle, FILE_MAP_READ, 0, 0, len); + CloseHandle(handle); + break; case PROT_WRITE: - { - handle = CreateFileMapping((HANDLE) _get_osfhandle(fildes),0,PAGE_READWRITE,0, - len, 0); - if (!handle) - break; - map = (void*)MapViewOfFile(handle, FILE_MAP_WRITE, 0, 0, len); - CloseHandle(handle); + handle = CreateFileMapping((HANDLE) + _get_osfhandle(fildes),0,PAGE_READWRITE,0, + len, 0); + if (!handle) break; - } + map = (void*)MapViewOfFile(handle, FILE_MAP_WRITE, 0, 0, len); + CloseHandle(handle); + break; case PROT_READWRITE: - { - handle = CreateFileMapping((HANDLE) _get_osfhandle(fildes),0,PAGE_READWRITE,0, - len, 0); - if (!handle) - break; - map = (void*)MapViewOfFile(handle, FILE_MAP_ALL_ACCESS, 0, 0, len); - CloseHandle(handle); + handle = CreateFileMapping((HANDLE) + _get_osfhandle(fildes),0,PAGE_READWRITE,0, + len, 0); + if (!handle) break; - } + map = (void*)MapViewOfFile(handle, FILE_MAP_ALL_ACCESS, 0, 0, len); + CloseHandle(handle); + break; } + if (map == (void*)NULL) return((void*)MAP_FAILED); return((void*) ((int8_t*)map + offset)); @@ -110,7 +109,8 @@ int mprotect(void *addr, size_t len, int prot) } #elif !defined(HAVE_MMAN) -void* mmap(void *addr, size_t len, int prot, int flags, int fildes, size_t offset) +void* mmap(void *addr, size_t len, int prot, int flags, + int fildes, size_t offset) { return malloc(len); } @@ -123,7 +123,8 @@ int munmap(void *addr, size_t len) int mprotect(void *addr, size_t len, int prot) { - /* stub - not really needed at this point since this codepath has no dynarecs */ + /* stub - not really needed at this point + * since this codepath has no dynarecs. */ return 0; } diff --git a/libretro-common/samples/file/nbio/nbio_test.c b/libretro-common/samples/file/nbio/nbio_test.c index 3fadf8f888..c7163536c4 100644 --- a/libretro-common/samples/file/nbio/nbio_test.c +++ b/libretro-common/samples/file/nbio/nbio_test.c @@ -9,6 +9,8 @@ static void nbio_write_test(void) bool looped = false; void* ptr = NULL; struct nbio_t* write = nbio_open("test.bin", NBIO_WRITE); + if (!write) + puts("ERROR: nbio_open failed (1)"); nbio_resize(write, 1024*1024); @@ -33,6 +35,8 @@ static void nbio_read_test(void) bool looped = false; struct nbio_t* read = nbio_open("test.bin", NBIO_READ); void* ptr = nbio_get_ptr(read, &size); + if (!read) + puts("ERROR: nbio_open failed (2)"); if (size != 1024*1024) puts("ERROR: wrong size (2)"); diff --git a/libretro-common/samples/formats/png/Makefile b/libretro-common/samples/formats/png/Makefile index 43e127041a..f1213e48ea 100644 --- a/libretro-common/samples/formats/png/Makefile +++ b/libretro-common/samples/formats/png/Makefile @@ -18,14 +18,18 @@ SOURCES_C := \ $(LIBRETRO_PNG_DIR)/rpng.c \ $(LIBRETRO_PNG_DIR)/rpng_encode.c \ $(LIBRETRO_COMM_DIR)/encodings/encoding_crc32.c \ + $(LIBRETRO_COMM_DIR)/encodings/encoding_utf.c \ $(LIBRETRO_COMM_DIR)/string/stdstring.c \ $(LIBRETRO_COMM_DIR)/compat/compat_strl.c \ + $(LIBRETRO_COMM_DIR)/compat/compat_strcasestr.c \ $(LIBRETRO_COMM_DIR)/file/nbio/nbio_stdio.c \ $(LIBRETRO_COMM_DIR)/file/archive_file.c \ $(LIBRETRO_COMM_DIR)/file/archive_file_zlib.c \ - $(LIBRETRO_COMM_DIR)//file/file_path.c \ - $(LIBRETRO_COMM_DIR)//file/retro_stat.c \ + $(LIBRETRO_COMM_DIR)/file/file_path.c \ $(LIBRETRO_COMM_DIR)/streams/file_stream.c \ + $(LIBRETRO_COMM_DIR)/streams/trans_stream.c \ + $(LIBRETRO_COMM_DIR)/streams/trans_stream_zlib.c \ + $(LIBRETRO_COMM_DIR)/streams/trans_stream_pipe.c \ $(LIBRETRO_COMM_DIR)/lists/string_list.c OBJS := $(SOURCES_C:.c=.o) diff --git a/libretro-common/streams/file_stream.c b/libretro-common/streams/file_stream.c index 745bb251e2..c4dcddf0a7 100644 --- a/libretro-common/streams/file_stream.c +++ b/libretro-common/streams/file_stream.c @@ -25,6 +25,10 @@ #include #include +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + #if defined(_WIN32) # ifdef _MSC_VER # define setmode _setmode @@ -107,6 +111,7 @@ struct RFILE #endif int fd; #endif + char *buf; }; FILE* filestream_get_fp(RFILE *stream) @@ -154,8 +159,19 @@ void filestream_set_size(RFILE *stream) filestream_seek(stream, 0, SEEK_SET); } -RFILE *filestream_open(const char *path, unsigned mode, ssize_t len) +/** + * filestream_open: + * @path : path to file + * @mode : file mode to use when opening (read/write) + * @bufsize : optional buffer size (-1 or 0 to use default) + * + * Opens a file for reading or writing, depending on the requested mode. + * If bufsize is > 0 for unbuffered modes (like RFILE_MODE_WRITE), file will instead be fully buffered. + * Returns a pointer to an RFILE if opened successfully, otherwise NULL. + **/ +RFILE *filestream_open(const char *path, unsigned mode, ssize_t unused) { + ssize_t bufsize = 0x4000; int flags = 0; int mode_int = 0; #if defined(HAVE_BUFFERED_IO) @@ -254,6 +270,9 @@ RFILE *filestream_open(const char *path, unsigned mode, ssize_t len) #if defined(PSP) stream->fd = sceIoOpen(path, flags, mode_int); + + if (stream->fd == -1) + goto error; #else #if defined(HAVE_BUFFERED_IO) if ((stream->hints & RFILE_HINT_UNBUFFERED) == 0 && mode_str) @@ -275,13 +294,28 @@ RFILE *filestream_open(const char *path, unsigned mode, ssize_t len) #else stream->fp = fopen(path, mode_str); #endif + if (!stream->fp) goto error; + + if (bufsize > 0) + { + /* Regarding setvbuf: + * + * https://www.freebsd.org/cgi/man.cgi?query=setvbuf&apropos=0&sektion=0&manpath=FreeBSD+11.1-RELEASE&arch=default&format=html + * + * If the size argument is not zero but buf is NULL, a buffer of the given size will be allocated immediately, and + * released on close. This is an extension to ANSI C. + * + * Since C89 does not support specifying a null buffer with a non-zero size, we create and track our own buffer for it. + */ + stream->buf = (char*)calloc(1, bufsize); + setvbuf(stream->fp, stream->buf, _IOFBF, bufsize); + } } else #endif { - /* FIXME: HAVE_BUFFERED_IO is always 1, but if it is ever changed, open() needs to be changed to _wopen() for WIndows. */ #if defined(_WIN32) && !defined(_XBOX) #if defined(LEGACY_WIN32) (void)path_wide; @@ -297,8 +331,10 @@ RFILE *filestream_open(const char *path, unsigned mode, ssize_t len) free(path_wide); #endif #else + /* FIXME: HAVE_BUFFERED_IO is always 1, but if it is ever changed, this open() needs to have an alternate _wopen() for Windows. */ stream->fd = open(path, flags, mode_int); #endif + if (stream->fd == -1) goto error; #ifdef HAVE_MMAP @@ -323,11 +359,6 @@ RFILE *filestream_open(const char *path, unsigned mode, ssize_t len) } #endif -#if defined(PSP) - if (stream->fd == -1) - goto error; -#endif - { const char *ld = (const char*)strrchr(path, '.'); if (ld) @@ -666,6 +697,8 @@ int filestream_close(RFILE *stream) if (stream->fd > 0) close(stream->fd); #endif + if (stream->buf) + free(stream->buf); free(stream); return 0; diff --git a/libretro-db/README.md b/libretro-db/README.md index 29e9a11d92..463bc9145e 100644 --- a/libretro-db/README.md +++ b/libretro-db/README.md @@ -66,6 +66,11 @@ Usecase: Search for all games released on October 1995. `libretrodb_tool find "{'releasemonth':10,'releaseyear':1995}"` +3) Names only search +Usecase: Search for all games released on October 1995, wont print checksums, filename or rom size, only the game name. + +`libretrodb_tool get-names "{'releasemonth':10,'releaseyear':1995}"` + # Compiling the Database Use [libretro-super](https://github.com/libretro/libretro-super) to compile the entire database: diff --git a/libretro-db/libretrodb_tool.c b/libretro-db/libretrodb_tool.c index b7e05524b6..e137e248e2 100644 --- a/libretro-db/libretrodb_tool.c +++ b/libretro-db/libretrodb_tool.c @@ -44,6 +44,7 @@ int main(int argc, char ** argv) printf("\tlist\n"); printf("\tcreate-index \n"); printf("\tfind \n"); + printf("\tget-names \n"); return 1; } @@ -113,6 +114,48 @@ int main(int argc, char ** argv) rmsgpack_dom_value_free(&item); } } + else if (memcmp(command, "get-names", 9) == 0) + { + if (argc != 4) + { + printf("Usage: %s get-names \n", argv[0]); + goto error; + } + + query_exp = argv[3]; + error = NULL; + q = libretrodb_query_compile(db, query_exp, strlen(query_exp), &error); + + if (error) + { + printf("%s\n", error); + goto error; + } + + if ((rv = libretrodb_cursor_open(db, cur, q)) != 0) + { + printf("Could not open cursor: %s\n", strerror(-rv)); + goto error; + } + + while (libretrodb_cursor_read_item(cur, &item) == 0) + { + if (item.type == RDT_MAP) //should always be true, but if false the program would segfault + { + unsigned i; + for (i = 0; i < item.val.map.len; i++) + { + if (item.val.map.items[i].key.type == RDT_STRING && (strncmp(item.val.map.items[i].key.val.string.buff, "name", item.val.map.items[i].key.val.string.len) == 0)) + { + rmsgpack_dom_value_print(&item.val.map.items[i].value); + printf("\n"); + } + } + } + + rmsgpack_dom_value_free(&item); + } + } else if (memcmp(command, "create-index", 12) == 0) { const char * index_name, * field_name; @@ -134,6 +177,7 @@ int main(int argc, char ** argv) goto error; } + libretrodb_cursor_close(cur); libretrodb_close(db); error: @@ -141,5 +185,7 @@ error: libretrodb_free(db); if (cur) libretrodb_cursor_free(cur); + if (q) + libretrodb_query_free(q); return 1; } diff --git a/libretro-db/query.c b/libretro-db/query.c index 339a62d192..9509de2ad0 100644 --- a/libretro-db/query.c +++ b/libretro-db/query.c @@ -289,7 +289,7 @@ struct registered_func registered_functions[100] = { static void query_raise_expected_number(ssize_t where, const char **error) { snprintf(tmp_error_buff, MAX_ERROR_LEN, - STRING_REP_UINT64 "::Expected number", + "%" PRIu64 "::Expected number", (uint64_t)where); *error = tmp_error_buff; } @@ -297,7 +297,7 @@ static void query_raise_expected_number(ssize_t where, const char **error) static void query_raise_expected_string(ssize_t where, const char ** error) { snprintf(tmp_error_buff, MAX_ERROR_LEN, - STRING_REP_UINT64 "::Expected string", + "%" PRIu64 "::Expected string", (uint64_t)where); *error = tmp_error_buff; } @@ -305,7 +305,7 @@ static void query_raise_expected_string(ssize_t where, const char ** error) static void query_raise_unexpected_eof(ssize_t where, const char ** error) { snprintf(tmp_error_buff, MAX_ERROR_LEN, - STRING_REP_UINT64 "::Unexpected EOF", + "%" PRIu64 "::Unexpected EOF", (uint64_t)where ); *error = tmp_error_buff; @@ -321,7 +321,7 @@ static void query_raise_unknown_function(ssize_t where, const char *name, ssize_t len, const char **error) { int n = snprintf(tmp_error_buff, MAX_ERROR_LEN, - STRING_REP_UINT64 "::Unknown function '", + "%" PRIu64 "::Unknown function '", (uint64_t)where ); @@ -336,7 +336,7 @@ static void query_raise_expected_eof( ssize_t where, char found, const char **error) { snprintf(tmp_error_buff, MAX_ERROR_LEN, - STRING_REP_UINT64 "::Expected EOF found '%c'", + "%" PRIu64 "::Expected EOF found '%c'", (uint64_t)where, found ); @@ -348,7 +348,7 @@ static void query_raise_unexpected_char( const char **error) { snprintf(tmp_error_buff, MAX_ERROR_LEN, - STRING_REP_UINT64 "::Expected '%c' found '%c'", + "%" PRIu64 "::Expected '%c' found '%c'", (uint64_t)where, expected, found); *error = tmp_error_buff; } diff --git a/libretro-db/rmsgpack_dom.c b/libretro-db/rmsgpack_dom.c index f7d6d3d916..942282a17c 100644 --- a/libretro-db/rmsgpack_dom.c +++ b/libretro-db/rmsgpack_dom.c @@ -315,10 +315,10 @@ void rmsgpack_dom_value_print(struct rmsgpack_dom_value *obj) printf("false"); break; case RDT_INT: - printf(STRING_REP_INT64, (int64_t)obj->val.int_); + printf("%" PRId64, (int64_t)obj->val.int_); break; case RDT_UINT: - printf(STRING_REP_UINT64, (uint64_t)obj->val.uint_); + printf("%" PRIu64, (uint64_t)obj->val.uint_); break; case RDT_STRING: printf("\"%s\"", obj->val.string.buff); diff --git a/libretro-db/rmsgpack_test.c b/libretro-db/rmsgpack_test.c index 2e7f7d0d3a..1c6f03cb57 100644 --- a/libretro-db/rmsgpack_test.c +++ b/libretro-db/rmsgpack_test.c @@ -186,7 +186,7 @@ static struct rmsgpack_read_callbacks stub_callbacks = { int main(void) { struct stub_state state; - RFILE *fd = filestream_open("test.msgpack", RFILE_MODE_READ, 0); + RFILE *fd = filestream_open("test.msgpack", RFILE_MODE_READ, -1); state.i = 0; state.stack[0] = 0; diff --git a/managers/cheat_manager.c b/managers/cheat_manager.c index 1cd839ad10..888175171a 100644 --- a/managers/cheat_manager.c +++ b/managers/cheat_manager.c @@ -97,7 +97,8 @@ void cheat_manager_apply_cheats(void) cheat_info.enabled = true; cheat_info.code = handle->cheats[i].code; - core_set_cheat(&cheat_info); + if (!string_is_empty(cheat_info.code)) + core_set_cheat(&cheat_info); } } runloop_msg_queue_push(msg_hash_to_str(MSG_APPLYING_CHEAT), 1, 180, true); diff --git a/menu/cbs/menu_cbs_deferred_push.c b/menu/cbs/menu_cbs_deferred_push.c index 8ab480aefd..538198987c 100644 --- a/menu/cbs/menu_cbs_deferred_push.c +++ b/menu/cbs/menu_cbs_deferred_push.c @@ -78,11 +78,6 @@ static int deferred_push_achievement_list(menu_displaylist_info_t *info) return deferred_push_dlist(info, DISPLAYLIST_ACHIEVEMENT_LIST); } -static int deferred_push_achievement_list_hardcore(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_ACHIEVEMENT_LIST_HARDCORE); -} - static int deferred_push_rdb_collection(menu_displaylist_info_t *info) { return deferred_push_dlist(info, DISPLAYLIST_PLAYLIST_COLLECTION); @@ -1533,9 +1528,6 @@ static int menu_cbs_init_bind_deferred_push_compare_label( case MENU_ENUM_LABEL_ACHIEVEMENT_LIST: BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_achievement_list); break; - case MENU_ENUM_LABEL_ACHIEVEMENT_LIST_HARDCORE: - BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_achievement_list_hardcore); - break; case MENU_ENUM_LABEL_CORE_COUNTERS: BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_core_counters); break; @@ -1768,9 +1760,6 @@ static int menu_cbs_init_bind_deferred_push_compare_label( case MENU_LABEL_ACHIEVEMENT_LIST: BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_achievement_list); break; - case MENU_LABEL_ACHIEVEMENT_LIST_HARDCORE: - BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_achievement_list_hardcore); - break; case MENU_LABEL_CORE_COUNTERS: BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_core_counters); break; diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index 4760206b17..d58701f8e3 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -94,6 +94,21 @@ static void menu_action_setting_disp_set_label_cheevos_unlocked_entry( msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ENTRY), len); } +static void menu_action_setting_disp_set_label_cheevos_unlocked_entry_hardcore( + file_list_t* list, + unsigned *w, unsigned type, unsigned i, + const char *label, + char *s, size_t len, + const char *entry_label, + const char *path, + char *s2, size_t len2) +{ + *w = 19; + strlcpy(s2, path, len2); + strlcpy(s, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ENTRY_HARDCORE), len); +} + static void menu_action_setting_disp_set_label_remap_file_load( file_list_t* list, unsigned *w, unsigned type, unsigned i, @@ -232,6 +247,11 @@ static void menu_action_setting_disp_set_label_pipeline( msg_hash_to_str( MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_BOKEH), len); break; + case XMB_SHADER_PIPELINE_SNOWFLAKE: + strlcpy(s, + msg_hash_to_str( + MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_SNOWFLAKE), len); + break; } strlcpy(s2, path, len2); @@ -557,7 +577,7 @@ static void menu_action_setting_disp_set_label_perf_counters_common( return; snprintf(s, len, - STRING_REP_UINT64 " ticks, " STRING_REP_UINT64 " runs.", + "%" PRIu64 " ticks, %" PRIu64 " runs.", ((uint64_t)counters[offset]->total / (uint64_t)counters[offset]->call_cnt), (uint64_t)counters[offset]->call_cnt); @@ -741,6 +761,10 @@ static void menu_action_setting_disp_set_label_xmb_theme( strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE), len); break; + case XMB_ICON_THEME_RETROSYSTEM: + strlcpy(s, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM), len); + break; case XMB_ICON_THEME_PIXEL: strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL), len); @@ -1972,6 +1996,10 @@ int menu_cbs_init_bind_get_string_representation(menu_file_list_cbs_t *cbs, BIND_ACTION_GET_VALUE(cbs, menu_action_setting_disp_set_label_cheevos_unlocked_entry); return 0; + case MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY_HARDCORE: + BIND_ACTION_GET_VALUE(cbs, + menu_action_setting_disp_set_label_cheevos_unlocked_entry_hardcore); + return 0; case MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY: BIND_ACTION_GET_VALUE(cbs, menu_action_setting_disp_set_label_cheevos_locked_entry); diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index e1c8496eea..dedf26bd8e 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -1032,6 +1032,23 @@ static bool menu_content_find_first_core(menu_content_ctx_defer_info_t *def_info return true; } +#ifdef HAVE_LIBRETRODB +void handle_dbscan_finished(void *task_data, void *user_data, const char *err); +#endif + +static void content_add_to_playlist(const char *path) +{ +#ifdef HAVE_LIBRETRODB + settings_t *settings = config_get_ptr(); + if (!settings || !settings->bools.automatically_add_content_to_playlist) + return; + task_push_dbscan( + settings->paths.directory_playlist, + settings->paths.path_content_database, + path, false, handle_dbscan_finished); +#endif +} + static int file_load_with_detect_core_wrapper( enum msg_hash_enums enum_label_idx, enum msg_hash_enums enum_idx, @@ -1118,6 +1135,7 @@ static int file_load_with_detect_core_wrapper( free(new_core_path); return -1; } + content_add_to_playlist(def_info.s); ret = 0; break; @@ -1189,6 +1207,13 @@ static int set_path_generic(const char *label, const char *action_path) return 0; } +static int generic_action_ok_command(enum event_command cmd) +{ + if (!command_event(cmd, NULL)) + return menu_cbs_exit(); + return 0; +} + static int generic_action_ok(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx, unsigned id, enum msg_hash_enums flush_id) @@ -1319,7 +1344,7 @@ static int generic_action_ok(const char *path, case ACTION_OK_APPEND_DISK_IMAGE: flush_type = MENU_SETTINGS; command_event(CMD_EVENT_DISK_APPEND_IMAGE, action_path); - command_event(CMD_EVENT_RESUME, NULL); + generic_action_ok_command(CMD_EVENT_RESUME); break; case ACTION_OK_SET_DIRECTORY: flush_char = msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_DIRECTORY_SETTINGS_LIST); @@ -1354,6 +1379,35 @@ error: return menu_cbs_exit(); } +static int default_action_ok_load_content_with_core_from_menu(const char *_path, unsigned _type) +{ + content_ctx_info_t content_info; + content_info.argc = 0; + content_info.argv = NULL; + content_info.args = NULL; + content_info.environ_get = NULL; + if (!task_push_load_content_with_core_from_menu(_path, &content_info, (enum rarch_core_type)_type, NULL, NULL)) + return -1; + content_add_to_playlist(_path); + return 0; +} + +static int default_action_ok_load_content_from_playlist_from_menu(const char *_path, const char *path, const char *entry_label) +{ + content_ctx_info_t content_info; + content_info.argc = 0; + content_info.argv = NULL; + content_info.args = NULL; + content_info.environ_get = NULL; + if (!task_push_load_content_from_playlist_from_menu( + _path, path, entry_label, + &content_info, + NULL, NULL)) + return -1; + return 0; +} + + #define default_action_ok_set(funcname, _id, _flush) \ static int (funcname)(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) \ { \ @@ -1378,17 +1432,11 @@ static int action_ok_file_load(const char *path, { char menu_path_new[PATH_MAX_LENGTH]; char full_path_new[PATH_MAX_LENGTH]; - content_ctx_info_t content_info; const char *menu_label = NULL; const char *menu_path = NULL; rarch_setting_t *setting = NULL; file_list_t *menu_stack = menu_entries_get_menu_stack_ptr(0); - content_info.argc = 0; - content_info.argv = NULL; - content_info.args = NULL; - content_info.environ_get = NULL; - menu_path_new[0] = full_path_new[0] = '\0'; file_list_get_last(menu_stack, &menu_path, &menu_label, NULL, NULL); @@ -1433,22 +1481,16 @@ static int action_ok_file_load(const char *path, break; } - if (!task_push_load_content_with_core_from_menu( - full_path_new, - &content_info, - CORE_TYPE_PLAIN, - NULL, NULL)) - return -1; - - return 0; + return default_action_ok_load_content_with_core_from_menu(full_path_new, + CORE_TYPE_PLAIN); } + static int action_ok_playlist_entry_collection(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { menu_content_ctx_playlist_info_t playlist_info; char new_core_path[PATH_MAX_LENGTH]; - content_ctx_info_t content_info; size_t selection_ptr = 0; bool playlist_initialized = false; playlist_t *playlist = NULL; @@ -1458,13 +1500,6 @@ static int action_ok_playlist_entry_collection(const char *path, const char *core_name = NULL; playlist_t *tmp_playlist = NULL; menu_handle_t *menu = NULL; - rarch_system_info_t *info = runloop_get_system_info(); - struct retro_system_info *system = &info->info; - - content_info.argc = 0; - content_info.argv = NULL; - content_info.args = NULL; - content_info.environ_get = NULL; if (!menu_driver_ctl(RARCH_MENU_CTL_DRIVER_DATA_GET, &menu)) return menu_cbs_exit(); @@ -1489,24 +1524,11 @@ static int action_ok_playlist_entry_collection(const char *path, playlist_get_index(playlist, selection_ptr, &entry_path, &entry_label, &core_path, &core_name, NULL, NULL); - /* If the currently loaded core's name is equal - * to the core name from the playlist entry, - * then we directly load this game with the current core. - */ - if (system && - string_is_equal(system->library_name, core_name)) - { - if (playlist_initialized) - playlist_free(tmp_playlist); - return action_ok_file_load(menu->deferred_path, label, type, idx, entry_idx); - } - /* Is the core path / name of the playlist entry not yet filled in? */ if ( string_is_equal(core_path, file_path_str(FILE_PATH_DETECT)) && string_is_equal(core_name, file_path_str(FILE_PATH_DETECT))) { core_info_ctx_find_t core_info; - char new_display_name[PATH_MAX_LENGTH]; const char *entry_path = NULL; const char *path_base = path_basename(menu->db_playlist_file); @@ -1514,8 +1536,6 @@ static int action_ok_playlist_entry_collection(const char *path, menu_content_playlist_find_associated_core( path_base, new_core_path, sizeof(new_core_path)); - new_display_name[0] = '\0'; - core_info.inf = NULL; core_info.path = new_core_path; @@ -1535,62 +1555,46 @@ static int action_ok_playlist_entry_collection(const char *path, menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &tmp_playlist); - strlcpy(new_display_name, - core_info.inf->display_name, sizeof(new_display_name)); - playlist_update(tmp_playlist, + command_playlist_update_write(tmp_playlist, selection_ptr, + core_info.inf->display_name, NULL, - NULL, - new_core_path, - new_display_name, - NULL, - NULL); - playlist_write_file(tmp_playlist); + new_core_path); } else - { strlcpy(new_core_path, core_path, sizeof(new_core_path)); - } playlist_info.data = playlist; playlist_info.idx = (unsigned)selection_ptr; if (!menu_content_playlist_load(&playlist_info)) { - runloop_msg_queue_push("File could not be loaded from playlist.\n", 1, 100, true); + runloop_msg_queue_push( + "File could not be loaded from playlist.\n", + 1, 100, true); return menu_cbs_exit(); } playlist_get_index(playlist, playlist_info.idx, &path, NULL, NULL, NULL, NULL, NULL); - - if (!task_push_load_content_from_playlist_from_menu( - new_core_path, path, - &content_info, - NULL, NULL)) - return -1; - - return 0; + return default_action_ok_load_content_from_playlist_from_menu(new_core_path, path, entry_label); } static int action_ok_playlist_entry(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { menu_content_ctx_playlist_info_t playlist_info; - content_ctx_info_t content_info; + char new_core_path[PATH_MAX_LENGTH]; size_t selection_ptr = 0; playlist_t *playlist = g_defaults.content_history; const char *entry_path = NULL; + const char *entry_label = NULL; const char *core_path = NULL; const char *core_name = NULL; - playlist_t *tmp_playlist = NULL; menu_handle_t *menu = NULL; - content_info.argc = 0; - content_info.argv = NULL; - content_info.args = NULL; - content_info.environ_get = NULL; + new_core_path[0] = '\0'; if (!menu_driver_ctl(RARCH_MENU_CTL_DRIVER_DATA_GET, &menu)) return menu_cbs_exit(); @@ -1598,22 +1602,16 @@ static int action_ok_playlist_entry(const char *path, selection_ptr = entry_idx; playlist_get_index(playlist, selection_ptr, - &entry_path, NULL, &core_path, &core_name, NULL, NULL); + &entry_path, &entry_label, &core_path, &core_name, NULL, NULL); if ( string_is_equal(core_path, file_path_str(FILE_PATH_DETECT)) && string_is_equal(core_name, file_path_str(FILE_PATH_DETECT))) { core_info_ctx_find_t core_info; - char new_core_path[PATH_MAX_LENGTH]; - char *new_display_name = NULL; const char *entry_path = NULL; const char *path_base = path_basename(menu->db_playlist_file); - bool found_associated_core = false; - - new_core_path[0] = '\0'; - - found_associated_core = + bool found_associated_core = menu_content_playlist_find_associated_core( path_base, new_core_path, sizeof(new_core_path)); @@ -1629,22 +1627,14 @@ static int action_ok_playlist_entry(const char *path, return action_ok_file_load_with_detect_core(entry_path, label, type, selection_ptr, entry_idx); - menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &tmp_playlist); - - new_display_name = strdup(core_info.inf->display_name); - - playlist_update(tmp_playlist, + command_playlist_update_write(NULL, selection_ptr, + core_info.inf->display_name, NULL, - NULL, - new_core_path, - new_display_name, - NULL, - NULL); - - free(new_display_name); - playlist_write_file(tmp_playlist); + new_core_path); } + else + strlcpy(new_core_path, core_path, sizeof(new_core_path)); playlist_info.data = playlist; playlist_info.idx = (unsigned)selection_ptr; @@ -1661,34 +1651,23 @@ static int action_ok_playlist_entry(const char *path, playlist_info.idx, &path, NULL, NULL, NULL, NULL, NULL); - if (!task_push_load_content_from_playlist_from_menu( - core_path, path, - &content_info, - NULL, NULL)) - return -1; - - return 0; + return default_action_ok_load_content_from_playlist_from_menu(new_core_path, path, entry_label); } static int action_ok_playlist_entry_start_content(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { menu_content_ctx_playlist_info_t playlist_info; - content_ctx_info_t content_info; size_t selection_ptr = 0; bool playlist_initialized = false; playlist_t *playlist = NULL; const char *entry_path = NULL; + const char *entry_label = NULL; const char *core_path = NULL; const char *core_name = NULL; playlist_t *tmp_playlist = NULL; menu_handle_t *menu = NULL; - content_info.argc = 0; - content_info.argv = NULL; - content_info.args = NULL; - content_info.environ_get = NULL; - if (!menu_driver_ctl(RARCH_MENU_CTL_DRIVER_DATA_GET, &menu)) return menu_cbs_exit(); @@ -1708,20 +1687,19 @@ static int action_ok_playlist_entry_start_content(const char *path, selection_ptr = rdb_entry_start_game_selection_ptr; playlist_get_index(playlist, selection_ptr, - &entry_path, NULL, &core_path, &core_name, NULL, NULL); + &entry_path, &entry_label, &core_path, &core_name, NULL, NULL); if ( string_is_equal(core_path, file_path_str(FILE_PATH_DETECT)) && string_is_equal(core_name, file_path_str(FILE_PATH_DETECT))) { core_info_ctx_find_t core_info; char new_core_path[PATH_MAX_LENGTH]; - char new_display_name[PATH_MAX_LENGTH]; const char *entry_path = NULL; const char *path_base = path_basename(menu->db_playlist_file); bool found_associated_core = false; - new_core_path[0] = new_display_name[0] = '\0'; + new_core_path[0] = '\0'; found_associated_core = menu_content_playlist_find_associated_core( @@ -1746,17 +1724,12 @@ static int action_ok_playlist_entry_start_content(const char *path, menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &tmp_playlist); - strlcpy(new_display_name, - core_info.inf->display_name, sizeof(new_display_name)); - playlist_update(tmp_playlist, + command_playlist_update_write( + tmp_playlist, selection_ptr, + core_info.inf->display_name, NULL, - NULL, - new_core_path, - new_display_name, - NULL, - NULL); - playlist_write_file(tmp_playlist); + new_core_path); } playlist_info.data = playlist; @@ -1771,21 +1744,7 @@ static int action_ok_playlist_entry_start_content(const char *path, playlist_get_index(playlist, playlist_info.idx, &path, NULL, NULL, NULL, NULL, NULL); - if (!task_push_load_content_from_playlist_from_menu( - core_path, path, - &content_info, - NULL, NULL)) - return -1; - - return 0; -} - -static int action_ok_cheat_apply_changes(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - command_event(CMD_EVENT_CHEATS_APPLY, NULL); - - return 0; + return default_action_ok_load_content_from_playlist_from_menu(core_path, path, entry_label); } static int action_ok_lookup_setting(const char *path, @@ -1828,15 +1787,12 @@ static int action_ok_audio_add_to_mixer_and_collection(const char *path, fill_pathname_join(combined_path, menu->scratch2_buf, menu->scratch_buf, sizeof(combined_path)); - playlist_push(g_defaults.music_history, + command_playlist_push_write( + g_defaults.music_history, combined_path, NULL, "builtin", - "musicplayer", - NULL, - NULL); - - playlist_write_file(g_defaults.music_history); + "musicplayer"); if(path_file_exists(combined_path)) task_push_audio_mixer_load(combined_path, @@ -1905,21 +1861,6 @@ static void menu_input_wifi_cb(void *userdata, const char *passphrase) menu_input_dialog_end(); } -static int action_ok_cheat(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - menu_input_ctx_line_t line; - - line.label = msg_hash_to_str(MSG_INPUT_CHEAT); - line.label_setting = label; - line.type = type; - line.idx = (unsigned)idx; - line.cb = menu_input_st_cheat_cb; - - if (!menu_input_dialog_start(&line)) - return -1; - return 0; -} static void menu_input_st_string_cb_rename_entry(void *userdata, const char *str) @@ -1929,25 +1870,11 @@ static void menu_input_st_string_cb_rename_entry(void *userdata, const char *label = menu_input_dialog_get_buffer(); if (!string_is_empty(label)) - { - playlist_t *tmp_playlist = NULL; - size_t new_selection_ptr = menu_input_dialog_get_kb_idx(); - - menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &tmp_playlist); - - if (tmp_playlist) - { - playlist_update(tmp_playlist, - new_selection_ptr, - NULL, - label, - NULL, - NULL, - NULL, - NULL); - playlist_write_file(tmp_playlist); - } - } + command_playlist_update_write(NULL, + menu_input_dialog_get_kb_idx(), + NULL, + label, + NULL); } menu_input_dialog_end(); @@ -2040,22 +1967,73 @@ static void menu_input_st_string_cb_save_preset(void *userdata, menu_input_dialog_end(); } -static int action_ok_shader_preset_save_as(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) +static void menu_input_st_string_cb_cheat_file_save_as( + void *userdata, const char *str) { - menu_input_ctx_line_t line; + if (str && *str) + { + rarch_setting_t *setting = NULL; + settings_t *settings = config_get_ptr(); + const char *label = menu_input_dialog_get_label_buffer(); - line.label = msg_hash_to_str(MSG_INPUT_PRESET_FILENAME); - line.label_setting = label; - line.type = type; - line.idx = (unsigned)idx; - line.cb = menu_input_st_string_cb_save_preset; + if (!string_is_empty(label)) + setting = menu_setting_find(label); - if (!menu_input_dialog_start(&line)) - return -1; - return 0; + if (setting) + { + setting_set_with_string_representation(setting, str); + menu_setting_generic(setting, false); + } + else if (!string_is_empty(label)) + cheat_manager_save(str, settings->paths.path_cheat_database); + } + + menu_input_dialog_end(); } +#define default_action_dialog_start(funcname, _label_setting, _idx, _cb) \ +static int (funcname)(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) \ +{ \ + menu_input_ctx_line_t line; \ + line.label = label; \ + line.label_setting = _label_setting; \ + line.type = type; \ + line.idx = (_idx); \ + line.cb = _cb; \ + if (!menu_input_dialog_start(&line)) \ + return -1; \ + return 0; \ +} + +default_action_dialog_start(action_ok_shader_preset_save_as, + msg_hash_to_str(MSG_INPUT_PRESET_FILENAME), + (unsigned)idx, + menu_input_st_string_cb_save_preset) +default_action_dialog_start(action_ok_enable_settings, + msg_hash_to_str(MSG_INPUT_ENABLE_SETTINGS_PASSWORD), + (unsigned)entry_idx, + menu_input_st_string_cb_enable_settings) +default_action_dialog_start(action_ok_wifi, + "Passphrase", + (unsigned)idx, + menu_input_wifi_cb) +default_action_dialog_start(action_ok_cheat_file_save_as, + msg_hash_to_str(MSG_INPUT_CHEAT_FILENAME), + (unsigned)idx, + menu_input_st_string_cb_cheat_file_save_as) +default_action_dialog_start(action_ok_cheat, + msg_hash_to_str(MSG_INPUT_CHEAT), + (unsigned)idx, + menu_input_st_cheat_cb) +default_action_dialog_start(action_ok_disable_kiosk_mode, + msg_hash_to_str(MSG_INPUT_KIOSK_MODE_PASSWORD), + (unsigned)entry_idx, + menu_input_st_string_cb_disable_kiosk_mode) +default_action_dialog_start(action_ok_rename_entry, + msg_hash_to_str(MSG_INPUT_RENAME_ENTRY), + (unsigned)entry_idx, + menu_input_st_string_cb_rename_entry) + enum { ACTION_OK_SHADER_PRESET_SAVE_CORE = 0, @@ -2134,45 +2112,7 @@ static int action_ok_shader_preset_save_game(const char *path, idx, entry_idx, ACTION_OK_SHADER_PRESET_SAVE_GAME); } -static void menu_input_st_string_cb_cheat_file_save_as( - void *userdata, const char *str) -{ - if (str && *str) - { - rarch_setting_t *setting = NULL; - settings_t *settings = config_get_ptr(); - const char *label = menu_input_dialog_get_label_buffer(); - if (!string_is_empty(label)) - setting = menu_setting_find(label); - - if (setting) - { - setting_set_with_string_representation(setting, str); - menu_setting_generic(setting, false); - } - else if (!string_is_empty(label)) - cheat_manager_save(str, settings->paths.path_cheat_database); - } - - menu_input_dialog_end(); -} - -static int action_ok_cheat_file_save_as(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - menu_input_ctx_line_t line; - - line.label = msg_hash_to_str(MSG_INPUT_CHEAT_FILENAME); - line.label_setting = label; - line.type = type; - line.idx = (unsigned)idx; - line.cb = menu_input_st_string_cb_cheat_file_save_as; - - if (!menu_input_dialog_start(&line)) - return -1; - return 0; -} static int generic_action_ok_remap_file_operation(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx, @@ -2316,26 +2256,14 @@ static int action_ok_core_deferred_set(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { char core_display_name[PATH_MAX_LENGTH]; - playlist_t *playlist = NULL; size_t selection = menu_navigation_get_selection(); core_display_name[0] = '\0'; - menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &playlist); - - retro_assert(playlist != NULL); - core_info_get_name(path, core_display_name, sizeof(core_display_name)); - - idx = rdb_entry_start_game_selection_ptr; - - playlist_update(playlist, idx, - NULL, NULL, - path, core_display_name, - NULL, - NULL); - - playlist_write_file(playlist); + command_playlist_update_write(NULL, + rdb_entry_start_game_selection_ptr, + core_display_name, NULL, path); menu_entries_pop_stack(&selection, 0, 1); menu_navigation_set_selection(selection); @@ -2343,37 +2271,6 @@ static int action_ok_core_deferred_set(const char *path, return menu_cbs_exit(); } -static int action_ok_core_deferred_set_current_core(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - char core_display_name[PATH_MAX_LENGTH]; - playlist_t *playlist = NULL; - size_t selection = menu_navigation_get_selection(); - - core_display_name[0] = '\0'; - - menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &playlist); - - retro_assert(playlist != NULL); - - core_info_get_name(path, core_display_name, sizeof(core_display_name)); - - idx = rdb_entry_start_game_selection_ptr; - - playlist_update(playlist, idx, - NULL, NULL, - path, core_display_name, - NULL, - NULL); - - playlist_write_file(playlist); - - menu_entries_pop_stack(&selection, 0, 1); - menu_navigation_set_selection(selection); - - return 0; -} - static int action_ok_deferred_list_stub(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { @@ -2400,78 +2297,44 @@ static int action_ok_load_core_deferred(const char *path, CORE_TYPE_PLAIN, NULL, NULL)) return -1; + content_add_to_playlist(path); return 0; } -static int action_ok_start_net_retropad_core(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - content_ctx_info_t content_info; - - content_info.argc = 0; - content_info.argv = NULL; - content_info.args = NULL; - content_info.environ_get = NULL; - - if (!task_push_start_builtin_core( - &content_info, - CORE_TYPE_NETRETROPAD, - NULL, NULL)) - return -1; - - return 0; +#define default_action_ok_start_builtin_core(funcname, _id) \ +static int (funcname)(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) \ +{ \ + content_ctx_info_t content_info; \ + content_info.argc = 0; \ + content_info.argv = NULL; \ + content_info.args = NULL; \ + content_info.environ_get = NULL; \ + if (!task_push_start_builtin_core(&content_info, _id, NULL, NULL)) \ + return -1; \ + return 0; \ } -static int action_ok_start_video_processor_core(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - content_ctx_info_t content_info; - - content_info.argc = 0; - content_info.argv = NULL; - content_info.args = NULL; - content_info.environ_get = NULL; - - if (!task_push_start_builtin_core( - &content_info, - CORE_TYPE_VIDEO_PROCESSOR, - NULL, NULL)) - return -1; - - return 0; -} +default_action_ok_start_builtin_core(action_ok_start_net_retropad_core, CORE_TYPE_NETRETROPAD) +default_action_ok_start_builtin_core(action_ok_start_video_processor_core, CORE_TYPE_VIDEO_PROCESSOR) #ifdef HAVE_FFMPEG static int action_ok_file_load_ffmpeg(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { char new_path[PATH_MAX_LENGTH]; - content_ctx_info_t content_info; - const char *menu_path = NULL; file_list_t *menu_stack = menu_entries_get_menu_stack_ptr(0); + file_list_get_last(menu_stack, &menu_path, NULL, NULL, NULL); new_path[0] = '\0'; - content_info.argc = 0; - content_info.argv = NULL; - content_info.args = NULL; - content_info.environ_get = NULL; - if (!string_is_empty(menu_path)) fill_pathname_join(new_path, menu_path, path, sizeof(new_path)); - if (!task_push_load_content_with_core_from_menu( - new_path, - &content_info, - CORE_TYPE_FFMPEG, - NULL, NULL)) - return -1; - - return 0; + return default_action_ok_load_content_with_core_from_menu(new_path, CORE_TYPE_FFMPEG); } #endif @@ -2479,7 +2342,6 @@ static int action_ok_audio_run(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { char combined_path[PATH_MAX_LENGTH]; - content_ctx_info_t content_info; menu_handle_t *menu = NULL; combined_path[0] = '\0'; @@ -2490,26 +2352,13 @@ static int action_ok_audio_run(const char *path, fill_pathname_join(combined_path, menu->scratch2_buf, menu->scratch_buf, sizeof(combined_path)); - content_info.argc = 0; - content_info.argv = NULL; - content_info.args = NULL; - content_info.environ_get = NULL; - - if (!task_push_load_content_with_core_from_menu( - combined_path, - &content_info, - CORE_TYPE_FFMPEG, - NULL, NULL)) - return -1; - - return 0; + return default_action_ok_load_content_with_core_from_menu(combined_path, CORE_TYPE_FFMPEG); } static int action_ok_file_load_imageviewer(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { char fullpath[PATH_MAX_LENGTH]; - content_ctx_info_t content_info; const char *menu_path = NULL; file_list_t *menu_stack = menu_entries_get_menu_stack_ptr(0); @@ -2517,43 +2366,17 @@ static int action_ok_file_load_imageviewer(const char *path, fullpath[0] = '\0'; - content_info.argc = 0; - content_info.argv = NULL; - content_info.args = NULL; - content_info.environ_get = NULL; - if (!string_is_empty(menu_path)) fill_pathname_join(fullpath, menu_path, path, sizeof(fullpath)); - if (!task_push_load_content_with_core_from_menu( - fullpath, - &content_info, - CORE_TYPE_IMAGEVIEWER, - NULL, NULL)) - return -1; - - return 0; + return default_action_ok_load_content_with_core_from_menu(fullpath, CORE_TYPE_IMAGEVIEWER); } static int action_ok_file_load_current_core(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { - content_ctx_info_t content_info; - - content_info.argc = 0; - content_info.argv = NULL; - content_info.args = NULL; - content_info.environ_get = NULL; - - if (!task_push_load_content_with_core_from_menu( - detect_content_path, - &content_info, - CORE_TYPE_PLAIN, - NULL, NULL)) - return -1; - - return 0; + return default_action_ok_load_content_with_core_from_menu(detect_content_path, CORE_TYPE_PLAIN); } static int action_ok_file_load_detect_core(const char *path, @@ -2569,19 +2392,14 @@ static int action_ok_file_load_detect_core(const char *path, if (!task_push_load_content_with_new_core_from_menu( path, detect_content_path, &content_info, - CORE_TYPE_FFMPEG, + CORE_TYPE_PLAIN, NULL, NULL)) return -1; + content_add_to_playlist(detect_content_path); return 0; } -static int generic_action_ok_command(enum event_command cmd) -{ - if (!command_event(cmd, NULL)) - return menu_cbs_exit(); - return 0; -} static int action_ok_load_state(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) @@ -2629,10 +2447,10 @@ static void cb_decompressed(void *task_data, void *user_data, const char *err) switch (type_hash) { case CB_CORE_UPDATER_DOWNLOAD: - command_event(CMD_EVENT_CORE_INFO_INIT, NULL); + generic_action_ok_command(CMD_EVENT_CORE_INFO_INIT); break; case CB_UPDATE_ASSETS: - command_event(CMD_EVENT_REINIT, NULL); + generic_action_ok_command(CMD_EVENT_REINIT); break; } } @@ -2728,7 +2546,7 @@ static int generic_action_ok_network(const char *path, menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh); - command_event(CMD_EVENT_NETWORK_INIT, NULL); + generic_action_ok_command(CMD_EVENT_NETWORK_INIT); transf = (menu_file_transfer_t*)calloc(1, sizeof(*transf)); strlcpy(transf->path, url_path, sizeof(transf->path)); @@ -2739,40 +2557,17 @@ static int generic_action_ok_network(const char *path, label, type, idx, entry_idx, type_id2); } -static int action_ok_core_content_list(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return generic_action_ok_network(path, label, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_CORE_CONTENT_LIST); +#define default_action_ok_list(funcname, _id) \ +static int (funcname)(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) \ +{ \ + return generic_action_ok_network(path, label, type, idx, entry_idx, _id); \ } -static int action_ok_core_content_dirs_list(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return generic_action_ok_network(path, label, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_CORE_CONTENT_DIRS_LIST); -} - -static int action_ok_core_updater_list(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return generic_action_ok_network(path, label, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_CORE_UPDATER_LIST); -} - -static int action_ok_thumbnails_updater_list(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return generic_action_ok_network(path, label, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_THUMBNAILS_UPDATER_LIST); -} - -static int action_ok_lakka_list(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return generic_action_ok_network(path, label, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_LAKKA_LIST); -} +default_action_ok_list(action_ok_core_content_list, MENU_ENUM_LABEL_CB_CORE_CONTENT_LIST) +default_action_ok_list(action_ok_core_content_dirs_list, MENU_ENUM_LABEL_CB_CORE_CONTENT_DIRS_LIST) +default_action_ok_list(action_ok_core_updater_list, MENU_ENUM_LABEL_CB_CORE_UPDATER_LIST) +default_action_ok_list(action_ok_thumbnails_updater_list, MENU_ENUM_LABEL_CB_THUMBNAILS_UPDATER_LIST) +default_action_ok_list(action_ok_lakka_list, MENU_ENUM_LABEL_CB_LAKKA_LIST) static void cb_generic_dir_download(void *task_data, void *user_data, const char *err) @@ -2924,7 +2719,7 @@ static void cb_generic_download(void *task_data, switch (transf->enum_idx) { case MENU_ENUM_LABEL_CB_CORE_UPDATER_DOWNLOAD: - command_event(CMD_EVENT_CORE_INFO_INIT, NULL); + generic_action_ok_command(CMD_EVENT_CORE_INFO_INIT); break; default: break; @@ -3053,103 +2848,26 @@ static int action_ok_core_content_download(const char *path, MENU_ENUM_LABEL_CB_CORE_CONTENT_DOWNLOAD); } -static int action_ok_core_content_thumbnails(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_CORE_THUMBNAILS_DOWNLOAD); +#define default_action_ok_download(funcname, _id) \ +static int (funcname)(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) \ +{ \ + return action_ok_download_generic(path, label, NULL, type, idx, entry_idx,_id); \ } -static int action_ok_thumbnails_updater_download(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_THUMBNAILS_UPDATER_DOWNLOAD); -} - -static int action_ok_download_url(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_DOWNLOAD_URL); -} - -static int action_ok_core_updater_download(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_CORE_UPDATER_DOWNLOAD); -} - -static int action_ok_lakka_download(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_LAKKA_DOWNLOAD); -} - -static int action_ok_update_assets(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_UPDATE_ASSETS); -} - -static int action_ok_update_core_info_files(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_UPDATE_CORE_INFO_FILES); -} - -static int action_ok_update_overlays(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_UPDATE_OVERLAYS); -} - -static int action_ok_update_shaders_cg(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_UPDATE_SHADERS_CG); -} - -static int action_ok_update_shaders_glsl(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_UPDATE_SHADERS_GLSL); -} - -static int action_ok_update_shaders_slang(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_UPDATE_SHADERS_SLANG); -} - -static int action_ok_update_databases(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_UPDATE_DATABASES); -} - -static int action_ok_update_cheats(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_UPDATE_CHEATS); -} - -static int action_ok_update_autoconfig_profiles(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return action_ok_download_generic(path, label, NULL, type, idx, entry_idx, - MENU_ENUM_LABEL_CB_UPDATE_AUTOCONFIG_PROFILES); -} +default_action_ok_download(action_ok_core_content_thumbnails, MENU_ENUM_LABEL_CB_CORE_THUMBNAILS_DOWNLOAD) +default_action_ok_download(action_ok_thumbnails_updater_download, MENU_ENUM_LABEL_CB_THUMBNAILS_UPDATER_DOWNLOAD) +default_action_ok_download(action_ok_download_url, MENU_ENUM_LABEL_CB_DOWNLOAD_URL) +default_action_ok_download(action_ok_core_updater_download, MENU_ENUM_LABEL_CB_CORE_UPDATER_DOWNLOAD) +default_action_ok_download(action_ok_lakka_download, MENU_ENUM_LABEL_CB_LAKKA_DOWNLOAD) +default_action_ok_download(action_ok_update_assets, MENU_ENUM_LABEL_CB_UPDATE_ASSETS) +default_action_ok_download(action_ok_update_core_info_files, MENU_ENUM_LABEL_CB_UPDATE_CORE_INFO_FILES) +default_action_ok_download(action_ok_update_overlays, MENU_ENUM_LABEL_CB_UPDATE_OVERLAYS) +default_action_ok_download(action_ok_update_shaders_cg, MENU_ENUM_LABEL_CB_UPDATE_SHADERS_CG) +default_action_ok_download(action_ok_update_shaders_glsl, MENU_ENUM_LABEL_CB_UPDATE_SHADERS_GLSL) +default_action_ok_download(action_ok_update_shaders_slang, MENU_ENUM_LABEL_CB_UPDATE_SHADERS_SLANG) +default_action_ok_download(action_ok_update_databases, MENU_ENUM_LABEL_CB_UPDATE_DATABASES) +default_action_ok_download(action_ok_update_cheats, MENU_ENUM_LABEL_CB_UPDATE_CHEATS) +default_action_ok_download(action_ok_update_autoconfig_profiles, MENU_ENUM_LABEL_CB_UPDATE_AUTOCONFIG_PROFILES) /* creates folder and core options stub file for subsequent runs */ static int action_ok_option_create(const char *path, @@ -3202,6 +2920,7 @@ int (func_name)(const char *path, const char *label, unsigned type, size_t idx, return generic_action_ok_command(cmd); \ } +default_action_ok_cmd_func(action_ok_cheat_apply_changes,CMD_EVENT_CHEATS_APPLY) default_action_ok_cmd_func(action_ok_quit, CMD_EVENT_QUIT) default_action_ok_cmd_func(action_ok_save_new_config, CMD_EVENT_MENU_SAVE_CONFIG) default_action_ok_cmd_func(action_ok_resume_content, CMD_EVENT_RESUME) @@ -3209,24 +2928,36 @@ default_action_ok_cmd_func(action_ok_restart_content, CMD_EVENT_RESET) default_action_ok_cmd_func(action_ok_screenshot, CMD_EVENT_TAKE_SCREENSHOT) default_action_ok_cmd_func(action_ok_disk_cycle_tray_status, CMD_EVENT_DISK_EJECT_TOGGLE ) default_action_ok_cmd_func(action_ok_shader_apply_changes, CMD_EVENT_SHADERS_APPLY_CHANGES ) -default_action_ok_cmd_func(action_ok_add_to_favorites, CMD_EVENT_ADD_TO_FAVORITES) -static int action_ok_rename_entry(const char *path, +static int action_ok_add_to_favorites(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { - menu_input_ctx_line_t line; - - line.label = msg_hash_to_str(MSG_INPUT_RENAME_ENTRY); - line.label_setting = label; - line.type = type; - line.idx = (unsigned)entry_idx; - line.cb = menu_input_st_string_cb_rename_entry; - - if (!menu_input_dialog_start(&line)) - return -1; + void *new_path = (void*)path_get(RARCH_PATH_CONTENT); + if (!command_event(CMD_EVENT_ADD_TO_FAVORITES, new_path)) + return menu_cbs_exit(); return 0; } +static int action_ok_add_to_favorites_playlist(const char *path, + const char *label, unsigned type, size_t idx, size_t entry_idx) +{ + const char *tmp_path = NULL; + playlist_t *tmp_playlist = NULL; + + menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &tmp_playlist); + + if (!tmp_playlist) + return 0; + + playlist_get_index(tmp_playlist, + rpl_entry_selection_ptr, &tmp_path, NULL, NULL, NULL, NULL, NULL); + + if (!command_event(CMD_EVENT_ADD_TO_FAVORITES, (void*)tmp_path)) + return menu_cbs_exit(); + return 0; +} + + static int action_ok_delete_entry(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { @@ -3267,7 +2998,11 @@ static int action_ok_delete_entry(const char *path, playlist = g_defaults.image_history; #endif - playlist_delete_index(playlist, rpl_entry_selection_ptr); + if (playlist) + { + playlist_delete_index(playlist, rpl_entry_selection_ptr); + playlist_write_file(playlist); + } new_selection_ptr = menu_navigation_get_selection(); menu_entries_pop_stack(&new_selection_ptr, 0, 1); @@ -3276,37 +3011,6 @@ static int action_ok_delete_entry(const char *path, return 0; } -static int action_ok_disable_kiosk_mode(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - menu_input_ctx_line_t line; - - line.label = msg_hash_to_str(MSG_INPUT_KIOSK_MODE_PASSWORD); - line.label_setting = label; - line.type = type; - line.idx = (unsigned)entry_idx; - line.cb = menu_input_st_string_cb_disable_kiosk_mode; - - if (!menu_input_dialog_start(&line)) - return -1; - return 0; -} - -static int action_ok_enable_settings(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - menu_input_ctx_line_t line; - - line.label = msg_hash_to_str(MSG_INPUT_ENABLE_SETTINGS_PASSWORD); - line.label_setting = label; - line.type = type; - line.idx = (unsigned)entry_idx; - line.cb = menu_input_st_string_cb_enable_settings; - - if (!menu_input_dialog_start(&line)) - return -1; - return 0; -} static int action_ok_rdb_entry_submenu(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) @@ -3464,7 +3168,7 @@ static int action_ok_netplay_connect_room(const char *path, tmp_hostname[0] = '\0'; if (netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_DATA_INITED, NULL)) - command_event(CMD_EVENT_NETPLAY_DEINIT, NULL); + generic_action_ok_command(CMD_EVENT_NETPLAY_DEINIT); netplay_driver_ctl(RARCH_NETPLAY_CTL_ENABLE_CLIENT, NULL); if (netplay_room_list[idx - 3].host_method == NETPLAY_HOST_METHOD_MITM) @@ -3502,22 +3206,6 @@ static int action_ok_netplay_connect_room(const char *path, return 0; } -static int action_ok_wifi(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - - menu_input_ctx_line_t line; - - line.label = "Passphrase"; - line.label_setting = label; - line.type = type; - line.idx = (unsigned)idx; - line.cb = menu_input_wifi_cb; - - if (!menu_input_dialog_start(&line)) - return -1; - return 0; -} static int action_ok_netplay_lan_scan(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) @@ -3535,7 +3223,7 @@ static int action_ok_netplay_lan_scan(const char *path, /* Enable Netplay client mode */ if (netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_DATA_INITED, NULL)) - command_event(CMD_EVENT_NETPLAY_DEINIT, NULL); + generic_action_ok_command(CMD_EVENT_NETPLAY_DEINIT); netplay_driver_ctl(RARCH_NETPLAY_CTL_ENABLE_CLIENT, NULL); /* Enable Netplay */ @@ -3545,33 +3233,18 @@ static int action_ok_netplay_lan_scan(const char *path, return -1; } -static int action_ok_content_collection_list(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - filebrowser_set_type(FILEBROWSER_SELECT_COLLECTION); - return generic_action_ok_displaylist_push(path, NULL, label, type, idx, - entry_idx, ACTION_OK_DL_CONTENT_COLLECTION_LIST); +#define default_action_ok_dl_push(funcname, _fbid, _id, _path) \ +static int (funcname)(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) \ +{ \ + settings_t *settings = config_get_ptr(); \ + (void)settings; \ + filebrowser_set_type(_fbid); \ + return generic_action_ok_displaylist_push(path, _path, label, type, idx, entry_idx, _id); \ } -static int action_ok_push_content_list(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - settings_t *settings = config_get_ptr(); - filebrowser_set_type(FILEBROWSER_SELECT_FILE); - return generic_action_ok_displaylist_push(path, - settings->paths.directory_menu_content, label, type, idx, - entry_idx, ACTION_OK_DL_CONTENT_LIST); -} - -static int action_ok_push_scan_file(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - settings_t *settings = config_get_ptr(); - filebrowser_set_type(FILEBROWSER_SCAN_FILE); - return generic_action_ok_displaylist_push(path, - settings->paths.directory_menu_content, label, type, idx, - entry_idx, ACTION_OK_DL_CONTENT_LIST); -} +default_action_ok_dl_push(action_ok_content_collection_list, FILEBROWSER_SELECT_COLLECTION, ACTION_OK_DL_CONTENT_COLLECTION_LIST, NULL) +default_action_ok_dl_push(action_ok_push_content_list, FILEBROWSER_SELECT_FILE, ACTION_OK_DL_CONTENT_LIST, settings->paths.directory_menu_content) +default_action_ok_dl_push(action_ok_push_scan_file, FILEBROWSER_SCAN_FILE, ACTION_OK_DL_CONTENT_LIST, settings->paths.directory_menu_content) #ifdef HAVE_NETWORKING struct netplay_host_list *lan_hosts; @@ -3708,13 +3381,17 @@ static void netplay_refresh_rooms_cb(void *task_data, void *user_data, const cha else { char s[PATH_MAX_LENGTH]; - int i = 0; - int k = 0; - file_list_t *file_list = menu_entries_get_selection_buf_ptr(0); + unsigned i = 0; + unsigned j = 0; + file_list_t *list = menu_entries_get_selection_buf_ptr(0); + lan_room_count = 0; + +#ifndef RARCH_CONSOLE netplay_discovery_driver_ctl(RARCH_NETPLAY_DISCOVERY_CTL_LAN_GET_RESPONSES, &lan_hosts); if (lan_hosts) - lan_room_count = (int)lan_hosts->size; + lan_room_count = (int)lan_hosts->size; +#endif netplay_rooms_parse(data->data); @@ -3730,37 +3407,20 @@ static void netplay_refresh_rooms_cb(void *task_data, void *user_data, const cha calloc(netplay_room_count + lan_room_count, sizeof(struct netplay_room)); - for (i = 0; i < netplay_room_count; i++) + for (i = 0; i < (unsigned)netplay_room_count; i++) memcpy(&netplay_room_list[i], netplay_room_get(i), sizeof(netplay_room_list[i])); if (lan_room_count != 0) { - struct netplay_host *host = NULL; - - for (host = &lan_hosts->hosts[k]; i < netplay_room_count + lan_room_count; i++) + for (i = netplay_room_count; i < (unsigned)(netplay_room_count + lan_room_count); i++) { - struct sockaddr *address = NULL; + struct netplay_host *host = &lan_hosts->hosts[j++]; strlcpy(netplay_room_list[i].nickname, host->nick, sizeof(netplay_room_list[i].nickname)); - address = &host->addr; - - if (address->sa_family == AF_INET) - { - struct sockaddr_in *sin = (struct sockaddr_in *) address; - inet_ntop_compat(AF_INET, &sin->sin_addr, - netplay_room_list[i].address, INET6_ADDRSTRLEN); - } -#if defined(AF_INET6) && !defined(HAVE_SOCKET_LEGACY) - else if (address->sa_family == AF_INET6) - { - struct sockaddr_in6 *sin = (struct sockaddr_in6 *) address; - inet_ntop_compat(AF_INET6, &sin->sin6_addr, - netplay_room_list[i].address, INET6_ADDRSTRLEN); - } -#endif + strlcpy(netplay_room_list[i].address, host->address, INET6_ADDRSTRLEN); strlcpy(netplay_room_list[i].corename, host->core, @@ -3775,7 +3435,7 @@ static void netplay_refresh_rooms_cb(void *task_data, void *user_data, const cha host->content, sizeof(netplay_room_list[i].gamename)); - netplay_room_list[i].port = 55435; + netplay_room_list[i].port = host->port; netplay_room_list[i].gamecrc = host->content_crc; netplay_room_list[i].timestamp = 0; netplay_room_list[i].lan = true; @@ -3786,7 +3446,7 @@ static void netplay_refresh_rooms_cb(void *task_data, void *user_data, const cha } netplay_room_count += lan_room_count; } - netplay_refresh_rooms_menu(file_list); + netplay_refresh_rooms_menu(list); } } @@ -3852,7 +3512,9 @@ static int action_ok_push_netplay_refresh_rooms(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { char url [2048] = "http://newlobby.libretro.com/list/"; +#ifndef RARCH_CONSOLE task_push_netplay_lan_scan(netplay_lan_scan_callback); +#endif task_push_http_transfer(url, true, NULL, netplay_refresh_rooms_cb, NULL); return 0; } @@ -3885,7 +3547,8 @@ static int action_ok_push_downloads_dir(const char *path, settings_t *settings = config_get_ptr(); filebrowser_set_type(FILEBROWSER_SELECT_FILE); - return generic_action_ok_displaylist_push(path, settings->paths.directory_core_assets, + return generic_action_ok_displaylist_push(path, + settings->paths.directory_core_assets, msg_hash_to_str(MENU_ENUM_LABEL_FAVORITES), type, idx, entry_idx, ACTION_OK_DL_CONTENT_LIST); @@ -3927,6 +3590,7 @@ static int action_ok_start_core(const char *path, content_info.args = NULL; content_info.environ_get = NULL; + path_clear(RARCH_PATH_BASENAME); if (!task_push_start_current_core(&content_info)) return -1; @@ -3936,17 +3600,10 @@ static int action_ok_start_core(const char *path, static int action_ok_load_archive(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { - content_ctx_info_t content_info; - menu_handle_t *menu = NULL; const char *menu_path = NULL; const char *content_path = NULL; - content_info.argc = 0; - content_info.argv = NULL; - content_info.args = NULL; - content_info.environ_get = NULL; - if (!menu_driver_ctl(RARCH_MENU_CTL_DRIVER_DATA_GET, &menu)) return menu_cbs_exit(); @@ -3956,16 +3613,11 @@ static int action_ok_load_archive(const char *path, fill_pathname_join(detect_content_path, menu_path, content_path, sizeof(detect_content_path)); - command_event(CMD_EVENT_LOAD_CORE, NULL); + generic_action_ok_command(CMD_EVENT_LOAD_CORE); - if (!task_push_load_content_with_core_from_menu( + return default_action_ok_load_content_with_core_from_menu( detect_content_path, - &content_info, - CORE_TYPE_PLAIN, - NULL, NULL)) - return -1; - - return 0; + CORE_TYPE_PLAIN); } static int action_ok_load_archive_detect_core(const char *path, @@ -4045,56 +3697,19 @@ static int action_ok_load_archive_detect_core(const char *path, return ret; } -static int action_ok_help_audio_video_troubleshooting(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return generic_action_ok_help(path, label, type, idx, entry_idx, - MENU_ENUM_LABEL_HELP_AUDIO_VIDEO_TROUBLESHOOTING, - MENU_DIALOG_HELP_AUDIO_VIDEO_TROUBLESHOOTING); +#define default_action_ok_help(funcname, _id, _id2) \ +static int (funcname)(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) \ +{ \ + return generic_action_ok_help(path, label, type, idx, entry_idx, _id, _id2); \ } -static int action_ok_help(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return generic_action_ok_help(path, label, type, idx, entry_idx, - MENU_ENUM_LABEL_HELP, MENU_DIALOG_WELCOME); -} - -static int action_ok_help_controls(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return generic_action_ok_help(path, label, type, idx, entry_idx, - MENU_ENUM_LABEL_HELP_CONTROLS, MENU_DIALOG_HELP_CONTROLS); -} - -static int action_ok_help_what_is_a_core(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return generic_action_ok_help(path, label, type, idx, entry_idx, - MENU_ENUM_LABEL_HELP_WHAT_IS_A_CORE, MENU_DIALOG_HELP_WHAT_IS_A_CORE); -} - -static int action_ok_help_scanning_content(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return generic_action_ok_help(path, label, type, idx, entry_idx, - MENU_ENUM_LABEL_HELP_SCANNING_CONTENT, MENU_DIALOG_HELP_SCANNING_CONTENT); -} - -static int action_ok_help_change_virtual_gamepad(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return generic_action_ok_help(path, label, type, idx, entry_idx, - MENU_ENUM_LABEL_HELP_CHANGE_VIRTUAL_GAMEPAD, - MENU_DIALOG_HELP_CHANGE_VIRTUAL_GAMEPAD); -} - -static int action_ok_help_load_content(const char *path, - const char *label, unsigned type, size_t idx, size_t entry_idx) -{ - return generic_action_ok_help(path, label, type, idx, entry_idx, - MENU_ENUM_LABEL_HELP_LOADING_CONTENT, MENU_DIALOG_HELP_LOADING_CONTENT); -} +default_action_ok_help(action_ok_help_audio_video_troubleshooting, MENU_ENUM_LABEL_HELP_AUDIO_VIDEO_TROUBLESHOOTING, MENU_DIALOG_HELP_AUDIO_VIDEO_TROUBLESHOOTING) +default_action_ok_help(action_ok_help, MENU_ENUM_LABEL_HELP, MENU_DIALOG_WELCOME) +default_action_ok_help(action_ok_help_controls, MENU_ENUM_LABEL_HELP_CONTROLS, MENU_DIALOG_HELP_CONTROLS) +default_action_ok_help(action_ok_help_what_is_a_core, MENU_ENUM_LABEL_HELP_WHAT_IS_A_CORE, MENU_DIALOG_HELP_WHAT_IS_A_CORE) +default_action_ok_help(action_ok_help_scanning_content, MENU_ENUM_LABEL_HELP_SCANNING_CONTENT, MENU_DIALOG_HELP_SCANNING_CONTENT) +default_action_ok_help(action_ok_help_change_virtual_gamepad, MENU_ENUM_LABEL_HELP_CHANGE_VIRTUAL_GAMEPAD, MENU_DIALOG_HELP_CHANGE_VIRTUAL_GAMEPAD) +default_action_ok_help(action_ok_help_load_content, MENU_ENUM_LABEL_HELP_LOADING_CONTENT, MENU_DIALOG_HELP_LOADING_CONTENT) static int action_ok_video_resolution(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) @@ -4109,7 +3724,7 @@ static int action_ok_video_resolution(const char *path, msg[0] = '\0'; #if defined(__CELLOS_LV2__) || defined(_WIN32) - command_event(CMD_EVENT_REINIT, NULL); + generic_action_ok_command(CMD_EVENT_REINIT); #endif video_driver_set_video_mode(width, height, true); #ifdef GEKKO @@ -4136,7 +3751,7 @@ static int action_ok_netplay_enable_host(const char *path, content_get_status(&contentless, &is_inited); if (netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_DATA_INITED, NULL)) - command_event(CMD_EVENT_NETPLAY_DEINIT, NULL); + generic_action_ok_command(CMD_EVENT_NETPLAY_DEINIT); netplay_driver_ctl(RARCH_NETPLAY_CTL_ENABLE_SERVER, NULL); /* If we haven't yet started, this will load on its own */ @@ -4202,15 +3817,15 @@ static int action_ok_netplay_enable_client(const char *path, #ifdef HAVE_NETWORKING menu_input_ctx_line_t line; if (netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_DATA_INITED, NULL)) - command_event(CMD_EVENT_NETPLAY_DEINIT, NULL); + generic_action_ok_command(CMD_EVENT_NETPLAY_DEINIT); netplay_driver_ctl(RARCH_NETPLAY_CTL_ENABLE_CLIENT, NULL); - /* If no host was specified in the config, ask for one */ - memset(&line, 0, sizeof(line)); - - line.label = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_IP_ADDRESS); + line.label = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETPLAY_IP_ADDRESS); line.label_setting = "no_setting"; - line.cb = action_ok_netplay_enable_client_hostname_cb; + line.type = 0; + line.idx = 0; + line.cb = action_ok_netplay_enable_client_hostname_cb; + if (menu_input_dialog_start(&line)) return 0; #endif @@ -4229,9 +3844,9 @@ static int action_ok_netplay_disconnect(const char *path, /* Re-enable rewind if it was enabled TODO: Add a setting for these tweaks */ if (settings->bools.rewind_enable) - command_event(CMD_EVENT_REWIND_INIT, NULL); + generic_action_ok_command(CMD_EVENT_REWIND_INIT); if (settings->uints.autosave_interval != 0) - command_event(CMD_EVENT_AUTOSAVE_INIT, NULL); + generic_action_ok_command(CMD_EVENT_AUTOSAVE_INIT); return generic_action_ok_command(CMD_EVENT_RESUME); #else @@ -4243,7 +3858,12 @@ static int action_ok_netplay_disconnect(const char *path, static int action_ok_core_delete(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { - char* core_path = strdup(path_get(RARCH_PATH_CORE)); + const char *path_core = path_get(RARCH_PATH_CORE); + char *core_path = !string_is_empty(path_core) + ? strdup(path_core) : NULL; + + if (!core_path) + return 0; generic_action_ok_command(CMD_EVENT_UNLOAD_CORE); menu_entries_flush_stack(0, 0); @@ -4357,10 +3977,8 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs, BIND_ACTION_OK(cbs, action_ok_load_core); break; case MENU_ENUM_LABEL_FILE_BROWSER_CORE_SELECT_FROM_COLLECTION: - BIND_ACTION_OK(cbs, action_ok_core_deferred_set); - break; case MENU_ENUM_LABEL_FILE_BROWSER_CORE_SELECT_FROM_COLLECTION_CURRENT_CORE: - BIND_ACTION_OK(cbs, action_ok_core_deferred_set_current_core); + BIND_ACTION_OK(cbs, action_ok_core_deferred_set); break; case MENU_ENUM_LABEL_START_CORE: BIND_ACTION_OK(cbs, action_ok_start_core); @@ -4401,6 +4019,9 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_RESUME_CONTENT: BIND_ACTION_OK(cbs, action_ok_resume_content); break; + case MENU_ENUM_LABEL_ADD_TO_FAVORITES_PLAYLIST: + BIND_ACTION_OK(cbs, action_ok_add_to_favorites_playlist); + break; case MENU_ENUM_LABEL_ADD_TO_FAVORITES: BIND_ACTION_OK(cbs, action_ok_add_to_favorites); break; diff --git a/menu/cbs/menu_cbs_scan.c b/menu/cbs/menu_cbs_scan.c index 965e99207e..8e0168fc86 100644 --- a/menu/cbs/menu_cbs_scan.c +++ b/menu/cbs/menu_cbs_scan.c @@ -37,7 +37,7 @@ #endif #ifdef HAVE_LIBRETRODB -static void handle_dbscan_finished(void *task_data, void *user_data, const char *err) +void handle_dbscan_finished(void *task_data, void *user_data, const char *err) { menu_ctx_environment_t menu_environ; menu_environ.type = MENU_ENVIRON_RESET_HORIZONTAL_LIST; @@ -144,6 +144,7 @@ static int action_scan_input_desc(const char *path, target->key = RETROK_UNKNOWN; target->joykey = NO_BTN; target->joyaxis = AXIS_NONE; + target->mbutton = NO_BTN; } return 0; diff --git a/menu/cbs/menu_cbs_select.c b/menu/cbs/menu_cbs_select.c index 70436fc105..bdca580865 100644 --- a/menu/cbs/menu_cbs_select.c +++ b/menu/cbs/menu_cbs_select.c @@ -23,6 +23,12 @@ #include "../widgets/menu_entry.h" #include "../menu_cbs.h" #include "../menu_setting.h" +#include "../../tasks/tasks_internal.h" + +#ifdef HAVE_NETWORKING +#include "../../network/netplay/netplay.h" +#include "../../network/netplay/netplay_discovery.h" +#endif #ifndef BIND_ACTION_SELECT #define BIND_ACTION_SELECT(cbs, name) \ @@ -42,7 +48,9 @@ static int action_select_default(const char *path, const char *label, unsigned t menu_entry_init(&entry); menu_entry_get(&entry, 0, idx, NULL, false); - cbs = selection_buf ? (menu_file_list_cbs_t*)file_list_get_actiondata_at_offset(selection_buf, idx) : NULL; + if (selection_buf) + cbs = (menu_file_list_cbs_t*) + file_list_get_actiondata_at_offset(selection_buf, idx); if (!cbs) { @@ -76,7 +84,7 @@ static int action_select_default(const char *path, const char *label, unsigned t if (action == MENU_ACTION_NOOP) { if (cbs->action_ok) - action = MENU_ACTION_OK; + action = MENU_ACTION_OK; else { if (cbs->action_start) @@ -146,6 +154,53 @@ static int action_select_input_desc_kbd(const char *path, const char *label, uns return action_right_input_desc_kbd(type, label, true); } +static int action_select_netplay_connect_room(const char *path, const char *label, unsigned type, + size_t idx) +{ +#ifdef HAVE_NETWORKING + char tmp_hostname[4115]; + + tmp_hostname[0] = '\0'; + + if (netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_DATA_INITED, NULL)) + command_event(CMD_EVENT_NETPLAY_DEINIT, NULL); + netplay_driver_ctl(RARCH_NETPLAY_CTL_ENABLE_CLIENT, NULL); + + if (netplay_room_list[idx - 3].host_method == NETPLAY_HOST_METHOD_MITM) + { + snprintf(tmp_hostname, + sizeof(tmp_hostname), + "%s|%d", + netplay_room_list[idx - 3].mitm_address, + netplay_room_list[idx - 3].mitm_port); + } + else + { + snprintf(tmp_hostname, + sizeof(tmp_hostname), + "%s|%d", + netplay_room_list[idx - 3].address, + netplay_room_list[idx - 3].port); + } + +#if 0 + RARCH_LOG("[lobby] connecting to: %s with game: %s/%08x\n", + tmp_hostname, + netplay_room_list[idx - 3].gamename, + netplay_room_list[idx - 3].gamecrc); +#endif + + task_push_netplay_crc_scan(netplay_room_list[idx - 3].gamecrc, + netplay_room_list[idx - 3].gamename, + tmp_hostname, netplay_room_list[idx - 3].corename); + +#else + return -1; + +#endif + return 0; +} + static int menu_cbs_init_bind_select_compare_type( menu_file_list_cbs_t *cbs, unsigned type) { @@ -180,6 +235,7 @@ static int menu_cbs_init_bind_select_compare_type( #endif else { + switch (type) { case FILE_TYPE_USE_DIRECTORY: @@ -207,6 +263,14 @@ int menu_cbs_init_bind_select(menu_file_list_cbs_t *cbs, BIND_ACTION_SELECT(cbs, action_select_default); +#ifdef HAVE_NETWORKING + if (cbs->enum_idx == MENU_ENUM_LABEL_CONNECT_NETPLAY_ROOM) + { + BIND_ACTION_SELECT(cbs, action_select_netplay_connect_room); + return 0; + } +#endif + if (cbs->setting) { uint64_t flags = cbs->setting->flags; diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 49994a53df..2dd471d3cc 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -44,6 +44,7 @@ return 0; \ } +default_sublabel_macro(action_bind_sublabel_automatically_add_content_to_playlist, MENU_ENUM_SUBLABEL_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST) default_sublabel_macro(action_bind_sublabel_driver_settings_list, MENU_ENUM_SUBLABEL_DRIVER_SETTINGS) default_sublabel_macro(action_bind_sublabel_retro_achievements_settings_list, MENU_ENUM_SUBLABEL_RETRO_ACHIEVEMENTS_SETTINGS) default_sublabel_macro(action_bind_sublabel_saving_settings_list, MENU_ENUM_SUBLABEL_SAVING_SETTINGS) @@ -62,6 +63,8 @@ default_sublabel_macro(action_bind_sublabel_information_list_list, MENU_ default_sublabel_macro(action_bind_sublabel_cheevos_enable, MENU_ENUM_SUBLABEL_CHEEVOS_ENABLE) default_sublabel_macro(action_bind_sublabel_cheevos_test_unofficial, MENU_ENUM_SUBLABEL_CHEEVOS_TEST_UNOFFICIAL) default_sublabel_macro(action_bind_sublabel_cheevos_hardcore_mode_enable, MENU_ENUM_SUBLABEL_CHEEVOS_HARDCORE_MODE_ENABLE) +default_sublabel_macro(action_bind_sublabel_cheevos_leaderboards_enable, MENU_ENUM_SUBLABEL_CHEEVOS_LEADERBOARDS_ENABLE) +default_sublabel_macro(action_bind_sublabel_cheevos_badges_enable, MENU_ENUM_SUBLABEL_CHEEVOS_BADGES_ENABLE) default_sublabel_macro(action_bind_sublabel_cheevos_verbose_enable, MENU_ENUM_SUBLABEL_CHEEVOS_VERBOSE_ENABLE) default_sublabel_macro(action_bind_sublabel_menu_views_settings_list, MENU_ENUM_SUBLABEL_MENU_VIEWS_SETTINGS) default_sublabel_macro(action_bind_sublabel_quick_menu_views_settings_list, MENU_ENUM_SUBLABEL_QUICK_MENU_VIEWS_SETTINGS) @@ -1245,6 +1248,7 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_shared_context); break; case MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY: + case MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY_HARDCORE: case MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_cheevos_entry); break; @@ -1262,6 +1266,12 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_CHEEVOS_HARDCORE_MODE_ENABLE: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_cheevos_hardcore_mode_enable); break; + case MENU_ENUM_LABEL_CHEEVOS_LEADERBOARDS_ENABLE: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_cheevos_leaderboards_enable); + break; + case MENU_ENUM_LABEL_CHEEVOS_BADGES_ENABLE: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_cheevos_badges_enable); + break; case MENU_ENUM_LABEL_CHEEVOS_VERBOSE_ENABLE: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_cheevos_verbose_enable); break; @@ -1367,6 +1377,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_CORE_SETTINGS: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_core_settings_list); break; + case MENU_ENUM_LABEL_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_automatically_add_content_to_playlist); + break; case MENU_ENUM_LABEL_DRIVER_SETTINGS: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_driver_settings_list); break; diff --git a/menu/cbs/menu_cbs_title.c b/menu/cbs/menu_cbs_title.c index 7cb532788e..d01c701c23 100644 --- a/menu/cbs/menu_cbs_title.c +++ b/menu/cbs/menu_cbs_title.c @@ -189,7 +189,6 @@ default_fill_title_macro(action_get_title_collection, MENU_ENUM_LABE default_title_copy_macro(action_get_title_help, MENU_ENUM_LABEL_VALUE_HELP_LIST) default_title_copy_macro(action_get_title_input_settings, MENU_ENUM_LABEL_VALUE_INPUT_SETTINGS) default_title_copy_macro(action_get_title_cheevos_list, MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_LIST) -default_title_copy_macro(action_get_title_cheevos_list_hardcore, MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_LIST_HARDCORE) default_title_copy_macro(action_get_title_video_shader_parameters,MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PARAMETERS) default_title_copy_macro(action_get_title_video_shader_preset_parameters,MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_PARAMETERS) @@ -1018,9 +1017,6 @@ static int menu_cbs_init_bind_title_compare_label(menu_file_list_cbs_t *cbs, case MENU_LABEL_ACHIEVEMENT_LIST: BIND_ACTION_GET_TITLE(cbs, action_get_title_cheevos_list); break; - case MENU_LABEL_ACHIEVEMENT_LIST_HARDCORE: - BIND_ACTION_GET_TITLE(cbs, action_get_title_cheevos_list_hardcore); - break; case MENU_LABEL_VIDEO_SHADER_PARAMETERS: BIND_ACTION_GET_TITLE(cbs, action_get_title_video_shader_parameters); break; diff --git a/menu/drivers/materialui.c b/menu/drivers/materialui.c index dfb91e1b24..b55140c9fa 100644 --- a/menu/drivers/materialui.c +++ b/menu/drivers/materialui.c @@ -1502,10 +1502,12 @@ static void mui_frame(void *data, video_frame_info_t *video_info) sublabel_color ); - font_driver_flush(video_info->width, video_info->height, mui->font); + font_driver_flush(video_info->width, video_info->height, mui->font, + video_info); font_driver_bind_block(mui->font, NULL); - font_driver_flush(video_info->width, video_info->height, mui->font2); + font_driver_flush(video_info->width, video_info->height, mui->font2, + video_info); font_driver_bind_block(mui->font2, NULL); menu_animation_ctl(MENU_ANIMATION_CTL_SET_ACTIVE, NULL); diff --git a/menu/drivers/rgui.c b/menu/drivers/rgui.c index 0839610c25..0901e15beb 100644 --- a/menu/drivers/rgui.c +++ b/menu/drivers/rgui.c @@ -83,30 +83,6 @@ static uint16_t argb32_to_rgba4444(uint32_t col) } #endif -static void rgui_copy_glyph(uint8_t *glyph, const uint8_t *buf) -{ - int x, y; - - if (!glyph) - return; - - for (y = 0; y < FONT_HEIGHT; y++) - { - for (x = 0; x < FONT_WIDTH; x++) - { - 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; - } - } -} static uint16_t rgui_gray_filler(unsigned x, unsigned y) { @@ -190,6 +166,32 @@ static void blit_line(int x, int y, } } +#if 0 +static void rgui_copy_glyph(uint8_t *glyph, const uint8_t *buf) +{ + int x, y; + + if (!glyph) + return; + + for (y = 0; y < FONT_HEIGHT; y++) + { + for (x = 0; x < FONT_WIDTH; x++) + { + 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; + } + } +} + static bool init_font(menu_handle_t *menu, const uint8_t *font_bmp_buf) { unsigned i; @@ -213,17 +215,22 @@ static bool init_font(menu_handle_t *menu, const uint8_t *font_bmp_buf) 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); diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index 52c14cd020..0185ec76ee 100755 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -61,6 +61,8 @@ #include "../../tasks/tasks_internal.h" +#include "../../cheevos/badges.h" + #define XMB_RIBBON_ROWS 64 #define XMB_RIBBON_COLS 64 #define XMB_RIBBON_VERTICES 2*XMB_RIBBON_COLS*XMB_RIBBON_ROWS-2*XMB_RIBBON_COLS @@ -382,6 +384,8 @@ const char* xmb_theme_ident(void) return "flatui"; case XMB_ICON_THEME_RETROACTIVE: return "retroactive"; + case XMB_ICON_THEME_RETROSYSTEM: + return "retrosystem"; case XMB_ICON_THEME_PIXEL: return "pixel"; case XMB_ICON_THEME_NEOACTIVE: @@ -2100,6 +2104,7 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb, case MENU_ENUM_LABEL_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE: return xmb->textures.list[XMB_TEXTURE_CORE_OPTIONS]; case MENU_ENUM_LABEL_ADD_TO_FAVORITES: + case MENU_ENUM_LABEL_ADD_TO_FAVORITES_PLAYLIST: return xmb->textures.list[XMB_TEXTURE_ADD_FAVORITE]; case MENU_ENUM_LABEL_CORE_INPUT_REMAPPING_OPTIONS: return xmb->textures.list[XMB_TEXTURE_INPUT_REMAPPING_OPTIONS]; @@ -2237,6 +2242,20 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb, #endif } +#ifdef HAVE_CHEEVOS + if ( + (type >= MENU_SETTINGS_CHEEVOS_START) && + (type < MENU_SETTINGS_NETPLAY_ROOMS_START) + ) + { + int new_id = type - MENU_SETTINGS_CHEEVOS_START; + if (get_badge_texture(new_id) != 0) + return get_badge_texture(new_id); + /* Should be replaced with placeholder badge icon. */ + return xmb->textures.list[XMB_TEXTURE_SUBSETTING]; + } +#endif + return xmb->textures.list[XMB_TEXTURE_SUBSETTING]; } @@ -2740,6 +2759,9 @@ static void xmb_draw_bg( case XMB_SHADER_PIPELINE_BOKEH: draw.pipeline.id = VIDEO_SHADER_MENU_5; break; + case XMB_SHADER_PIPELINE_SNOWFLAKE: + draw.pipeline.id = VIDEO_SHADER_MENU_6; + break; default: break; } @@ -3130,10 +3152,12 @@ static void xmb_frame(void *data, video_frame_info_t *video_info) width, height); - font_driver_flush(video_info->width, video_info->height, xmb->font); + font_driver_flush(video_info->width, video_info->height, xmb->font, + video_info); font_driver_bind_block(xmb->font, NULL); - font_driver_flush(video_info->width, video_info->height, xmb->font2); + font_driver_flush(video_info->width, video_info->height, xmb->font2, + video_info); font_driver_bind_block(xmb->font2, NULL); if (menu_input_dialog_get_display_kb()) diff --git a/menu/drivers/zarch.c b/menu/drivers/zarch.c index 5c59dd9241..a0529653bd 100644 --- a/menu/drivers/zarch.c +++ b/menu/drivers/zarch.c @@ -993,7 +993,8 @@ static void zarch_frame(void *data, video_frame_info_t *video_info) zui->rendering = false; - font_driver_flush(video_info->width, video_info->height, zui->font); + font_driver_flush(video_info->width, video_info->height, zui->font, + video_info); font_driver_bind_block(zui->font, NULL); menu_display_unset_viewport(video_info->width, video_info->height); diff --git a/menu/drivers_display/menu_display_d3d.c b/menu/drivers_display/menu_display_d3d.c index e7b300498b..f4895783f7 100644 --- a/menu/drivers_display/menu_display_d3d.c +++ b/menu/drivers_display/menu_display_d3d.c @@ -143,9 +143,7 @@ static void menu_display_d3d_bind_texture(void *data) static void menu_display_d3d_draw(void *data) { -#if 0 - math_matrix_4x4 *mat = NULL; -#endif + video_shader_ctx_mvp_t mvp; d3d_video_t *d3d = (d3d_video_t*)video_driver_get_ptr(false); menu_display_ctx_draw_t *draw = (menu_display_ctx_draw_t*)data; @@ -159,6 +157,12 @@ static void menu_display_d3d_draw(void *data) if (!draw->coords->lut_tex_coord) draw->coords->lut_tex_coord = menu_display_d3d_get_default_tex_coords(); + mvp.data = d3d; + mvp.matrix = draw->matrix_data ? (math_matrix_4x4*)draw->matrix_data + : (math_matrix_4x4*)menu_display_d3d_get_default_mvp(); + + video_driver_set_mvp(&mvp); + menu_display_d3d_viewport(draw); menu_display_d3d_bind_texture(draw); diff --git a/menu/drivers_display/menu_display_gl.c b/menu/drivers_display/menu_display_gl.c index 9d857cce04..d1d57b7075 100644 --- a/menu/drivers_display/menu_display_gl.c +++ b/menu/drivers_display/menu_display_gl.c @@ -139,13 +139,13 @@ static void menu_display_gl_draw(void *data) coords.handle_data = gl; coords.data = draw->coords; - video_shader_driver_set_coords(coords); + 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_shader_driver_set_mvp(mvp); + video_driver_set_mvp(&mvp); glDrawArrays(menu_display_prim_to_gl_enum( draw->prim_type), 0, draw->coords->vertices); @@ -185,6 +185,7 @@ static void menu_display_gl_draw_pipeline(void *data) case VIDEO_SHADER_MENU_3: case VIDEO_SHADER_MENU_4: case VIDEO_SHADER_MENU_5: + case VIDEO_SHADER_MENU_6: shader_info.data = NULL; shader_info.idx = draw->pipeline.id; shader_info.set_active = true; @@ -215,6 +216,7 @@ static void menu_display_gl_draw_pipeline(void *data) case VIDEO_SHADER_MENU_3: case VIDEO_SHADER_MENU_4: case VIDEO_SHADER_MENU_5: + case VIDEO_SHADER_MENU_6: #ifndef HAVE_PSGL uniform_param.type = UNIFORM_2F; uniform_param.lookup.ident = "OutputSize"; diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index b38bc4ffe7..b42384394d 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -834,21 +834,21 @@ static int menu_displaylist_parse_system_info(menu_displaylist_info_t *info) if (memory_used != 0 && memory_total != 0) { snprintf(tmp, sizeof(tmp), - "%s %s: " STRING_REP_UINT64 "/" STRING_REP_UINT64 " B", + "%s %s: %" PRIu64 "/%" PRIu64 " B", msg_hash_to_str(MSG_MEMORY), msg_hash_to_str(MSG_IN_BYTES), memory_used, memory_total ); snprintf(tmp2, sizeof(tmp2), - "%s %s: " STRING_REP_UINT64 "/" STRING_REP_UINT64 " MB", + "%s %s: %" PRIu64 "/%" PRIu64 " MB", msg_hash_to_str(MSG_MEMORY), msg_hash_to_str(MSG_IN_MEGABYTES), bytes_to_mb(memory_used), bytes_to_mb(memory_total) ); snprintf(tmp3, sizeof(tmp3), - "%s %s: " STRING_REP_UINT64 "/" STRING_REP_UINT64 " GB", + "%s %s: %" PRIu64 "/%" PRIu64 " GB", msg_hash_to_str(MSG_MEMORY), msg_hash_to_str(MSG_IN_GIGABYTES), bytes_to_gb(memory_used), @@ -1405,15 +1405,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_FBO_SUPPORT), - _fbo_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_FFMPEG_SUPPORT), @@ -1581,7 +1572,7 @@ static int menu_displaylist_parse_playlist(menu_displaylist_info_t *info, free(tmp); } } - + free(path_short); } @@ -2963,11 +2954,6 @@ static int menu_displaylist_parse_load_content_settings( msg_hash_to_str(MENU_ENUM_LABEL_ACHIEVEMENT_LIST), MENU_ENUM_LABEL_ACHIEVEMENT_LIST, MENU_SETTING_ACTION, 0, 0); - menu_entries_append_enum(info->list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_LIST_HARDCORE), - msg_hash_to_str(MENU_ENUM_LABEL_ACHIEVEMENT_LIST_HARDCORE), - MENU_ENUM_LABEL_ACHIEVEMENT_LIST_HARDCORE, - MENU_SETTING_ACTION, 0, 0); } #endif } @@ -3044,6 +3030,14 @@ static int menu_displaylist_parse_horizontal_content_actions( msg_hash_to_str(MENU_ENUM_LABEL_DELETE_ENTRY), MENU_ENUM_LABEL_DELETE_ENTRY, MENU_SETTING_ACTION_DELETE_ENTRY, 0, 0); + + if (settings->bools.quick_menu_show_add_to_favorites) + { + menu_entries_append_enum(info->list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES_PLAYLIST), + msg_hash_to_str(MENU_ENUM_LABEL_ADD_TO_FAVORITES_PLAYLIST), + MENU_ENUM_LABEL_ADD_TO_FAVORITES_PLAYLIST, FILE_TYPE_PLAYLIST_ENTRY, 0, 0); + } } if (!string_is_empty(db_name) && (!content_loaded || @@ -3496,7 +3490,7 @@ static int menu_displaylist_parse_options_remappings( } #ifdef HAVE_KEYMAPPER if (system) - { + { settings_t *settings = config_get_ptr(); unsigned device = settings->uints.input_libretro_device[settings->uints.keymapper_port]; @@ -3515,13 +3509,13 @@ static int menu_displaylist_parse_options_remappings( keybind = &input_config_binds[settings->uints.keymapper_port][retro_id]; auto_bind = (const struct retro_keybind*) input_config_get_bind_auto(settings->uints.keymapper_port, retro_id); - + input_config_get_bind_string(descriptor, keybind, auto_bind, sizeof(descriptor)); if(!strstr(descriptor, "Auto")) { - const struct retro_keybind *keyptr = + const struct retro_keybind *keyptr = &input_config_binds[settings->uints.keymapper_port][retro_id]; strlcpy(descriptor, msg_hash_to_str(keyptr->enum_idx), sizeof(descriptor)); @@ -3861,7 +3855,7 @@ static int menu_displaylist_parse_cores( malloc(PATH_MAX_LENGTH * sizeof(char)); char *display_name = (char*) malloc(PATH_MAX_LENGTH * sizeof(char)); - core_path[0] = + core_path[0] = display_name[0] = '\0'; fill_pathname_join(core_path, dir, path, @@ -4181,7 +4175,7 @@ static void menu_displaylist_parse_playlist_generic( { playlist_t *playlist = NULL; char *path_playlist = NULL; - + menu_displaylist_set_new_playlist(menu, playlist_path); menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &playlist); @@ -4279,7 +4273,7 @@ bool menu_displaylist_process(menu_displaylist_info_t *info) MENU_SETTING_ACTION, 0, 0); #endif -#if defined(HAVE_NETWORKING) && defined(HAVE_NETWORKGAMEPAD) && defined(HAVE_NETWORKGAMEPAD_CORE) +#if defined(HAVE_NETWORKING) && defined(HAVE_NETWORKGAMEPAD) menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_START_NET_RETROPAD), msg_hash_to_str(MENU_ENUM_LABEL_START_NET_RETROPAD), @@ -4741,15 +4735,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) case DISPLAYLIST_ACHIEVEMENT_LIST: #ifdef HAVE_CHEEVOS menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - cheevos_populate_menu(info, false); - info->need_push = true; - info->need_refresh = true; -#endif - break; - case DISPLAYLIST_ACHIEVEMENT_LIST_HARDCORE: -#ifdef HAVE_CHEEVOS - menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); - cheevos_populate_menu(info, true); + cheevos_populate_menu(info); info->need_push = true; info->need_refresh = true; #endif @@ -5318,6 +5304,9 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_FILTER_BY_CURRENT_CORE, PARSE_ONLY_BOOL, false); + menu_displaylist_parse_settings_enum(menu, info, + MENU_ENUM_LABEL_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, + PARSE_ONLY_BOOL, false); info->need_refresh = true; info->need_push = true; break; @@ -5611,10 +5600,19 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) MENU_ENUM_LABEL_CHEEVOS_PASSWORD, PARSE_ONLY_STRING, false); menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_CHEEVOS_TEST_UNOFFICIAL, + MENU_ENUM_LABEL_CHEEVOS_HARDCORE_MODE_ENABLE, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_CHEEVOS_HARDCORE_MODE_ENABLE, + MENU_ENUM_LABEL_CHEEVOS_LEADERBOARDS_ENABLE, + PARSE_ONLY_BOOL, false); + if (string_is_equal_fast(settings->arrays.menu_driver, "xmb", 3)) + { + menu_displaylist_parse_settings_enum(menu, info, + MENU_ENUM_LABEL_CHEEVOS_BADGES_ENABLE, + PARSE_ONLY_BOOL, false); + } + menu_displaylist_parse_settings_enum(menu, info, + MENU_ENUM_LABEL_CHEEVOS_TEST_UNOFFICIAL, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_CHEEVOS_VERBOSE_ENABLE, diff --git a/menu/menu_displaylist.h b/menu/menu_displaylist.h index 9572d5ebf5..9e2294b687 100644 --- a/menu/menu_displaylist.h +++ b/menu/menu_displaylist.h @@ -108,8 +108,7 @@ enum menu_displaylist_ctl_state DISPLAYLIST_NETWORK_INFO, DISPLAYLIST_SYSTEM_INFO, DISPLAYLIST_ACHIEVEMENT_LIST, - DISPLAYLIST_ACHIEVEMENT_LIST_HARDCORE, - DISPLAYLIST_USER_BINDS_LIST, + DISPLAYLIST_USER_BINDS_LIST, DISPLAYLIST_ACCOUNTS_LIST, DISPLAYLIST_DRIVER_SETTINGS_LIST, DISPLAYLIST_VIDEO_SETTINGS_LIST, diff --git a/menu/menu_driver.h b/menu/menu_driver.h index 95ac63ff54..f2d3db313f 100644 --- a/menu/menu_driver.h +++ b/menu/menu_driver.h @@ -248,6 +248,7 @@ enum xmb_icon_theme XMB_ICON_THEME_SYSTEMATIC, XMB_ICON_THEME_DOTART, XMB_ICON_THEME_CUSTOM, + XMB_ICON_THEME_RETROSYSTEM, XMB_ICON_THEME_LAST }; @@ -259,6 +260,7 @@ enum xmb_shader_pipeline XMB_SHADER_PIPELINE_SIMPLE_SNOW, XMB_SHADER_PIPELINE_SNOW, XMB_SHADER_PIPELINE_BOKEH, + XMB_SHADER_PIPELINE_SNOWFLAKE, XMB_SHADER_PIPELINE_LAST }; diff --git a/menu/menu_event.c b/menu/menu_event.c index 8c5b321bd5..c8fe862dbb 100644 --- a/menu/menu_event.c +++ b/menu/menu_event.c @@ -137,7 +137,7 @@ void menu_event_kb_set(bool down, enum retro_key key) * entire button state either but do a separate event per button * state. */ -unsigned menu_event(uint64_t input, uint64_t trigger_input) +unsigned menu_event(retro_bits_t* p_input, retro_bits_t* p_trigger_input) { menu_animation_ctx_delta_t delta; float delta_time; @@ -160,12 +160,12 @@ unsigned menu_event(uint64_t input, uint64_t trigger_input) unsigned menu_cancel_btn = (!input_swap_override && settings->bools.input_menu_swap_ok_cancel_buttons) ? RETRO_DEVICE_ID_JOYPAD_A : RETRO_DEVICE_ID_JOYPAD_B; - unsigned ok_current = (unsigned)(input & UINT64_C(1) << menu_ok_btn); + unsigned ok_current = RARCH_INPUT_STATE_BIT_GET_PTR(p_input, menu_ok_btn ); unsigned ok_trigger = ok_current & ~ok_old; ok_old = ok_current; - if (input) + if (RARCH_INPUT_STATE_ANY_SET_PTR(p_input)) { if (!first_held) { @@ -179,7 +179,7 @@ unsigned menu_event(uint64_t input, uint64_t trigger_input) if (delay_count >= delay_timer) { - uint64_t input_repeat = 0; + uint32_t input_repeat = 0; BIT32_SET(input_repeat, RETRO_DEVICE_ID_JOYPAD_UP); BIT32_SET(input_repeat, RETRO_DEVICE_ID_JOYPAD_DOWN); BIT32_SET(input_repeat, RETRO_DEVICE_ID_JOYPAD_LEFT); @@ -189,7 +189,7 @@ unsigned menu_event(uint64_t input, uint64_t trigger_input) set_scroll = true; first_held = false; - trigger_input |= input & input_repeat; + p_trigger_input->data[0] |= p_input->data[0] & input_repeat; menu_driver_ctl(MENU_NAVIGATION_CTL_GET_SCROLL_ACCEL, &new_scroll_accel); @@ -221,31 +221,31 @@ unsigned menu_event(uint64_t input, uint64_t trigger_input) { menu_event_osk_iterate(); - if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_DOWN)) + if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_DOWN)) { if (menu_event_get_osk_ptr() < 33) menu_event_set_osk_ptr(menu_event_get_osk_ptr() + OSK_CHARS_PER_LINE); } - if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_UP)) + if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_UP)) { if (menu_event_get_osk_ptr() >= OSK_CHARS_PER_LINE) menu_event_set_osk_ptr(menu_event_get_osk_ptr() - OSK_CHARS_PER_LINE); } - if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_RIGHT)) + if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_RIGHT)) { if (menu_event_get_osk_ptr() < 43) menu_event_set_osk_ptr(menu_event_get_osk_ptr() + 1); } - if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_LEFT)) + if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_LEFT)) { if (menu_event_get_osk_ptr() >= 1) menu_event_set_osk_ptr(menu_event_get_osk_ptr() - 1); } - if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_L)) + if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_L)) { if (menu_event_get_osk_idx() > OSK_TYPE_UNKNOWN + 1) menu_event_set_osk_idx((enum osk_type)(menu_event_get_osk_idx() - 1)); @@ -253,7 +253,7 @@ unsigned menu_event(uint64_t input, uint64_t trigger_input) menu_event_set_osk_idx((enum osk_type)(OSK_TYPE_LAST - 1)); } - if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_R)) + if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_R)) { if (menu_event_get_osk_idx() < OSK_TYPE_LAST - 1) menu_event_set_osk_idx((enum osk_type)(menu_event_get_osk_idx() + 1)); @@ -261,50 +261,50 @@ unsigned menu_event(uint64_t input, uint64_t trigger_input) menu_event_set_osk_idx((enum osk_type)(OSK_TYPE_UNKNOWN + 1)); } - if (trigger_input & (UINT64_C(1) << menu_ok_btn)) + if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, menu_ok_btn)) { if (menu_event_get_osk_ptr() >= 0) menu_event_osk_append(menu_event_get_osk_ptr()); } - if (trigger_input & (UINT64_C(1) << menu_cancel_btn)) + if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, menu_cancel_btn)) { input_keyboard_event(true, '\x7f', '\x7f', 0, RETRO_DEVICE_KEYBOARD); } /* send return key to close keyboard input window */ - if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_START)) + if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_START)) input_keyboard_event(true, '\n', '\n', 0, RETRO_DEVICE_KEYBOARD); - trigger_input = 0; + RARCH_INPUT_STATE_CLEAR_PTR(p_trigger_input); } else { - if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_UP)) + if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_UP)) ret = MENU_ACTION_UP; - else if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_DOWN)) + else if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_DOWN)) ret = MENU_ACTION_DOWN; - else if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_LEFT)) + else if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_LEFT)) ret = MENU_ACTION_LEFT; - else if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_RIGHT)) + else if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_RIGHT)) ret = MENU_ACTION_RIGHT; - else if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_L)) + else if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_L)) ret = MENU_ACTION_SCROLL_UP; - else if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_R)) + else if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_R)) ret = MENU_ACTION_SCROLL_DOWN; else if (ok_trigger) ret = MENU_ACTION_OK; - else if (trigger_input & (UINT64_C(1) << menu_cancel_btn)) + else if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, menu_cancel_btn)) ret = MENU_ACTION_CANCEL; - else if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_X)) + else if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_X)) ret = MENU_ACTION_SEARCH; - else if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_Y)) + else if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_Y)) ret = MENU_ACTION_SCAN; - else if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_START)) + else if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_START)) ret = MENU_ACTION_START; - else if (trigger_input & (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_SELECT)) + else if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_SELECT)) ret = MENU_ACTION_INFO; - else if (trigger_input & (UINT64_C(1) << RARCH_MENU_TOGGLE)) + else if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RARCH_MENU_TOGGLE)) ret = MENU_ACTION_TOGGLE; } @@ -314,7 +314,7 @@ unsigned menu_event(uint64_t input, uint64_t trigger_input) menu_event_kb_set_internal(RETROK_F11, 0); } - if (runloop_cmd_press(trigger_input, RARCH_QUIT_KEY)) + if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RARCH_QUIT_KEY)) return MENU_ACTION_QUIT; mouse_enabled = settings->bools.menu_mouse_enable; diff --git a/menu/menu_event.h b/menu/menu_event.h index 61e9f4b0e3..25d59c0991 100644 --- a/menu/menu_event.h +++ b/menu/menu_event.h @@ -44,7 +44,7 @@ RETRO_BEGIN_DECLS * entire button state either but do a separate event per button * state. */ -unsigned menu_event(uint64_t input, uint64_t trigger_state); +unsigned menu_event(retro_bits_t* p_input, retro_bits_t* p_trigger_state); /* Set a specific keyboard key. * diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 76f57f5a89..86cca1a42a 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -917,7 +917,7 @@ int menu_setting_set(unsigned type, const char *label, int ret = 0; file_list_t *selection_buf = menu_entries_get_selection_buf_ptr(0); size_t selection = menu_navigation_get_selection(); - menu_file_list_cbs_t *cbs = selection_buf ? + menu_file_list_cbs_t *cbs = selection_buf ? (menu_file_list_cbs_t*)file_list_get_actiondata_at_offset(selection_buf, selection) : NULL; if (!cbs) @@ -1441,12 +1441,13 @@ static int setting_action_ok_bind_defaults(void *data, bool wraparound) target->key = def_binds[i - MENU_SETTINGS_BIND_BEGIN].key; target->joykey = NO_BTN; target->joyaxis = AXIS_NONE; + target->mbutton = NO_BTN; } return 0; } -static void +static void setting_get_string_representation_st_float_video_refresh_rate_auto( void *data, char *s, size_t len) { @@ -2262,7 +2263,7 @@ static bool setting_append_list( parent_group); #endif -#if defined(HAVE_NETWORKING) && defined(HAVE_NETWORKGAMEPAD) && defined(HAVE_NETWORKGAMEPAD_CORE) +#if defined(HAVE_NETWORKING) && defined(HAVE_NETWORKGAMEPAD) CONFIG_ACTION( list, list_info, MENU_ENUM_LABEL_START_NET_RETROPAD, @@ -5984,6 +5985,23 @@ static bool setting_append_list( START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info, parent_group); +#ifdef HAVE_LIBRETRODB + CONFIG_BOOL( + list, list_info, + &settings->bools.automatically_add_content_to_playlist, + MENU_ENUM_LABEL_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, + MENU_ENUM_LABEL_VALUE_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, + true, + 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); +#endif + CONFIG_BOOL( list, list_info, &settings->bools.multimedia_builtin_mediaplayer_enable, @@ -6445,6 +6463,38 @@ static bool setting_append_list( SD_FLAG_ADVANCED ); + CONFIG_BOOL( + list, list_info, + &settings->bools.cheevos_leaderboards_enable, + MENU_ENUM_LABEL_CHEEVOS_LEADERBOARDS_ENABLE, + MENU_ENUM_LABEL_VALUE_CHEEVOS_LEADERBOARDS_ENABLE, + false, + MENU_ENUM_LABEL_VALUE_OFF, + MENU_ENUM_LABEL_VALUE_ON, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler, + SD_FLAG_NONE + ); + + CONFIG_BOOL( + list, list_info, + &settings->bools.cheevos_badges_enable, + MENU_ENUM_LABEL_CHEEVOS_BADGES_ENABLE, + MENU_ENUM_LABEL_VALUE_CHEEVOS_BADGES_ENABLE, + false, + MENU_ENUM_LABEL_VALUE_OFF, + MENU_ENUM_LABEL_VALUE_ON, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler, + SD_FLAG_NONE + ); + CONFIG_BOOL( list, list_info, &settings->bools.cheevos_verbose_enable, diff --git a/menu/widgets/menu_dialog.c b/menu/widgets/menu_dialog.c index 4e4ecb065b..4157e31502 100644 --- a/menu/widgets/menu_dialog.c +++ b/menu/widgets/menu_dialog.c @@ -255,6 +255,7 @@ void menu_dialog_push_pending(bool push, enum menu_dialog_type type) void menu_dialog_push(void) { menu_displaylist_info_t info; + const char *label; if (!menu_dialog_is_push_pending()) return; @@ -263,8 +264,11 @@ void menu_dialog_push(void) info.list = menu_entries_get_menu_stack_ptr(0); info.enum_idx = MENU_ENUM_LABEL_HELP; - info.label = strdup( - msg_hash_to_str(MENU_ENUM_LABEL_HELP)); + + /* Set the label string, if it exists. */ + label = msg_hash_to_str(MENU_ENUM_LABEL_HELP); + if (label) + info.label = strdup(label); menu_displaylist_ctl(DISPLAYLIST_HELP, &info); } diff --git a/menu/widgets/menu_filebrowser.c b/menu/widgets/menu_filebrowser.c index b3c0f729ba..0e5e5da57a 100644 --- a/menu/widgets/menu_filebrowser.c +++ b/menu/widgets/menu_filebrowser.c @@ -274,9 +274,10 @@ void filebrowser_parse(void *data, unsigned type_data) } end: - menu_entries_prepend(info->list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PARENT_DIRECTORY), - path, - MENU_ENUM_LABEL_PARENT_DIRECTORY, - FILE_TYPE_PARENT_DIRECTORY, 0, 0); + if (info) + menu_entries_prepend(info->list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_PARENT_DIRECTORY), + path, + MENU_ENUM_LABEL_PARENT_DIRECTORY, + FILE_TYPE_PARENT_DIRECTORY, 0, 0); } diff --git a/menu/widgets/menu_input_bind_dialog.c b/menu/widgets/menu_input_bind_dialog.c index 960110fcb8..456ae54b46 100644 --- a/menu/widgets/menu_input_bind_dialog.c +++ b/menu/widgets/menu_input_bind_dialog.c @@ -30,9 +30,11 @@ #define MENU_MAX_BUTTONS 219 #define MENU_MAX_AXES 32 #define MENU_MAX_HATS 4 +#define MENU_MAX_MBUTTONS 32 /*enough to cover largest libretro constant*/ struct menu_bind_state_port { + bool mbuttons[MENU_MAX_MBUTTONS]; bool buttons[MENU_MAX_BUTTONS]; int16_t axes[MENU_MAX_AXES]; uint16_t hats[MENU_MAX_HATS]; @@ -206,6 +208,7 @@ static void menu_input_key_bind_poll_bind_state( unsigned port, bool timed_out) { + unsigned b; rarch_joypad_info_t joypad_info; const input_device_driver_t *joypad = input_driver_get_joypad_driver(); @@ -217,6 +220,11 @@ static void menu_input_key_bind_poll_bind_state( memset(state->state, 0, sizeof(state->state)); + /* poll mouse (on the relevant port) */ + for (b = 0; b < MENU_MAX_MBUTTONS; b++) + state->state[port].mbuttons[b] = + input_mouse_button_raw(port, b); + joypad_info.joy_idx = 0; joypad_info.auto_binds = NULL; joypad_info.axis_threshold = 0.0f; @@ -277,6 +285,30 @@ static bool menu_input_key_bind_poll_find_trigger_pad( const struct menu_bind_state_port *o = (const struct menu_bind_state_port*) &state->state[p]; + for (b = 0; b < MENU_MAX_MBUTTONS; b++) + { + bool iterate = n->mbuttons[b] && !o->mbuttons[b]; + + if (!iterate) + continue; + + switch ( b ) + { + + case RETRO_DEVICE_ID_MOUSE_LEFT: + case RETRO_DEVICE_ID_MOUSE_RIGHT: + case RETRO_DEVICE_ID_MOUSE_MIDDLE: + case RETRO_DEVICE_ID_MOUSE_BUTTON_4: + case RETRO_DEVICE_ID_MOUSE_BUTTON_5: + case RETRO_DEVICE_ID_MOUSE_WHEELUP: + case RETRO_DEVICE_ID_MOUSE_WHEELDOWN: + case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP: + case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN: + state->target->mbutton = b; + return true; + } + } + for (b = 0; b < MENU_MAX_BUTTONS; b++) { bool iterate = n->buttons[b] && !o->buttons[b]; @@ -398,7 +430,7 @@ bool menu_input_key_bind_iterate(menu_input_ctx_bind_t *bind) } snprintf(bind->s, bind->len, - "[%s]\npress keyboard or joypad\n(timeout %d %s)", + "[%s]\npress keyboard, mouse or joypad\n(timeout %d %s)", input_config_bind_map_get_desc( menu_input_binds.begin - MENU_SETTINGS_BIND_BEGIN), rarch_timer_get_timeout(&menu_input_binds.timer), diff --git a/menu/widgets/menu_input_dialog.c b/menu/widgets/menu_input_dialog.c index 8031868d85..1017c4c4d5 100644 --- a/menu/widgets/menu_input_dialog.c +++ b/menu/widgets/menu_input_dialog.c @@ -59,7 +59,7 @@ void menu_input_dialog_end(void) { menu_input_dialog_keyboard_type = 0; menu_input_dialog_keyboard_idx = 0; - menu_input_dialog_keyboard_display = false; + menu_input_dialog_keyboard_display = false; menu_input_dialog_keyboard_label[0] = '\0'; menu_input_dialog_keyboard_label_setting[0] = '\0'; @@ -86,17 +86,17 @@ unsigned menu_input_dialog_get_kb_idx(void) bool menu_input_dialog_get_display_kb(void) { - return menu_input_dialog_keyboard_display; + return menu_input_dialog_keyboard_display; } void menu_input_dialog_display_kb(void) { - menu_input_dialog_keyboard_display = true; + menu_input_dialog_keyboard_display = true; } void menu_input_dialog_hide_kb(void) { - menu_input_dialog_keyboard_display = false; + menu_input_dialog_keyboard_display = false; } bool menu_input_dialog_start_search(void) @@ -128,10 +128,14 @@ bool menu_input_dialog_start(menu_input_ctx_line_t *line) return false; menu_input_dialog_display_kb(); - strlcpy(menu_input_dialog_keyboard_label, line->label, - sizeof(menu_input_dialog_keyboard_label)); - strlcpy(menu_input_dialog_keyboard_label_setting, - line->label_setting, sizeof(menu_input_dialog_keyboard_label_setting)); + + /* Only copy over the menu label and setting if they exist. */ + if (line->label) + strlcpy(menu_input_dialog_keyboard_label, line->label, + sizeof(menu_input_dialog_keyboard_label)); + if (line->label_setting) + strlcpy(menu_input_dialog_keyboard_label_setting, + line->label_setting, sizeof(menu_input_dialog_keyboard_label_setting)); menu_input_dialog_keyboard_type = line->type; menu_input_dialog_keyboard_idx = line->idx; diff --git a/msg_hash.h b/msg_hash.h index b4eecdc70c..f9e92af1d3 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -342,6 +342,7 @@ enum msg_hash_enums MSG_REWINDING, MSG_SLOW_MOTION_REWIND, MSG_SLOW_MOTION, + MSG_FAST_FORWARD, MSG_REWIND_REACHED_END, MSG_FAILED_TO_START_MOVIE_RECORD, MSG_CHEEVOS_HARDCORE_MODE_ENABLE, @@ -356,6 +357,7 @@ enum msg_hash_enums MSG_PREPARING_FOR_CONTENT_SCAN, MSG_SCANNING, MSG_SCANNING_OF_DIRECTORY_FINISHED, + MSG_SCANNING_OF_FILE_FINISHED, MSG_LOADED_STATE_FROM_SLOT, MSG_LOADED_STATE_FROM_SLOT_AUTO, MSG_REMOVING_TEMPORARY_CONTENT_FILE, @@ -393,6 +395,9 @@ enum msg_hash_enums MSG_EXTRACTING, MSG_EXTRACTING_FILE, MSG_NO_CONTENT_STARTING_DUMMY_CORE, + MSG_CONFIG_OVERRIDE_LOADED, + MSG_GAME_REMAP_FILE_LOADED, + MSG_CORE_REMAP_FILE_LOADED, MENU_LABEL(ADD_TO_MIXER), MENU_LABEL(ADD_TO_MIXER_AND_COLLECTION), @@ -419,6 +424,7 @@ enum msg_hash_enums MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_MONOCHROME, MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_FLATUI, MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, + MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_NEOACTIVE, MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_SYSTEMATIC, @@ -441,6 +447,7 @@ enum msg_hash_enums MENU_LABEL(SHADER_PIPELINE_SIMPLE_SNOW), MENU_LABEL(SHADER_PIPELINE_SNOW), MENU_LABEL(SHADER_PIPELINE_BOKEH), + MENU_LABEL(SHADER_PIPELINE_SNOWFLAKE), MENU_LABEL(MATERIALUI_MENU_HEADER_OPACITY), MENU_LABEL(MATERIALUI_MENU_FOOTER_OPACITY), @@ -458,6 +465,7 @@ enum msg_hash_enums MENU_ENUM_LABEL_PLAYLIST_COLLECTION_ENTRY, MENU_LABEL(CHEEVOS_UNLOCKED_ENTRY), + MENU_LABEL(CHEEVOS_UNLOCKED_ENTRY_HARDCORE), MENU_LABEL(CHEEVOS_LOCKED_ENTRY), MENU_ENUM_LABEL_SHADER_PARAMETERS_ENTRY, @@ -541,6 +549,15 @@ enum msg_hash_enums MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R3, MENU_ENUM_LABEL_VALUE_INPUT_KEY, + MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT, + MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT, + MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE, + MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4, + MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5, + MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP, + MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN, + MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP, + MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X, @@ -553,6 +570,17 @@ enum msg_hash_enums MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, + MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_KEY, @@ -784,6 +812,7 @@ enum msg_hash_enums MENU_LABEL(GOTO_IMAGES), MENU_LABEL(GOTO_VIDEO), MENU_LABEL(ADD_TO_FAVORITES), + MENU_LABEL(ADD_TO_FAVORITES_PLAYLIST), MENU_LABEL(MENU_THROTTLE_FRAMERATE), MENU_LABEL(NO_ACHIEVEMENTS_TO_DISPLAY), MENU_LABEL(NO_ENTRIES_TO_DISPLAY), @@ -846,6 +875,8 @@ enum msg_hash_enums MENU_LABEL(ACCOUNTS_CHEEVOS_USERNAME), MENU_LABEL(CHEEVOS_HARDCORE_MODE_ENABLE), + MENU_LABEL(CHEEVOS_LEADERBOARDS_ENABLE), + MENU_LABEL(CHEEVOS_BADGES_ENABLE), MENU_LABEL(CHEEVOS_TEST_UNOFFICIAL), MENU_LABEL(CHEEVOS_VERBOSE_ENABLE), MENU_LABEL(CHEEVOS_ENABLE), @@ -994,6 +1025,7 @@ enum msg_hash_enums MENU_LABEL(INFORMATION), MENU_LABEL(INFORMATION_LIST), MENU_LABEL(USE_BUILTIN_PLAYER), + MENU_LABEL(AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST), MENU_LABEL(NETPLAY_SETTINGS), MENU_LABEL(CONTENT_SETTINGS), MENU_LABEL(LOAD_CONTENT_LIST), @@ -1848,7 +1880,6 @@ enum msg_hash_enums #define MENU_LABEL_FRONTEND_COUNTERS 0xe5696877U #define MENU_LABEL_CORE_COUNTERS 0x64cc83e0U #define MENU_LABEL_ACHIEVEMENT_LIST 0x7b90fc49U -#define MENU_LABEL_ACHIEVEMENT_LIST_HARDCORE 0x7c632930U #define MENU_LABEL_CORE_INFORMATION 0xb638e0d3U #define MENU_LABEL_CORE_OPTIONS 0xf65e60f9U #define MENU_LABEL_SHADER_OPTIONS 0x1f7d2fc7U diff --git a/network/httpserver/httpserver.c b/network/httpserver/httpserver.c index 050604d0e6..c85b67ffa4 100644 --- a/network/httpserver/httpserver.c +++ b/network/httpserver/httpserver.c @@ -247,10 +247,10 @@ static int httpserver_handle_basic_info(struct mg_connection* conn, void* cbdata "\"frontendSupportsAchievements\":false," "\"coreSupportsAchievements\":null," #endif - "\"saveRam\":{\"pointer\":\"%" PRIXPTR "\",\"size\":" STRING_REP_UINT64 "}," - "\"rtcRam\":{\"pointer\":\"%" PRIXPTR "\",\"size\":" STRING_REP_UINT64 "}," - "\"systemRam\":{\"pointer\":\"%" PRIXPTR "\",\"size\":" STRING_REP_UINT64 "}," - "\"videoRam\":{\"pointer\":\"%" PRIXPTR "\",\"size\":" STRING_REP_UINT64 "},", + "\"saveRam\":{\"pointer\":\"%" PRIXPTR "\",\"size\":%" PRIu64 "}," + "\"rtcRam\":{\"pointer\":\"%" PRIXPTR "\",\"size\":%" PRIu64 "}," + "\"systemRam\":{\"pointer\":\"%" PRIXPTR "\",\"size\":%" PRIu64 "}," + "\"videoRam\":{\"pointer\":\"%" PRIXPTR "\",\"size\":%" PRIu64 "},", core_path, api.version, system->info.library_name, @@ -428,13 +428,13 @@ static int httpserver_handle_get_mmaps(struct mg_connection* conn, void* cbdata) mg_printf(conn, "%s{" "\"id\":%u," - "\"flags\":" STRING_REP_UINT64 "," + "\"flags\":%" PRIu64 "," "\"ptr\":\"%" PRIXPTR "\"," - "\"offset\":" STRING_REP_UINT64 "," - "\"start\":" STRING_REP_UINT64 "," - "\"select\":" STRING_REP_UINT64 "," - "\"disconnect\":" STRING_REP_UINT64 "," - "\"len\":" STRING_REP_UINT64 "," + "\"offset\":%" PRIu64 "," + "\"start\":%" PRIu64 "," + "\"select\":%" PRIu64 "," + "\"disconnect\":%" PRIu64 "," + "\"len\":%" PRIu64 "," "\"addrspace\":\"%s\"" "}", comma, diff --git a/network/netplay/netplay_discovery.c b/network/netplay/netplay_discovery.c index e3ad842842..82e63ada7a 100644 --- a/network/netplay/netplay_discovery.c +++ b/network/netplay/netplay_discovery.c @@ -60,6 +60,7 @@ struct ad_packet uint32_t header; uint32_t protocol_version; uint32_t port; + char address[NETPLAY_HOST_STR_LEN]; char retroarch_version[NETPLAY_HOST_STR_LEN]; char nick[NETPLAY_HOST_STR_LEN]; char core[NETPLAY_HOST_STR_LEN]; @@ -107,7 +108,7 @@ bool init_netplay_discovery(void) error: if (addr) freeaddrinfo_retro(addr); - RARCH_ERR("Failed to initialize netplay advertisement client socket.\n"); + RARCH_ERR("[discovery] Failed to initialize netplay advertisement client socket.\n"); return false; } @@ -122,9 +123,13 @@ void deinit_netplay_discovery(void) } /** Discovery control */ +/* Todo: implement net_ifinfo and ntohs for consoles */ bool netplay_discovery_driver_ctl(enum rarch_netplay_discovery_ctl_state state, void *data) { +#ifndef RARCH_CONSOLE char port_str[6]; + int ret; + unsigned k = 0; if (lan_ad_client_fd < 0) return false; @@ -133,8 +138,12 @@ bool netplay_discovery_driver_ctl(enum rarch_netplay_discovery_ctl_state state, { case RARCH_NETPLAY_DISCOVERY_CTL_LAN_SEND_QUERY: { + net_ifinfo_t interfaces; struct addrinfo hints = {0}, *addr; - int canBroadcast = 1; + int canBroadcast = 1; + + if (!net_ifinfo_new(&interfaces)) + return false; /* Get the broadcast address (IPv4 only for now) */ snprintf(port_str, 6, "%hu", (unsigned short) RARCH_DEFAULT_PORT); @@ -145,20 +154,28 @@ bool netplay_discovery_driver_ctl(enum rarch_netplay_discovery_ctl_state state, #if defined(SOL_SOCKET) && defined(SO_BROADCAST) if (setsockopt(lan_ad_client_fd, SOL_SOCKET, SO_BROADCAST, (const char *)&canBroadcast, sizeof(canBroadcast)) < 0) - RARCH_WARN("Failed to set netplay discovery port to broadcast.\n"); + RARCH_WARN("[discovery] Failed to set netplay discovery port to broadcast\n"); #endif /* Put together the request */ memcpy((void *) &ad_packet_buffer, "RANQ", 4); ad_packet_buffer.protocol_version = htonl(NETPLAY_PROTOCOL_VERSION); - /* And send it off */ - if (sendto(lan_ad_client_fd, (const char *) &ad_packet_buffer, - 2*sizeof(uint32_t), 0, addr->ai_addr, addr->ai_addrlen) < - (ssize_t) (2*sizeof(uint32_t))) - RARCH_WARN("Failed to send netplay discovery response.\n"); + for (k = 0; k < (unsigned)interfaces.size; k++) + { + strlcpy(ad_packet_buffer.address, interfaces.entries[k].host, + NETPLAY_HOST_STR_LEN); + + /* And send it off */ + ret = sendto(lan_ad_client_fd, (const char *) &ad_packet_buffer, + sizeof(struct ad_packet), 0, addr->ai_addr, addr->ai_addrlen); + if (ret < (ssize_t) (2*sizeof(uint32_t))) + RARCH_WARN("[discovery] Failed to send netplay discovery query (error: %d)\n", errno); + } freeaddrinfo_retro(addr); + net_ifinfo_free(&interfaces); + break; } @@ -175,7 +192,7 @@ bool netplay_discovery_driver_ctl(enum rarch_netplay_discovery_ctl_state state, default: return false; } - +#endif return true; } @@ -201,7 +218,7 @@ static bool init_lan_ad_server_socket(netplay_t *netplay, uint16_t port) error: if (addr) freeaddrinfo_retro(addr); - RARCH_ERR("Failed to initialize netplay advertisement socket.\n"); + RARCH_ERR("[discovery] Failed to initialize netplay advertisement socket\n"); return false; } @@ -212,15 +229,26 @@ error: */ bool netplay_lan_ad_server(netplay_t *netplay) { +/* Todo: implement net_ifinfo and ntohs for consoles */ +#ifndef RARCH_CONSOLE fd_set fds; + int ret; struct timeval tmp_tv = {0}; struct sockaddr their_addr; socklen_t addr_size; rarch_system_info_t *info = NULL; + unsigned k = 0; + char reply_addr[NETPLAY_HOST_STR_LEN], port_str[6]; + struct addrinfo *our_addr, hints = {0}; + + net_ifinfo_t interfaces; + + if (!net_ifinfo_new(&interfaces)) + return false; if (lan_ad_server_fd < 0 && !init_lan_ad_server_socket(netplay, RARCH_DEFAULT_PORT)) return false; - + /* Check for any ad queries */ while (1) { @@ -234,59 +262,100 @@ bool netplay_lan_ad_server(netplay_t *netplay) /* Somebody queried, so check that it's valid */ addr_size = sizeof(their_addr); - if (recvfrom(lan_ad_server_fd, (char*)&ad_packet_buffer, - sizeof(struct ad_packet), 0, &their_addr, &addr_size) >= - (ssize_t) (2*sizeof(uint32_t))) + ret = recvfrom(lan_ad_server_fd, (char*)&ad_packet_buffer, + sizeof(struct ad_packet), 0, &their_addr, &addr_size); + if (ret >= (ssize_t) (2 * sizeof(uint32_t))) { char s[NETPLAY_HOST_STR_LEN]; uint32_t content_crc = 0; /* Make sure it's a valid query */ if (memcmp((void *) &ad_packet_buffer, "RANQ", 4)) + { + RARCH_LOG("[discovery] invalid query\n"); continue; + } /* For this version */ if (ntohl(ad_packet_buffer.protocol_version) != NETPLAY_PROTOCOL_VERSION) - continue; - - info = runloop_get_system_info(); - - /* Now build our response */ - content_crc = content_get_crc(); - - memset(&ad_packet_buffer, 0, sizeof(struct ad_packet)); - memcpy(&ad_packet_buffer, "RANS", 4); - - ad_packet_buffer.protocol_version = - htonl(NETPLAY_PROTOCOL_VERSION); - ad_packet_buffer.port = htonl(netplay->tcp_port); - strlcpy(ad_packet_buffer.retroarch_version, PACKAGE_VERSION, - NETPLAY_HOST_STR_LEN); - strlcpy(ad_packet_buffer.content, !string_is_empty( - path_basename(path_get(RARCH_PATH_BASENAME))) - ? path_basename(path_get(RARCH_PATH_BASENAME)) : "N/A", - NETPLAY_HOST_LONGSTR_LEN); - strlcpy(ad_packet_buffer.nick, netplay->nick, NETPLAY_HOST_STR_LEN); - - if (info) { - strlcpy(ad_packet_buffer.core, info->info.library_name, - NETPLAY_HOST_STR_LEN); - strlcpy(ad_packet_buffer.core_version, info->info.library_version, - NETPLAY_HOST_STR_LEN); + RARCH_LOG("[discovery] invalid protocol version\n"); + continue; } - snprintf(s, sizeof(s), "%d", content_crc); - strlcpy(ad_packet_buffer.content_crc, s, - NETPLAY_HOST_STR_LEN); + strlcpy(reply_addr, ad_packet_buffer.address, NETPLAY_HOST_STR_LEN); - /* And send it */ - sendto(lan_ad_server_fd, (const char*)&ad_packet_buffer, - sizeof(struct ad_packet), 0, &their_addr, addr_size); + for (k = 0; k < interfaces.size; k++) + { + char *p; + char sub[NETPLAY_HOST_STR_LEN]; + + p=strrchr(reply_addr,'.'); + if (p) + { + strlcpy(sub, reply_addr, p - reply_addr + 1); + if (strstr(interfaces.entries[k].host, sub) && + !strstr(interfaces.entries[k].host, "127.0.0.1")) + { + RARCH_LOG ("[discovery] query received on common interface: %s/%s (theirs / ours) \n", + reply_addr, interfaces.entries[k].host); + + info = runloop_get_system_info(); + + /* Now build our response */ + content_crc = content_get_crc(); + + memset(&ad_packet_buffer, 0, sizeof(struct ad_packet)); + memcpy(&ad_packet_buffer, "RANS", 4); + + strlcpy(ad_packet_buffer.address, interfaces.entries[k].host, + NETPLAY_HOST_STR_LEN); + ad_packet_buffer.protocol_version = + htonl(NETPLAY_PROTOCOL_VERSION); + ad_packet_buffer.port = htonl(netplay->tcp_port); + strlcpy(ad_packet_buffer.retroarch_version, PACKAGE_VERSION, + NETPLAY_HOST_STR_LEN); + strlcpy(ad_packet_buffer.content, !string_is_empty( + path_basename(path_get(RARCH_PATH_BASENAME))) + ? path_basename(path_get(RARCH_PATH_BASENAME)) : "N/A", + NETPLAY_HOST_LONGSTR_LEN); + strlcpy(ad_packet_buffer.nick, netplay->nick, NETPLAY_HOST_STR_LEN); + + if (info) + { + strlcpy(ad_packet_buffer.core, info->info.library_name, + NETPLAY_HOST_STR_LEN); + strlcpy(ad_packet_buffer.core_version, info->info.library_version, + NETPLAY_HOST_STR_LEN); + } + + snprintf(s, sizeof(s), "%d", content_crc); + strlcpy(ad_packet_buffer.content_crc, s, + NETPLAY_HOST_STR_LEN); + + /* Build up the destination address*/ + snprintf(port_str, 6, "%hu", ntohs(((struct sockaddr_in*)(&their_addr))->sin_port)); + if (getaddrinfo_retro(reply_addr, port_str, &hints, &our_addr) < 0) + continue; + + RARCH_LOG ("[discovery] sending reply to %s \n", reply_addr); + + /* And send it */ + sendto(lan_ad_server_fd, (const char*)&ad_packet_buffer, + sizeof(struct ad_packet), 0, our_addr->ai_addr, our_addr->ai_addrlen); + freeaddrinfo_retro(our_addr); + } + else + continue; + } + else + continue; + } } } - + net_ifinfo_free(&interfaces); +#endif return true; } @@ -350,7 +419,7 @@ static bool netplay_lan_ad_client(void) { struct sockaddr_in *sin = NULL; - RARCH_WARN ("[lobby] using IPv4 for discovery\n"); + RARCH_WARN ("[discovery] using IPv4 for discovery\n"); sin = (struct sockaddr_in *) &their_addr; sin->sin_port = htons(ntohl(ad_packet_buffer.port)); @@ -359,7 +428,7 @@ static bool netplay_lan_ad_client(void) else if (their_addr.sa_family == AF_INET6) { struct sockaddr_in6 *sin6 = NULL; - RARCH_WARN ("[lobby] using IPv6 for discovery\n"); + RARCH_WARN ("[discovery] using IPv6 for discovery\n"); sin6 = (struct sockaddr_in6 *) &their_addr; sin6->sin6_port = htons(ad_packet_buffer.port); @@ -402,6 +471,9 @@ static bool netplay_lan_ad_client(void) host->addr = their_addr; host->addrlen = addr_size; + host->port = ntohl(ad_packet_buffer.port); + + strlcpy(host->address, ad_packet_buffer.address, NETPLAY_HOST_STR_LEN); strlcpy(host->nick, ad_packet_buffer.nick, NETPLAY_HOST_STR_LEN); strlcpy(host->core, ad_packet_buffer.core, NETPLAY_HOST_STR_LEN); strlcpy(host->retroarch_version, ad_packet_buffer.retroarch_version, diff --git a/network/netplay/netplay_discovery.h b/network/netplay/netplay_discovery.h index 2260e7d6d6..57bb153f97 100644 --- a/network/netplay/netplay_discovery.h +++ b/network/netplay/netplay_discovery.h @@ -18,6 +18,7 @@ #define __RARCH_NETPLAY_DISCOVERY_H #include +#include #include #define NETPLAY_HOST_STR_LEN 32 @@ -36,12 +37,14 @@ struct netplay_host struct sockaddr addr; socklen_t addrlen; + char address[NETPLAY_HOST_STR_LEN]; char nick[NETPLAY_HOST_STR_LEN]; char core[NETPLAY_HOST_STR_LEN]; char core_version[NETPLAY_HOST_STR_LEN]; char retroarch_version[NETPLAY_HOST_STR_LEN]; char content[NETPLAY_HOST_LONGSTR_LEN]; int content_crc; + int port; }; struct netplay_host_list diff --git a/network/netplay/netplay_frontend.c b/network/netplay/netplay_frontend.c index 49026cb10f..86c8234849 100644 --- a/network/netplay/netplay_frontend.c +++ b/network/netplay/netplay_frontend.c @@ -613,9 +613,12 @@ static void netplay_announce(void) char *corename = NULL; char *gamename = NULL; char *coreversion = NULL; + char *frontend_ident = NULL; settings_t *settings = config_get_ptr(); rarch_system_info_t *system = runloop_get_system_info(); uint32_t content_crc = content_get_crc(); + const frontend_ctx_driver_t + *frontend = frontend_get_ptr(); net_http_urlencode_full(&username, settings->paths.username); net_http_urlencode_full(&corename, system->info.library_name); @@ -623,27 +626,34 @@ static void netplay_announce(void) !string_is_empty(path_basename(path_get(RARCH_PATH_BASENAME))) ? path_basename(path_get(RARCH_PATH_BASENAME)) : "N/A"); net_http_urlencode_full(&coreversion, system->info.library_version); + net_http_urlencode_full(&frontend_ident, frontend->ident); buf[0] = '\0'; snprintf(buf, sizeof(buf), "username=%s&core_name=%s&core_version=%s&" "game_name=%s&game_crc=%08X&port=%d" - "&has_password=%d&has_spectate_password=%d&force_mitm=%d&retroarch_version=%s", + "&has_password=%d&has_spectate_password=%d&force_mitm=%d&retroarch_version=%s&frontend=%s", username, corename, coreversion, gamename, content_crc, settings->uints.netplay_port, *settings->paths.netplay_password ? 1 : 0, *settings->paths.netplay_spectate_password ? 1 : 0, settings->bools.netplay_use_mitm_server, - PACKAGE_VERSION); + PACKAGE_VERSION, frontend_ident); #if 0 RARCH_LOG("[netplay] announcement URL: %s\n", buf); #endif task_push_http_post_transfer(url, buf, true, NULL, netplay_announce_cb, NULL); - free(username); - free(corename); - free(gamename); - free(coreversion); + if (username) + free(username); + if (corename) + free(corename); + if (gamename) + free(gamename); + if (coreversion) + free(coreversion); + if (frontend_ident) + free(frontend_ident); } int16_t input_state_net(unsigned port, unsigned device, diff --git a/pkg/android/phoenix/AndroidManifest.xml b/pkg/android/phoenix/AndroidManifest.xml index 5d82f1b08c..b2896d6872 100644 --- a/pkg/android/phoenix/AndroidManifest.xml +++ b/pkg/android/phoenix/AndroidManifest.xml @@ -1,8 +1,8 @@ diff --git a/pkg/android/phoenix/jni/Android.mk b/pkg/android/phoenix/jni/Android.mk index e8e7b1e16b..62d8cefa5f 100644 --- a/pkg/android/phoenix/jni/Android.mk +++ b/pkg/android/phoenix/jni/Android.mk @@ -68,7 +68,7 @@ else DEFINES += -DHAVE_OPENGLES2 endif -DEFINES += -DRARCH_MOBILE -DHAVE_GRIFFIN -DHAVE_STB_VORBIS -DHAVE_LANGEXTRA -DANDROID -DHAVE_DYNAMIC -DHAVE_OPENGL -DHAVE_FBO -DHAVE_OVERLAY -DHAVE_OPENGLES -DGLSL_DEBUG -DHAVE_DYLIB -DHAVE_EGL -DHAVE_GLSL -DHAVE_MENU -DHAVE_RGUI -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_RBMP -DHAVE_RTGA -DINLINE=inline -DHAVE_THREADS -D__LIBRETRO__ -DHAVE_RSOUND -DHAVE_NETWORKGAMEPAD -DHAVE_NETWORKING -DRARCH_INTERNAL -DHAVE_FILTERS_BUILTIN -DHAVE_MATERIALUI -DHAVE_XMB -DHAVE_SHADERPIPELINE -DHAVE_LIBRETRODB -DHAVE_STB_FONT -DHAVE_IMAGEVIEWER -DHAVE_UPDATE_ASSETS -DHAVE_CC_RESAMPLER -DHAVE_MINIUPNPC -DHAVE_BUILTINMINIUPNPC -DMINIUPNPC_SET_SOCKET_TIMEOUT -DMINIUPNPC_GET_SRC_ADDR -DHAVE_KEYMAPPER -DHAVE_NETWORKGAMEPAD -DHAVE_FLAC -DHAVE_CHD +DEFINES += -DRARCH_MOBILE -DHAVE_GRIFFIN -DHAVE_STB_VORBIS -DHAVE_LANGEXTRA -DANDROID -DHAVE_DYNAMIC -DHAVE_OPENGL -DHAVE_OVERLAY -DHAVE_OPENGLES -DGLSL_DEBUG -DHAVE_DYLIB -DHAVE_EGL -DHAVE_GLSL -DHAVE_MENU -DHAVE_RGUI -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_RBMP -DHAVE_RTGA -DINLINE=inline -DHAVE_THREADS -D__LIBRETRO__ -DHAVE_RSOUND -DHAVE_NETWORKGAMEPAD -DHAVE_NETWORKING -DRARCH_INTERNAL -DHAVE_FILTERS_BUILTIN -DHAVE_MATERIALUI -DHAVE_XMB -DHAVE_SHADERPIPELINE -DHAVE_LIBRETRODB -DHAVE_STB_FONT -DHAVE_IMAGEVIEWER -DHAVE_UPDATE_ASSETS -DHAVE_CC_RESAMPLER -DHAVE_MINIUPNPC -DHAVE_BUILTINMINIUPNPC -DMINIUPNPC_SET_SOCKET_TIMEOUT -DMINIUPNPC_GET_SRC_ADDR -DHAVE_KEYMAPPER -DHAVE_NETWORKGAMEPAD -DHAVE_FLAC -DHAVE_CHD DEFINES += -DWANT_IFADDRS ifeq ($(HAVE_VULKAN),1) diff --git a/pkg/apple/RetroArch.xcodeproj/project.pbxproj b/pkg/apple/RetroArch.xcodeproj/project.pbxproj index 3b14037e24..62f87cbf8b 100644 --- a/pkg/apple/RetroArch.xcodeproj/project.pbxproj +++ b/pkg/apple/RetroArch.xcodeproj/project.pbxproj @@ -515,7 +515,6 @@ "-DHAVE_MENU", "-DOSX", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_CC_RESAMPLER", "-DHAVE_GLSL", "-DINLINE=inline", @@ -577,7 +576,6 @@ "-DHAVE_MENU", "-DOSX", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_CC_RESAMPLER", "-DHAVE_GLSL", "-DINLINE=inline", diff --git a/pkg/apple/RetroArch_PPC.xcodeproj/project.pbxproj b/pkg/apple/RetroArch_PPC.xcodeproj/project.pbxproj index 3983cd4a9a..1387385b1b 100644 --- a/pkg/apple/RetroArch_PPC.xcodeproj/project.pbxproj +++ b/pkg/apple/RetroArch_PPC.xcodeproj/project.pbxproj @@ -299,7 +299,6 @@ "-DHAVE_MENU", "-DOSX", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_CC_RESAMPLER", "-DHAVE_GLSL", "-DINLINE=inline", @@ -375,7 +374,6 @@ "-DHAVE_MENU", "-DOSX", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_CC_RESAMPLER", "-DHAVE_GLSL", "-DINLINE=inline", diff --git a/pkg/apple/RetroArch_iOS.xcodeproj/project.pbxproj b/pkg/apple/RetroArch_iOS.xcodeproj/project.pbxproj index b109544c88..4043e26919 100644 --- a/pkg/apple/RetroArch_iOS.xcodeproj/project.pbxproj +++ b/pkg/apple/RetroArch_iOS.xcodeproj/project.pbxproj @@ -558,7 +558,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -644,7 +643,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -697,7 +695,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -784,7 +781,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -866,7 +862,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -916,7 +911,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1000,7 +994,6 @@ "-DIOS", "-DHAVE_DYNAMIC", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1011,7 +1004,6 @@ "-DRARCH_MOBILE", "-std=gnu99", "-DHAVE_COREAUDIO", - "-DHAVE_FBO", "-DHAVE_OVERLAY", "-DHAVE_ZLIB", "-DHAVE_RPNG", @@ -1072,7 +1064,6 @@ "-DIOS", "-DHAVE_DYNAMIC", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1083,7 +1074,6 @@ "-DRARCH_MOBILE", "-std=gnu99", "-DHAVE_COREAUDIO", - "-DHAVE_FBO", "-DHAVE_OVERLAY", "-DHAVE_ZLIB", "-DHAVE_RPNG", @@ -1148,7 +1138,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1234,7 +1223,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1287,7 +1275,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", diff --git a/pkg/apple/RetroArch_iOS10.xcodeproj/project.pbxproj b/pkg/apple/RetroArch_iOS10.xcodeproj/project.pbxproj index 906bbe8982..460484d528 100644 --- a/pkg/apple/RetroArch_iOS10.xcodeproj/project.pbxproj +++ b/pkg/apple/RetroArch_iOS10.xcodeproj/project.pbxproj @@ -624,7 +624,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -712,7 +711,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -767,7 +765,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -856,7 +853,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -940,7 +936,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -992,7 +987,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1076,7 +1070,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1164,7 +1157,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1219,7 +1211,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1309,7 +1300,6 @@ "-DIOS", "-DHAVE_DYNAMIC", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1320,7 +1310,6 @@ "-DRARCH_MOBILE", "-std=gnu99", "-DHAVE_COREAUDIO", - "-DHAVE_FBO", "-DHAVE_OVERLAY", "-DHAVE_ZLIB", "-DHAVE_RPNG", @@ -1383,7 +1372,6 @@ "-DIOS", "-DHAVE_DYNAMIC", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1394,7 +1382,6 @@ "-DRARCH_MOBILE", "-std=gnu99", "-DHAVE_COREAUDIO", - "-DHAVE_FBO", "-DHAVE_OVERLAY", "-DHAVE_ZLIB", "-DHAVE_RPNG", @@ -1461,7 +1448,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1549,7 +1535,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1604,7 +1589,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", diff --git a/pkg/apple/RetroArch_iOS10_static.xcodeproj/project.pbxproj b/pkg/apple/RetroArch_iOS10_static.xcodeproj/project.pbxproj index 7473681015..a60b3985ef 100644 --- a/pkg/apple/RetroArch_iOS10_static.xcodeproj/project.pbxproj +++ b/pkg/apple/RetroArch_iOS10_static.xcodeproj/project.pbxproj @@ -629,7 +629,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -715,7 +714,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -769,7 +767,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -857,7 +854,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -940,7 +936,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -991,7 +986,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1074,7 +1068,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1161,7 +1154,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1215,7 +1207,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1303,7 +1294,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1314,7 +1304,6 @@ "-DRARCH_MOBILE", "-std=gnu99", "-DHAVE_COREAUDIO", - "-DHAVE_FBO", "-DHAVE_OVERLAY", "-DHAVE_ZLIB", "-DHAVE_RPNG", @@ -1376,7 +1365,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1387,7 +1375,6 @@ "-DRARCH_MOBILE", "-std=gnu99", "-DHAVE_COREAUDIO", - "-DHAVE_FBO", "-DHAVE_OVERLAY", "-DHAVE_ZLIB", "-DHAVE_RPNG", @@ -1454,7 +1441,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1541,7 +1527,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1595,7 +1580,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", diff --git a/pkg/apple/iOS/Makefile b/pkg/apple/iOS/Makefile index a54a8b293d..2c540ad76d 100644 --- a/pkg/apple/iOS/Makefile +++ b/pkg/apple/iOS/Makefile @@ -17,7 +17,7 @@ ${APPLICATION_NAME}_FILES = $(SRC_DIR)/griffin/griffin.c \ $(SRC_DIR)/audio/drivers_resampler/sinc_neon.S \ $(SRC_DIR)/audio/drivers_resampler/cc_resampler_neon.S -COMMON_FLAGS := -DIOS -DHAVE_GRIFFIN -DHAVE_CORELOCATION -DHAVE_NETWORKING -DHAVE_RGUI -DHAVE_MENU -DHAVE_DYNAMIC -DHAVE_OPENGL -DHAVE_FBO -DHAVE_OPENGLES -DHAVE_OPENGLES2 -DHAVE_GLSL -DINLINE=inline -DHAVE_THREADS -D__LIBRETRO__ -DRARCH_MOBILE -std=gnu99 -DHAVE_COREAUDIO -DHAVE_FBO -DHAVE_OVERLAY -DHAVE_ZLIB -DWANT_ZLIB -DSINC_LOWER_QUALITY -DRARCH_INTERNAL -DHAVE_FILTERS_BUILTIN -DHAVE_XMB -D_LZMA_UINT32_IS_ULONG -DHAVE_STRL +COMMON_FLAGS := -DIOS -DHAVE_GRIFFIN -DHAVE_CORELOCATION -DHAVE_NETWORKING -DHAVE_RGUI -DHAVE_MENU -DHAVE_DYNAMIC -DHAVE_OPENGL -DHAVE_OPENGLES -DHAVE_OPENGLES2 -DHAVE_GLSL -DINLINE=inline -DHAVE_THREADS -D__LIBRETRO__ -DRARCH_MOBILE -std=gnu99 -DHAVE_COREAUDIO -DHAVE_OVERLAY -DHAVE_ZLIB -DWANT_ZLIB -DSINC_LOWER_QUALITY -DRARCH_INTERNAL -DHAVE_FILTERS_BUILTIN -DHAVE_XMB -D_LZMA_UINT32_IS_ULONG -DHAVE_STRL COMMON_FLAGS += -DHAVE_AVFOUNDATION COMMON_IOS_FLAGS := -Wno-deprecated-declarations -Wno-error COMMON_IOS_OBJCFLAGS := -fobjc-arc diff --git a/ctr/Makefile.cores b/pkg/ctr/Makefile.cores similarity index 52% rename from ctr/Makefile.cores rename to pkg/ctr/Makefile.cores index de64f12c4f..ebf5cf7a5c 100644 --- a/ctr/Makefile.cores +++ b/pkg/ctr/Makefile.cores @@ -3,79 +3,79 @@ ifeq ($(LIBRETRO), gambatte) APP_TITLE = Gambatte Libretro APP_PRODUCT_CODE = RARCH-GAMBATTE APP_UNIQUE_ID = 0xBAC01 - APP_ICON = ctr/assets/gambatte.png - APP_BANNER = ctr/assets/gambatte_banner.png + APP_ICON = pkg/ctr/assets/gambatte.png + APP_BANNER = pkg/ctr/assets/gambatte_banner.png else ifeq ($(LIBRETRO), gpsp) APP_TITLE = gpSP Libretro APP_PRODUCT_CODE = RARCH-GPSP APP_UNIQUE_ID = 0xBAC02 - APP_ICON = ctr/assets/gpsp.png - APP_BANNER = ctr/assets/gpsp_banner.png + APP_ICON = pkg/ctr/assets/gpsp.png + APP_BANNER = pkg/ctr/assets/gpsp_banner.png APP_USE_SVCHAX = 1 else ifeq ($(LIBRETRO), fceumm) APP_TITLE = FCeumm Libretro APP_PRODUCT_CODE = RARCH-FCEUMM APP_UNIQUE_ID = 0xBAC03 - APP_ICON = ctr/assets/fceumm.png - APP_BANNER = ctr/assets/fceumm_banner.png + APP_ICON = pkg/ctr/assets/fceumm.png + APP_BANNER = pkg/ctr/assets/fceumm_banner.png else ifeq ($(LIBRETRO), nestopia) APP_TITLE = Nestopia Libretro APP_PRODUCT_CODE = RARCH-NESTOPIA APP_UNIQUE_ID = 0xBAC04 - APP_ICON = ctr/assets/nestopia.png - APP_BANNER = ctr/assets/nestopia_banner.png + APP_ICON = pkg/ctr/assets/nestopia.png + APP_BANNER = pkg/ctr/assets/nestopia_banner.png else ifeq ($(LIBRETRO), nxengine) APP_TITLE = NXengine Libretro APP_PRODUCT_CODE = RARCH-NXENGINE APP_UNIQUE_ID = 0xBAC05 - APP_ICON = ctr/assets/nxengine.png - APP_BANNER = ctr/assets/nxengine_banner.png + APP_ICON = pkg/ctr/assets/nxengine.png + APP_BANNER = pkg/ctr/assets/nxengine_banner.png else ifeq ($(LIBRETRO), genesis_plus_gx) APP_TITLE = Genesis Plus GX Libretro APP_PRODUCT_CODE = RARCH-GENPLUSGX APP_UNIQUE_ID = 0xBAC06 - APP_ICON = ctr/assets/genesis_plus_gx.png - APP_BANNER = ctr/assets/genesis_plus_gx_banner.png + APP_ICON = pkg/ctr/assets/genesis_plus_gx.png + APP_BANNER = pkg/ctr/assets/genesis_plus_gx_banner.png else ifeq ($(LIBRETRO), mednafen_wswan) APP_TITLE = Mednafen wswan Libretro APP_PRODUCT_CODE = RARCH-M-WSWAN APP_UNIQUE_ID = 0xBAC08 - APP_ICON = ctr/assets/mednafen_wswan.png - APP_BANNER = ctr/assets/mednafen_wswan_banner.png + APP_ICON = pkg/ctr/assets/mednafen_wswan.png + APP_BANNER = pkg/ctr/assets/mednafen_wswan_banner.png else ifeq ($(LIBRETRO), mednafen_vb) APP_TITLE = Mednafen VB Libretro APP_PRODUCT_CODE = RARCH-M-VB APP_UNIQUE_ID = 0xBAC09 - APP_ICON = ctr/assets/mednafen_vb.png - APP_BANNER = ctr/assets/mednafen_vb_banner.png + APP_ICON = pkg/ctr/assets/mednafen_vb.png + APP_BANNER = pkg/ctr/assets/mednafen_vb_banner.png else ifeq ($(LIBRETRO), mednafen_ngp) APP_TITLE = Mednafen NGP Libretro APP_PRODUCT_CODE = RARCH-M-NGP APP_UNIQUE_ID = 0xBAC0A - APP_ICON = ctr/assets/mednafen_ngp.png - APP_BANNER = ctr/assets/mednafen_ngp_banner.png + APP_ICON = pkg/ctr/assets/mednafen_ngp.png + APP_BANNER = pkg/ctr/assets/mednafen_ngp_banner.png else ifeq ($(LIBRETRO), 2048) APP_TITLE = 2048 Libretro APP_PRODUCT_CODE = RARCH-2048 APP_UNIQUE_ID = 0xBAC0B - APP_ICON = ctr/assets/2048.png - APP_BANNER = ctr/assets/2048_banner.png + APP_ICON = pkg/ctr/assets/2048.png + APP_BANNER = pkg/ctr/assets/2048_banner.png else ifeq ($(LIBRETRO), picodrive) APP_TITLE = Picodrive Libretro APP_PRODUCT_CODE = RARCH-PICODRIVE APP_UNIQUE_ID = 0xBAC0C - APP_ICON = ctr/assets/picodrive.png - APP_BANNER = ctr/assets/picodrive_banner.png + APP_ICON = pkg/ctr/assets/picodrive.png + APP_BANNER = pkg/ctr/assets/picodrive_banner.png APP_USE_SVCHAX = 1 @@ -84,16 +84,16 @@ else ifeq ($(LIBRETRO), mgba) APP_AUTHOR = Jeffrey Pfau APP_PRODUCT_CODE = RARCH-MGBA APP_UNIQUE_ID = 0xBAC0E - APP_ICON = ctr/assets/mgba.png - APP_BANNER = ctr/assets/mgba_banner.png + APP_ICON = pkg/ctr/assets/mgba.png + APP_BANNER = pkg/ctr/assets/mgba_banner.png else ifeq ($(LIBRETRO), quicknes) APP_TITLE = QuickNES Libretro APP_AUTHOR = blargg, kode54 APP_PRODUCT_CODE = RARCH-QUICKNES APP_UNIQUE_ID = 0xBAC0F - APP_ICON = ctr/assets/quicknes.png - APP_BANNER = ctr/assets/quicknes_banner.png + APP_ICON = pkg/ctr/assets/quicknes.png + APP_BANNER = pkg/ctr/assets/quicknes_banner.png else ifeq ($(LIBRETRO), fbalpha2012) APP_TITLE = Final Burn Alpha 2012 @@ -101,16 +101,16 @@ else ifeq ($(LIBRETRO), fbalpha2012) APP_PRODUCT_CODE = RARCH-FBA APP_UNIQUE_ID = 0xBAC17 APP_BIG_TEXT_SECTION = 1 - APP_ICON = ctr/assets/fbalpha2012.png - APP_BANNER = ctr/assets/fbalpha2012_banner.png + APP_ICON = pkg/ctr/assets/fbalpha2012.png + APP_BANNER = pkg/ctr/assets/fbalpha2012_banner.png else ifeq ($(LIBRETRO), fbalpha2012_neogeo) APP_TITLE = Final Burn Alpha 2012 - NeoGeo APP_AUTHOR = Team FB Alpha APP_PRODUCT_CODE = RARCH-FBANEOGEO APP_UNIQUE_ID = 0xBAC10 - APP_ICON = ctr/assets/fbalpha2012_neogeo.png - APP_BANNER = ctr/assets/fbalpha2012_neogeo_banner.png + APP_ICON = pkg/ctr/assets/fbalpha2012_neogeo.png + APP_BANNER = pkg/ctr/assets/fbalpha2012_neogeo_banner.png APP_SYSTEM_MODE = 80MB else ifeq ($(LIBRETRO), fbalpha2012_cps1) @@ -118,16 +118,16 @@ else ifeq ($(LIBRETRO), fbalpha2012_cps1) APP_AUTHOR = Team FB Alpha APP_PRODUCT_CODE = RARCH-FBACPS1 APP_UNIQUE_ID = 0xBAC11 - APP_ICON = ctr/assets/fbalpha2012_cps1.png - APP_BANNER = ctr/assets/fbalpha2012_cps1_banner.png + APP_ICON = pkg/ctr/assets/fbalpha2012_cps1.png + APP_BANNER = pkg/ctr/assets/fbalpha2012_cps1_banner.png else ifeq ($(LIBRETRO), fbalpha2012_cps2) APP_TITLE = Final Burn Alpha 2012 - CPS-2 APP_AUTHOR = Team FB Alpha APP_PRODUCT_CODE = RARCH-FBACPS2 APP_UNIQUE_ID = 0xBAC12 - APP_ICON = ctr/assets/fbalpha2012_cps2.png - APP_BANNER = ctr/assets/fbalpha2012_cps2_banner.png + APP_ICON = pkg/ctr/assets/fbalpha2012_cps2.png + APP_BANNER = pkg/ctr/assets/fbalpha2012_cps2_banner.png APP_SYSTEM_MODE = 80MB @@ -136,16 +136,16 @@ else ifeq ($(LIBRETRO), mednafen_pce_fast) APP_AUTHOR = Ryphecha APP_PRODUCT_CODE = RARCH-M-PCE-FAST APP_UNIQUE_ID = 0xBAC14 - APP_ICON = ctr/assets/mednafen_pce_fast.png - APP_BANNER = ctr/assets/mednafen_pce_fast_banner.png + APP_ICON = pkg/ctr/assets/mednafen_pce_fast.png + APP_BANNER = pkg/ctr/assets/mednafen_pce_fast_banner.png else ifeq ($(LIBRETRO), pcsx_rearmed) APP_TITLE = PCSX ReARMed APP_AUTHOR = PCSX Team, notaz, Exophase APP_PRODUCT_CODE = RARCH-PCSXRARMD APP_UNIQUE_ID = 0xBAC15 - APP_ICON = ctr/assets/pcsx_rearmed.png - APP_BANNER = ctr/assets/pcsx_rearmed_banner.png + APP_ICON = pkg/ctr/assets/pcsx_rearmed.png + APP_BANNER = pkg/ctr/assets/pcsx_rearmed_banner.png APP_USE_SVCHAX = 1 else ifeq ($(LIBRETRO), fmsx) @@ -153,23 +153,23 @@ else ifeq ($(LIBRETRO), fmsx) APP_AUTHOR = Marat Fayzullin APP_PRODUCT_CODE = RARCH-FMSX APP_UNIQUE_ID = 0xBAC16 - APP_ICON = ctr/assets/fmsx.png - APP_BANNER = ctr/assets/fmsx_banner.png + APP_ICON = pkg/ctr/assets/fmsx.png + APP_BANNER = pkg/ctr/assets/fmsx_banner.png else ifeq ($(LIBRETRO), mame2000) APP_TITLE = MAME-2000 APP_PRODUCT_CODE = RARCH-MAME2000 APP_UNIQUE_ID = 0xBAC19 - APP_ICON = ctr/assets/mame2000.png - APP_BANNER = ctr/assets/mame2000_banner.png + APP_ICON = pkg/ctr/assets/mame2000.png + APP_BANNER = pkg/ctr/assets/mame2000_banner.png APP_BIG_TEXT_SECTION = 1 else ifeq ($(LIBRETRO), mame2003) APP_TITLE = MAME-2003 APP_PRODUCT_CODE = RARCH-MAME2003 APP_UNIQUE_ID = 0xBAC18 - APP_ICON = ctr/assets/mame2003.png - APP_BANNER = ctr/assets/mame2003_banner.png + APP_ICON = pkg/ctr/assets/mame2003.png + APP_BANNER = pkg/ctr/assets/mame2003_banner.png APP_BIG_TEXT_SECTION = 1 @@ -178,36 +178,68 @@ else ifeq ($(LIBRETRO), snes9x2002) APP_AUTHOR = various APP_PRODUCT_CODE = RARCH-POCKETSNES APP_UNIQUE_ID = 0xBAC1A - APP_ICON = ctr/assets/snes9x2002.png - APP_BANNER = ctr/assets/snes9x2002_banner.png + APP_ICON = pkg/ctr/assets/snes9x2002.png + APP_BANNER = pkg/ctr/assets/snes9x2002_banner.png else ifeq ($(LIBRETRO), snes9x2005) APP_TITLE = Snes9x 2005 APP_PRODUCT_CODE = RARCH-CATSFC APP_UNIQUE_ID = 0xBAC07 - APP_ICON = ctr/assets/snes9x2005.png - APP_BANNER = ctr/assets/snes9x2005_banner.png + APP_ICON = pkg/ctr/assets/snes9x2005.png + APP_BANNER = pkg/ctr/assets/snes9x2005_banner.png else ifeq ($(LIBRETRO), snes9x2005_plus) APP_TITLE = Snes9x 2005 Plus APP_PRODUCT_CODE = RARCH-CATSFCPLUS APP_UNIQUE_ID = 0xBAC13 - APP_ICON = ctr/assets/snes9x2005_plus.png - APP_BANNER = ctr/assets/snes9x2005_plus_banner.png + APP_ICON = pkg/ctr/assets/snes9x2005_plus.png + APP_BANNER = pkg/ctr/assets/snes9x2005_plus_banner.png else ifeq ($(LIBRETRO), snes9x2010) APP_TITLE = Snes9x 2010 APP_PRODUCT_CODE = RARCH-SNES9XNEXT APP_UNIQUE_ID = 0xBAC0D - APP_ICON = ctr/assets/snes9x2010.png - APP_BANNER = ctr/assets/snes9x2010_banner.png + APP_ICON = pkg/ctr/assets/snes9x2010.png + APP_BANNER = pkg/ctr/assets/snes9x2010_banner.png else ifeq ($(LIBRETRO), dosbox) APP_TITLE = DosBox APP_AUTHOR = various APP_PRODUCT_CODE = RARCH-DOSBOX APP_UNIQUE_ID = 0xBAC1B - APP_ICON = ctr/assets/dosbox.png - APP_BANNER = ctr/assets/dosbox_banner.png + APP_ICON = pkg/ctr/assets/dosbox.png + APP_BANNER = pkg/ctr/assets/dosbox_banner.png + +else ifeq ($(LIBRETRO), nekop2) + APP_TITLE = Neko Project 2 + APP_AUTHOR = various + APP_PRODUCT_CODE = RARCH-NP2 + APP_UNIQUE_ID = 0xBAC1C + APP_ICON = pkg/ctr/assets/nekop2.png + APP_BANNER = pkg/ctr/assets/nekop2_banner.png + +else ifeq ($(LIBRETRO), np2kai) + APP_TITLE = Neko Project 2 Kai + APP_AUTHOR = various + APP_PRODUCT_CODE = RARCH-NP2KAI + APP_UNIQUE_ID = 0xBAC1D + APP_ICON = pkg/ctr/assets/np2kai.png + APP_BANNER = pkg/ctr/assets/np2kai_banner.png + +else ifeq ($(LIBRETRO), 81) + APP_TITLE = lr-81 + APP_AUTHOR = various + APP_PRODUCT_CODE = RARCH-81 + APP_UNIQUE_ID = 0xBAC1E + APP_ICON = pkg/ctr/assets/81.png + APP_BANNER = pkg/ctr/assets/81_banner.png + +else ifeq ($(LIBRETRO), fuse) + APP_TITLE = Fuse + APP_AUTHOR = various + APP_PRODUCT_CODE = RARCH-FUSE + APP_UNIQUE_ID = 0xBAC1F + APP_ICON = pkg/ctr/assets/fuse.png + APP_BANNER = pkg/ctr/assets/fuse_banner.png endif diff --git a/ctr/assets/2048.png b/pkg/ctr/assets/2048.png similarity index 100% rename from ctr/assets/2048.png rename to pkg/ctr/assets/2048.png diff --git a/ctr/assets/2048_banner.png b/pkg/ctr/assets/2048_banner.png similarity index 100% rename from ctr/assets/2048_banner.png rename to pkg/ctr/assets/2048_banner.png diff --git a/ctr/assets/4do.png b/pkg/ctr/assets/4do.png similarity index 100% rename from ctr/assets/4do.png rename to pkg/ctr/assets/4do.png diff --git a/ctr/assets/4do_banner.png b/pkg/ctr/assets/4do_banner.png similarity index 100% rename from ctr/assets/4do_banner.png rename to pkg/ctr/assets/4do_banner.png diff --git a/pkg/ctr/assets/81.png b/pkg/ctr/assets/81.png new file mode 100644 index 0000000000..b0404d6731 Binary files /dev/null and b/pkg/ctr/assets/81.png differ diff --git a/pkg/ctr/assets/81_banner.png b/pkg/ctr/assets/81_banner.png new file mode 100644 index 0000000000..76697a38e1 Binary files /dev/null and b/pkg/ctr/assets/81_banner.png differ diff --git a/ctr/assets/assets.7z b/pkg/ctr/assets/assets.7z similarity index 100% rename from ctr/assets/assets.7z rename to pkg/ctr/assets/assets.7z diff --git a/ctr/assets/atari800.png b/pkg/ctr/assets/atari800.png similarity index 100% rename from ctr/assets/atari800.png rename to pkg/ctr/assets/atari800.png diff --git a/ctr/assets/atari800_banner.png b/pkg/ctr/assets/atari800_banner.png similarity index 100% rename from ctr/assets/atari800_banner.png rename to pkg/ctr/assets/atari800_banner.png diff --git a/ctr/assets/default.png b/pkg/ctr/assets/default.png similarity index 100% rename from ctr/assets/default.png rename to pkg/ctr/assets/default.png diff --git a/ctr/assets/dosbox.png b/pkg/ctr/assets/dosbox.png similarity index 100% rename from ctr/assets/dosbox.png rename to pkg/ctr/assets/dosbox.png diff --git a/ctr/assets/dosbox_banner.png b/pkg/ctr/assets/dosbox_banner.png similarity index 100% rename from ctr/assets/dosbox_banner.png rename to pkg/ctr/assets/dosbox_banner.png diff --git a/ctr/assets/fbalpha2012.png b/pkg/ctr/assets/fbalpha2012.png similarity index 100% rename from ctr/assets/fbalpha2012.png rename to pkg/ctr/assets/fbalpha2012.png diff --git a/ctr/assets/fbalpha2012_banner.png b/pkg/ctr/assets/fbalpha2012_banner.png similarity index 100% rename from ctr/assets/fbalpha2012_banner.png rename to pkg/ctr/assets/fbalpha2012_banner.png diff --git a/ctr/assets/fbalpha2012_cps1.png b/pkg/ctr/assets/fbalpha2012_cps1.png similarity index 100% rename from ctr/assets/fbalpha2012_cps1.png rename to pkg/ctr/assets/fbalpha2012_cps1.png diff --git a/ctr/assets/fbalpha2012_cps1_banner.png b/pkg/ctr/assets/fbalpha2012_cps1_banner.png similarity index 100% rename from ctr/assets/fbalpha2012_cps1_banner.png rename to pkg/ctr/assets/fbalpha2012_cps1_banner.png diff --git a/ctr/assets/fbalpha2012_cps2.png b/pkg/ctr/assets/fbalpha2012_cps2.png similarity index 100% rename from ctr/assets/fbalpha2012_cps2.png rename to pkg/ctr/assets/fbalpha2012_cps2.png diff --git a/ctr/assets/fbalpha2012_cps2_banner.png b/pkg/ctr/assets/fbalpha2012_cps2_banner.png similarity index 100% rename from ctr/assets/fbalpha2012_cps2_banner.png rename to pkg/ctr/assets/fbalpha2012_cps2_banner.png diff --git a/ctr/assets/fbalpha2012_cps3.png b/pkg/ctr/assets/fbalpha2012_cps3.png similarity index 100% rename from ctr/assets/fbalpha2012_cps3.png rename to pkg/ctr/assets/fbalpha2012_cps3.png diff --git a/ctr/assets/fbalpha2012_cps3_banner.png b/pkg/ctr/assets/fbalpha2012_cps3_banner.png similarity index 100% rename from ctr/assets/fbalpha2012_cps3_banner.png rename to pkg/ctr/assets/fbalpha2012_cps3_banner.png diff --git a/ctr/assets/fbalpha2012_neogeo.png b/pkg/ctr/assets/fbalpha2012_neogeo.png similarity index 100% rename from ctr/assets/fbalpha2012_neogeo.png rename to pkg/ctr/assets/fbalpha2012_neogeo.png diff --git a/ctr/assets/fbalpha2012_neogeo_banner.png b/pkg/ctr/assets/fbalpha2012_neogeo_banner.png similarity index 100% rename from ctr/assets/fbalpha2012_neogeo_banner.png rename to pkg/ctr/assets/fbalpha2012_neogeo_banner.png diff --git a/ctr/assets/fceumm.png b/pkg/ctr/assets/fceumm.png similarity index 100% rename from ctr/assets/fceumm.png rename to pkg/ctr/assets/fceumm.png diff --git a/ctr/assets/fceumm_banner.png b/pkg/ctr/assets/fceumm_banner.png similarity index 100% rename from ctr/assets/fceumm_banner.png rename to pkg/ctr/assets/fceumm_banner.png diff --git a/ctr/assets/fmsx.png b/pkg/ctr/assets/fmsx.png similarity index 100% rename from ctr/assets/fmsx.png rename to pkg/ctr/assets/fmsx.png diff --git a/ctr/assets/fmsx_banner.png b/pkg/ctr/assets/fmsx_banner.png similarity index 100% rename from ctr/assets/fmsx_banner.png rename to pkg/ctr/assets/fmsx_banner.png diff --git a/ctr/assets/fuse.png b/pkg/ctr/assets/fuse.png similarity index 100% rename from ctr/assets/fuse.png rename to pkg/ctr/assets/fuse.png diff --git a/ctr/assets/fuse_banner.png b/pkg/ctr/assets/fuse_banner.png similarity index 100% rename from ctr/assets/fuse_banner.png rename to pkg/ctr/assets/fuse_banner.png diff --git a/ctr/assets/gambatte.png b/pkg/ctr/assets/gambatte.png similarity index 100% rename from ctr/assets/gambatte.png rename to pkg/ctr/assets/gambatte.png diff --git a/ctr/assets/gambatte_banner.png b/pkg/ctr/assets/gambatte_banner.png similarity index 100% rename from ctr/assets/gambatte_banner.png rename to pkg/ctr/assets/gambatte_banner.png diff --git a/ctr/assets/genesis_plus_gx.png b/pkg/ctr/assets/genesis_plus_gx.png similarity index 100% rename from ctr/assets/genesis_plus_gx.png rename to pkg/ctr/assets/genesis_plus_gx.png diff --git a/ctr/assets/genesis_plus_gx_banner.png b/pkg/ctr/assets/genesis_plus_gx_banner.png similarity index 100% rename from ctr/assets/genesis_plus_gx_banner.png rename to pkg/ctr/assets/genesis_plus_gx_banner.png diff --git a/ctr/assets/gpsp.png b/pkg/ctr/assets/gpsp.png similarity index 100% rename from ctr/assets/gpsp.png rename to pkg/ctr/assets/gpsp.png diff --git a/ctr/assets/gpsp_banner.png b/pkg/ctr/assets/gpsp_banner.png similarity index 100% rename from ctr/assets/gpsp_banner.png rename to pkg/ctr/assets/gpsp_banner.png diff --git a/ctr/assets/gw.png b/pkg/ctr/assets/gw.png similarity index 100% rename from ctr/assets/gw.png rename to pkg/ctr/assets/gw.png diff --git a/ctr/assets/gw_banner.png b/pkg/ctr/assets/gw_banner.png similarity index 100% rename from ctr/assets/gw_banner.png rename to pkg/ctr/assets/gw_banner.png diff --git a/ctr/assets/handy.png b/pkg/ctr/assets/handy.png similarity index 100% rename from ctr/assets/handy.png rename to pkg/ctr/assets/handy.png diff --git a/ctr/assets/handy_banner.png b/pkg/ctr/assets/handy_banner.png similarity index 100% rename from ctr/assets/handy_banner.png rename to pkg/ctr/assets/handy_banner.png diff --git a/ctr/assets/libretro_banner.png b/pkg/ctr/assets/libretro_banner.png similarity index 100% rename from ctr/assets/libretro_banner.png rename to pkg/ctr/assets/libretro_banner.png diff --git a/pkg/ctr/assets/libretro_neutral_shaded_banner.png b/pkg/ctr/assets/libretro_neutral_shaded_banner.png new file mode 100644 index 0000000000..dbfa96dd4a Binary files /dev/null and b/pkg/ctr/assets/libretro_neutral_shaded_banner.png differ diff --git a/ctr/assets/mame2000.png b/pkg/ctr/assets/mame2000.png similarity index 100% rename from ctr/assets/mame2000.png rename to pkg/ctr/assets/mame2000.png diff --git a/ctr/assets/mame2000_banner.png b/pkg/ctr/assets/mame2000_banner.png similarity index 100% rename from ctr/assets/mame2000_banner.png rename to pkg/ctr/assets/mame2000_banner.png diff --git a/ctr/assets/mame2003.png b/pkg/ctr/assets/mame2003.png similarity index 100% rename from ctr/assets/mame2003.png rename to pkg/ctr/assets/mame2003.png diff --git a/ctr/assets/mame2003_banner.png b/pkg/ctr/assets/mame2003_banner.png similarity index 100% rename from ctr/assets/mame2003_banner.png rename to pkg/ctr/assets/mame2003_banner.png diff --git a/ctr/assets/mednafen_ngp.png b/pkg/ctr/assets/mednafen_ngp.png similarity index 100% rename from ctr/assets/mednafen_ngp.png rename to pkg/ctr/assets/mednafen_ngp.png diff --git a/ctr/assets/mednafen_ngp_banner.png b/pkg/ctr/assets/mednafen_ngp_banner.png similarity index 100% rename from ctr/assets/mednafen_ngp_banner.png rename to pkg/ctr/assets/mednafen_ngp_banner.png diff --git a/ctr/assets/mednafen_pce_fast.png b/pkg/ctr/assets/mednafen_pce_fast.png similarity index 100% rename from ctr/assets/mednafen_pce_fast.png rename to pkg/ctr/assets/mednafen_pce_fast.png diff --git a/ctr/assets/mednafen_pce_fast_banner.png b/pkg/ctr/assets/mednafen_pce_fast_banner.png similarity index 100% rename from ctr/assets/mednafen_pce_fast_banner.png rename to pkg/ctr/assets/mednafen_pce_fast_banner.png diff --git a/ctr/assets/mednafen_vb.png b/pkg/ctr/assets/mednafen_vb.png similarity index 100% rename from ctr/assets/mednafen_vb.png rename to pkg/ctr/assets/mednafen_vb.png diff --git a/ctr/assets/mednafen_vb_banner.png b/pkg/ctr/assets/mednafen_vb_banner.png similarity index 100% rename from ctr/assets/mednafen_vb_banner.png rename to pkg/ctr/assets/mednafen_vb_banner.png diff --git a/ctr/assets/mednafen_wswan.png b/pkg/ctr/assets/mednafen_wswan.png similarity index 100% rename from ctr/assets/mednafen_wswan.png rename to pkg/ctr/assets/mednafen_wswan.png diff --git a/ctr/assets/mednafen_wswan_banner.png b/pkg/ctr/assets/mednafen_wswan_banner.png similarity index 100% rename from ctr/assets/mednafen_wswan_banner.png rename to pkg/ctr/assets/mednafen_wswan_banner.png diff --git a/ctr/assets/mgba.png b/pkg/ctr/assets/mgba.png similarity index 100% rename from ctr/assets/mgba.png rename to pkg/ctr/assets/mgba.png diff --git a/ctr/assets/mgba_banner.png b/pkg/ctr/assets/mgba_banner.png similarity index 100% rename from ctr/assets/mgba_banner.png rename to pkg/ctr/assets/mgba_banner.png diff --git a/pkg/ctr/assets/nekop2.png b/pkg/ctr/assets/nekop2.png new file mode 100644 index 0000000000..d7695ba10e Binary files /dev/null and b/pkg/ctr/assets/nekop2.png differ diff --git a/pkg/ctr/assets/nekop2_banner.png b/pkg/ctr/assets/nekop2_banner.png new file mode 100644 index 0000000000..c97662eb6e Binary files /dev/null and b/pkg/ctr/assets/nekop2_banner.png differ diff --git a/ctr/assets/nestopia.png b/pkg/ctr/assets/nestopia.png similarity index 100% rename from ctr/assets/nestopia.png rename to pkg/ctr/assets/nestopia.png diff --git a/ctr/assets/nestopia_banner.png b/pkg/ctr/assets/nestopia_banner.png similarity index 100% rename from ctr/assets/nestopia_banner.png rename to pkg/ctr/assets/nestopia_banner.png diff --git a/pkg/ctr/assets/np2kai.png b/pkg/ctr/assets/np2kai.png new file mode 100644 index 0000000000..d7695ba10e Binary files /dev/null and b/pkg/ctr/assets/np2kai.png differ diff --git a/pkg/ctr/assets/np2kai_banner.png b/pkg/ctr/assets/np2kai_banner.png new file mode 100644 index 0000000000..83a82db0f6 Binary files /dev/null and b/pkg/ctr/assets/np2kai_banner.png differ diff --git a/ctr/assets/nxengine.png b/pkg/ctr/assets/nxengine.png similarity index 100% rename from ctr/assets/nxengine.png rename to pkg/ctr/assets/nxengine.png diff --git a/ctr/assets/nxengine_banner.png b/pkg/ctr/assets/nxengine_banner.png similarity index 100% rename from ctr/assets/nxengine_banner.png rename to pkg/ctr/assets/nxengine_banner.png diff --git a/ctr/assets/o2em.png b/pkg/ctr/assets/o2em.png similarity index 100% rename from ctr/assets/o2em.png rename to pkg/ctr/assets/o2em.png diff --git a/ctr/assets/o2em_banner.png b/pkg/ctr/assets/o2em_banner.png similarity index 100% rename from ctr/assets/o2em_banner.png rename to pkg/ctr/assets/o2em_banner.png diff --git a/ctr/assets/pcsx_rearmed.png b/pkg/ctr/assets/pcsx_rearmed.png similarity index 100% rename from ctr/assets/pcsx_rearmed.png rename to pkg/ctr/assets/pcsx_rearmed.png diff --git a/ctr/assets/pcsx_rearmed_banner.png b/pkg/ctr/assets/pcsx_rearmed_banner.png similarity index 100% rename from ctr/assets/pcsx_rearmed_banner.png rename to pkg/ctr/assets/pcsx_rearmed_banner.png diff --git a/ctr/assets/picodrive.png b/pkg/ctr/assets/picodrive.png similarity index 100% rename from ctr/assets/picodrive.png rename to pkg/ctr/assets/picodrive.png diff --git a/ctr/assets/picodrive_banner.png b/pkg/ctr/assets/picodrive_banner.png similarity index 100% rename from ctr/assets/picodrive_banner.png rename to pkg/ctr/assets/picodrive_banner.png diff --git a/ctr/assets/prosystem.png b/pkg/ctr/assets/prosystem.png similarity index 100% rename from ctr/assets/prosystem.png rename to pkg/ctr/assets/prosystem.png diff --git a/ctr/assets/prosystem_banner.png b/pkg/ctr/assets/prosystem_banner.png similarity index 100% rename from ctr/assets/prosystem_banner.png rename to pkg/ctr/assets/prosystem_banner.png diff --git a/ctr/assets/quicknes.png b/pkg/ctr/assets/quicknes.png similarity index 100% rename from ctr/assets/quicknes.png rename to pkg/ctr/assets/quicknes.png diff --git a/ctr/assets/quicknes_banner.png b/pkg/ctr/assets/quicknes_banner.png similarity index 100% rename from ctr/assets/quicknes_banner.png rename to pkg/ctr/assets/quicknes_banner.png diff --git a/ctr/assets/silent.wav b/pkg/ctr/assets/silent.wav similarity index 100% rename from ctr/assets/silent.wav rename to pkg/ctr/assets/silent.wav diff --git a/ctr/assets/snes9x2002.png b/pkg/ctr/assets/snes9x2002.png similarity index 100% rename from ctr/assets/snes9x2002.png rename to pkg/ctr/assets/snes9x2002.png diff --git a/ctr/assets/snes9x2002_banner.png b/pkg/ctr/assets/snes9x2002_banner.png similarity index 100% rename from ctr/assets/snes9x2002_banner.png rename to pkg/ctr/assets/snes9x2002_banner.png diff --git a/ctr/assets/snes9x2005.png b/pkg/ctr/assets/snes9x2005.png similarity index 100% rename from ctr/assets/snes9x2005.png rename to pkg/ctr/assets/snes9x2005.png diff --git a/ctr/assets/snes9x2005_banner.png b/pkg/ctr/assets/snes9x2005_banner.png similarity index 100% rename from ctr/assets/snes9x2005_banner.png rename to pkg/ctr/assets/snes9x2005_banner.png diff --git a/ctr/assets/snes9x2005_plus.png b/pkg/ctr/assets/snes9x2005_plus.png similarity index 100% rename from ctr/assets/snes9x2005_plus.png rename to pkg/ctr/assets/snes9x2005_plus.png diff --git a/ctr/assets/snes9x2005_plus_banner.png b/pkg/ctr/assets/snes9x2005_plus_banner.png similarity index 100% rename from ctr/assets/snes9x2005_plus_banner.png rename to pkg/ctr/assets/snes9x2005_plus_banner.png diff --git a/ctr/assets/snes9x2010.png b/pkg/ctr/assets/snes9x2010.png similarity index 100% rename from ctr/assets/snes9x2010.png rename to pkg/ctr/assets/snes9x2010.png diff --git a/ctr/assets/snes9x2010_banner.png b/pkg/ctr/assets/snes9x2010_banner.png similarity index 100% rename from ctr/assets/snes9x2010_banner.png rename to pkg/ctr/assets/snes9x2010_banner.png diff --git a/ctr/assets/stella.png b/pkg/ctr/assets/stella.png similarity index 100% rename from ctr/assets/stella.png rename to pkg/ctr/assets/stella.png diff --git a/ctr/assets/stella_banner.png b/pkg/ctr/assets/stella_banner.png similarity index 100% rename from ctr/assets/stella_banner.png rename to pkg/ctr/assets/stella_banner.png diff --git a/ctr/assets/vecx.png b/pkg/ctr/assets/vecx.png similarity index 100% rename from ctr/assets/vecx.png rename to pkg/ctr/assets/vecx.png diff --git a/ctr/assets/vecx_banner.png b/pkg/ctr/assets/vecx_banner.png similarity index 100% rename from ctr/assets/vecx_banner.png rename to pkg/ctr/assets/vecx_banner.png diff --git a/ctr/assets/virtualjaguar.png b/pkg/ctr/assets/virtualjaguar.png similarity index 100% rename from ctr/assets/virtualjaguar.png rename to pkg/ctr/assets/virtualjaguar.png diff --git a/ctr/assets/virtualjaguar_banner.png b/pkg/ctr/assets/virtualjaguar_banner.png similarity index 100% rename from ctr/assets/virtualjaguar_banner.png rename to pkg/ctr/assets/virtualjaguar_banner.png diff --git a/ctr/assets/yabause.png b/pkg/ctr/assets/yabause.png similarity index 100% rename from ctr/assets/yabause.png rename to pkg/ctr/assets/yabause.png diff --git a/ctr/assets/yabause_banner.png b/pkg/ctr/assets/yabause_banner.png similarity index 100% rename from ctr/assets/yabause_banner.png rename to pkg/ctr/assets/yabause_banner.png diff --git a/ctr/big_text_section.xml b/pkg/ctr/big_text_section.xml similarity index 100% rename from ctr/big_text_section.xml rename to pkg/ctr/big_text_section.xml diff --git a/ctr/tools/bannertool-linux b/pkg/ctr/tools/bannertool-linux similarity index 100% rename from ctr/tools/bannertool-linux rename to pkg/ctr/tools/bannertool-linux diff --git a/ctr/tools/bannertool-mac b/pkg/ctr/tools/bannertool-mac similarity index 100% rename from ctr/tools/bannertool-mac rename to pkg/ctr/tools/bannertool-mac diff --git a/ctr/tools/bannertool.exe b/pkg/ctr/tools/bannertool.exe similarity index 100% rename from ctr/tools/bannertool.exe rename to pkg/ctr/tools/bannertool.exe diff --git a/ctr/tools/makerom-linux b/pkg/ctr/tools/makerom-linux similarity index 100% rename from ctr/tools/makerom-linux rename to pkg/ctr/tools/makerom-linux diff --git a/ctr/tools/makerom-mac b/pkg/ctr/tools/makerom-mac similarity index 100% rename from ctr/tools/makerom-mac rename to pkg/ctr/tools/makerom-mac diff --git a/ctr/tools/makerom.exe b/pkg/ctr/tools/makerom.exe similarity index 100% rename from ctr/tools/makerom.exe rename to pkg/ctr/tools/makerom.exe diff --git a/ctr/tools/template.rsf b/pkg/ctr/tools/template.rsf similarity index 100% rename from ctr/tools/template.rsf rename to pkg/ctr/tools/template.rsf diff --git a/pkg/msvc/msvc-2003/RetroArch-msvc2003.vcproj b/pkg/msvc/msvc-2003/RetroArch-msvc2003.vcproj index dcae17a7a8..143fe63efe 100644 --- a/pkg/msvc/msvc-2003/RetroArch-msvc2003.vcproj +++ b/pkg/msvc/msvc-2003/RetroArch-msvc2003.vcproj @@ -21,7 +21,7 @@ Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories=""$(SolutionDir)\..\..\libretro-common\include";"$(SolutionDir)\..\..\libretro-common\include\compat\msvc";"$(SolutionDir)\..\..\deps";"$(SolutionDir)\..\..\deps\stb";"$(SolutionDir)\..\..\gfx\include"" - PreprocessorDefinitions="_WIN32;WINVER=0x0400;_WIN32_WINNT=0x0400;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_GRIFFIN;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;WANT_ZLIB;HAVE_DINPUT;HAVE_DSOUND;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;__STDC_CONSTANT_MACROS" + PreprocessorDefinitions="_WIN32;WINVER=0x0400;_WIN32_WINNT=0x0400;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_GRIFFIN;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;WANT_ZLIB;HAVE_DINPUT;HAVE_DSOUND;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;__STDC_CONSTANT_MACROS" MinimalRebuild="TRUE" BasicRuntimeChecks="3" RuntimeLibrary="5" @@ -70,7 +70,7 @@ Level3 Disabled - WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT + WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) MultiThreadedDebug CompileAsCpp @@ -201,7 +201,7 @@ Level3 Disabled - WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_CG;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_FBO;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT + WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_CG;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(CG_INC_PATH);$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) MultiThreadedDebug CompileAsCpp @@ -221,7 +221,7 @@ Level3 Disabled - WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_SECURE_NO_WARNINGS;__SSE__;__SSE2__;__x86_64__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT + WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_SECURE_NO_WARNINGS;__SSE__;__SSE2__;__x86_64__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) MultiThreadedDebug CompileAsCpp @@ -240,7 +240,7 @@ Level3 Disabled - WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_CG;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_FBO;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_SECURE_NO_WARNINGS;__SSE__;__SSE2__;__x86_64__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT + WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_CG;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_SECURE_NO_WARNINGS;__SSE__;__SSE2__;__x86_64__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(CG_INC_PATH);$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) MultiThreadedDebug CompileAsCpp @@ -262,7 +262,7 @@ MaxSpeed true true - WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_GL_SYNC;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT + WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_GL_SYNC;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) MultiThreaded CompileAsCpp @@ -286,7 +286,7 @@ MaxSpeed true true - WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_CG;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_FBO;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;WANT_ZLIB;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_GL_SYNC;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT + WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_CG;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;WANT_ZLIB;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_GL_SYNC;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(CG_INC_PATH);$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) MultiThreaded CompileAsCpp @@ -311,7 +311,7 @@ MaxSpeed true true - WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;_CRT_SECURE_NO_WARNINGS;__SSE__;__SSE2__;__x86_64__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT + WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;_CRT_SECURE_NO_WARNINGS;__SSE__;__SSE2__;__x86_64__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) MultiThreaded CompileAsCpp @@ -335,7 +335,7 @@ MaxSpeed true true - WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_CG;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_FBO;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;WANT_ZLIB;_CRT_SECURE_NO_WARNINGS;__SSE__;__SSE2__;__x86_64__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT + WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_CG;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;WANT_ZLIB;_CRT_SECURE_NO_WARNINGS;__SSE__;__SSE2__;__x86_64__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(CG_INC_PATH);$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) MultiThreaded CompileAsCpp diff --git a/pkg/msvc/msvc-2015/RetroArch-msvc2015.vcxproj b/pkg/msvc/msvc-2015/RetroArch-msvc2015.vcxproj index 00a0edcfe3..20411f8586 100644 --- a/pkg/msvc/msvc-2015/RetroArch-msvc2015.vcxproj +++ b/pkg/msvc/msvc-2015/RetroArch-msvc2015.vcxproj @@ -190,7 +190,7 @@ Level3 Disabled - WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT + WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) MultiThreadedDebug CompileAsCpp @@ -209,7 +209,7 @@ Level3 Disabled - WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_CG;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_FBO;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT + WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_CG;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(CG_INC_PATH);$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) MultiThreadedDebug CompileAsCpp @@ -229,7 +229,7 @@ Level3 Disabled - WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_SECURE_NO_WARNINGS;__SSE__;__SSE2__;__x86_64__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT + WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_SECURE_NO_WARNINGS;__SSE__;__SSE2__;__x86_64__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) MultiThreadedDebug CompileAsCpp @@ -248,7 +248,7 @@ Level3 Disabled - WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_CG;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_FBO;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_SECURE_NO_WARNINGS;__SSE__;__SSE2__;__x86_64__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT + WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_CG;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_SECURE_NO_WARNINGS;__SSE__;__SSE2__;__x86_64__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(CG_INC_PATH);$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) MultiThreadedDebug CompileAsCpp @@ -270,7 +270,7 @@ MaxSpeed true true - WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_GL_SYNC;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT + WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_GL_SYNC;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) MultiThreaded CompileAsCpp @@ -294,7 +294,7 @@ MaxSpeed true true - WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_CG;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_FBO;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;WANT_ZLIB;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_GL_SYNC;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT + WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_CG;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;WANT_ZLIB;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_GL_SYNC;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(CG_INC_PATH);$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) MultiThreaded CompileAsCpp @@ -319,7 +319,7 @@ MaxSpeed true true - WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;_CRT_SECURE_NO_WARNINGS;__SSE__;__SSE2__;__x86_64__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT + WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;_CRT_SECURE_NO_WARNINGS;__SSE__;__SSE2__;__x86_64__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) MultiThreaded CompileAsCpp @@ -343,7 +343,7 @@ MaxSpeed true true - WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_CG;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_FBO;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;WANT_ZLIB;_CRT_SECURE_NO_WARNINGS;__SSE__;__SSE2__;__x86_64__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT + WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_CG;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;WANT_ZLIB;_CRT_SECURE_NO_WARNINGS;__SSE__;__SSE2__;__x86_64__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(CG_INC_PATH);$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) MultiThreaded CompileAsCpp diff --git a/pkg/msvc/msvc-6/RetroArch/RetroArch.dsp b/pkg/msvc/msvc-6/RetroArch/RetroArch.dsp index f0765d9130..035a7bea88 100644 --- a/pkg/msvc/msvc-6/RetroArch/RetroArch.dsp +++ b/pkg/msvc/msvc-6/RetroArch/RetroArch.dsp @@ -42,7 +42,7 @@ RSC=rc.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /w /W0 /GX /O2 /I "../../../../libretro-common/include" /I "../../../../libretro-common/include/compat/msvc" /I "../../../../deps" /I "../../../../deps/stb" /I "$(ProgramFiles)/Microsoft Platform SDK/include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D _WIN32_WINNT=0x0351 /D "RARCH_INTERNAL" /D "HAVE_CC_RESAMPLER" /D "HAVE_GRIFFIN" /D "HAVE_FBO" /D "HAVE_ZLIB" /D "HAVE_RPNG" /D "HAVE_RJPEG" /D "HAVE_RBMP" /D "HAVE_RTGA" /D "HAVE_IMAGEVIEWER" /D "HAVE_XMB" /D "WANT_ZLIB" /D "HAVE_DYLIB" /D "HAVE_NETWORK_CMD" /D "HAVE_COMMAND" /D "HAVE_STDIN_CMD" /D "HAVE_THREADS" /D "HAVE_DYNAMIC" /D "HAVE_OVERLAY" /D "HAVE_RGUI" /D "HAVE_MENU" /D "HAVE_7ZIP" /D "HAVE_MATERIALUI" /D "HAVE_LIBRETRODB" /D "HAVE_STB_FONT" /D "__STDC_CONSTANT_MACROS" /YX /FD /c +# ADD CPP /nologo /w /W0 /GX /O2 /I "../../../../libretro-common/include" /I "../../../../libretro-common/include/compat/msvc" /I "../../../../deps" /I "../../../../deps/stb" /I "$(ProgramFiles)/Microsoft Platform SDK/include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D _WIN32_WINNT=0x0351 /D "RARCH_INTERNAL" /D "HAVE_CC_RESAMPLER" /D "HAVE_GRIFFIN" /D "HAVE_ZLIB" /D "HAVE_RPNG" /D "HAVE_RJPEG" /D "HAVE_RBMP" /D "HAVE_RTGA" /D "HAVE_IMAGEVIEWER" /D "HAVE_XMB" /D "WANT_ZLIB" /D "HAVE_DYLIB" /D "HAVE_NETWORK_CMD" /D "HAVE_COMMAND" /D "HAVE_STDIN_CMD" /D "HAVE_THREADS" /D "HAVE_DYNAMIC" /D "HAVE_OVERLAY" /D "HAVE_RGUI" /D "HAVE_MENU" /D "HAVE_7ZIP" /D "HAVE_MATERIALUI" /D "HAVE_LIBRETRODB" /D "HAVE_STB_FONT" /D "__STDC_CONSTANT_MACROS" /YX /FD /c # SUBTRACT CPP /Fr # ADD BASE RSC /l 0x411 /d "NDEBUG" # ADD RSC /l 0x809 /d "NDEBUG" @@ -68,7 +68,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /w /W0 /Gm /GX /ZI /Od /I "../../../../libretro-common/include" /I "../../../../libretro-common/include/compat/msvc" /I "../../../../deps" /I "../../../../deps/stb" /I "$(ProgramFiles)/Microsoft Platform SDK/include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D _WIN32_WINNT=0x0351 /D "RARCH_INTERNAL" /D "HAVE_CC_RESAMPLER" /D "HAVE_GRIFFIN" /D "HAVE_FBO" /D "HAVE_ZLIB" /D "HAVE_RPNG" /D "HAVE_RJPEG" /D "HAVE_RBMP" /D "HAVE_RTGA" /D "HAVE_IMAGEVIEWER" /D "HAVE_XMB" /D "WANT_ZLIB" /D "HAVE_DYLIB" /D "HAVE_NETWORK_CMD" /D "HAVE_COMMAND" /D "HAVE_STDIN_CMD" /D "HAVE_THREADS" /D "HAVE_DYNAMIC" /D "HAVE_OVERLAY" /D "HAVE_RGUI" /D "HAVE_MENU" /D "HAVE_7ZIP" /D "HAVE_MATERIALUI" /D "HAVE_LIBRETRODB" /D "HAVE_STB_FONT" /D "__STDC_CONSTANT_MACROS" /YX /FD /GZ /c +# ADD CPP /nologo /w /W0 /Gm /GX /ZI /Od /I "../../../../libretro-common/include" /I "../../../../libretro-common/include/compat/msvc" /I "../../../../deps" /I "../../../../deps/stb" /I "$(ProgramFiles)/Microsoft Platform SDK/include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D _WIN32_WINNT=0x0351 /D "RARCH_INTERNAL" /D "HAVE_CC_RESAMPLER" /D "HAVE_GRIFFIN" /D "HAVE_ZLIB" /D "HAVE_RPNG" /D "HAVE_RJPEG" /D "HAVE_RBMP" /D "HAVE_RTGA" /D "HAVE_IMAGEVIEWER" /D "HAVE_XMB" /D "WANT_ZLIB" /D "HAVE_DYLIB" /D "HAVE_NETWORK_CMD" /D "HAVE_COMMAND" /D "HAVE_STDIN_CMD" /D "HAVE_THREADS" /D "HAVE_DYNAMIC" /D "HAVE_OVERLAY" /D "HAVE_RGUI" /D "HAVE_MENU" /D "HAVE_7ZIP" /D "HAVE_MATERIALUI" /D "HAVE_LIBRETRODB" /D "HAVE_STB_FONT" /D "__STDC_CONSTANT_MACROS" /YX /FD /GZ /c # SUBTRACT CPP /Fr # ADD BASE RSC /l 0x411 /d "_DEBUG" # ADD RSC /l 0x411 /d "_DEBUG" diff --git a/pkg/qnx/.cproject b/pkg/qnx/.cproject index 6953a740c6..c9d2ad9f6e 100644 --- a/pkg/qnx/.cproject +++ b/pkg/qnx/.cproject @@ -55,7 +55,6 @@ - @@ -119,7 +118,6 @@ - @@ -244,7 +242,6 @@ - @@ -308,7 +305,6 @@ - @@ -436,7 +432,6 @@ - @@ -500,7 +495,6 @@ - @@ -625,7 +619,6 @@ - @@ -689,7 +682,6 @@ - diff --git a/playlist.c b/playlist.c index c410fbb5f2..2c22d9243d 100644 --- a/playlist.c +++ b/playlist.c @@ -121,8 +121,6 @@ void playlist_delete_index(playlist_t *playlist, playlist->size = playlist->size - 1; playlist->modified = true; - - playlist_write_file(playlist); } void playlist_get_index_by_path(playlist_t *playlist, @@ -283,17 +281,19 @@ bool playlist_push(playlist_t *playlist, const char *db_name) { size_t i; + bool core_path_empty = string_is_empty(core_path); + bool core_name_empty = string_is_empty(core_name); - if (string_is_empty(core_path) || string_is_empty(core_name)) + if (core_path_empty || core_name_empty) { - if (string_is_empty(core_name) && !string_is_empty(core_path)) + if (core_name_empty && !core_path_empty) { static char base_path[255] = {0}; fill_pathname_base_noext(base_path, core_path, sizeof(base_path)); core_name = base_path; } - if (string_is_empty(core_path) || string_is_empty(core_name)) + if (core_path_empty || core_name_empty) { RARCH_ERR("cannot push NULL or empty core name into the playlist.\n"); return false; @@ -381,22 +381,23 @@ void playlist_write_file(playlist_t *playlist) { size_t i; RFILE *file = NULL; + FILE *fp = NULL; if (!playlist || !playlist->modified) return; file = filestream_open(playlist->conf_path, RFILE_MODE_WRITE, -1); - RARCH_LOG("Trying to write to playlist file: %s\n", playlist->conf_path); - if (!file) { RARCH_ERR("Failed to write to playlist file: %s\n", playlist->conf_path); return; } + fp = filestream_get_fp(file); + for (i = 0; i < playlist->size; i++) - fprintf(filestream_get_fp(file), "%s\n%s\n%s\n%s\n%s\n%s\n", + fprintf(fp, "%s\n%s\n%s\n%s\n%s\n%s\n", playlist->entries[i].path ? playlist->entries[i].path : "", playlist->entries[i].label ? playlist->entries[i].label : "", playlist->entries[i].core_path, @@ -406,6 +407,9 @@ void playlist_write_file(playlist_t *playlist) ); playlist->modified = false; + + RARCH_LOG("Written to playlist file: %s\n", playlist->conf_path); + filestream_close(file); } diff --git a/qb/config.comp.sh b/qb/config.comp.sh index f0fcc84844..1ce76eeb14 100644 --- a/qb/config.comp.sh +++ b/qb/config.comp.sh @@ -4,4 +4,3 @@ USE_LANG_C="yes" if [ "$OS" = 'Win32' ]; then USE_LANG_CXX="yes" fi - diff --git a/qb/config.libs.sh b/qb/config.libs.sh index 0b3bb404d5..615c36853c 100644 --- a/qb/config.libs.sh +++ b/qb/config.libs.sh @@ -1,14 +1,13 @@ -check_switch_c C99 -std=gnu99 "Cannot find C99 compatible compiler." - -check_switch_c NOUNUSED -Wno-unused-result -add_define_make NOUNUSED "$HAVE_NOUNUSED" -check_switch_c NOUNUSED_VARIABLE -Wno-unused-variable -add_define_make NOUNUSED_VARIABLE "$HAVE_NOUNUSED_VARIABLE" +check_switch '' C99 -std=gnu99 "Cannot find C99 compatible compiler." +check_switch '' NOUNUSED -Wno-unused-result +add_define MAKEFILE NOUNUSED "$HAVE_NOUNUSED" +check_switch '' NOUNUSED_VARIABLE -Wno-unused-variable +add_define MAKEFILE NOUNUSED_VARIABLE "$HAVE_NOUNUSED_VARIABLE" # There are still broken 64-bit Linux distros out there. :) -[ -z "$CROSS_COMPILE" ] && [ -d /usr/lib64 ] && add_library_dirs /usr/lib64 +[ -z "$CROSS_COMPILE" ] && [ -d /usr/lib64 ] && add_dirs LIBRARY /usr/lib64 -[ -z "$CROSS_COMPILE" ] && [ -d /opt/local/lib ] && add_library_dirs /opt/local/lib +[ -z "$CROSS_COMPILE" ] && [ -d /opt/local/lib ] && add_dirs LIBRARY /opt/local/lib [ "$GLOBAL_CONFIG_DIR" ] || \ { case "$PREFIX" in @@ -30,16 +29,16 @@ elif [ "$OS" = 'Haiku' ]; then CLIB=-lroot PTHREADLIB=-lroot SOCKETLIB=-lnetwork + CFLAGS="$CFLAGS -D_BSD_SOURCE" elif [ "$OS" = 'Win32' ]; then SOCKETLIB=-lws2_32 SOCKETHEADER="#include " DYLIB= elif [ "$OS" = 'Cygwin' ]; then - echo "Error: Cygwin is not a supported platform. See https://bot.libretro.com/docs/compilation/windows/" - exit 1 + die 1 'Error: Cygwin is not a supported platform. See https://bot.libretro.com/docs/compilation/windows/' fi -add_define_make DYLIB_LIB "$DYLIB" +add_define MAKEFILE DYLIB_LIB "$DYLIB" check_lib '' SYSTEMD -lsystemd sd_get_machine_names @@ -48,7 +47,7 @@ if [ "$HAVE_VIDEOCORE" != "no" ]; then # use fallback if pkgconfig is not available if [ ! "$VC_TEST_LIBS" ]; then - [ -d /opt/vc/lib ] && add_library_dirs /opt/vc/lib && add_library_dirs /opt/vc/lib/GL + [ -d /opt/vc/lib ] && add_dirs LIBRARY /opt/vc/lib /opt/vc/lib/GL check_lib '' VIDEOCORE -lbcm_host bcm_host_init "-lvcos -lvchiq_arm" else HAVE_VIDEOCORE="$HAVE_VC_TEST" @@ -61,9 +60,9 @@ if [ "$HAVE_VIDEOCORE" = 'yes' ]; then # use fallback if pkgconfig is not available if [ ! "$VC_TEST_LIBS" ]; then - [ -d /opt/vc/include ] && add_include_dirs /opt/vc/include - [ -d /opt/vc/include/interface/vcos/pthreads ] && add_include_dirs /opt/vc/include/interface/vcos/pthreads - [ -d /opt/vc/include/interface/vmcs_host/linux ] && add_include_dirs /opt/vc/include/interface/vmcs_host/linux + [ -d /opt/vc/include ] && add_dirs INCLUDE /opt/vc/include + [ -d /opt/vc/include/interface/vcos/pthreads ] && add_dirs INCLUDE /opt/vc/include/interface/vcos/pthreads + [ -d /opt/vc/include/interface/vmcs_host/linux ] && add_dirs INCLUDE /opt/vc/include/interface/vmcs_host/linux EXTRA_GL_LIBS="-lbrcmEGL -lbrcmGLESv2 -lbcm_host -lvcos -lvchiq_arm" fi fi @@ -75,12 +74,12 @@ if [ "$HAVE_NEON" = "yes" ]; then fi if [ "$HAVE_7ZIP" = "yes" ]; then - add_include_dirs ./deps/7zip/ + add_dirs INCLUDE ./deps/7zip fi if [ "$HAVE_PRESERVE_DYLIB" = "yes" ]; then - echo "Notice: Disabling dlclose() of shared objects for Valgrind support." - add_define_make HAVE_PRESERVE_DYLIB "1" + die : 'Notice: Disabling dlclose() of shared objects for Valgrind support.' + add_define MAKEFILE HAVE_PRESERVE_DYLIB "1" fi if [ "$HAVE_FLOATHARD" = "yes" ]; then @@ -121,10 +120,8 @@ fi if [ "$HAVE_EGL" != "no" ] && [ "$OS" != 'Win32' ]; then check_pkgconf EGL "$VC_PREFIX"egl # some systems have EGL libs, but no pkgconfig - if [ "$HAVE_EGL" = "no" ]; then - HAVE_EGL=auto; check_lib '' EGL "-l${VC_PREFIX}EGL $EXTRA_GL_LIBS" - [ "$HAVE_EGL" = "yes" ] && EGL_LIBS=-l"$VC_PREFIX"EGL - else + check_val '' EGL "-l${VC_PREFIX}EGL $EXTRA_GL_LIBS" + if [ "$HAVE_EGL" = "yes" ]; then EGL_LIBS="$EGL_LIBS $EXTRA_GL_LIBS" fi fi @@ -143,7 +140,7 @@ if [ "$HAVE_DISPMANX" != "no" ]; then fi if [ "$LIBRETRO" ]; then - echo "Notice: Explicit libretro used, disabling dynamic libretro loading ..." + die : 'Notice: Explicit libretro used, disabling dynamic libretro loading ...' HAVE_DYNAMIC='no' else LIBRETRO="-lretro" fi @@ -151,17 +148,12 @@ fi [ "$HAVE_DYNAMIC" = 'yes' ] || { #check_lib '' RETRO "$LIBRETRO" retro_init "$DYLIB" "Cannot find libretro, did you forget --with-libretro=\"-lretro\"?" check_lib '' RETRO "$LIBRETRO" "$DYLIB" "Cannot find libretro, did you forget --with-libretro=\"-lretro\"?" - add_define_make libretro "$LIBRETRO" + add_define MAKEFILE libretro "$LIBRETRO" } -[ -z "$ASSETS_DIR" ] && ASSETS_DIR="${PREFIX}/share" -add_define_make ASSETS_DIR "$ASSETS_DIR" - -[ -z "$BIN_DIR" ] && BIN_DIR="${PREFIX}/bin" -add_define_make BIN_DIR "$BIN_DIR" - -[ -z "$MAN_DIR" ] && MAN_DIR="${PREFIX}/share/man" -add_define_make MAN_DIR "$MAN_DIR" +add_define MAKEFILE ASSETS_DIR "${ASSETS_DIR:-${PREFIX}/share}" +add_define MAKEFILE BIN_DIR "${BIN_DIR:-${PREFIX}/bin}" +add_define MAKEFILE MAN_DIR "${MAN_DIR:-${PREFIX}/share/man}" if [ "$OS" = 'DOS' ]; then HAVE_SHADERPIPELINE=no @@ -197,7 +189,7 @@ if [ "$HAVE_NETWORKING" = 'yes' ]; then check_lib '' GETADDRINFO "$SOCKETLIB" getaddrinfo if [ "$HAVE_GETADDRINFO" != 'yes' ]; then HAVE_SOCKET_LEGACY=yes - echo "Notice: RetroArch will use legacy socket support" + die : 'Notice: RetroArch will use legacy socket support' fi fi HAVE_NETWORK_CMD=yes @@ -211,7 +203,7 @@ if [ "$HAVE_NETWORKING" = 'yes' ]; then HAVE_MINIUPNPC='yes' fi else - echo "Warning: All networking features have been disabled." + die : 'Warning: All networking features have been disabled.' HAVE_KEYMAPPER='no' HAVE_NETWORK_CMD='no' HAVE_NETWORKGAMEPAD='no' @@ -229,8 +221,7 @@ fi check_lib '' GETOPT_LONG "$CLIB" getopt_long if [ "$HAVE_DYLIB" = 'no' ] && [ "$HAVE_DYNAMIC" = 'yes' ]; then - echo "Error: Dynamic loading of libretro is enabled, but your platform does not appear to have dlopen(), use --disable-dynamic or --with-libretro=\"-lretro\"". - exit 1 + die 1 'Error: Dynamic loading of libretro is enabled, but your platform does not appear to have dlopen(), use --disable-dynamic or --with-libretro="-lretro".' fi check_pkgconf ALSA alsa @@ -240,7 +231,7 @@ check_header OSS_BSD soundcard.h check_lib '' OSS_LIB -lossaudio if [ "$OS" = 'Linux' ]; then - HAVE_TINYALSA=yes + HAVE_TINYALSA=yes fi if [ "$OS" = 'Darwin' ]; then @@ -266,15 +257,15 @@ check_pkgconf SDL2 sdl2 2.0.0 if [ "$HAVE_SDL2" = 'yes' ]; then if [ "$HAVE_SDL2" = 'yes' ] && [ "$HAVE_SDL" = 'yes' ]; then - echo "Notice: SDL drivers will be replaced by SDL2 ones." + die : 'Notice: SDL drivers will be replaced by SDL2 ones.' HAVE_SDL=no elif [ "$HAVE_SDL2" = 'no' ]; then - echo "Warning: SDL2 not found, skipping." + die : 'Warning: SDL2 not found, skipping.' HAVE_SDL2=no fi fi -check_pkgconf LIBUSB libusb-1.0 1.0.16 +check_pkgconf LIBUSB libusb-1.0 1.0.13 if [ "$OS" = 'Win32' ]; then check_lib '' DINPUT -ldinput8 @@ -305,34 +296,24 @@ if [ "$HAVE_OPENGL" != 'no' ] && [ "$HAVE_OPENGLES" != 'yes' ]; then if [ "$HAVE_OPENGL" = 'yes' ]; then if [ "$OS" = 'Darwin' ]; then - check_lib '' CG "-framework Cg" cgCreateContext - [ "$HAVE_CG" = 'yes' ] && CG_LIBS='-framework Cg' + check_lib '' CG '-framework Cg' cgCreateContext elif [ "$OS" = 'Win32' ]; then - check_lib cxx CG -lcg cgCreateContext - [ "$HAVE_CG" = 'yes' ] && CG_LIBS='-lcg -lcgGL' + check_lib cxx CG '-lcg -lcgGL' cgCreateContext else # On some distros, -lCg doesn't link against -lstdc++ it seems ... - check_lib cxx CG -lCg cgCreateContext - [ "$HAVE_CG" = 'yes' ] && CG_LIBS='-lCg -lCgGL' + check_lib cxx CG '-lCg -lCgGL' cgCreateContext fi - # fix undefined variables - PKG_CONF_USED="$PKG_CONF_USED CG" - check_pkgconf OSMESA osmesa else - echo "Notice: Ignoring Cg. Desktop OpenGL is not enabled." + die : 'Notice: Ignoring Cg. Desktop OpenGL is not enabled.' HAVE_CG='no' fi fi if [ "$HAVE_ZLIB" != 'no' ]; then check_pkgconf ZLIB zlib - - if [ "$HAVE_ZLIB" = 'no' ]; then - HAVE_ZLIB='auto' - check_lib '' ZLIB '-lz' - fi + check_val '' ZLIB '-lz' fi if [ "$HAVE_THREADS" != 'no' ]; then @@ -349,11 +330,11 @@ if [ "$HAVE_THREADS" != 'no' ]; then HAVE_FFMPEG='yes' if [ "$HAVE_AVCODEC" = 'no' ] || [ "$HAVE_SWRESAMPLE" = 'no' ] || [ "$HAVE_AVFORMAT" = 'no' ] || [ "$HAVE_AVUTIL" = 'no' ] || [ "$HAVE_SWSCALE" = 'no' ]; then HAVE_FFMPEG='no' - echo "Notice: FFmpeg built-in support disabled due to missing or unsuitable packages." + die : 'Notice: FFmpeg built-in support disabled due to missing or unsuitable packages.' fi fi else - echo "Notice: Not building with threading support. Will skip FFmpeg." + die : 'Notice: Not building with threading support. Will skip FFmpeg.' HAVE_FFMPEG='no' fi @@ -367,8 +348,7 @@ if [ "$HAVE_KMS" != "no" ]; then if [ "$HAVE_GBM" = "yes" ] && [ "$HAVE_DRM" = "yes" ] && [ "$HAVE_EGL" = "yes" ]; then HAVE_KMS=yes elif [ "$HAVE_KMS" = "yes" ]; then - echo "Error: Cannot find libgbm, libdrm and EGL libraries required for KMS. Compile without --enable-kms." - exit 1 + die 1 'Error: Cannot find libgbm, libdrm and EGL libraries required for KMS. Compile without --enable-kms.' else HAVE_KMS=no fi @@ -379,23 +359,20 @@ check_pkgconf LIBXML2 libxml-2.0 if [ "$HAVE_EGL" = "yes" ]; then if [ "$HAVE_OPENGLES" != "no" ]; then if [ "$OPENGLES_LIBS" ] || [ "$OPENGLES_CFLAGS" ]; then - echo "Notice: Using custom OpenGLES CFLAGS ($OPENGLES_CFLAGS) and LDFLAGS ($OPENGLES_LIBS)." - add_define_make OPENGLES_LIBS "$OPENGLES_LIBS" - add_define_make OPENGLES_CFLAGS "$OPENGLES_CFLAGS" + die : "Notice: Using custom OpenGLES CFLAGS ($OPENGLES_CFLAGS) and LDFLAGS ($OPENGLES_LIBS)." + add_define MAKEFILE OPENGLES_LIBS "$OPENGLES_LIBS" + add_define MAKEFILE OPENGLES_CFLAGS "$OPENGLES_CFLAGS" else HAVE_OPENGLES=auto; check_pkgconf OPENGLES "$VC_PREFIX"glesv2 if [ "$HAVE_OPENGLES" = "no" ]; then HAVE_OPENGLES=auto; check_lib '' OPENGLES "-l${VC_PREFIX}GLESv2 $EXTRA_GL_LIBS" - add_define_make OPENGLES_LIBS "-l${VC_PREFIX}GLESv2 $EXTRA_GL_LIBS" + add_define MAKEFILE OPENGLES_LIBS "-l${VC_PREFIX}GLESv2 $EXTRA_GL_LIBS" fi fi fi if [ "$HAVE_VG" != "no" ]; then check_pkgconf VG "$VC_PREFIX"vg - if [ "$HAVE_VG" = "no" ]; then - HAVE_VG=auto; check_lib '' VG "-l${VC_PREFIX}OpenVG $EXTRA_GL_LIBS" - [ "$HAVE_VG" = "yes" ] && VG_LIBS=-l"$VC_PREFIX"OpenVG - fi + check_val '' VG "-l${VC_PREFIX}OpenVG $EXTRA_GL_LIBS" fi else HAVE_VG=no @@ -403,23 +380,13 @@ else fi check_pkgconf V4L2 libv4l2 - -if [ "$OS" = 'Darwin' ]; then - check_lib '' FBO "-framework OpenGL" glFramebufferTexture2D -elif [ "$OS" = 'Win32' ]; then - HAVE_FBO=yes -else - if [ "$HAVE_OPENGLES" = "yes" ]; then - [ $HAVE_FBO != "no" ] && HAVE_FBO=yes - else - check_lib '' FBO -lGL glFramebufferTexture2D - fi -fi - check_pkgconf FREETYPE freetype2 check_pkgconf X11 x11 check_pkgconf XCB xcb -[ "$HAVE_X11" = "no" ] && HAVE_XEXT=no && HAVE_XF86VM=no && HAVE_XINERAMA=no && HAVE_XSHM=no + +if [ "$OS" != 'Darwin' ]; then + check_val '' X11 -lX11 +fi check_pkgconf WAYLAND wayland-egl check_pkgconf WAYLAND_CURSOR wayland-cursor @@ -428,21 +395,26 @@ check_pkgconf XKBCOMMON xkbcommon 0.3.2 check_pkgconf DBUS dbus-1 check_pkgconf XEXT xext check_pkgconf XF86VM xxf86vm + +if [ "$HAVE_X11" != "no" ]; then + check_val '' XEXT -lXext + check_val '' XF86VM -lXxf86vm +else + HAVE_XEXT=no; HAVE_XF86VM=no; HAVE_XINERAMA=no; HAVE_XSHM=no +fi + check_pkgconf XINERAMA xinerama if [ "$HAVE_X11" = 'yes' ] && [ "$HAVE_XEXT" = 'yes' ] && [ "$HAVE_XF86VM" = 'yes' ]; then check_pkgconf XVIDEO xv else - echo "Notice: X11, Xext or xf86vm not present. Skipping X11 code paths." + die : 'Notice: X11, Xext or xf86vm not present. Skipping X11 code paths.' HAVE_X11='no' HAVE_XVIDEO='no' fi if [ "$HAVE_UDEV" != "no" ]; then check_pkgconf UDEV libudev - if [ "$HAVE_UDEV" = "no" ]; then - HAVE_UDEV=auto; check_lib '' UDEV "-ludev" - [ "$HAVE_UDEV" = "yes" ] && UDEV_LIBS=-ludev - fi + check_val '' UDEV "-ludev" fi check_header XSHM X11/Xlib.h X11/extensions/XShm.h @@ -457,18 +429,6 @@ check_lib '' STRCASESTR "$CLIB" strcasestr check_lib '' MMAP "$CLIB" mmap check_lib '' VULKAN -lvulkan vkCreateInstance -if [ "$HAVE_VULKAN" != 'no' ] && [ ! -e deps/glslang/glslang/README.md ]; then - echo "Warning: glslang submodule not loaded, can't use Vulkan." - echo "To fix, use: git submodule init && git submodule update" - HAVE_VULKAN=no -fi - -if [ "$HAVE_VULKAN" != 'no' ] && [ ! -e deps/SPIRV-Cross/README.md ]; then - echo "Warning: SPIRV-Cross submodule not loaded, can't use Vulkan." - echo "To fix, use: git submodule init && git submodule update" - HAVE_VULKAN=no -fi - check_pkgconf PYTHON python3 if [ "$HAVE_MATERIALUI" != 'no' ] || [ "$HAVE_XMB" != 'no' ] || [ "$HAVE_ZARCH" != 'no' ]; then @@ -476,35 +436,35 @@ if [ "$HAVE_MATERIALUI" != 'no' ] || [ "$HAVE_XMB" != 'no' ] || [ "$HAVE_ZARCH" HAVE_MATERIALUI=no HAVE_XMB=no HAVE_ZARCH=no - echo "Notice: RGUI not available, MaterialUI, XMB and ZARCH will also be disabled." + die : 'Notice: RGUI not available, MaterialUI, XMB and ZARCH will also be disabled.' elif [ "$HAVE_OPENGL" = 'no' ] && [ "$HAVE_OPENGLES" = 'no' ] && [ "$HAVE_VULKAN" = 'no' ]; then if [ "$OS" = 'Win32' ]; then HAVE_SHADERPIPELINE=no HAVE_VULKAN=no - echo "Notice: Hardware rendering context not available." + die : 'Notice: Hardware rendering context not available.' elif [ "$HAVE_CACA" = 'yes' ]; then - echo "Notice: Hardware rendering context not available." + die : 'Notice: Hardware rendering context not available.' else HAVE_MATERIALUI=no HAVE_XMB=no HAVE_ZARCH=no - echo "Notice: Hardware rendering context not available, XMB, MaterialUI and ZARCH will also be disabled." + die : 'Notice: Hardware rendering context not available, XMB, MaterialUI and ZARCH will also be disabled.' fi fi fi check_macro NEON __ARM_NEON__ -add_define_make OS "$OS" +add_define MAKEFILE OS "$OS" if [ "$HAVE_ZLIB" = 'no' ] && [ "$HAVE_RPNG" != 'no' ]; then HAVE_RPNG=no - echo "Notice: zlib is not available, RPNG will also be disabled." + die : 'Notice: zlib is not available, RPNG will also be disabled.' fi if [ "$HAVE_THREADS" = 'no' ] && [ "$HAVE_LIBUSB" != 'no' ]; then HAVE_LIBUSB=no - echo "Notice: Threads are not available, libusb will also be disabled." + die : 'Notice: Threads are not available, libusb will also be disabled.' fi if [ "$HAVE_V4L2" != 'no' ] && [ "$HAVE_VIDEOPROCESSOR" != 'no' ]; then @@ -512,7 +472,7 @@ if [ "$HAVE_V4L2" != 'no' ] && [ "$HAVE_VIDEOPROCESSOR" != 'no' ]; then fi # Creates config.mk and config.h. -add_define_make GLOBAL_CONFIG_DIR "$GLOBAL_CONFIG_DIR" +add_define MAKEFILE GLOBAL_CONFIG_DIR "$GLOBAL_CONFIG_DIR" set -- $(set | grep ^HAVE_) while [ $# -gt 0 ]; do tmpvar="${1%=*}" diff --git a/qb/config.params.sh b/qb/config.params.sh index 4076b63c4a..53612d047f 100644 --- a/qb/config.params.sh +++ b/qb/config.params.sh @@ -19,6 +19,7 @@ C89_SDL2=no HAVE_LIBUSB=auto # Libusb HID support C89_LIBUSB=no HAVE_DBUS=auto # dbus support +HAVE_SYSTEMD=auto # Systemd support HAVE_UDEV=auto # Udev/Evdev gamepad support HAVE_THREADS=auto # Threading support HAVE_THREAD_STORAGE=auto # Thread Local Storage support @@ -56,7 +57,6 @@ HAVE_CG=auto # Cg shader support HAVE_LIBXML2=auto # libxml2 support HAVE_BUILTINZLIB=no # Bake in zlib HAVE_ZLIB=auto # zlib support (ZIP extract, PNG decoding/encoding) -HAVE_FBO=auto # render-to-texture (FBO) support HAVE_ALSA=auto # ALSA support C89_ALSA=no HAVE_TINYALSA=auto # TinyALSA support diff --git a/qb/qb.comp.sh b/qb/qb.comp.sh index fd27365517..147715443d 100644 --- a/qb/qb.comp.sh +++ b/qb/qb.comp.sh @@ -14,12 +14,17 @@ cc_works=0 if [ "$CC" ]; then "$CC" -o "$TEMP_EXE" "$TEMP_C" >/dev/null 2>&1 && cc_works=1 else - for CC in $(printf %s "$(which ${CROSS_COMPILE}gcc ${CROSS_COMPILE}cc ${CROSS_COMPILE}clang 2>/dev/null)") ''; do - "$CC" -o "$TEMP_EXE" "$TEMP_C" >/dev/null 2>&1 && cc_works=1 && break + for cc in gcc cc clang; do + CC="$(exists "${CROSS_COMPILE}${cc}")" || CC="" + if [ "$CC" ]; then + "$CC" -o "$TEMP_EXE" "$TEMP_C" >/dev/null 2>&1 && { + cc_works=1; break + } + fi done fi -rm -f "$TEMP_C" "$TEMP_EXE" +rm -f -- "$TEMP_C" "$TEMP_EXE" cc_status='does not work' if [ "$cc_works" = '1' ]; then @@ -31,8 +36,7 @@ fi echo "Checking for suitable working C compiler ... $CC $cc_status" if [ "$cc_works" = '0' ] && [ "$USE_LANG_C" = 'yes' ]; then - echo "Error: Cannot proceed without a working C compiler." - exit 1 + die 1 'Error: Cannot proceed without a working C compiler.' fi # Checking for working C++ @@ -45,12 +49,17 @@ cxx_works=0 if [ "$CXX" ]; then "$CXX" -o "$TEMP_EXE" "$TEMP_CXX" >/dev/null 2>&1 && cxx_works=1 else - for CXX in $(printf %s "$(which ${CROSS_COMPILE}g++ ${CROSS_COMPILE}c++ ${CROSS_COMPILE}clang++ 2>/dev/null)") ''; do - "$CXX" -o "$TEMP_EXE" "$TEMP_CXX" >/dev/null 2>&1 && cxx_works=1 && break + for cxx in g++ c++ clang++; do + CXX="$(exists "${CROSS_COMPILE}${cxx}")" || CXX="" + if [ "$CXX" ]; then + "$CXX" -o "$TEMP_EXE" "$TEMP_CXX" >/dev/null 2>&1 && { + cxx_works=1; break + } + fi done fi -rm -f "$TEMP_CXX" "$TEMP_EXE" +rm -f -- "$TEMP_CXX" "$TEMP_EXE" cxx_status='does not work' if [ "$cxx_works" = '1' ]; then @@ -62,33 +71,31 @@ fi echo "Checking for suitable working C++ compiler ... $CXX $cxx_status" if [ "$cxx_works" = '0' ] && [ "$USE_LANG_CXX" = 'yes' ]; then - echo "Error: Cannot proceed without a working C++ compiler." - exit 1 + die 1 'Error: Cannot proceed without a working C++ compiler.' fi if [ "$OS" = "Win32" ]; then echobuf="Checking for windres" if [ -z "$WINDRES" ]; then - WINDRES=$(which ${CROSS_COMPILE}windres) - [ "$WINDRES" ] || { echo "$echobuf ... Not found. Exiting."; exit 1; } + WINDRES="$(exists "${CROSS_COMPILE}windres")" || WINDRES="" + [ -z "$WINDRES" ] && die 1 "$echobuf ... Not found. Exiting." fi echo "$echobuf ... $WINDRES" fi -[ -n "$PKG_CONF_PATH" ] || { +if [ -z "$PKG_CONF_PATH" ]; then PKG_CONF_PATH="none" - - for p in $(which "${CROSS_COMPILE}pkg-config" 2>/dev/null) ''; do - [ -n "$p" ] && { - PKG_CONF_PATH=$p; - break; + for pkgconf in pkgconf pkg-config; do + PKGCONF="$(exists "${CROSS_COMPILE}${pkgconf}")" || PKGCONF="" + [ "$PKGCONF" ] && { + PKG_CONF_PATH="$PKGCONF" + break } done - -} +fi echo "Checking for pkg-config ... $PKG_CONF_PATH" if [ "$PKG_CONF_PATH" = "none" ]; then - echo "Warning: pkg-config not found, package checks will fail." + die : 'Warning: pkg-config not found, package checks will fail.' fi diff --git a/qb/qb.libs.sh b/qb/qb.libs.sh index 52ae472eca..86868a3cfb 100644 --- a/qb/qb.libs.sh +++ b/qb/qb.libs.sh @@ -1,108 +1,83 @@ -MAKEFILE_DEFINES='.MAKEFILE_DEFINES' -CONFIG_DEFINES='.CONFIG_DEFINES' -cat /dev/null > "$MAKEFILE_DEFINES" > "$CONFIG_DEFINES" -#cat /dev/null > "${MAKEFILE_DEFINES:=.MAKEFILE_DEFINES}" > "${CONFIG_DEFINES=.CONFIG_DEFINES}" +MAKEFILE_DEFINES='' +CONFIG_DEFINES='' [ "$PREFIX" ] || PREFIX="/usr/local" -add_define_header() -{ echo "$1=$2" >> "$CONFIG_DEFINES";} +add_define() # $1 = MAKEFILE or CONFIG $2 = define $3 = value +{ eval "${1}_DEFINES=\"\${${1}_DEFINES} $2=$3\""; } -add_define_make() -{ echo "$1=$2" >> "$MAKEFILE_DEFINES";} - -add_include_dirs() -{ while [ "$1" ]; do INCLUDE_DIRS="$INCLUDE_DIRS -I$1"; shift; done - INCLUDE_DIRS="${INCLUDE_DIRS# }" +add_dirs() # $1 = INCLUDE or LIBRARY $@ = include or library paths +{ ADD="$1"; LINK="${1%"${1#?}"}"; shift + while [ "$1" ]; do + eval "${ADD}_DIRS=\"\${${ADD}_DIRS} -${LINK}${1}\"" + shift + done + eval "${ADD}_DIRS=\"\${${ADD}_DIRS# }\"" } -add_library_dirs() -{ while [ "$1" ]; do LIBRARY_DIRS="$LIBRARY_DIRS -L$1"; shift; done - LIBRARY_DIRS="${LIBRARY_DIRS# }" -} - -check_lib() # $1 = language $2 = HAVE_$2 $3 = lib $4 = function in lib $5 = extralibs $6 = headers $7 = critical error message [checked only if non-empty] -{ tmpval="$(eval echo \$HAVE_$2)" - [ "$tmpval" = 'no' ] && return 0 - - if [ "$1" = cxx ]; then +check_compiler() # $1 = language $2 = function in lib +{ if [ "$1" = cxx ]; then COMPILER="$CXX" TEMP_CODE="$TEMP_CXX" - TEST_C="extern \"C\" { void $4(void); } int main() { $4(); }" + TEST_C="extern \"C\" { void $2(void); } int main() { $2(); }" else COMPILER="$CC" TEMP_CODE="$TEMP_C" - TEST_C="void $4(void); int main(void) { $4(); return 0; }" + TEST_C="void $2(void); int main(void) { $2(); return 0; }" fi +} + +check_lib() # $1 = language $2 = HAVE_$2 $3 = lib $4 = function in lib $5 = extralibs $6 = headers $7 = critical error message [checked only if non-empty] +{ tmpval="$(eval "printf %s \"\$HAVE_$2\"")" + [ "$tmpval" = 'no' ] && return 0 + + check_compiler "$1" "$4" if [ "$4" ]; then ECHOBUF="Checking function $4 in ${3% }" if [ "$6" ]; then printf %s\\n "$6" "int main(void) { void *p = (void*)$4; return 0; }" > "$TEMP_CODE" else - echo "$TEST_C" > "$TEMP_CODE" + printf %s\\n "$TEST_C" > "$TEMP_CODE" fi else ECHOBUF="Checking existence of ${3% }" - echo "int main(void) { return 0; }" > "$TEMP_CODE" + printf %s\\n 'int main(void) { return 0; }' > "$TEMP_CODE" fi + + val="$2" + lib="$3" + error="${7:-}" answer='no' - "$COMPILER" -o \ - "$TEMP_EXE" \ - "$TEMP_CODE" \ - $INCLUDE_DIRS \ - $LIBRARY_DIRS \ - $(printf %s "$5") \ - $CFLAGS \ - $LDFLAGS \ - $(printf %s "$3") >>config.log 2>&1 && answer='yes' - eval HAVE_$2="$answer"; echo "$ECHOBUF ... $answer" + eval "set -- $INCLUDE_DIRS $LIBRARY_DIRS $5 $CFLAGS $LDFLAGS $3" + "$COMPILER" -o "$TEMP_EXE" "$TEMP_CODE" "$@" >>config.log 2>&1 && answer='yes' + eval "HAVE_$val=\"$answer\"" + printf %s\\n "$ECHOBUF ... $answer" rm -f -- "$TEMP_CODE" "$TEMP_EXE" - [ "$answer" = 'no' ] && { - [ "$7" ] && { echo "$7"; exit 1;} + if [ "$answer" = 'no' ]; then + [ "$error" ] && die 1 "$error" [ "$tmpval" = 'yes' ] && { - echo "Forced to build with library $3, but cannot locate. Exiting ..." - exit 1 + die 1 "Forced to build with library $lib, but cannot locate. Exiting ..." } - - } + else + eval "${val}_LIBS=\"$lib\"" + PKG_CONF_USED="$PKG_CONF_USED $val" + fi return 0 } -check_code_c() -{ tmpval="$(eval echo \$HAVE_$1)" - [ "$tmpval" = 'no' ] && return 0 - - ECHOBUF="Checking C code snippet \"$3\"" - answer='no' - "$CC" -o "$TEMP_EXE" "$TEMP_C" $INCLUDE_DIRS $LIBRARY_DIRS $2 $CFLAGS $LDFLAGS >>config.log 2>&1 && answer='yes' - eval HAVE_$1="$answer"; echo "$ECHOBUF ... $answer" - rm -f -- "$TEMP_C" "$TEMP_EXE" -} - -check_code_cxx() -{ tmpval="$(eval echo \$HAVE_$1)" - [ "$tmpval" = 'no' ] && return 0 - - ECHOBUF="Checking C++ code snippet \"$3\"" - answer='no' - "$CXX" -o "$TEMP_EXE" "$TEMP_CXX" $INCLUDE_DIRS $LIBRARY_DIRS $2 $CXXFLAGS $LDFLAGS >>config.log 2>&1 && answer='yes' - eval HAVE_$1="$answer"; echo "$ECHOBUF ... $answer" - rm -f -- "$TEMP_CXX" "$TEMP_EXE" -} - -check_pkgconf() #$1 = HAVE_$1 $2 = package $3 = version $4 = critical error message [checked only if non-empty] -{ tmpval="$(eval echo \$HAVE_$1)" +check_pkgconf() # $1 = HAVE_$1 $2 = package $3 = version $4 = critical error message [checked only if non-empty] +{ tmpval="$(eval "printf %s \"\$HAVE_$1\"")" [ "$tmpval" = 'no' ] && return 0 ECHOBUF="Checking presence of package $2" [ "$3" ] && ECHOBUF="$ECHOBUF >= $3" [ "$PKG_CONF_PATH" = "none" ] && { - eval HAVE_$1="no" - echo "$ECHOBUF ... no" + eval "HAVE_$1=no" + printf %s\\n "$ECHOBUF ... no" return 0 } @@ -110,44 +85,45 @@ check_pkgconf() #$1 = HAVE_$1 $2 = package $3 = version $4 = critical error mess version='no' $PKG_CONF_PATH --atleast-version="${3:-0.0}" "$2" && { answer='yes' - version=$($PKG_CONF_PATH --modversion "$2") - eval $1_CFLAGS=\"$($PKG_CONF_PATH $2 --cflags)\" - eval $1_LIBS=\"$($PKG_CONF_PATH $2 --libs)\" + version="$("$PKG_CONF_PATH" --modversion "$2")" + eval "$1_CFLAGS=\"$("$PKG_CONF_PATH" "$2" --cflags)\"" + eval "$1_LIBS=\"$("$PKG_CONF_PATH" "$2" --libs)\"" } - eval HAVE_$1="$answer"; - echo "$ECHOBUF ... $version" - PKG_CONF_USED="$PKG_CONF_USED $1" - [ "$answer" = 'no' ] && { - [ "$4" ] && { echo "$4"; exit 1;} - [ "$tmpval" = 'yes' ] && { - echo "Forced to build with package $2, but cannot locate. Exiting ..." - exit 1 - } - } + eval "HAVE_$1=\"$answer\"" + printf %s\\n "$ECHOBUF ... $version" + if [ "$answer" = 'no' ]; then + [ "$4" ] && die 1 "$4" + [ "$tmpval" = 'yes' ] && \ + die 1 "Forced to build with package $2, but cannot locate. Exiting ..." + else + PKG_CONF_USED="$PKG_CONF_USED $1" + fi } -check_header() #$1 = HAVE_$1 $2..$5 = header files -{ tmpval="$(eval echo \$HAVE_$1)" +check_header() #$1 = HAVE_$1 $2..$5 = header files +{ tmpval="$(eval "printf %s \"\$HAVE_$1\"")" [ "$tmpval" = 'no' ] && return 0 CHECKHEADER="$2" - echo "#include <$2>" > "$TEMP_C" - [ "$3" != "" ] && CHECKHEADER="$3" && echo "#include <$3>" >> "$TEMP_C" - [ "$4" != "" ] && CHECKHEADER="$4" && echo "#include <$4>" >> "$TEMP_C" - [ "$5" != "" ] && CHECKHEADER="$5" && echo "#include <$5>" >> "$TEMP_C" - echo "int main(void) { return 0; }" >> "$TEMP_C" + printf %s\\n "#include <$2>" > "$TEMP_C" + [ "$3" != '' ] && CHECKHEADER="$3" && printf %s\\n "#include <$3>" >> "$TEMP_C" + [ "$4" != '' ] && CHECKHEADER="$4" && printf %s\\n "#include <$4>" >> "$TEMP_C" + [ "$5" != '' ] && CHECKHEADER="$5" && printf %s\\n "#include <$5>" >> "$TEMP_C" + printf %s\\n "int main(void) { return 0; }" >> "$TEMP_C" answer='no' - "$CC" -o "$TEMP_EXE" "$TEMP_C" $INCLUDE_DIRS >>config.log 2>&1 && answer='yes' - eval HAVE_$1="$answer"; echo "Checking presence of header file $CHECKHEADER ... $answer" + val="$1" + header="$2" + eval "set -- $INCLUDE_DIRS" + "$CC" -o "$TEMP_EXE" "$TEMP_C" "$@" >>config.log 2>&1 && answer='yes' + eval "HAVE_$val=\"$answer\"" + printf %s\\n "Checking presence of header file $CHECKHEADER ... $answer" rm -f -- "$TEMP_C" "$TEMP_EXE" - [ "$tmpval" = 'yes' ] && [ "$answer" = 'no' ] && { - echo "Build assumed that $2 exists, but cannot locate. Exiting ..." - exit 1 - } + [ "$tmpval" = 'yes' ] && [ "$answer" = 'no' ] && \ + die 1 "Build assumed that $header exists, but cannot locate. Exiting ..." } -check_macro() #$1 = HAVE_$1 $2 = macro name -{ tmpval="$(eval echo \$HAVE_$1)" +check_macro() #$1 = HAVE_$1 $2 = macro name +{ tmpval="$(eval "printf %s \"\$HAVE_$1\"")" [ "$tmpval" = 'no' ] && return 0 ECHOBUF="Checking presence of predefined macro $2" cat << EOF > "$TEMP_C" @@ -157,113 +133,119 @@ check_macro() #$1 = HAVE_$1 $2 = macro name int main(void) { return 0; } EOF answer='no' - "$CC" -o "$TEMP_EXE" "$TEMP_C" $CFLAGS $INCLUDE_DIRS >>config.log 2>&1 && answer='yes' - eval HAVE_$1="$answer"; echo "$ECHOBUF ... $answer" + val="$1" + macro="$2" + eval "set -- $CFLAGS $INCLUDE_DIRS" + "$CC" -o "$TEMP_EXE" "$TEMP_C" "$@" >>config.log 2>&1 && answer='yes' + eval "HAVE_$val=\"$answer\"" + printf %s\\n "$ECHOBUF ... $answer" rm -f -- "$TEMP_C" "$TEMP_EXE" - [ "$tmpval" = 'yes' ] && [ "$answer" = 'no' ] && { - echo "Build assumed that $2 is defined, but it's not. Exiting ..." - exit 1 + [ "$tmpval" = 'yes' ] && [ "$answer" = 'no' ] && \ + die 1 "Build assumed that $macro is defined, but it's not. Exiting ..." +} + +check_switch() # $1 = language $2 = HAVE_$2 $3 = switch $4 = critical error message [checked only if non-empty] +{ check_compiler "$1" '' + + ECHOBUF="Checking for availability of switch $3 in $COMPILER" + printf %s\\n 'int main(void) { return 0; }' > "$TEMP_CODE" + answer='no' + "$COMPILER" -o "$TEMP_EXE" "$TEMP_CODE" "$3" >>config.log 2>&1 && answer='yes' + eval "HAVE_$2=\"$answer\"" + printf %s\\n "$ECHOBUF ... $answer" + rm -f -- "$TEMP_CODE" "$TEMP_EXE" + [ "$answer" = 'no' ] && { + [ "$4" ] && die 1 "$4" } } -check_switch_c() #$1 = HAVE_$1 $2 = switch $3 = critical error message [checked only if non-empty] -{ ECHOBUF="Checking for availability of switch $2 in $CC" - echo "int main(void) { return 0; }" > $TEMP_C - answer='no' - "$CC" -o "$TEMP_EXE" "$TEMP_C" $2 >>config.log 2>&1 && answer='yes' - eval HAVE_$1="$answer"; echo "$ECHOBUF ... $answer" - rm -f -- "$TEMP_C" "$TEMP_EXE" - [ "$answer" = 'no' ] && { - [ "$3" ] && { echo "$3"; exit 1;} - } -} - -check_switch_cxx() #$1 = HAVE_$1 $2 = switch $3 = critical error message [checked only if non-empty] -{ ECHOBUF="Checking for availability of switch $2 in $CXX" - echo "int main() { return 0; }" > $TEMP_CXX - answer='no' - "$CXX" -o "$TEMP_EXE" "$TEMP_CXX" "$2" >>config.log 2>&1 && answer='yes' - eval HAVE_$1="$answer"; echo "$ECHOBUF ... $answer" - rm -f -- "$TEMP_CXX" "$TEMP_EXE" - [ "$answer" = 'no' ] && { - [ "$3" ] && { echo "$3"; exit 1;} - } +check_val() # $1 = language $2 = HAVE_$2 $3 = lib +{ tmpval="$(eval "printf %s \"\$HAVE_$2\"")" + if [ "$tmpval" = 'no' ]; then + eval "HAVE_$2=auto" + check_lib "$1" "$2" "$3" + fi } create_config_header() { outfile="$1"; shift - echo "Creating config header: $outfile" - name=$(echo "QB_${outfile}__" | tr '.[a-z]' '_[A-Z]') - { echo "#ifndef $name" - echo "#define $name" - echo "" - echo "#define PACKAGE_NAME \"$PACKAGE_NAME\"" + printf %s\\n "Creating config header: $outfile" + name="$(printf %s "QB_${outfile}__" | tr '.[a-z]' '_[A-Z]')" + + { printf %s\\n "#ifndef $name" "#define $name" '' \ + "#define PACKAGE_NAME \"$PACKAGE_NAME\"" while [ "$1" ]; do - case $(eval echo \$HAVE_$1) in + case "$(eval "printf %s \"\$HAVE_$1\"")" in 'yes') - if [ "$(eval echo \$C89_$1)" = "no" ]; then echo "#if __cplusplus || __STDC_VERSION__ >= 199901L"; fi - echo "#define HAVE_$1 1" - if [ "$(eval echo \$C89_$1)" = "no" ]; then echo "#endif"; fi - ;; - 'no') echo "/* #undef HAVE_$1 */";; + if [ "$(eval "printf %s \"\$C89_$1\"")" = 'no' ]; then + printf %s\\n '#if __cplusplus || __STDC_VERSION__ >= 199901L' \ + "#define HAVE_$1 1" '#endif' + else + printf %s\\n "#define HAVE_$1 1" + fi + ;; + 'no') printf %s\\n "/* #undef HAVE_$1 */";; esac shift done - while IFS='=' read VAR VAL; do echo "#define $VAR $VAL"; done < "$CONFIG_DEFINES" + eval "set -- $CONFIG_DEFINES" + for VAR do + printf %s\\n "#define ${VAR%%=*} ${VAR#*=}" + done - echo "#endif" + printf %s\\n '#endif' } > "$outfile" } create_config_make() { outfile="$1"; shift - echo "Creating make config: $outfile" + printf %s\\n "Creating make config: $outfile" - { if [ "$USE_LANG_C" = 'yes' ]; then - echo "CC = $CC" - echo "CFLAGS = $CFLAGS" - fi - if [ "$USE_LANG_CXX" = 'yes' ]; then - echo "CXX = $CXX" - echo "CXXFLAGS = $CXXFLAGS" - fi - echo "WINDRES = $WINDRES" - echo "ASFLAGS = $ASFLAGS" - echo "LDFLAGS = $LDFLAGS" - echo "INCLUDE_DIRS = $INCLUDE_DIRS" - echo "LIBRARY_DIRS = $LIBRARY_DIRS" - echo "PACKAGE_NAME = $PACKAGE_NAME" - echo "PREFIX = $PREFIX" + { [ "$USE_LANG_C" = 'yes' ] && printf %s\\n "CC = $CC" "CFLAGS = $CFLAGS" + [ "$USE_LANG_CXX" = 'yes' ] && printf %s\\n "CXX = $CXX" "CXXFLAGS = $CXXFLAGS" + + printf %s\\n "WINDRES = $WINDRES" \ + "ASFLAGS = $ASFLAGS" \ + "LDFLAGS = $LDFLAGS" \ + "INCLUDE_DIRS = $INCLUDE_DIRS" \ + "LIBRARY_DIRS = $LIBRARY_DIRS" \ + "PACKAGE_NAME = $PACKAGE_NAME" \ + "BUILD = $BUILD" \ + "PREFIX = $PREFIX" while [ "$1" ]; do - case $(eval echo \$HAVE_$1) in + case "$(eval "printf %s \"\$HAVE_$1\"")" in 'yes') - if [ "$(eval echo \$C89_$1)" = "no" ]; then echo "ifneq (\$(C89_BUILD),1)"; fi - echo "HAVE_$1 = 1" - if [ "$(eval echo \$C89_$1)" = "no" ]; then echo "endif"; fi - ;; - 'no') echo "HAVE_$1 = 0";; + if [ "$(eval "printf %s \"\$C89_$1\"")" = 'no' ]; then + printf %s\\n "ifneq (\$(C89_BUILD),1)" \ + "HAVE_$1 = 1" 'endif' + else + printf %s\\n "HAVE_$1 = 1" + fi + ;; + 'no') printf %s\\n "HAVE_$1 = 0";; esac case "$PKG_CONF_USED" in *$1*) - FLAGS="$(eval echo \$$1_CFLAGS)" - LIBS="$(eval echo \$$1_LIBS)" - echo "$1_CFLAGS = ${FLAGS%"${FLAGS##*[! ]}"}" - echo "$1_LIBS = ${LIBS%"${LIBS##*[! ]}"}" + FLAG="$(eval "printf %s \"\$$1_CFLAGS\"")" + LIBS="$(eval "printf %s \"\$$1_LIBS\"")" + [ "${FLAG}" ] && printf %s\\n "$1_CFLAGS = ${FLAG%"${FLAG##*[! ]}"}" + [ "${LIBS}" ] && printf %s\\n "$1_LIBS = ${LIBS%"${LIBS##*[! ]}"}" ;; esac shift done - while IFS='=' read VAR VAL; do echo "$VAR = $VAL"; done < "$MAKEFILE_DEFINES" + eval "set -- $MAKEFILE_DEFINES" + for VAR do + printf %s\\n "${VAR%%=*} = ${VAR#*=}" + done } > "$outfile" } . qb/config.libs.sh - -rm -f -- "$MAKEFILE_DEFINES" "$CONFIG_DEFINES" diff --git a/qb/qb.params.sh b/qb/qb.params.sh index 68048f2be6..d574c60057 100644 --- a/qb/qb.params.sh +++ b/qb/qb.params.sh @@ -1,3 +1,14 @@ +die() # $1 = exit code, use : to not exit when printing warnings $@ = exit or warning messages +{ + ret="$1" + shift 1 + printf %s\\n "$@" >&2 + case "$ret" in + : ) return 0 ;; + * ) exit "$ret" ;; + esac +} + print_help_option() # $1 = option $@ = description { _opt="$1" @@ -23,14 +34,18 @@ General options: EOF print_help_option "--prefix=PATH" "Install path prefix" print_help_option "--global-config-dir=PATH" "System wide config file prefix" - print_help_option "--host=HOST" "cross-compile to build programs to run on HOST" + print_help_option "--build=BUILD" "The build system (no-op)" + print_help_option "--host=HOST" "Cross-compile with HOST-gcc instead of gcc" print_help_option "--help" "Show this help" echo "" echo "Custom options:" - while IFS='=#' read VAR VAL COMMENT; do - VAR=$(echo "${VAR##HAVE_}" | tr '[:upper:]' '[:lower:]') + while read -r VAR COMMENT; do + TMPVAR="${VAR%=*}" + COMMENT="${COMMENT#*#}" + VAL="${VAR#*=}" + VAR="$(echo "${TMPVAR#HAVE_}" | tr '[:upper:]' '[:lower:]')" case "$VAR" in 'c89_'*) continue;; *) @@ -50,20 +65,26 @@ EOF } opt_exists() # $opt is returned if exists in OPTS -{ opt=$(echo "$1" | tr '[:lower:]' '[:upper:]') - for OPT in $OPTS; do [ "$opt" = "$OPT" ] && return; done - echo "Unknown option $2"; exit 1 +{ opt="$(echo "$1" | tr '[:lower:]' '[:upper:]')" + err="$2" + eval "set -- $OPTS" + for OPT do [ "$opt" = "$OPT" ] && return; done + die 1 "Unknown option $err" } parse_input() # Parse stuff :V -{ OPTS=; while IFS='=' read VAR dummy; do OPTS="$OPTS ${VAR##HAVE_}"; done < 'qb/config.params.sh' -#OPTS contains all available options in config.params.sh - used to speedup -#things in opt_exists() +{ OPTS=; while read -r VAR _; do + TMPVAR="${VAR%=*}" + OPTS="$OPTS ${TMPVAR##HAVE_}" + done < 'qb/config.params.sh' + #OPTS contains all available options in config.params.sh - used to speedup + #things in opt_exists() while [ "$1" ]; do case "$1" in --prefix=*) PREFIX=${1##--prefix=};; --global-config-dir=*) GLOBAL_CONFIG_DIR=${1##--global-config-dir=};; + --build=*) BUILD="${1#*=}";; --host=*) CROSS_COMPILE=${1##--host=}-;; --enable-*) opt_exists "${1##--enable-}" "$1" @@ -81,7 +102,7 @@ parse_input() # Parse stuff :V eval "$opt=\"$val\"" ;; -h|--help) print_help; exit 0;; - *) echo "Unknown option $1"; exit 1;; + *) die 1 "Unknown option $1";; esac shift done @@ -89,4 +110,4 @@ parse_input() # Parse stuff :V . qb/config.params.sh -parse_input "$@" +parse_input "$@" diff --git a/qb/qb.system.sh b/qb/qb.system.sh index 0589126905..597ba350c0 100644 --- a/qb/qb.system.sh +++ b/qb/qb.system.sh @@ -1,3 +1,24 @@ +exists() # checks executables listed in $@ against the $PATH +{ + v=1 + while [ "$#" -gt 0 ]; do + arg="$1" + shift 1 + case "$arg" in ''|*/) continue ;; esac + x="${arg##*/}" + z="${arg%/*}" + [ ! -f "$z/$x" ] || [ ! -x "$z/$x" ] && [ "$z/$x" = "$arg" ] && continue + [ "$x" = "$z" ] && [ -x "$z/$x" ] && [ ! -f "$arg" ] && z= + p=":$z:$PATH" + while [ "$p" != "${p#*:}" ]; do + p="${p#*:}" + d="${p%%:*}" + { [ -f "$d/$x" ] && [ -x "$d/$x" ] && \ + { printf %s\\n "$d/$x"; v=0; break; }; } || : + done + done + return "$v" +} if [ -n "$CROSS_COMPILE" ]; then case "$CROSS_COMPILE" in @@ -26,4 +47,3 @@ if [ -e /etc/lsb-release ]; then fi echo "Checking operating system ... $OS ${DISTRO}" - diff --git a/record/drivers/record_ffmpeg.c b/record/drivers/record_ffmpeg.c index b74875f293..4cdab159f1 100644 --- a/record/drivers/record_ffmpeg.c +++ b/record/drivers/record_ffmpeg.c @@ -68,6 +68,17 @@ extern "C" { #include "../../gfx/video_driver.h" #include "../../verbosity.h" +#ifndef AV_CODEC_FLAG_QSCALE +#define AV_CODEC_FLAG_QSCALE CODEC_FLAG_QSCALE +#endif + +#ifndef AV_CODEC_FLAG_GLOBAL_HEADER +#define AV_CODEC_FLAG_GLOBAL_HEADER CODEC_FLAG_GLOBAL_HEADER +#endif + +#ifndef AV_INPUT_BUFFER_MIN_SIZE +#define AV_INPUT_BUFFER_MIN_SIZE FF_MIN_BUFFER_SIZE +#endif #ifndef PIX_FMT_RGB32 #define PIX_FMT_RGB32 AV_PIX_FMT_RGB32 @@ -348,7 +359,7 @@ static bool ffmpeg_init_audio(ffmpeg_t *handle) if (params->audio_qscale) { - audio->codec->flags |= CODEC_FLAG_QSCALE; + audio->codec->flags |= AV_CODEC_FLAG_QSCALE; audio->codec->global_quality = params->audio_global_quality; } else if (params->audio_bit_rate) @@ -358,7 +369,7 @@ static bool ffmpeg_init_audio(ffmpeg_t *handle) audio->codec->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL; if (handle->muxer.ctx->oformat->flags & AVFMT_GLOBALHEADER) - audio->codec->flags |= CODEC_FLAG_GLOBAL_HEADER; + audio->codec->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; if (avcodec_open2(audio->codec, codec, params->audio_opts ? ¶ms->audio_opts : NULL) != 0) return false; @@ -378,7 +389,7 @@ static bool ffmpeg_init_audio(ffmpeg_t *handle) if (!audio->buffer) return false; - audio->outbuf_size = FF_MIN_BUFFER_SIZE; + audio->outbuf_size = AV_INPUT_BUFFER_MIN_SIZE; audio->outbuf = (uint8_t*)av_malloc(audio->outbuf_size); if (!audio->outbuf) return false; @@ -490,14 +501,14 @@ static bool ffmpeg_init_video(ffmpeg_t *handle) if (params->video_qscale) { - video->codec->flags |= CODEC_FLAG_QSCALE; + video->codec->flags |= AV_CODEC_FLAG_QSCALE; video->codec->global_quality = params->video_global_quality; } else if (params->video_bit_rate) video->codec->bit_rate = params->video_bit_rate; if (handle->muxer.ctx->oformat->flags & AVFMT_GLOBALHEADER) - video->codec->flags |= CODEC_FLAG_GLOBAL_HEADER; + video->codec->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; if (avcodec_open2(video->codec, codec, params->video_opts ? ¶ms->video_opts : NULL) != 0) diff --git a/retroarch.c b/retroarch.c index 4ab0eca51d..88173a0266 100644 --- a/retroarch.c +++ b/retroarch.c @@ -219,6 +219,7 @@ static bool runloop_paused = false; static bool runloop_idle = false; static bool runloop_exec = false; static bool runloop_slowmotion = false; +static bool runloop_fastmotion = false; static bool runloop_shutdown_initiated = false; static bool runloop_core_shutdown_initiated = false; static bool runloop_perfcnt_enable = false; @@ -395,10 +396,6 @@ static void retroarch_print_features(void) _PSUPP(sdl_image, "SDL_image", "SDL_image image loading"); _PSUPP(rpng, "rpng", "PNG image loading/encoding"); _PSUPP(rpng, "rjpeg", "JPEG image loading"); - - _PSUPP(fbo, "FBO", "OpenGL render-to-texture " - "(multi-pass shaders)"); - _PSUPP(dynamic, "Dynamic", "Dynamic run-time loading of " "libretro library"); _PSUPP(ffmpeg, "FFmpeg", "On-the-fly recording of gameplay " @@ -1384,10 +1381,10 @@ static bool rarch_game_specific_options(char **output) if (!retroarch_validate_game_options(game_path, game_path_size, false)) - goto error; + goto error; if (!config_file_exists(game_path)) - goto error; + goto error; RARCH_LOG("%s %s\n", msg_hash_to_str(MSG_GAME_SPECIFIC_CORE_OPTIONS_FOUND_AT), @@ -2313,40 +2310,40 @@ bool runloop_msg_queue_pull(const char **ret) #ifdef HAVE_MENU static bool input_driver_toggle_button_combo( - unsigned mode, uint64_t input) + unsigned mode, retro_bits_t* p_input) { switch (mode) { case INPUT_TOGGLE_DOWN_Y_L_R: - if (!BIT64_GET(input, RETRO_DEVICE_ID_JOYPAD_DOWN)) + if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_DOWN)) return false; - if (!BIT64_GET(input, RETRO_DEVICE_ID_JOYPAD_Y)) + if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_Y)) return false; - if (!BIT64_GET(input, RETRO_DEVICE_ID_JOYPAD_L)) + if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_L)) return false; - if (!BIT64_GET(input, RETRO_DEVICE_ID_JOYPAD_R)) + if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_R)) return false; break; case INPUT_TOGGLE_L3_R3: - if (!BIT64_GET(input, RETRO_DEVICE_ID_JOYPAD_L3)) + if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_L3)) return false; - if (!BIT64_GET(input, RETRO_DEVICE_ID_JOYPAD_R3)) + if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_R3)) return false; break; case INPUT_TOGGLE_L1_R1_START_SELECT: - if (!BIT64_GET(input, RETRO_DEVICE_ID_JOYPAD_START)) + if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_START)) return false; - if (!BIT64_GET(input, RETRO_DEVICE_ID_JOYPAD_SELECT)) + if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_SELECT)) return false; - if (!BIT64_GET(input, RETRO_DEVICE_ID_JOYPAD_L)) + if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_L)) return false; - if (!BIT64_GET(input, RETRO_DEVICE_ID_JOYPAD_R)) + if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_R)) return false; break; case INPUT_TOGGLE_START_SELECT: - if (!BIT64_GET(input, RETRO_DEVICE_ID_JOYPAD_START)) + if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_START)) return false; - if (!BIT64_GET(input, RETRO_DEVICE_ID_JOYPAD_SELECT)) + if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_SELECT)) return false; break; default: @@ -2363,7 +2360,7 @@ static enum runloop_state runloop_check_state( bool input_nonblock_state, unsigned *sleep_ms) { - static uint64_t last_input = 0; + static retro_bits_t last_input = {{0}}; static bool old_fs_toggle_pressed= false; static bool old_focus = true; bool is_focused = false; @@ -2375,13 +2372,17 @@ static enum runloop_state runloop_check_state( #ifdef HAVE_MENU bool menu_driver_binding_state = menu_driver_is_binding_state(); bool menu_is_alive = menu_driver_is_alive(); - uint64_t current_input = - menu_is_alive && !(settings->bools.menu_unified_controls && !menu_input_dialog_get_display_kb())? - input_menu_keys_pressed(settings, last_input) : - input_keys_pressed(settings, last_input); + + retro_bits_t current_input; + + if ( menu_is_alive && !(settings->bools.menu_unified_controls && !menu_input_dialog_get_display_kb()) ) + input_menu_keys_pressed(settings, ¤t_input); + else + input_keys_pressed(settings, ¤t_input); + #else - uint64_t current_input = - input_keys_pressed(settings, last_input); + retro_bits_t current_input; + input_keys_pressed(settings, ¤t_input); #endif last_input = current_input; @@ -2389,20 +2390,20 @@ static enum runloop_state runloop_check_state( if ( ((settings->uints.input_menu_toggle_gamepad_combo != INPUT_TOGGLE_NONE) && input_driver_toggle_button_combo( - settings->uints.input_menu_toggle_gamepad_combo, last_input))) + settings->uints.input_menu_toggle_gamepad_combo, &last_input))) { - BIT64_SET(current_input, RARCH_MENU_TOGGLE); + RARCH_INPUT_STATE_BIT_SET(current_input, RARCH_MENU_TOGGLE); } #endif if (input_driver_flushing_input) { input_driver_flushing_input = false; - if (current_input) + if (RARCH_INPUT_STATE_ANY_SET(current_input)) { - current_input = 0; + RARCH_INPUT_STATE_CLEAR( current_input ); if (runloop_paused) - BIT64_SET(current_input, RARCH_PAUSE_TOGGLE); + RARCH_INPUT_STATE_BIT_SET(current_input, RARCH_PAUSE_TOGGLE); input_driver_flushing_input = true; } } @@ -2411,7 +2412,7 @@ static enum runloop_state runloop_check_state( #ifdef HAVE_MENU if (menu_driver_binding_state) - current_input = 0; + RARCH_INPUT_STATE_CLEAR( current_input ); #endif #ifdef HAVE_OVERLAY @@ -2532,15 +2533,21 @@ static enum runloop_state runloop_check_state( #ifdef HAVE_MENU if (menu_is_alive) { - static uint64_t old_input = 0; + static retro_bits_t old_input = {{0}}; menu_ctx_iterate_t iter; retro_ctx.poll_cb(); { - uint64_t trigger_input = current_input & ~old_input; - enum menu_action action = (enum menu_action)menu_event(current_input, trigger_input); - bool focused = pause_nonactive ? is_focused : true; + retro_bits_t trigger_input; + enum menu_action action; + bool focused; + + trigger_input = current_input; + RARCH_INPUT_STATE_CLEAR_BITS( trigger_input, old_input ); + + action = (enum menu_action)menu_event(¤t_input, &trigger_input); + focused = pause_nonactive ? is_focused : true; focused = focused && !ui_companion_is_on_foreground(); @@ -2769,21 +2776,34 @@ static enum runloop_state runloop_check_state( if (new_button_state && !old_button_state) { - if (input_nonblock_state) + if (input_nonblock_state) { input_driver_unset_nonblock_state(); - else + runloop_fastmotion = false; + } + else { input_driver_set_nonblock_state(); + runloop_fastmotion = true; + } driver_set_nonblock_state(); } else if (old_hold_button_state != new_hold_button_state) { - if (new_hold_button_state) + if (new_hold_button_state) { input_driver_set_nonblock_state(); - else + runloop_fastmotion = true; + } + else { input_driver_unset_nonblock_state(); + runloop_fastmotion = false; + } driver_set_nonblock_state(); } + /* Display the fast forward state to the user, if needed. */ + if (runloop_fastmotion) + runloop_msg_queue_push( + msg_hash_to_str(MSG_FAST_FORWARD), 1, 1, false); + old_button_state = new_button_state; old_hold_button_state = new_hold_button_state; } @@ -2887,10 +2907,10 @@ static enum runloop_state runloop_check_state( if (state_manager_frame_is_reversed()) runloop_msg_queue_push( - msg_hash_to_str(MSG_SLOW_MOTION_REWIND), 2, 30, true); + msg_hash_to_str(MSG_SLOW_MOTION_REWIND), 1, 1, false); else runloop_msg_queue_push( - msg_hash_to_str(MSG_SLOW_MOTION), 2, 30, true); + msg_hash_to_str(MSG_SLOW_MOTION), 1, 1, false); } } @@ -3134,7 +3154,6 @@ int runloop_iterate(unsigned *sleep_ms) if (settings->floats.fastforward_ratio) end: { - retro_time_t to_sleep_ms = ( (frame_limit_last_time + frame_limit_minimum_time) - cpu_features_get_time_usec()) / 1000; diff --git a/retroarch.desktop b/retroarch.desktop index ffbff3c980..f9ae21d6b7 100644 --- a/retroarch.desktop +++ b/retroarch.desktop @@ -1,9 +1,10 @@ [Desktop Entry] Version=1.0 Name=RetroArch -GenericName=Libretro Frontend +GenericName=RetroArch Type=Application -Comment=Multi-Engine Platform +Comment=Frontend for emulators, game engines and media players +Comment[ru]=Графический интерфейс для эмуляторов, игровых движков и медиаплееров Icon=retroarch Exec=retroarch Terminal=false diff --git a/retroarch.h b/retroarch.h index a8600f665b..3cd1b742d3 100644 --- a/retroarch.h +++ b/retroarch.h @@ -27,7 +27,7 @@ #include "core_type.h" #include "core.h" -#define runloop_cmd_press(current_input, id) (BIT64_GET(current_input, id)) +#define runloop_cmd_press(current_input, id) (RARCH_INPUT_STATE_BIT_GET(current_input, id)) RETRO_BEGIN_DECLS @@ -225,6 +225,7 @@ typedef struct global char ups[8192]; char bps[8192]; char ips[8192]; + char label[8192]; char *remapfile; } name; diff --git a/setting_list.c b/setting_list.c index ebb84273fd..1b69342c31 100644 --- a/setting_list.c +++ b/setting_list.c @@ -131,6 +131,8 @@ static int setting_bind_action_start(void *data) bind_type = setting_get_bind_type(setting); keybind->key = def_binds[bind_type - MENU_SETTINGS_BIND_BEGIN].key; + keybind->mbutton = NO_BTN; + return 0; } #endif diff --git a/tasks/task_autodetect.c b/tasks/task_autodetect.c index 7a25d9bc61..66080478f8 100644 --- a/tasks/task_autodetect.c +++ b/tasks/task_autodetect.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-2017 - 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- @@ -24,7 +25,36 @@ #include #include +#ifdef HAVE_LIBUSB +#ifdef __FreeBSD__ +#include +#else +#include +#endif +#endif + +#if defined(_WIN32) && !defined(_XBOX) && !defined(_MSC_VER) && _WIN32_WINNT >= 0x0500 +/* MinGW Win32 HID API */ +#include +#include +#include +#ifdef __NO_INLINE__ +/* Workaround MinGW issue where compiling without -O2 (which sets __NO_INLINE__) causes the strsafe functions + * to never be defined (only declared). + */ +#define __CRT_STRSAFE_IMPL +#endif +#include +#include +#include +#include +#include +/* Why doesn't including cguid.h work to get a GUID_NULL instead? */ +const GUID GUID_NULL = {0, 0, 0, {0, 0, 0, 0, 0, 0, 0, 0}}; +#endif + #include "../input/input_driver.h" +#include "../input/include/blissbox.h" #include "../configuration.h" #include "../file_path_special.h" @@ -33,6 +63,19 @@ #include "tasks_internal.h" +/* HID Class-Specific Requests values. See section 7.2 of the HID specifications */ +#define USB_HID_GET_REPORT 0x01 +#define USB_CTRL_IN LIBUSB_ENDPOINT_IN|LIBUSB_REQUEST_TYPE_CLASS|LIBUSB_RECIPIENT_INTERFACE +#define USB_PACKET_CTRL_LEN 64 +#define USB_TIMEOUT 5000 /* timeout in ms */ + +/* only one blissbox per machine is currently supported */ +static const blissbox_pad_type_t *blissbox_pads[BLISSBOX_MAX_PADS] = {NULL}; + +#ifdef HAVE_LIBUSB +static struct libusb_device_handle *autoconfig_libusb_handle = NULL; +#endif + typedef struct autoconfig_disconnect autoconfig_disconnect_t; typedef struct autoconfig_params autoconfig_params_t; @@ -120,13 +163,16 @@ static int input_autoconfigure_joypad_try_from_conf(config_file_t *conf, if (config_get_int (conf, "input_product_id", &tmp_int)) input_pid = tmp_int; + if (params->vid == BLISSBOX_VID) + input_pid = BLISSBOX_PID; + /* Check for VID/PID */ if ( (params->vid == input_vid) && (params->pid == input_pid) && (params->vid != 0) && (params->pid != 0) - && (input_vid != 0) - && (input_pid != 0)) + && (params->vid != BLISSBOX_VID) + && (params->pid != BLISSBOX_PID)) score += 3; /* Check for name match */ @@ -333,6 +379,392 @@ static void input_autoconfigure_params_free(autoconfig_params_t *params) params->autoconfig_directory = NULL; } +#ifdef _WIN32 +static const blissbox_pad_type_t* input_autoconfigure_get_blissbox_pad_type_win32(int vid, int pid) +{ + /* TODO: Remove the check for !defined(_MSC_VER) after making sure this builds on MSVC */ + + /* HID API is available since Windows 2000 */ +#if defined(_WIN32) && !defined(_XBOX) && !defined(_MSC_VER) && _WIN32_WINNT >= 0x0500 + HDEVINFO hDeviceInfo; + SP_DEVINFO_DATA DeviceInfoData; + SP_DEVICE_INTERFACE_DATA deviceInterfaceData; + HANDLE hDeviceHandle = INVALID_HANDLE_VALUE; + BOOL bResult = TRUE; + BOOL success = FALSE; + GUID guidDeviceInterface = {0}; + PSP_DEVICE_INTERFACE_DETAIL_DATA + pInterfaceDetailData = NULL; + ULONG requiredLength = 0; + LPTSTR lpDevicePath = NULL; + char *devicePath = NULL; + DWORD index = 0; + DWORD intIndex = 0; + size_t nLength = 0; + unsigned len = 0; + unsigned i = 0; + char vidPidString[32] = {0}; + char vidString[5] = {0}; + char pidString[5] = {0}; + char report[USB_PACKET_CTRL_LEN + 1] = {0}; + + snprintf(vidString, sizeof(vidString), "%04x", vid); + snprintf(pidString, sizeof(pidString), "%04x", pid); + + strlcat(vidPidString, "vid_", sizeof(vidPidString)); + strlcat(vidPidString, vidString, sizeof(vidPidString)); + strlcat(vidPidString, "&pid_", sizeof(vidPidString)); + strlcat(vidPidString, pidString, sizeof(vidPidString)); + + HidD_GetHidGuid(&guidDeviceInterface); + + if (!memcmp(&guidDeviceInterface, &GUID_NULL, sizeof(GUID_NULL))) + { + RARCH_ERR("[Autoconf]: null guid\n"); + return NULL; + } + + /* Get information about all the installed devices for the specified + * device interface class. + */ + hDeviceInfo = SetupDiGetClassDevs( + &guidDeviceInterface, + NULL, + NULL, + DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); + + if (hDeviceInfo == INVALID_HANDLE_VALUE) + { + RARCH_ERR("[Autoconf]: Error in SetupDiGetClassDevs: %d.\n", GetLastError()); + goto done; + } + + /* Enumerate all the device interfaces in the device information set. */ + DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); + + while (!success) + { + success = SetupDiEnumDeviceInfo(hDeviceInfo, index, &DeviceInfoData); + + /* Reset for this iteration */ + if (lpDevicePath) + { + LocalFree(lpDevicePath); + lpDevicePath = NULL; + } + + if (pInterfaceDetailData) + { + LocalFree(pInterfaceDetailData); + pInterfaceDetailData = NULL; + } + + /* Check if this is the last item */ + if (GetLastError() == ERROR_NO_MORE_ITEMS) + break; + + deviceInterfaceData.cbSize = sizeof(SP_INTERFACE_DEVICE_DATA); + + /* Get information about the device interface. */ + for (intIndex = 0; (bResult = SetupDiEnumDeviceInterfaces( + hDeviceInfo, + &DeviceInfoData, + &guidDeviceInterface, + intIndex, + &deviceInterfaceData)); intIndex++) + { + /* Check if this is the last item */ + if (GetLastError() == ERROR_NO_MORE_ITEMS) + break; + + /* Check for some other error */ + if (!bResult) + { + RARCH_ERR("[Autoconf]: Error in SetupDiEnumDeviceInterfaces: %d.\n", GetLastError()); + goto done; + } + + /* Interface data is returned in SP_DEVICE_INTERFACE_DETAIL_DATA + * which we need to allocate, so we have to call this function twice. + * First to get the size so that we know how much to allocate, and + * second to do the actual call with the allocated buffer. + */ + + bResult = SetupDiGetDeviceInterfaceDetail( + hDeviceInfo, + &deviceInterfaceData, + NULL, 0, + &requiredLength, + NULL); + + /* Check for some other error */ + if (!bResult) + { + if ((ERROR_INSUFFICIENT_BUFFER == GetLastError()) && (requiredLength > 0)) + { + /* we got the size, now allocate buffer */ + pInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)LocalAlloc(LPTR, requiredLength); + + if (!pInterfaceDetailData) + { + RARCH_ERR("[Autoconf]: Error allocating memory for the device detail buffer.\n"); + goto done; + } + } + else + { + RARCH_ERR("[Autoconf]: Other error: %d.\n", GetLastError()); + goto done; + } + } + + /* get the interface detailed data */ + pInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); + + /* Now call it with the correct size and allocated buffer */ + bResult = SetupDiGetDeviceInterfaceDetail( + hDeviceInfo, + &deviceInterfaceData, + pInterfaceDetailData, + requiredLength, + NULL, + &DeviceInfoData); + + /* Check for some other error */ + if (!bResult) + { + RARCH_LOG("[Autoconf]: Error in SetupDiGetDeviceInterfaceDetail: %d.\n", GetLastError()); + goto done; + } + + /* copy device path */ + nLength = _tcslen(pInterfaceDetailData->DevicePath) + 1; + lpDevicePath = (TCHAR*)LocalAlloc(LPTR, nLength * sizeof(TCHAR)); + + StringCchCopy(lpDevicePath, nLength, pInterfaceDetailData->DevicePath); + + devicePath = (char*)malloc(nLength); + + for (len = 0; len < nLength; len++) + devicePath[len] = lpDevicePath[len]; + + lpDevicePath[nLength - 1] = 0; + + if (strstr(devicePath, vidPidString)) + goto found; + } + + success = FALSE; + index++; + } + + if (!lpDevicePath) + { + RARCH_ERR("[Autoconf]: No devicepath. Error %d.", GetLastError()); + goto done; + } + +found: + /* Open the device */ + hDeviceHandle = CreateFileA( + devicePath, + GENERIC_READ, /* | GENERIC_WRITE,*/ + FILE_SHARE_READ, /* | FILE_SHARE_WRITE,*/ + NULL, + OPEN_EXISTING, + 0, /*FILE_FLAG_OVERLAPPED,*/ + NULL); + + if (hDeviceHandle == INVALID_HANDLE_VALUE) + { + RARCH_ERR("[Autoconf]: Can't open device: %d.", GetLastError()); + goto done; + } + +done: + free(devicePath); + LocalFree(lpDevicePath); + LocalFree(pInterfaceDetailData); + bResult = SetupDiDestroyDeviceInfoList(hDeviceInfo); + + devicePath = NULL; + lpDevicePath = NULL; + pInterfaceDetailData = NULL; + + if (!bResult) + RARCH_ERR("[Autoconf]: Could not destroy device info list.\n"); + + if (!hDeviceHandle || hDeviceHandle == INVALID_HANDLE_VALUE) + { + /* device is not connected */ + return NULL; + } + + report[0] = BLISSBOX_USB_FEATURE_REPORT_ID; + + HidD_GetFeature(hDeviceHandle, report, sizeof(report)); + + CloseHandle(hDeviceHandle); + + for (i = 0; i < sizeof(blissbox_pad_types) / sizeof(blissbox_pad_types[0]); i++) + { + const blissbox_pad_type_t *pad = &blissbox_pad_types[i]; + + if (!pad || string_is_empty(pad->name)) + continue; + + if (pad->index == report[0]) + return pad; + } + + RARCH_LOG("[Autoconf]: Could not find connected pad in Bliss-Box port#%d.\n", pid - BLISSBOX_PID); +#endif + + return NULL; +} +#endif + +#ifndef _WIN32 +static const blissbox_pad_type_t* input_autoconfigure_get_blissbox_pad_type_libusb(int vid, int pid) +{ +#ifdef HAVE_LIBUSB + unsigned i; + unsigned char answer[USB_PACKET_CTRL_LEN] = {0}; + int ret = libusb_init(NULL); + + if (ret < 0) + { + RARCH_ERR("[Autoconf]: Could not initialize libusb.\n"); + return NULL; + } + + autoconfig_libusb_handle = libusb_open_device_with_vid_pid(NULL, vid, pid); + + if (!autoconfig_libusb_handle) + { + RARCH_ERR("[Autoconf]: Could not find or open libusb device %d:%d.\n", vid, pid); + goto error; + } + +#ifdef __linux__ + libusb_detach_kernel_driver(autoconfig_libusb_handle, 0); +#endif + + ret = libusb_set_configuration(autoconfig_libusb_handle, 1); + + if (ret < 0) + { + RARCH_ERR("[Autoconf]: Error during libusb_set_configuration.\n"); + goto error; + } + + ret = libusb_claim_interface(autoconfig_libusb_handle, 0); + + if (ret < 0) + { + RARCH_ERR("[Autoconf]: Error during libusb_claim_interface.\n"); + goto error; + } + + ret = libusb_control_transfer(autoconfig_libusb_handle, USB_CTRL_IN, USB_HID_GET_REPORT, BLISSBOX_USB_FEATURE_REPORT_ID, 0, answer, USB_PACKET_CTRL_LEN, USB_TIMEOUT); + + if (ret < 0) + RARCH_ERR("[Autoconf]: Error during libusb_control_transfer.\n"); + + libusb_release_interface(autoconfig_libusb_handle, 0); + +#ifdef __linux__ + libusb_attach_kernel_driver(autoconfig_libusb_handle, 0); +#endif + + libusb_close(autoconfig_libusb_handle); + libusb_exit(NULL); + + for (i = 0; i < sizeof(blissbox_pad_types) / sizeof(blissbox_pad_types[0]); i++) + { + const blissbox_pad_type_t *pad = &blissbox_pad_types[i]; + + if (!pad || string_is_empty(pad->name)) + continue; + + if (pad->index == answer[0]) + return pad; + } + + RARCH_LOG("[Autoconf]: Could not find connected pad in Bliss-Box port#%d.\n", pid - BLISSBOX_PID); + + return NULL; + +error: + libusb_close(autoconfig_libusb_handle); + libusb_exit(NULL); +#endif + + return NULL; +} +#endif + +static const blissbox_pad_type_t* input_autoconfigure_get_blissbox_pad_type(int vid, int pid) +{ +#if defined(_WIN32) +#if defined(_MSC_VER) || defined(_XBOX) + /* no MSVC/XBOX support */ + return NULL; +#else + /* MinGW */ + return input_autoconfigure_get_blissbox_pad_type_win32(vid, pid); +#endif +#else + return input_autoconfigure_get_blissbox_pad_type_libusb(vid, pid); +#endif +} + +static void input_autoconfigure_override_handler(autoconfig_params_t *params) +{ + if (params->vid == BLISSBOX_VID) + { + if (params->pid == BLISSBOX_UPDATE_MODE_PID) + RARCH_LOG("[Autoconf]: Bliss-Box in update mode detected. Ignoring.\n"); + else if (params->pid == BLISSBOX_OLD_PID) + RARCH_LOG("[Autoconf]: Bliss-Box 1.0 firmware detected. Please update to 2.0 or later.\n"); + else if (params->pid >= BLISSBOX_PID && params->pid <= BLISSBOX_PID + BLISSBOX_MAX_PAD_INDEX) + { + const blissbox_pad_type_t *pad; + char name[255] = {0}; + int index = params->pid - BLISSBOX_PID; + + RARCH_LOG("[Autoconf]: Bliss-Box detected. Getting pad type...\n"); + + if (blissbox_pads[index]) + pad = blissbox_pads[index]; + else + pad = input_autoconfigure_get_blissbox_pad_type(params->vid, params->pid); + + if (pad && !string_is_empty(pad->name)) + { + RARCH_LOG("[Autoconf]: Found Bliss-Box pad type: %s (%d) in port#%d\n", pad->name, pad->index, index); + + if (params->name) + free(params->name); + + /* override name given to autoconfig so it knows what kind of pad this is */ + strlcat(name, "Bliss-Box 4-Play ", sizeof(name)); + strlcat(name, pad->name, sizeof(name)); + + params->name = strdup(name); + + blissbox_pads[index] = pad; + } + else + { + int count = sizeof(blissbox_pad_types) / sizeof(blissbox_pad_types[0]); + /* use NULL entry to mark as an unconnected port */ + blissbox_pads[index] = &blissbox_pad_types[count - 1]; + } + } + } +} + static void input_autoconfigure_connect_handler(retro_task_t *task) { autoconfig_params_t *params = (autoconfig_params_t*)task->state; @@ -499,6 +931,8 @@ bool input_autoconfigure_connect( state->max_users = *( input_driver_get_uint(INPUT_ACTION_MAX_USERS)); + input_autoconfigure_override_handler(state); + if (!string_is_empty(state->name)) input_config_set_device_name(state->idx, state->name); input_config_set_pid(state->idx, state->pid); diff --git a/tasks/task_content.c b/tasks/task_content.c index 65a4ab6974..0c8f0b4129 100644 --- a/tasks/task_content.c +++ b/tasks/task_content.c @@ -173,27 +173,21 @@ static void content_load_init_wrap( *argc = 0; argv[(*argc)++] = strdup("retroarch"); -#ifdef HAVE_DYNAMIC - if (!args->no_content) + if (args->content_path) { -#endif - if (args->content_path) - { - RARCH_LOG("Using content: %s.\n", args->content_path); - argv[(*argc)++] = strdup(args->content_path); - } + RARCH_LOG("Using content: %s.\n", args->content_path); + argv[(*argc)++] = strdup(args->content_path); + } #ifdef HAVE_MENU - else - { - RARCH_LOG("%s\n", - msg_hash_to_str(MSG_NO_CONTENT_STARTING_DUMMY_CORE)); - argv[(*argc)++] = strdup("--menu"); - } -#endif -#ifdef HAVE_DYNAMIC + else + { + RARCH_LOG("%s\n", + msg_hash_to_str(MSG_NO_CONTENT_STARTING_DUMMY_CORE)); + argv[(*argc)++] = strdup("--menu"); } #endif + if (args->sram_path) { argv[(*argc)++] = strdup("-s"); @@ -920,7 +914,9 @@ static bool task_load_content(content_ctx_info_t *content_info, { const char *core_path = NULL; const char *core_name = NULL; + const char *label = NULL; playlist_t *playlist_tmp = g_defaults.content_history; + global_t *global = global_get_ptr(); switch (path_is_media_type(tmp)) { @@ -955,19 +951,18 @@ static bool task_load_content(content_ctx_info_t *content_info, content_ctx->history_list_enable = settings->bools.history_list_enable; } + if (global && !string_is_empty(global->name.label)) + label = global->name.label; + if ( - content_ctx->history_list_enable - && playlist_tmp - && playlist_push( + content_ctx->history_list_enable + && playlist_tmp) + command_playlist_push_write( playlist_tmp, tmp, - NULL, + label, core_path, - core_name, - NULL, - NULL) - ) - playlist_write_file(playlist_tmp); + core_name); } free(tmp); @@ -1127,7 +1122,7 @@ bool task_push_start_dummy_core(content_ctx_info_t *content_info) if (error_string) { runloop_msg_queue_push(error_string, 2, 90, true); - RARCH_ERR(error_string); + RARCH_ERR("%s\n", error_string); free(error_string); } @@ -1150,6 +1145,7 @@ bool task_push_start_dummy_core(content_ctx_info_t *content_info) bool task_push_load_content_from_playlist_from_menu( const char *core_path, const char *fullpath, + const char *label, content_ctx_info_t *content_info, retro_task_callback_t cb, void *user_data) @@ -1191,6 +1187,10 @@ bool task_push_load_content_from_playlist_from_menu( content_ctx.name_bps = strdup(global->name.bps); if (!string_is_empty(global->name.ups)) content_ctx.name_ups = strdup(global->name.ups); + if (label) + strlcpy(global->name.label, label, sizeof(global->name.label)); + else + global->name.label[0] = '\0'; } if (!string_is_empty(settings->paths.directory_system)) @@ -1213,7 +1213,7 @@ bool task_push_load_content_from_playlist_from_menu( if (error_string) { runloop_msg_queue_push(error_string, 2, 90, true); - RARCH_ERR(error_string); + RARCH_ERR("%s\n", error_string); free(error_string); } @@ -1315,7 +1315,7 @@ bool task_push_start_current_core(content_ctx_info_t *content_info) if (error_string) { runloop_msg_queue_push(error_string, 2, 90, true); - RARCH_ERR(error_string); + RARCH_ERR("%s\n", error_string); free(error_string); } @@ -1443,7 +1443,7 @@ bool task_push_load_content_with_new_core_from_menu( if (error_string) { runloop_msg_queue_push(error_string, 2, 90, true); - RARCH_ERR(error_string); + RARCH_ERR("%s\n", error_string); free(error_string); } @@ -1548,7 +1548,7 @@ end: if (error_string) { runloop_msg_queue_push(error_string, 2, 90, true); - RARCH_ERR(error_string); + RARCH_ERR("%s\n", error_string); free(error_string); } diff --git a/tasks/task_database.c b/tasks/task_database.c index 6e49a4125a..afe42dd83e 100644 --- a/tasks/task_database.c +++ b/tasks/task_database.c @@ -505,7 +505,7 @@ static int task_database_cue_get_crc(const char *name, uint32_t *crc) return 0; } - RARCH_LOG("CUE '%s' primary track: %s\n (%Zu, %Zu)", name, track_path, offset, size); + RARCH_LOG("CUE '%s' primary track: %s\n (%lu, %lu)\n", name, track_path, (unsigned long) offset, (unsigned long) size); RARCH_LOG("%s\n", msg_hash_to_str(MSG_READING_FIRST_DATA_TRACK)); @@ -797,6 +797,7 @@ static int database_info_list_iterate_found_match( database_info_get_current_element_name(db); database_info_t *db_info_entry = &db_state->info->list[db_state->entry_index]; + char *hash; db_crc[0] = '\0'; db_playlist_path[0] = '\0'; @@ -827,6 +828,11 @@ static int database_info_list_iterate_found_match( entry_path_str, archive_name, '#', PATH_MAX_LENGTH * sizeof(char)); + if (core_info_database_match_archive_member( + db_state->list->elems[db_state->list_index].data) && + (hash = strchr(entry_path_str, '#'))) + *hash = '\0'; + #if 0 RARCH_LOG("Found match in database !\n"); @@ -862,6 +868,17 @@ static int database_info_list_iterate_found_match( free(db_playlist_base_str); free(db_crc); + /* Move database to start since we are likely to match against it + again */ + if (db_state->list_index != 0) + { + struct string_list_elem entry = db_state->list->elems[db_state->list_index]; + memmove(&db_state->list->elems[1], + &db_state->list->elems[0], + sizeof(entry) * db_state->list_index); + db_state->list->elems[0] = entry; + } + return 0; } @@ -900,7 +917,10 @@ static int task_database_iterate_crc_lookup( query[0] = '\0'; /* don't scan files that can't be in this database */ - if (!core_info_database_supports_content_path( + if (!(path_contains_compressed_file(name) && + core_info_database_match_archive_member( + db_state->list->elems[db_state->list_index].data)) && + !core_info_database_supports_content_path( db_state->list->elems[db_state->list_index].data, name)) return database_info_list_iterate_next(db_state); @@ -1234,9 +1254,14 @@ static void task_database_handler(retro_task_t *task) } else { - runloop_msg_queue_push( - msg_hash_to_str(MSG_SCANNING_OF_DIRECTORY_FINISHED), - 0, 180, true); + if (db->is_directory) + runloop_msg_queue_push( + msg_hash_to_str(MSG_SCANNING_OF_DIRECTORY_FINISHED), + 0, 180, true); + else + runloop_msg_queue_push( + msg_hash_to_str(MSG_SCANNING_OF_FILE_FINISHED), + 0, 180, true); goto task_finished; } break; diff --git a/tasks/task_file_transfer.c b/tasks/task_file_transfer.c index de00534f4d..9d8ed3976a 100644 --- a/tasks/task_file_transfer.c +++ b/tasks/task_file_transfer.c @@ -67,7 +67,7 @@ void task_file_load_handler(retro_task_t *task) case NBIO_STATUS_INIT: if (nbio && !string_is_empty(nbio->path)) { - struct nbio_t *handle = nbio_open(nbio->path, NBIO_READ); + struct nbio_t *handle = (struct nbio_t*)nbio_open(nbio->path, NBIO_READ); if (handle) { diff --git a/tasks/task_screenshot.c b/tasks/task_screenshot.c index e9f071c5b2..dee2926136 100644 --- a/tasks/task_screenshot.c +++ b/tasks/task_screenshot.c @@ -49,6 +49,7 @@ #endif #include "../defaults.h" +#include "../command.h" #include "../configuration.h" #include "../retroarch.h" #include "../paths.h" @@ -158,23 +159,16 @@ static void task_screenshot_handler(retro_task_t *task) #endif #ifdef HAVE_IMAGEVIEWER - if (ret && !state->silence) - { - if ( - state->history_list_enable - && g_defaults.image_history - && playlist_push( - g_defaults.image_history, - state->filename, - NULL, - "builtin", - "imageviewer", - NULL, - NULL - ) + if ( ret && + !state->silence && + state->history_list_enable ) - playlist_write_file(g_defaults.image_history); - } + command_playlist_push_write( + g_defaults.image_history, + state->filename, + NULL, + "builtin", + "imageviewer"); #endif task_set_progress(task, 100); diff --git a/tasks/tasks_internal.h b/tasks/tasks_internal.h index e9174eac43..bf32504ef0 100644 --- a/tasks/tasks_internal.h +++ b/tasks/tasks_internal.h @@ -198,6 +198,7 @@ bool task_push_load_content_with_new_core_from_menu( bool task_push_load_content_from_playlist_from_menu( const char *core_path, const char *fullpath, + const char *label, content_ctx_info_t *content_info, retro_task_callback_t cb, void *user_data); diff --git a/tools/ps3/ps3py/LICENSE b/tools/ps3/ps3py/LICENSE new file mode 100644 index 0000000000..1580af9d38 --- /dev/null +++ b/tools/ps3/ps3py/LICENSE @@ -0,0 +1,19 @@ + Copyright (c) 2011 PSL1GHT Development Team + + 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. diff --git a/tools/ps3/ps3py/crypt.c b/tools/ps3/ps3py/crypt.c index f128b47e02..01bb770e8b 100644 --- a/tools/ps3/ps3py/crypt.c +++ b/tools/ps3/ps3py/crypt.c @@ -1,3 +1,24 @@ +/* Copyright (c) 2011 PSL1GHT Development Team + * + * 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 static PyObject *sha1_callback = NULL; @@ -81,10 +102,10 @@ static PyObject *register_sha1_callback(PyObject *self, PyObject *args) PyErr_SetString(PyExc_TypeError, "parameter must be callable"); return NULL; } - Py_XINCREF(temp); /* Add a reference to new callback */ + Py_XINCREF(temp); /* Add a reference to new callback */ Py_XDECREF(sha1_callback); /* Dispose of previous callback */ sha1_callback = temp; /* Remember new callback */ - /* Boilerplate to return "None" */ + /* Boilerplate to return "None" */ Py_INCREF(Py_None); result = Py_None; } diff --git a/ui/drivers/cocoa/cocoa_common.m b/ui/drivers/cocoa/cocoa_common.m index 71d3205f65..3c823d5a1c 100644 --- a/ui/drivers/cocoa/cocoa_common.m +++ b/ui/drivers/cocoa/cocoa_common.m @@ -302,11 +302,8 @@ static void event_process_camera_frame(void *pbuf_ptr) } outputTexture = RCVOpenGLTextureGetName(renderTexture); - glBindTexture(GL_TEXTURE_2D, outputTexture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + gl_bind_texture(outputTexture, GL_CLAMP_TO_EDGE, GL_LINEAR, GL_LINEAR); CVPixelBufferUnlockBaseAddress(pixelBuffer, 0); [[NSNotificationCenter defaultCenter] postNotificationName:@"NewCameraTextureReady" object:nil]; diff --git a/version.all b/version.all index 7b71569142..ce3e230e61 100644 --- a/version.all +++ b/version.all @@ -6,8 +6,8 @@ # /* - pkg/snap/snapcraft.yaml (including the github url) */ #if 0 -RARCH_VERSION="1.6.7" +RARCH_VERSION="1.6.9" #endif #ifndef PACKAGE_VERSION -#define PACKAGE_VERSION "1.6.7" +#define PACKAGE_VERSION "1.6.9" #endif diff --git a/version.dtd b/version.dtd index 9520dcf0d2..d1fb503a4e 100644 --- a/version.dtd +++ b/version.dtd @@ -1 +1 @@ - + diff --git a/wiiu/system/exception_handler.c b/wiiu/system/exception_handler.c index 7ec7dc3f90..b867a77a2e 100644 --- a/wiiu/system/exception_handler.c +++ b/wiiu/system/exception_handler.c @@ -90,8 +90,7 @@ void __attribute__((__noreturn__)) exception_cb(OSContext* ctx, OSExceptionType /* First up, the pretty header that tells you wtf just happened */ if (type == OS_EXCEPTION_TYPE_DSI) { - /* Exception type and offending instruction location - Also initializes exception_msgbuf, use buf_add from now on */ + /* Exception type and offending instruction location */ buf_add("DSI: Instr at %08" PRIX32, ctx->srr0); /* Was this a read or a write? */ if (ctx->dsisr & DSISR_WRITE_ATTEMPTED) { @@ -216,6 +215,12 @@ void exception_print_symbol(uint32_t addr) { /* Try for a base address */ void* libAddr; OSDynLoad_Acquire(symbolName, &libAddr); + /* Special case for coreinit; which has broken handles */ + if (!strcmp(symbolName, "coreinit.rpl")) { + void* PPCExit_addr; + OSDynLoad_FindExport(libAddr, 0, "__PPCExit", &PPCExit_addr); + libAddr = PPCExit_addr - 0x180; + } *seperator = '|'; /* We got one! */ if (libAddr) {