diff --git a/Makefile.common b/Makefile.common
index b6579d75aa..5f81c8618c 100644
--- a/Makefile.common
+++ b/Makefile.common
@@ -56,6 +56,7 @@ endif
ifneq ($(findstring Darwin,$(OS)),)
OSX := 1
LIBS += -framework AppKit
+ JOYCONFIG_LIBS += -framework CoreFoundation
else
OSX := 0
endif
@@ -64,7 +65,8 @@ ifneq ($(findstring Linux,$(OS)),)
LIBS += -lrt
JOYCONFIG_LIBS += -lrt -lpthread
OBJ += input/drivers/linuxraw_input.o \
- input/drivers_joypad/linuxraw_joypad.o
+ input/drivers_joypad/linuxraw_joypad.o \
+ frontend/drivers/platform_linux.o
endif
ifeq ($(findstring Haiku,$(OS)),)
@@ -172,6 +174,7 @@ OBJ += frontend/frontend.o \
playlist.o \
movie.o \
record/record_driver.o \
+ record/drivers/record_null.o \
performance.o
@@ -252,6 +255,10 @@ ifeq ($(HAVE_AL), 1)
endif
endif
+ifeq ($(OSX), 1)
+ OBJ += frontend/drivers/platform_apple.o
+endif
+
ifeq ($(HAVE_JACK),1)
OBJ += audio/drivers/jack.o
LIBS += $(JACK_LIBS)
@@ -430,14 +437,15 @@ ifeq ($(HAVE_PARPORT), 1)
OBJ += input/drivers_joypad/parport_joypad.o
endif
+OBJ += gfx/video_context_driver.o \
+ gfx/drivers_context/gfx_null_ctx.o
+
# Video
#
ifeq ($(HAVE_OPENGL), 1)
DEFINES += -DHAVE_OPENGL -DHAVE_GLSL
OBJ += gfx/drivers/gl.o \
gfx/drivers/gl_common.o \
- gfx/video_context_driver.o \
- gfx/drivers_context/gfx_null_ctx.o \
gfx/drivers_font/gl_raster_font.o \
libretro-common/gfx/math/matrix_4x4.o \
gfx/video_state_tracker.o \
@@ -640,13 +648,10 @@ endif
ifeq ($(HAVE_ZLIB), 1)
ZLIB_OBJS = decompress/zip_support.o
- OBJ += libretro-common/formats/png/rpng_nbio.o \
- libretro-common/formats/png/rpng_fbio.o \
- libretro-common/formats/png/rpng_decode.o \
- libretro-common/formats/png/rpng_encode.o \
- libretro-common/file/file_extract.o
+ OBJ += libretro-common/file/file_extract.o
OBJ += $(ZLIB_OBJS)
DEFINES += -DHAVE_ZLIB
+ HAVE_RPNG = 1
HAVE_COMPRESSION = 1
ifeq ($(WANT_ZLIB), 1)
DEFINES += -DWANT_ZLIB
@@ -656,6 +661,17 @@ ifeq ($(HAVE_ZLIB), 1)
endif
endif
+ifdef HAVE_RPNG
+ DEFINES += -DHAVE_RPNG
+endif
+
+ifeq ($(HAVE_RPNG), 1)
+ OBJ += libretro-common/formats/png/rpng_nbio.o \
+ libretro-common/formats/png/rpng_fbio.o \
+ libretro-common/formats/png/rpng_decode.o \
+ libretro-common/formats/png/rpng_encode.o
+endif
+
ifdef HAVE_COMPRESSION
DEFINES += -DHAVE_COMPRESSION
endif
diff --git a/Makefile.ctr b/Makefile.ctr
index b54c29d1e6..44cb99611f 100644
--- a/Makefile.ctr
+++ b/Makefile.ctr
@@ -39,7 +39,7 @@ CFLAGS += -I. -Ideps/zlib -Ideps/7zip -Ilibretro-common/include
CFLAGS += -DRARCH_INTERNAL -DRARCH_CONSOLE -DSINC_LOWEST_QUALITY
CFLAGS += -DHAVE_GRIFFIN=1 -DHAVE_FILTERS_BUILTIN -DHAVE_MENU -DHAVE_RGUI
-CFLAGS += -DHAVE_ZLIB -DWANT_ZLIB -DHAVE_BUILTIN_AUTOCONFIG
+CFLAGS += -DHAVE_ZLIB -DHAVE_RPNG -DWANT_ZLIB -DHAVE_BUILTIN_AUTOCONFIG
#-DHAVE_LIBRETRO_MANAGEMENT -DWANT_RPNG -DHAVE_7ZIP
diff --git a/Makefile.griffin b/Makefile.griffin
index 25543252c3..f893cd9350 100644
--- a/Makefile.griffin
+++ b/Makefile.griffin
@@ -76,6 +76,7 @@ endif
HAVE_FILTERS_BUILTIN := 1
HAVE_THREADS := 1
HAVE_ZLIB := 1
+ HAVE_RPNG := 1
HAVE_7ZIP := 1
HAVE_RPNG := 1
HAVE_OVERLAY := 1
@@ -119,6 +120,7 @@ HAVE_7ZIP := 1
HAVE_LIBRETRO_MANAGEMENT := 1
HAVE_ZLIB := 1
HAVE_RPNG := 1
+ HAVE_RPNG := 1
HAVE_OVERLAY := 1
HAVE_LIBSICKSAXIS := 0
HAVE_BUILTIN_AUTOCONFIG := 1
@@ -172,6 +174,10 @@ ifeq ($(HAVE_ZLIB), 1)
CFLAGS += -DHAVE_ZLIB -DWANT_ZLIB
endif
+ifeq ($(HAVE_RPNG), 1)
+CFLAGS += -DHAVE_RPNG
+endif
+
ifeq ($(HAVE_7ZIP), 1)
CFLAGS += -DHAVE_7ZIP
endif
diff --git a/Makefile.ps3 b/Makefile.ps3
index 47d2186b4f..5cfe5a2773 100644
--- a/Makefile.ps3
+++ b/Makefile.ps3
@@ -106,7 +106,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_OPENGLES -DHAVE_OPENGLES1 -DHAVE_PSGL -DHAVE_CG -DHAVE_CG_RUNTIME_COMPILER -DHAVE_FBO -DHAVE_SYSMODULES -DHAVE_SYSUTILS -DHAVE_RARCH_EXEC -DHAVE_LIBRETRO_MANAGEMENT -DHAVE_RSOUND -DHAVE_ZLIB -DHAVE_7Z -DWANT_ZLIB -DSINC_LOWER_QUALITY -D__CELLOS_LV2__ -DHAVE_NETPLAY=1 -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 -DHAVE_BUILTIN_AUTOCONFIG
+DEFINES += -DHAVE_THREADS -DRARCH_CONSOLE -DHAVE_OPENGL -DHAVE_HEADSET -DHAVE_OPENGLES -DHAVE_OPENGLES1 -DHAVE_PSGL -DHAVE_CG -DHAVE_CG_RUNTIME_COMPILER -DHAVE_FBO -DHAVE_SYSMODULES -DHAVE_SYSUTILS -DHAVE_RARCH_EXEC -DHAVE_LIBRETRO_MANAGEMENT -DHAVE_RSOUND -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_7Z -DWANT_ZLIB -DSINC_LOWER_QUALITY -D__CELLOS_LV2__ -DHAVE_NETPLAY=1 -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 -DHAVE_BUILTIN_AUTOCONFIG
ifeq ($(DEBUG), 1)
PPU_OPTIMIZE_LV := -O0 -g
diff --git a/Makefile.ps3.cobra b/Makefile.ps3.cobra
index 1d708570c2..c542425989 100644
--- a/Makefile.ps3.cobra
+++ b/Makefile.ps3.cobra
@@ -106,7 +106,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_LIBRETRO_MANAGEMENT -DHAVE_RSOUND -DHAVE_ZLIB -DWANT_ZLIB -DSINC_LOWER_QUALITY -D__CELLOS_LV2__ -DHAVE_NETPLAY=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)
+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_LIBRETRO_MANAGEMENT -DHAVE_RSOUND -DHAVE_ZLIB -DHAVE_RPNG -DWANT_ZLIB -DSINC_LOWER_QUALITY -D__CELLOS_LV2__ -DHAVE_NETPLAY=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)
ifeq ($(DEBUG), 1)
PPU_OPTIMIZE_LV := -O0 -g
diff --git a/Makefile.psl1ght b/Makefile.psl1ght
index 88db64d0d7..85ddec7938 100644
--- a/Makefile.psl1ght
+++ b/Makefile.psl1ght
@@ -90,7 +90,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 -DWANT_ZLIB -DHAVE_GRIFFIN=1 -DHAVE_NETPLAY=1 -DHAVE_SOCKET_LEGACY=1 -DPC_DEVELOPMENT_IP_ADDRESS=\"$(PC_DEVELOPMENT_IP_ADDRESS)\" -DPC_DEVELOPMENT_UDP_PORT=$(PC_DEVELOPMENT_UDP_PORT) -Wno-char-subscripts
+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_NETPLAY=1 -DHAVE_SOCKET_LEGACY=1 -DPC_DEVELOPMENT_IP_ADDRESS=\"$(PC_DEVELOPMENT_IP_ADDRESS)\" -DPC_DEVELOPMENT_UDP_PORT=$(PC_DEVELOPMENT_UDP_PORT) -Wno-char-subscripts
CFLAGS += -std=gnu99 $(SHARED_FLAGS)
CXXFLAGS += $(SHARED_FLAGS)
diff --git a/Makefile.psp1 b/Makefile.psp1
index 2b7491db07..d4d43ebafa 100644
--- a/Makefile.psp1
+++ b/Makefile.psp1
@@ -23,7 +23,7 @@ INCDIR = deps/zlib deps/7zip libretro-common/include
CFLAGS = $(OPTIMIZE_LV) -G0 -std=gnu99 -ffast-math
ASFLAGS = $(CFLAGS)
-RARCH_DEFINES = -DPSP -D_MIPS_ARCH_ALLEGREX -DHAVE_LIBRETRO_MANAGEMENT -DHAVE_ZLIB -DWANT_ZLIB -DHAVE_GRIFFIN=1 -DRARCH_INTERNAL -DRARCH_CONSOLE -DHAVE_MENU -DHAVE_RGUI -DWANT_RPNG -DSINC_LOWEST_QUALITY -DHAVE_BUILTIN_AUTOCONFIG -DHAVE_FILTERS_BUILTIN -DHAVE_7ZIP
+RARCH_DEFINES = -DPSP -D_MIPS_ARCH_ALLEGREX -DHAVE_LIBRETRO_MANAGEMENT -DHAVE_ZLIB -DHAVE_RPNG -DWANT_ZLIB -DHAVE_GRIFFIN=1 -DRARCH_INTERNAL -DRARCH_CONSOLE -DHAVE_MENU -DHAVE_RGUI -DWANT_RPNG -DSINC_LOWEST_QUALITY -DHAVE_BUILTIN_AUTOCONFIG -DHAVE_FILTERS_BUILTIN -DHAVE_7ZIP
LIBDIR =
LDFLAGS =
diff --git a/Makefile.psp1.salamander b/Makefile.psp1.salamander
index a5a01061f7..829aa38ec3 100644
--- a/Makefile.psp1.salamander
+++ b/Makefile.psp1.salamander
@@ -18,7 +18,7 @@ RARCH_DEFINES = -DPSP -DIS_SALAMANDER -DRARCH_CONSOLE
LIBDIR =
LDFLAGS =
-LIBS = -lstdc++ -lm
+LIBS = -lstdc++ -lm -lpsppower
ifeq ($(HAVE_FILE_LOGGER), 1)
CFLAGS += -DHAVE_FILE_LOGGER
diff --git a/android/phoenix/jni/Android.mk b/android/phoenix/jni/Android.mk
index 757d41bc1b..c73f73f532 100644
--- a/android/phoenix/jni/Android.mk
+++ b/android/phoenix/jni/Android.mk
@@ -58,7 +58,7 @@ else
endif
-LOCAL_CFLAGS += -Wall -pthread -Wno-unused-function -fno-stack-protector -funroll-loops -DRARCH_MOBILE -DHAVE_GRIFFIN -DANDROID -DHAVE_DYNAMIC -DHAVE_OPENGL -DHAVE_FBO -DHAVE_OVERLAY -DHAVE_OPENGLES -DHAVE_OPENGLES2 -DGLSL_DEBUG -DHAVE_DYLIB -DHAVE_GLSL -DHAVE_MENU -DHAVE_RGUI -DHAVE_ZLIB -DINLINE=inline -DLSB_FIRST -DHAVE_THREADS -D__LIBRETRO__ -DHAVE_RSOUND -DHAVE_NETPLAY -DHAVE_NETWORKING -DRARCH_INTERNAL -DHAVE_FILTERS_BUILTIN -DHAVE_GLUI -DHAVE_XMB -std=gnu99 -DHAVE_LIBRETRODB
+LOCAL_CFLAGS += -Wall -pthread -Wno-unused-function -fno-stack-protector -funroll-loops -DRARCH_MOBILE -DHAVE_GRIFFIN -DANDROID -DHAVE_DYNAMIC -DHAVE_OPENGL -DHAVE_FBO -DHAVE_OVERLAY -DHAVE_OPENGLES -DHAVE_OPENGLES2 -DGLSL_DEBUG -DHAVE_DYLIB -DHAVE_GLSL -DHAVE_MENU -DHAVE_RGUI -DHAVE_ZLIB -DHAVE_RPNG -DINLINE=inline -DLSB_FIRST -DHAVE_THREADS -D__LIBRETRO__ -DHAVE_RSOUND -DHAVE_NETPLAY -DHAVE_NETWORKING -DRARCH_INTERNAL -DHAVE_FILTERS_BUILTIN -DHAVE_GLUI -DHAVE_XMB -std=gnu99 -DHAVE_LIBRETRODB
LOCAL_CFLAGS += -DHAVE_7ZIP
ifeq ($(NDK_DEBUG),1)
diff --git a/apple/OSX/platform.h b/apple/OSX/platform.h
deleted file mode 100644
index 3b98b3fc90..0000000000
--- a/apple/OSX/platform.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/* RetroArch - A frontend for libretro.
- * Copyright (C) 2013-2014 - Jason Fetters
- * Copyright (C) 2011-2015 - Daniel De Matteis
- *
- * RetroArch is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Found-
- * ation, either version 3 of the License, or (at your option) any later version.
- *
- * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE. See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with RetroArch.
- * If not, see .
- */
-
-#ifndef __RARCH_OSX_PLATFORM_H
-#define __RARCH_OSX_PLATFORM_H
-
-#include
-#ifdef HAVE_LOCATION
-#include
-#endif
-
-#include "../common/CFExtensions.h"
-
-@interface RAGameView : NSView
-#ifdef HAVE_LOCATION
-
-#endif
-
-+ (RAGameView*)get;
-#ifndef OSX
-- (void)display;
-#endif
-
-@end
-
-@interface RetroArch_OSX : NSObject
-{
- NSWindow* _window;
- NSWindowController* _settingsWindow;
- NSWindow* _coreSelectSheet;
- NSString* _file;
- NSString* _core;
-}
-
-@property (nonatomic, retain) NSWindow IBOutlet* window;
-
-+ (RetroArch_OSX*)get;
-
-- (void)loadingCore:(NSString*)core withFile:(const char*)file;
-- (void)unloadingCore;
-
-@end
-
-#endif
diff --git a/apple/OSX/platform.m b/apple/OSX/platform.m
index b79992e563..87c8281a86 100644
--- a/apple/OSX/platform.m
+++ b/apple/OSX/platform.m
@@ -17,14 +17,12 @@
#include
#import "../common/RetroArch_Apple.h"
-#include "../../input/drivers/apple_input.h"
+#include "../../input/drivers/cocoa_input.h"
#include "../../frontend/frontend.h"
-#include "../../menu/menu.h"
#include "../../retroarch.h"
#include
-static void* const associated_core_key = (void*)&associated_core_key;
id apple_platform;
void apple_rarch_exited(void);
@@ -42,11 +40,11 @@ void apple_rarch_exited(void)
- (void)sendEvent:(NSEvent *)event
{
NSEventType event_type;
- apple_input_data_t *apple = NULL;
+ cocoa_input_data_t *apple = NULL;
driver_t *driver = driver_get_ptr();
[super sendEvent:event];
- apple = (apple_input_data_t*)driver->input_data;
+ apple = (cocoa_input_data_t*)driver->input_data;
event_type = event.type;
if (!apple)
@@ -80,11 +78,11 @@ void apple_rarch_exited(void)
mod |= RETROKMOD_NUMLOCK;
for (i = 1; i < ch.length; i++)
- apple_input_keyboard_event(event_type == NSKeyDown,
+ cocoa_input_keyboard_event(event_type == NSKeyDown,
0, [ch characterAtIndex:i], mod, RETRO_DEVICE_KEYBOARD);
}
- apple_input_keyboard_event(event_type == NSKeyDown,
+ cocoa_input_keyboard_event(event_type == NSKeyDown,
event.keyCode, character, mod, RETRO_DEVICE_KEYBOARD);
}
break;
@@ -95,7 +93,7 @@ void apple_rarch_exited(void)
bool down = (new_flags & old_flags) == old_flags;
old_flags = new_flags;
- apple_input_keyboard_event(down, event.keyCode,
+ cocoa_input_keyboard_event(down, event.keyCode,
0, event.modifierFlags, RETRO_DEVICE_KEYBOARD);
}
break;
@@ -195,7 +193,7 @@ static void poll_iteration(void)
{
NSEvent *event = NULL;
driver_t *driver = driver_get_ptr();
- apple_input_data_t *apple = (apple_input_data_t*)driver->input_data;
+ cocoa_input_data_t *apple = (cocoa_input_data_t*)driver->input_data;
if (!apple)
return;
@@ -325,7 +323,6 @@ static void poll_iteration(void)
- (IBAction)coreWasChosen:(id)sender
{
- NSComboBox* cb = NULL;
global_t *global = global_get_ptr();
[[NSApplication sharedApplication] stopModal];
@@ -335,14 +332,6 @@ static void poll_iteration(void)
if (global && global->system.shutdown)
return;
- /* TODO - rewrite this. */
-
- cb = (NSComboBox*)[[self.coreSelectSheet contentView] viewWithTag:1];
-#if defined(MAC_OS_X_VERSION_10_6)
- /* FIXME - Rewrite this so that this is no longer an associated object - requires ObjC 2.0 runtime */
- self.core = objc_getAssociatedObject(cb.objectValueOfSelectedItem, associated_core_key);
-#endif
-
if (global && !global->main_is_init)
{
/* TODO/FIXME: Set core/content here. */
@@ -353,7 +342,6 @@ static void poll_iteration(void)
event_command(EVENT_CMD_QUIT);
}
-#pragma mark RetroArch_Platform
- (void)loadingCore:(const NSString*)core withFile:(const char*)file
{
if (file)
@@ -365,7 +353,6 @@ static void poll_iteration(void)
[[NSApplication sharedApplication] terminate:nil];
}
-#pragma mark Menus
- (IBAction)showCoresDirectory:(id)sender
{
settings_t *settings = config_get_ptr();
diff --git a/apple/OSX/settings.m b/apple/OSX/settings.m
index 6f6cd0ac0a..58e1975506 100644
--- a/apple/OSX/settings.m
+++ b/apple/OSX/settings.m
@@ -17,7 +17,7 @@
#import "../common/RetroArch_Apple.h"
#include
#include "../../settings.h"
-#include "../../input/drivers/apple_input.h"
+#include "../../input/drivers/cocoa_input.h"
#include "../../driver.h"
#include "../../input/input_common.h"
@@ -76,11 +76,11 @@ static void* const associated_name_tag = (void*)&associated_name_tag;
if (self.setting->index)
idx = self.setting->index - 1;
- if ((value = apple_input_find_any_key()))
+ if ((value = cocoa_input_find_any_key()))
BINDFOR(*[self setting]).key = input_keymaps_translate_keysym_to_rk(value);
- else if ((value = apple_input_find_any_button(idx)) >= 0)
+ else if ((value = cocoa_input_find_any_button(idx)) >= 0)
BINDFOR(*[self setting]).joykey = value;
- else if ((value = apple_input_find_any_axis(idx)))
+ else if ((value = cocoa_input_find_any_axis(idx)))
BINDFOR(*[self setting]).joyaxis = (value > 0) ? AXIS_POS(value - 1) : AXIS_NEG(abs(value) - 1);
else
return;
diff --git a/apple/OSXPPC/RetroArch_OSX.xcodeproj/project.pbxproj b/apple/OSXPPC/RetroArch_OSX.xcodeproj/project.pbxproj
index 879add6b9b..a5d901bac6 100644
--- a/apple/OSXPPC/RetroArch_OSX.xcodeproj/project.pbxproj
+++ b/apple/OSXPPC/RetroArch_OSX.xcodeproj/project.pbxproj
@@ -282,6 +282,8 @@
ONLY_ACTIVE_ARCH = YES;
OTHER_CFLAGS = (
"-DHAVE_GRIFFIN",
+ "-DHAVE_CORETEXT",
+ "-DHAVE_IOHIDMANAGER",
"-DHAVE_RGUI",
"-DHAVE_MENU",
"-DOSX",
@@ -296,6 +298,8 @@
"-DHAVE_DYNAMIC",
"-DHAVE_OVERLAY",
"-DHAVE_ZLIB",
+ "-DHAVE_RPNG",
+ "-DHAVE_COCOA",
"-DWANT_ZLIB",
"-DSINC_LOWER_QUALITY",
"-DHAVE_NETPLAY",
@@ -343,6 +347,7 @@
"-DNS_BLOCK_ASSERTIONS=1",
"-DNDEBUG",
"-DHAVE_GRIFFIN",
+ "-DHAVE_IOHIDMANAGER",
"-DHAVE_RGUI",
"-DHAVE_MENU",
"-DOSX",
@@ -357,6 +362,8 @@
"-DHAVE_DYNAMIC",
"-DHAVE_OVERLAY",
"-DHAVE_ZLIB",
+ "-DHAVE_RPNG",
+ "-DHAVE_COCOA",
"-DWANT_ZLIB",
"-DSINC_LOWER_QUALITY",
"-DHAVE_NETPLAY",
diff --git a/apple/RetroArch_OSX.xcodeproj/project.pbxproj b/apple/RetroArch_OSX.xcodeproj/project.pbxproj
index 764eee0b83..8aeb1f9a3f 100644
--- a/apple/RetroArch_OSX.xcodeproj/project.pbxproj
+++ b/apple/RetroArch_OSX.xcodeproj/project.pbxproj
@@ -325,6 +325,8 @@
MACOSX_DEPLOYMENT_TARGET = 10.5;
OTHER_CFLAGS = (
"-DHAVE_GRIFFIN",
+ "-DHAVE_CORETEXT",
+ "-DHAVE_IOHIDMANAGER",
"-DHAVE_LOCATION",
"-DHAVE_RGUI",
"-DHAVE_MENU",
@@ -339,6 +341,8 @@
"-DHAVE_DYNAMIC",
"-DHAVE_OVERLAY",
"-DHAVE_ZLIB",
+ "-DHAVE_RPNG",
+ "-DHAVE_COCOA",
"-DWANT_ZLIB",
"-DSINC_LOWER_QUALITY",
"-DHAVE_NETPLAY",
@@ -379,6 +383,7 @@
MACOSX_DEPLOYMENT_TARGET = 10.5;
OTHER_CFLAGS = (
"-DHAVE_GRIFFIN",
+ "-DHAVE_IOHIDMANAGER",
"-DHAVE_LOCATION",
"-DHAVE_RGUI",
"-DHAVE_MENU",
@@ -393,6 +398,8 @@
"-DHAVE_DYNAMIC",
"-DHAVE_OVERLAY",
"-DHAVE_ZLIB",
+ "-DHAVE_RPNG",
+ "-DHAVE_COCOA",
"-DWANT_ZLIB",
"-DSINC_LOWER_QUALITY",
"-DHAVE_NETPLAY",
diff --git a/apple/common/CFExtensions.h b/apple/common/CFExtensions.h
index e75e3e9f8b..dda7fba7e6 100644
--- a/apple/common/CFExtensions.h
+++ b/apple/common/CFExtensions.h
@@ -1,7 +1,7 @@
/* RetroArch - A frontend for libretro.
+ * Copyright (C) 2013-2014 - Jason Fetters
* Copyright (C) 2011-2015 - Daniel De Matteis
- * Copyright (C) 2014-2015 - Jay McCarthy
- *
+ *
* 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.
@@ -14,9 +14,10 @@
* If not, see .
*/
-#ifndef _CFEXTENSIONS_H
-#define _CFEXTENSIONS_H
+#ifndef __CFEXTENSIONS_H
+#define __CFEXTENSIONS_H
+#import
#include
typedef enum
diff --git a/apple/common/RetroArch_Apple.h b/apple/common/RetroArch_Apple.h
index c22f41f8e9..186cb2da6a 100644
--- a/apple/common/RetroArch_Apple.h
+++ b/apple/common/RetroArch_Apple.h
@@ -18,10 +18,12 @@
#define __RARCH_APPLE_H
#include
-#import
+#include "CFExtensions.h"
#include "../../core_info.h"
+#include "../../playlist.h"
#include "../../settings.h"
+#include "../../menu/menu.h"
@protocol RetroArch_Platform
- (void)loadingCore:(NSString*)core withFile:(const char*)file;
@@ -30,9 +32,194 @@
#ifdef IOS
#include
-#import "../iOS/platform.h"
+
+#include
+#import
+
+@protocol RAMenuItemBase
+- (UITableViewCell*)cellForTableView:(UITableView*)tableView;
+- (void)wasSelectedOnTableView:(UITableView*)tableView ofController:(UIViewController*)controller;
+@end
+
+/*********************************************/
+/* RAMenuBase */
+/* A menu class that displays RAMenuItemBase */
+/* objects. */
+/*********************************************/
+@interface RAMenuBase : UITableViewController
+@property (nonatomic) NSMutableArray* sections;
+@property (nonatomic) BOOL hidesHeaders;
+
+- (id)initWithStyle:(UITableViewStyle)style;
+- (id)itemForIndexPath:(NSIndexPath*)indexPath;
+
+@end
+
+/*********************************************/
+/* RAMenuItemBasic */
+/* A simple menu item that displays a text */
+/* description and calls a block object when */
+/* selected. */
+/*********************************************/
+@interface RAMenuItemBasic : NSObject
+@property (nonatomic) NSString* description;
+@property (nonatomic) id userdata;
+@property (copy) void (^action)(id userdata);
+@property (copy) NSString* (^detail)(id userdata);
+
++ (RAMenuItemBasic*)itemWithDescription:(NSString*)description action:(void (^)())action;
++ (RAMenuItemBasic*)itemWithDescription:(NSString*)description action:(void (^)())action detail:(NSString* (^)())detail;
++ (RAMenuItemBasic*)itemWithDescription:(NSString*)description association:(id)userdata action:(void (^)())action detail:(NSString* (^)())detail;
+
+@end
+
+/*********************************************/
+/* RAMenuItemGeneralSetting */
+/* A simple menu item that displays the */
+/* state, and allows editing, of a string or */
+/* numeric setting. */
+/*********************************************/
+@interface RAMenuItemGeneralSetting : NSObject
+@property (nonatomic) rarch_setting_t* setting;
+@property (copy) void (^action)();
+@property (nonatomic, weak) UITableView* parentTable;
++ (id)itemForSetting:(rarch_setting_t*)setting action:(void (^)())action;
+- (id)initWithSetting:(rarch_setting_t*)setting action:(void (^)())action;
+@end
+
+/*********************************************/
+/* RAMenuItemBooleanSetting */
+/* A simple menu item that displays the */
+/* state, and allows editing, of a boolean */
+/* setting. */
+/*********************************************/
+@interface RAMenuItemBooleanSetting : NSObject
+@property (nonatomic) rarch_setting_t* setting;
+@property (copy) void (^action)();
+- (id)initWithSetting:(rarch_setting_t*)setting action:(void (^)())action;
+@end
+
+/*********************************************/
+/* RAMenuItemPathSetting */
+/* A menu item that displays and allows */
+/* browsing for a path setting. */
+/*********************************************/
+@interface RAMenuItemPathSetting : RAMenuItemGeneralSetting @end
+
+/*********************************************/
+/* RAMenuItemEnumSetting */
+/* A menu item that displays and allows */
+/* a setting to be set from a list of */
+/* allowed choices. */
+/*********************************************/
+@interface RAMenuItemEnumSetting : RAMenuItemGeneralSetting @end
+
+/*********************************************/
+/* RAMenuItemBindSetting */
+/* A menu item that displays and allows */
+/* mapping of a keybinding. */
+/*********************************************/
+@interface RAMenuItemBindSetting : RAMenuItemGeneralSetting @end
+
+/*********************************************/
+/* RAMainMenu */
+/* Menu object that is displayed immediately */
+/* after startup. */
+/*********************************************/
+@interface RAMainMenu : RAMenuBase
+@property (nonatomic) NSString* core;
+@end
+
+@interface RADirectoryItem : NSObject
+@property (nonatomic) NSString* path;
+@property (nonatomic) bool isDirectory;
+@end
+
+@interface RADirectoryList : RAMenuBase
+@property (nonatomic, weak) RADirectoryItem* selectedItem;
+
+@property (nonatomic, copy) void (^chooseAction)(RADirectoryList* list, RADirectoryItem* item);
+@property (nonatomic, copy) NSString* path;
+@property (nonatomic, copy) NSString* extensions;
+
+@property (nonatomic) bool allowBlank;
+@property (nonatomic) bool forDirectory;
+
+- (id)initWithPath:(NSString*)path extensions:(const char*)extensions action:(void (^)(RADirectoryList* list, RADirectoryItem* item))action;
+- (void)browseTo:(NSString*)path;
+@end
+
+@interface RAFoldersList : RAMenuBase
+- (id) initWithFilePath:(NSString*)path;
+@end
+
+typedef struct
+{
+ char orientations[32];
+ unsigned orientation_flags;
+ char bluetooth_mode[64];
+} apple_frontend_settings_t;
+extern apple_frontend_settings_t apple_frontend_settings;
+
+@interface RAGameView : UIViewController
++ (RAGameView*)get;
+@end
+
+@interface RetroArch_iOS : UINavigationController
+
+@property (nonatomic) UIWindow* window;
+@property (nonatomic) NSString* documentsDirectory; // e.g. /var/mobile/Documents
+
++ (RetroArch_iOS*)get;
+
+- (void)showGameView;
+- (void)toggleUI;
+
+- (void)loadingCore:(NSString*)core withFile:(const char*)file;
+- (void)unloadingCore;
+
+- (void)refreshSystemConfig;
+@end
+
+void get_ios_version(int *major, int *minor);
+
#elif defined(OSX)
-#import "../OSX/platform.h"
+#include
+#ifdef HAVE_LOCATION
+#include
+#endif
+
+
+@interface RAGameView : NSView
+#ifdef HAVE_LOCATION
+
+#endif
+
++ (RAGameView*)get;
+#ifndef OSX
+- (void)display;
+#endif
+
+@end
+
+@interface RetroArch_OSX : NSObject
+{
+ NSWindow* _window;
+ NSWindowController* _settingsWindow;
+ NSWindow* _coreSelectSheet;
+ NSString* _file;
+ NSString* _core;
+}
+
+@property (nonatomic, retain) NSWindow IBOutlet* window;
+
++ (RetroArch_OSX*)get;
+
+- (void)loadingCore:(NSString*)core withFile:(const char*)file;
+- (void)unloadingCore;
+
+@end
+
#endif
extern id apple_platform;
diff --git a/apple/common/apple_cocoa_common.m b/apple/common/apple_cocoa_common.m
index f2c87cb597..22d376025e 100644
--- a/apple/common/apple_cocoa_common.m
+++ b/apple/common/apple_cocoa_common.m
@@ -19,7 +19,6 @@
#include
#include
#import
-#include "CFExtensions.h"
#import "RetroArch_Apple.h"
#include "../../general.h"
#include "../../runloop.h"
@@ -172,11 +171,6 @@ void apple_display_alert(const char *message, const char *title)
/* Define compatibility symbols and categories. */
-//#if defined(MAC_OS_X_VERSION_10_7) || defined(__IPHONE_4_0)
-#if defined(__IPHONE_4_0) && defined(IOS)
-#define HAVE_AVFOUNDATION
-#endif
-
#ifdef HAVE_AVFOUNDATION
#include
#include
@@ -200,7 +194,7 @@ void *nsview_get_ptr(void)
#endif
/* forward declarations */
-void apple_gfx_ctx_update(void);
+void cocoagl_gfx_ctx_update(void);
void *glkitview_init(void);
@implementation RAGameView
@@ -232,7 +226,7 @@ void *glkitview_init(void);
{
[super setFrame:frameRect];
- apple_gfx_ctx_update();
+ cocoagl_gfx_ctx_update();
}
/* Stop the annoying sound when pressing a key. */
@@ -636,7 +630,7 @@ camera_driver_t camera_apple = {
apple_camera_start,
apple_camera_stop,
apple_camera_poll,
- "apple",
+ "avfoundation",
};
#endif
diff --git a/apple/iOS/RetroArch_iOS.xcodeproj/project.pbxproj b/apple/iOS/RetroArch_iOS.xcodeproj/project.pbxproj
index 38b11ae32f..44af0f46f0 100644
--- a/apple/iOS/RetroArch_iOS.xcodeproj/project.pbxproj
+++ b/apple/iOS/RetroArch_iOS.xcodeproj/project.pbxproj
@@ -494,6 +494,7 @@
"-DHAVE_NETWORKING",
"-DHAVE_CAMERA",
"-DHAVE_GRIFFIN",
+ "-DHAVE_CORETEXT",
"-DHAVE_LOCATION",
"-DHAVE_RGUI",
"-DHAVE_MENU",
@@ -512,6 +513,8 @@
"-DHAVE_DYNAMIC",
"-DHAVE_OVERLAY",
"-DHAVE_ZLIB",
+ "-DHAVE_RPNG",
+ "-DHAVE_COCOATOUCH",
"-DWANT_ZLIB",
"-DSINC_LOWER_QUALITY",
"-DRARCH_INTERNAL",
@@ -575,6 +578,8 @@
"-DHAVE_DYNAMIC",
"-DHAVE_OVERLAY",
"-DHAVE_ZLIB",
+ "-DHAVE_RPNG",
+ "-DHAVE_COCOATOUCH",
"-DWANT_ZLIB",
"-DSINC_LOWER_QUALITY",
"-DRARCH_INTERNAL",
@@ -612,6 +617,8 @@
"-DRARCH_INTERNAL",
"-DHAVE_OVERLAY",
"-DHAVE_ZLIB",
+ "-DHAVE_RPNG",
+ "-DHAVE_COCOATOUCH",
"-DWANT_ZLIB",
"-DSINC_LOWER_QUALITY",
"-DHAVE_THREADS",
@@ -681,6 +688,8 @@
"-DHAVE_FBO",
"-DHAVE_OVERLAY",
"-DHAVE_ZLIB",
+ "-DHAVE_RPNG",
+ "-DHAVE_COCOATOUCH",
"-DWANT_ZLIB",
"-DSINC_LOWER_QUALITY",
);
@@ -739,6 +748,8 @@
"-DHAVE_FBO",
"-DHAVE_OVERLAY",
"-DHAVE_ZLIB",
+ "-DHAVE_RPNG",
+ "-DHAVE_COCOATOUCH",
"-DWANT_ZLIB",
"-DSINC_LOWER_QUALITY",
);
@@ -796,6 +807,8 @@
"-DHAVE_DYNAMIC",
"-DHAVE_OVERLAY",
"-DHAVE_ZLIB",
+ "-DHAVE_RPNG",
+ "-DHAVE_COCOATOUCH",
"-DWANT_ZLIB",
"-DSINC_LOWER_QUALITY",
"-DRARCH_INTERNAL",
@@ -805,6 +818,7 @@
"-DHAVE_XMB",
"-D_LZMA_UINT32_IS_ULONG",
"-DHAVE_MFI",
+ "-DHAVE_AVFOUNDATION",
);
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE = "";
@@ -860,6 +874,8 @@
"-DHAVE_DYNAMIC",
"-DHAVE_OVERLAY",
"-DHAVE_ZLIB",
+ "-DHAVE_RPNG",
+ "-DHAVE_COCOATOUCH",
"-DWANT_ZLIB",
"-DSINC_LOWER_QUALITY",
"-DRARCH_INTERNAL",
@@ -870,6 +886,7 @@
"-DHAVE_XMB",
"-D_LZMA_UINT32_IS_ULONG",
"-DHAVE_MFI",
+ "-DHAVE_AVFOUNDATION",
);
"OTHER_CFLAGS[arch=*]" = (
"-DNS_BLOCK_ASSERTIONS=1",
@@ -898,6 +915,8 @@
"-DRARCH_INTERNAL",
"-DHAVE_OVERLAY",
"-DHAVE_ZLIB",
+ "-DHAVE_RPNG",
+ "-DHAVE_COCOATOUCH",
"-DWANT_ZLIB",
"-DSINC_LOWER_QUALITY",
"-DHAVE_THREADS",
@@ -907,6 +926,7 @@
"-DHAVE_XMB",
"-D_LZMA_UINT32_IS_ULONG",
"-DHAVE_MFI",
+ "-DHAVE_AVFOUNDATION",
);
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE = "";
diff --git a/apple/iOS/browser.m b/apple/iOS/browser.m
index 208aad2383..ec3cf7b840 100644
--- a/apple/iOS/browser.m
+++ b/apple/iOS/browser.m
@@ -16,9 +16,7 @@
#include
-#import "../common/RetroArch_Apple.h"
-#import "views.h"
-
+#include "../common/RetroArch_Apple.h"
#include "../../content.h"
#include "../../general.h"
#include
diff --git a/apple/iOS/menu.h b/apple/iOS/menu.h
deleted file mode 100644
index c1286b8326..0000000000
--- a/apple/iOS/menu.h
+++ /dev/null
@@ -1,118 +0,0 @@
-/* RetroArch - A frontend for libretro.
- * Copyright (C) 2013-2014 - Jason Fetters
- * Copyright (C) 2014-2015 - Jay McCarthy
- *
- * 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 __APPLE_RARCH_IOS_MENU_H__
-#define __APPLE_RARCH_IOS_MENU_H__
-
-#include "../../playlist.h"
-#include "views.h"
-#include "../../settings.h"
-
-@protocol RAMenuItemBase
-- (UITableViewCell*)cellForTableView:(UITableView*)tableView;
-- (void)wasSelectedOnTableView:(UITableView*)tableView ofController:(UIViewController*)controller;
-@end
-
-/*********************************************/
-/* RAMenuBase */
-/* A menu class that displays RAMenuItemBase */
-/* objects. */
-/*********************************************/
-@interface RAMenuBase : UITableViewController
-@property (nonatomic) NSMutableArray* sections;
-@property (nonatomic) BOOL hidesHeaders;
-
-- (id)initWithStyle:(UITableViewStyle)style;
-- (id)itemForIndexPath:(NSIndexPath*)indexPath;
-
-@end
-
-/*********************************************/
-/* RAMenuItemBasic */
-/* A simple menu item that displays a text */
-/* description and calls a block object when */
-/* selected. */
-/*********************************************/
-@interface RAMenuItemBasic : NSObject
-@property (nonatomic) NSString* description;
-@property (nonatomic) id userdata;
-@property (copy) void (^action)(id userdata);
-@property (copy) NSString* (^detail)(id userdata);
-
-+ (RAMenuItemBasic*)itemWithDescription:(NSString*)description action:(void (^)())action;
-+ (RAMenuItemBasic*)itemWithDescription:(NSString*)description action:(void (^)())action detail:(NSString* (^)())detail;
-+ (RAMenuItemBasic*)itemWithDescription:(NSString*)description association:(id)userdata action:(void (^)())action detail:(NSString* (^)())detail;
-
-@end
-
-/*********************************************/
-/* RAMenuItemGeneralSetting */
-/* A simple menu item that displays the */
-/* state, and allows editing, of a string or */
-/* numeric setting. */
-/*********************************************/
-@interface RAMenuItemGeneralSetting : NSObject
-@property (nonatomic) rarch_setting_t* setting;
-@property (copy) void (^action)();
-@property (nonatomic, weak) UITableView* parentTable;
-+ (id)itemForSetting:(rarch_setting_t*)setting action:(void (^)())action;
-- (id)initWithSetting:(rarch_setting_t*)setting action:(void (^)())action;
-@end
-
-/*********************************************/
-/* RAMenuItemBooleanSetting */
-/* A simple menu item that displays the */
-/* state, and allows editing, of a boolean */
-/* setting. */
-/*********************************************/
-@interface RAMenuItemBooleanSetting : NSObject
-@property (nonatomic) rarch_setting_t* setting;
-@property (copy) void (^action)();
-- (id)initWithSetting:(rarch_setting_t*)setting action:(void (^)())action;
-@end
-
-/*********************************************/
-/* RAMenuItemPathSetting */
-/* A menu item that displays and allows */
-/* browsing for a path setting. */
-/*********************************************/
-@interface RAMenuItemPathSetting : RAMenuItemGeneralSetting @end
-
-/*********************************************/
-/* RAMenuItemEnumSetting */
-/* A menu item that displays and allows */
-/* a setting to be set from a list of */
-/* allowed choices. */
-/*********************************************/
-@interface RAMenuItemEnumSetting : RAMenuItemGeneralSetting @end
-
-/*********************************************/
-/* RAMenuItemBindSetting */
-/* A menu item that displays and allows */
-/* mapping of a keybinding. */
-/*********************************************/
-@interface RAMenuItemBindSetting : RAMenuItemGeneralSetting @end
-
-/*********************************************/
-/* RAMainMenu */
-/* Menu object that is displayed immediately */
-/* after startup. */
-/*********************************************/
-@interface RAMainMenu : RAMenuBase
-@property (nonatomic) NSString* core;
-@end
-
-#endif
diff --git a/apple/iOS/menu.m b/apple/iOS/menu.m
index 74f5ec3197..7fd8d3901c 100644
--- a/apple/iOS/menu.m
+++ b/apple/iOS/menu.m
@@ -17,14 +17,12 @@
#include "../common/RetroArch_Apple.h"
#include "../../input/input_common.h"
#include "../../input/input_keymaps.h"
-#include "../../input/drivers/apple_input.h"
+#include "../../input/drivers/cocoa_input.h"
#include
#include
-#include "menu.h"
#include
-#include "../../menu/menu.h"
#include "../../menu/menu_entries.h"
#include "../../menu/drivers/shared.h"
@@ -543,7 +541,7 @@ static void RunActionSheet(const char* title, const struct string_list* items, U
[self.bindTimer invalidate];
self.bindTimer = nil;
- apple_input_reset_icade_buttons();
+ cocoa_input_reset_icade_buttons();
}
- (void)alertView:(UIAlertView*)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
@@ -566,11 +564,11 @@ static void RunActionSheet(const char* title, const struct string_list* items, U
if (self.setting->index)
idx = self.setting->index - 1;
- if ((value = apple_input_find_any_key()))
+ if ((value = cocoa_input_find_any_key()))
BINDFOR(*self.setting).key = input_keymaps_translate_keysym_to_rk(value);
- else if ((value = apple_input_find_any_button(idx)) >= 0)
+ else if ((value = cocoa_input_find_any_button(idx)) >= 0)
BINDFOR(*self.setting).joykey = value;
- else if ((value = apple_input_find_any_axis(idx)))
+ else if ((value = cocoa_input_find_any_axis(idx)))
BINDFOR(*self.setting).joyaxis = (value > 0) ? AXIS_POS(value - 1) : AXIS_NEG(abs(value) - 1);
else
return;
diff --git a/apple/iOS/platform.h b/apple/iOS/platform.h
deleted file mode 100644
index c8f167a48a..0000000000
--- a/apple/iOS/platform.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/* RetroArch - A frontend for libretro.
- * Copyright (C) 2013-2014 - Jason Fetters
- * Copyright (C) 2011-2015 - Daniel De Matteis
- *
- * RetroArch is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Found-
- * ation, either version 3 of the License, or (at your option) any later version.
- *
- * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE. See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with RetroArch.
- * If not, see .
- */
-
-#ifndef __RARCH_IOS_PLATFORM_H
-#define __RARCH_IOS_PLATFORM_H
-
-#include
-#import
-#include "views.h"
-
-typedef struct
-{
- char orientations[32];
- unsigned orientation_flags;
- char bluetooth_mode[64];
-} apple_frontend_settings_t;
-extern apple_frontend_settings_t apple_frontend_settings;
-
-@interface RAGameView : UIViewController
-+ (RAGameView*)get;
-@end
-
-@interface RetroArch_iOS : UINavigationController
-
-@property (nonatomic) UIWindow* window;
-@property (nonatomic) NSString* documentsDirectory; // e.g. /var/mobile/Documents
-
-+ (RetroArch_iOS*)get;
-
-- (void)showGameView;
-- (void)toggleUI;
-
-- (void)loadingCore:(NSString*)core withFile:(const char*)file;
-- (void)unloadingCore;
-
-- (void)refreshSystemConfig;
-@end
-
-void get_ios_version(int *major, int *minor);
-
-#endif
diff --git a/apple/iOS/platform.m b/apple/iOS/platform.m
index 81c8b28531..617c07fb9e 100644
--- a/apple/iOS/platform.m
+++ b/apple/iOS/platform.m
@@ -17,15 +17,12 @@
#include
#include "../common/RetroArch_Apple.h"
-#include "../../input/drivers/apple_input.h"
+#include "../../input/drivers/cocoa_input.h"
#include "../../settings.h"
#ifdef HAVE_MFI
#include "../../input/drivers_hid/mfi_hid.h"
#endif
-#include "menu.h"
-#include "../../menu/menu.h"
-#import "views.h"
#include "../../input/drivers_hid/btstack_hid.h"
id apple_platform;
@@ -55,9 +52,6 @@ static void rarch_draw(CFRunLoopObserverRef observer, CFRunLoopActivity activity
if (runloop->is_idle)
return;
-
- if (g_view)
- [g_view display];
CFRunLoopWakeUp(CFRunLoopGetMain());
}
@@ -68,6 +62,41 @@ void apple_rarch_exited(void)
apple_frontend_settings_t apple_frontend_settings;
+enum frontend_powerstate ios_get_powerstate(int *seconds, int *percent)
+{
+ float level;
+ enum frontend_powerstate ret = FRONTEND_POWERSTATE_NONE;
+ UIDevice *uidev = [UIDevice currentDevice];
+
+ if (!uidev)
+ return ret;
+
+ [uidev setBatteryMonitoringEnabled:true];
+
+ switch (uidev.batteryState)
+ {
+ case UIDeviceBatteryStateCharging:
+ ret = FRONTEND_POWERSTATE_CHARGING;
+ break;
+ case UIDeviceBatteryStateFull:
+ ret = FRONTEND_POWERSTATE_CHARGED;
+ break;
+ case UIDeviceBatteryStateUnplugged:
+ ret = FRONTEND_POWERSTATE_ON_POWER_SOURCE;
+ break;
+ case UIDeviceBatteryStateUnknown:
+ break;
+ }
+
+ level = uidev.batteryLevel;
+
+ *percent = ((level < 0.0f) ? -1 : ((int)((level * 100) + 0.5f)));
+
+ [uidev setBatteryMonitoringEnabled:false];
+
+ return ret;
+}
+
void get_ios_version(int *major, int *minor)
{
NSArray *decomposed_os_version = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."];
@@ -78,15 +107,15 @@ void get_ios_version(int *major, int *minor)
*minor = [decomposed_os_version[1] integerValue];
}
-extern float apple_gfx_ctx_get_native_scale(void);
+extern float cocoagl_gfx_ctx_get_native_scale(void);
/* Input helpers: This is kept here because it needs ObjC */
static void handle_touch_event(NSArray* touches)
{
unsigned i;
driver_t *driver = driver_get_ptr();
- apple_input_data_t *apple = (apple_input_data_t*)driver->input_data;
- float scale = apple_gfx_ctx_get_native_scale();
+ cocoa_input_data_t *apple = (cocoa_input_data_t*)driver->input_data;
+ float scale = cocoagl_gfx_ctx_get_native_scale();
if (!apple)
return;
@@ -177,17 +206,17 @@ enum
unsigned i;
character = [ch characterAtIndex:0];
- apple_input_keyboard_event(event._isKeyDown,
+ cocoa_input_keyboard_event(event._isKeyDown,
(uint32_t)event._keyCode, 0, mod,
RETRO_DEVICE_KEYBOARD);
for (i = 1; i < ch.length; i++)
- apple_input_keyboard_event(event._isKeyDown,
+ cocoa_input_keyboard_event(event._isKeyDown,
0, [ch characterAtIndex:i], mod,
RETRO_DEVICE_KEYBOARD);
}
- apple_input_keyboard_event(event._isKeyDown,
+ cocoa_input_keyboard_event(event._isKeyDown,
(uint32_t)event._keyCode, character, mod,
RETRO_DEVICE_KEYBOARD);
}
@@ -222,7 +251,7 @@ enum
{
case GSEVENT_TYPE_KEYDOWN:
case GSEVENT_TYPE_KEYUP:
- apple_input_keyboard_event(eventType == GSEVENT_TYPE_KEYDOWN,
+ cocoa_input_keyboard_event(eventType == GSEVENT_TYPE_KEYDOWN,
*(uint16_t*)&eventMem[0x3C], 0, 0, RETRO_DEVICE_KEYBOARD);
break;
}
@@ -329,10 +358,9 @@ enum
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
- apple_input_reset_icade_buttons();
+ cocoa_input_reset_icade_buttons();
[self setToolbarHidden:![[viewController toolbarItems] count] animated:YES];
- // Workaround to keep frontend settings fresh
[self refreshSystemConfig];
}
@@ -354,10 +382,13 @@ enum
- (IBAction)showPauseMenu:(id)sender
{
runloop_t *runloop = rarch_main_get_ptr();
-
- runloop->is_paused = true;
- runloop->is_idle = true;
- runloop->ui_companion_is_on_foreground = true;
+
+ if (runloop)
+ {
+ runloop->is_paused = true;
+ runloop->is_idle = true;
+ runloop->ui_companion_is_on_foreground = true;
+ }
[[UIApplication sharedApplication] setStatusBarHidden:false withAnimation:UIStatusBarAnimationNone];
[[UIApplication sharedApplication] setIdleTimerDisabled:false];
@@ -409,8 +440,8 @@ enum
is_icade = !(strcmp(apple_frontend_settings.bluetooth_mode, "icade"));
is_btstack = !(strcmp(apple_frontend_settings.bluetooth_mode, "btstack"));
- apple_input_enable_small_keyboard(small_keyboard);
- apple_input_enable_icade(is_icade);
+ cocoa_input_enable_small_keyboard(small_keyboard);
+ cocoa_input_enable_icade(is_icade);
btstack_set_poweron(is_btstack);
}
diff --git a/apple/iOS/views.h b/apple/iOS/views.h
deleted file mode 100644
index 521aebac89..0000000000
--- a/apple/iOS/views.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/* RetroArch - A frontend for libretro.
- * Copyright (C) 2013-2014 - Jason Fetters
- * Copyright (C) 2011-2015 - Daniel De Matteis
- *
- * RetroArch is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Found-
- * ation, either version 3 of the License, or (at your option) any later version.
- *
- * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE. See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with RetroArch.
- * If not, see .
- */
-
-#ifndef _RARCH_APPLE_VIEWS_H
-#define _RARCH_APPLE_VIEWS_H
-
-#include
-#include "../../core_info.h"
-
-
-#include "menu.h"
-
-// browser.m
-@interface RADirectoryItem : NSObject
-@property (nonatomic) NSString* path;
-@property (nonatomic) bool isDirectory;
-@end
-
-@interface RADirectoryList : RAMenuBase
-@property (nonatomic, weak) RADirectoryItem* selectedItem;
-
-@property (nonatomic, copy) void (^chooseAction)(RADirectoryList* list, RADirectoryItem* item);
-@property (nonatomic, copy) NSString* path;
-@property (nonatomic, copy) NSString* extensions;
-
-@property (nonatomic) bool allowBlank;
-@property (nonatomic) bool forDirectory;
-
-- (id)initWithPath:(NSString*)path extensions:(const char*)extensions action:(void (^)(RADirectoryList* list, RADirectoryItem* item))action;
-- (void)browseTo:(NSString*)path;
-@end
-
-// browser.m
-@interface RAFoldersList : RAMenuBase
-- (id) initWithFilePath:(NSString*)path;
-@end
-
-#endif
diff --git a/audio/drivers/coreaudio.c b/audio/drivers/coreaudio.c
index 3debd7ce02..fd025f171e 100644
--- a/audio/drivers/coreaudio.c
+++ b/audio/drivers/coreaudio.c
@@ -19,7 +19,7 @@
#include
#include
#include
-#include
+#include
#ifdef OSX
#include
@@ -33,8 +33,8 @@
typedef struct coreaudio
{
- slock_t *lock;
- scond_t *cond;
+ pthread_mutex_t lock;
+ pthread_cond_t cond;
#ifdef OSX_PPC
ComponentInstance dev;
@@ -71,8 +71,8 @@ static void coreaudio_free(void *data)
if (dev->buffer)
fifo_free(dev->buffer);
- slock_free(dev->lock);
- scond_free(dev->cond);
+ pthread_mutex_destroy(&dev->lock);
+ pthread_cond_destroy(&dev->cond);
free(dev);
}
@@ -82,8 +82,8 @@ static OSStatus audio_write_cb(void *userdata,
const AudioTimeStamp *time_stamp, UInt32 bus_number,
UInt32 number_frames, AudioBufferList *io_data)
{
+ void *outbuf;
unsigned write_avail;
- void *outbuf = NULL;
coreaudio_t *dev = (coreaudio_t*)userdata;
(void)time_stamp;
@@ -96,9 +96,9 @@ static OSStatus audio_write_cb(void *userdata,
return noErr;
write_avail = io_data->mBuffers[0].mDataByteSize;
- outbuf = io_data->mBuffers[0].mData;
+ outbuf = io_data->mBuffers[0].mData;
- slock_lock(dev->lock);
+ pthread_mutex_lock(&dev->lock);
if (fifo_read_avail(dev->buffer) < write_avail)
{
@@ -107,15 +107,16 @@ static OSStatus audio_write_cb(void *userdata,
/* Seems to be needed. */
memset(outbuf, 0, write_avail);
- goto end;
+ pthread_mutex_unlock(&dev->lock);
+
+ /* Technically possible to deadlock without. */
+ pthread_cond_signal(&dev->cond);
+ return noErr;
}
fifo_read(dev->buffer, outbuf, write_avail);
-
-end:
- slock_unlock(dev->lock);
- scond_signal(dev->cond);
-
+ pthread_mutex_unlock(&dev->lock);
+ pthread_cond_signal(&dev->cond);
return noErr;
}
@@ -123,8 +124,7 @@ end:
static void choose_output_device(coreaudio_t *dev, const char* device)
{
unsigned i;
- UInt32 size = 0, deviceCount;
- AudioDeviceID *devices = NULL;
+ AudioDeviceID *devices;
AudioObjectPropertyAddress propaddr =
{
kAudioHardwarePropertyDevices,
@@ -132,23 +132,22 @@ static void choose_output_device(coreaudio_t *dev, const char* device)
kAudioObjectPropertyElementMaster
};
+ UInt32 size = 0, deviceCount;
+
if (AudioObjectGetPropertyDataSize(kAudioObjectSystemObject,
&propaddr, 0, 0, &size) != noErr)
return;
- deviceCount = size / sizeof(AudioDeviceID);
- devices = (AudioDeviceID*)malloc(size);
+ deviceCount = size / sizeof(AudioDeviceID);
+ devices = (AudioDeviceID*)malloc(size);
- if (!devices)
- goto done;
-
- if (AudioObjectGetPropertyData(kAudioObjectSystemObject,
+ if (!devices || AudioObjectGetPropertyData(kAudioObjectSystemObject,
&propaddr, 0, 0, &size, devices) != noErr)
goto done;
- propaddr.mScope = kAudioDevicePropertyScopeOutput;
+ propaddr.mScope = kAudioDevicePropertyScopeOutput;
propaddr.mSelector = kAudioDevicePropertyDeviceName;
- size = 1024;
+ size = 1024;
for (i = 0; i < deviceCount; i ++)
{
@@ -196,12 +195,12 @@ static void *coreaudio_init(const char *device,
AudioStreamBasicDescription stream_desc = {0};
static bool session_initialized = false;
coreaudio_t *dev = NULL;
- settings_t *settings = config_get_ptr();
#ifdef OSX_PPC
ComponentDescription desc = {0};
#else
AudioComponentDescription desc = {0};
#endif
+ settings_t *settings = config_get_ptr();
(void)session_initialized;
(void)device;
@@ -210,22 +209,8 @@ static void *coreaudio_init(const char *device,
if (!dev)
return NULL;
- dev->lock = slock_new();
-
- if (!dev->lock)
- {
- free(dev);
- return NULL;
- }
-
- dev->cond = scond_new();
-
- if (!dev->cond)
- {
- free(dev->lock);
- free(dev);
- return NULL;
- }
+ pthread_mutex_init(&dev->lock, NULL);
+ pthread_cond_init(&dev->cond, NULL);
#ifdef IOS
if (!session_initialized)
@@ -284,8 +269,7 @@ static void *coreaudio_init(const char *device,
goto error;
/* Check returned audio format. */
- i_size = sizeof(real_desc);
-
+ i_size = sizeof(real_desc);
if (AudioUnitGetProperty(dev->dev, kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Input, 0, &real_desc, &i_size) != noErr)
goto error;
@@ -351,40 +335,46 @@ static ssize_t coreaudio_write(void *data, const void *buf_, size_t size)
size_t written = 0;
#ifdef IOS
+ struct timespec timeout;
struct timeval time;
+
gettimeofday(&time, 0);
+
+ memset(&timeout, 0, sizeof(timeout));
+ timeout.tv_sec = time.tv_sec + 3;
+ timeout.tv_nsec = time.tv_usec * 1000;
#endif
while (!g_interrupted && size > 0)
{
size_t write_avail;
- slock_lock(dev->lock);
+ pthread_mutex_lock(&dev->lock);
write_avail = fifo_write_avail(dev->buffer);
if (write_avail > size)
write_avail = size;
fifo_write(dev->buffer, buf, write_avail);
- buf += write_avail;
+ buf += write_avail;
written += write_avail;
- size -= write_avail;
+ size -= write_avail;
if (dev->nonblock)
{
- slock_unlock(dev->lock);
+ pthread_mutex_unlock(&dev->lock);
break;
}
#ifdef IOS
- if (write_avail == 0 && !scond_wait_timeout(
- dev->cond, dev->lock, time.tv_usec))
+ if (write_avail == 0 && pthread_cond_timedwait(
+ &dev->cond, &dev->lock, &timeout) == ETIMEDOUT)
g_interrupted = true;
#else
if (write_avail == 0)
- scond_wait(dev->cond, dev->lock);
+ pthread_cond_wait(&dev->cond, &dev->lock);
#endif
- slock_unlock(dev->lock);
+ pthread_mutex_unlock(&dev->lock);
}
return written;
@@ -434,9 +424,9 @@ static size_t coreaudio_write_avail(void *data)
size_t avail;
coreaudio_t *dev = (coreaudio_t*)data;
- slock_lock(dev->lock);
+ pthread_mutex_lock(&dev->lock);
avail = fifo_write_avail(dev->buffer);
- slock_unlock(dev->lock);
+ pthread_mutex_unlock(&dev->lock);
return avail;
}
diff --git a/audio/drivers/ctr_audio.c b/audio/drivers/ctr_audio.c
index a82f15561c..e9b26d2d4b 100644
--- a/audio/drivers/ctr_audio.c
+++ b/audio/drivers/ctr_audio.c
@@ -21,20 +21,24 @@
typedef struct
{
bool nonblocking;
+ bool playing;
int16_t* l;
int16_t* r;
- int16_t* silence;
uint32_t l_paddr;
uint32_t r_paddr;
- uint32_t silence_paddr;
uint32_t pos;
+
+ uint32_t playpos;
+ uint32_t cpu_ticks_per_sample;
+ uint64_t cpu_ticks_last;
+
int rate;
} ctr_audio_t;
-#define CTR_AUDIO_COUNT (1u << 12u)
+#define CTR_AUDIO_COUNT (1u << 11u)
#define CTR_AUDIO_COUNT_MASK (CTR_AUDIO_COUNT - 1u)
#define CTR_AUDIO_SIZE (CTR_AUDIO_COUNT * sizeof(int16_t))
#define CTR_AUDIO_SIZE_MASK (CTR_AUDIO_SIZE - 1u)
@@ -52,31 +56,30 @@ static void *ctr_audio_init(const char *device, unsigned rate, unsigned latency)
ctr_audio_t *ctr = (ctr_audio_t*)calloc(1, sizeof(ctr_audio_t));
- ctr->l = linearAlloc(CTR_AUDIO_SIZE);
- ctr->r = linearAlloc(CTR_AUDIO_SIZE);
- ctr->silence = linearAlloc(CTR_AUDIO_SIZE);
+ ctr->l = linearAlloc(CTR_AUDIO_SIZE);
+ ctr->r = linearAlloc(CTR_AUDIO_SIZE);
- memset(ctr->l, 0, CTR_AUDIO_SIZE);
- memset(ctr->r, 0, CTR_AUDIO_SIZE);
- memset(ctr->silence, 0, CTR_AUDIO_SIZE);
+ memset(ctr->l, 0, CTR_AUDIO_SIZE);
+ memset(ctr->r, 0, CTR_AUDIO_SIZE);
- ctr->l_paddr = osConvertVirtToPhys((u32)ctr->l);
- ctr->r_paddr = osConvertVirtToPhys((u32)ctr->r);
- ctr->silence_paddr = osConvertVirtToPhys((u32)ctr->silence);
+ ctr->l_paddr = osConvertVirtToPhys((u32)ctr->l);
+ ctr->r_paddr = osConvertVirtToPhys((u32)ctr->r);
ctr->pos = 0;
ctr->rate = rate;
+ ctr->cpu_ticks_per_sample = CSND_TIMER(rate) * 4;
- GSPGPU_FlushDataCache(NULL, (u8*)ctr->silence, CTR_AUDIO_SIZE);
+ GSPGPU_FlushDataCache(NULL, (u8*)ctr->l_paddr, CTR_AUDIO_SIZE);
+ GSPGPU_FlushDataCache(NULL, (u8*)ctr->r_paddr, CTR_AUDIO_SIZE);
csndPlaySound(0x8, SOUND_LOOPMODE(CSND_LOOPMODE_NORMAL)| SOUND_FORMAT(CSND_ENCODING_PCM16),
- rate, ctr->silence, ctr->silence, CTR_AUDIO_SIZE);
+ rate, 1.0, -1.0, ctr->l, ctr->l, CTR_AUDIO_SIZE);
csndPlaySound(0x9, SOUND_LOOPMODE(CSND_LOOPMODE_NORMAL)| SOUND_FORMAT(CSND_ENCODING_PCM16),
- rate, ctr->silence, ctr->silence, CTR_AUDIO_SIZE);
+ rate, 1.0, 1.0, ctr->r, ctr->r, CTR_AUDIO_SIZE);
- CSND_SetVol(0x8, 0xFFFF, 0);
- CSND_SetVol(0x9, 0, 0xFFFF);
- csndExecCmds(false);
+ ctr->playpos = 0;
+ ctr->cpu_ticks_last = svcGetSystemTick();
+ ctr->playing = true;
return ctr;
}
@@ -92,7 +95,6 @@ static void ctr_audio_free(void *data)
linearFree(ctr->l);
linearFree(ctr->r);
- linearFree(ctr->silence);
free(ctr);
}
@@ -107,45 +109,35 @@ static ssize_t ctr_audio_write(void *data, const void *buf, size_t size)
int i;
const uint16_t* src = buf;
- RARCH_PERFORMANCE_INIT(ctraudio_f);
+ RARCH_PERFORMANCE_INIT(ctraudio_f);
RARCH_PERFORMANCE_START(ctraudio_f);
- CSND_ChnInfo channel_info;
- csndGetState(0x8, &channel_info);
+ uint64_t current_tick = svcGetSystemTick();
+ uint32_t samples_played = (current_tick - ctr->cpu_ticks_last) / ctr->cpu_ticks_per_sample;
+ ctr->playpos = (ctr->playpos + samples_played) & CTR_AUDIO_COUNT_MASK;
+ ctr->cpu_ticks_last += samples_played * ctr->cpu_ticks_per_sample;
- uint32_t playpos;
- if((channel_info.samplePAddr >= (ctr->l_paddr)) &&
- (channel_info.samplePAddr < (ctr->l_paddr + CTR_AUDIO_SIZE)))
- {
- playpos = (channel_info.samplePAddr - ctr->l_paddr) / sizeof(uint16_t);
- }
- else
- {
- CSND_SetBlock(0x8, 1, ctr->l_paddr, CTR_AUDIO_SIZE);
- CSND_SetBlock(0x9, 1, ctr->r_paddr, CTR_AUDIO_SIZE);
- csndExecCmds(false);
- playpos = 0;
- }
- if((((playpos - ctr->pos) & CTR_AUDIO_COUNT_MASK) < (CTR_AUDIO_COUNT >> 2)) ||
- (((ctr->pos - playpos ) & CTR_AUDIO_COUNT_MASK) < (CTR_AUDIO_COUNT >> 4)) ||
- (((playpos - ctr->pos) & CTR_AUDIO_COUNT_MASK) < (size >> 2)))
+ if((((ctr->playpos - ctr->pos) & CTR_AUDIO_COUNT_MASK) < (CTR_AUDIO_COUNT >> 2)) ||
+ (((ctr->pos - ctr->playpos ) & CTR_AUDIO_COUNT_MASK) < (CTR_AUDIO_COUNT >> 4)) ||
+ (((ctr->playpos - ctr->pos) & CTR_AUDIO_COUNT_MASK) < (size >> 2)))
{
if (ctr->nonblocking)
- ctr->pos = (playpos + (CTR_AUDIO_COUNT >> 1)) & CTR_AUDIO_COUNT_MASK;
+ ctr->pos = (ctr->playpos + (CTR_AUDIO_COUNT >> 1)) & CTR_AUDIO_COUNT_MASK;
else
{
do{
- svcSleepThread(100000);
-// svcSleepThread(((s64)(CTR_AUDIO_COUNT >> 8) * 1000000000) / ctr->rate);
- csndGetState(0x8, &channel_info);
- playpos = (channel_info.samplePAddr - ctr->l_paddr) / sizeof(uint16_t);
- }while (((playpos - ctr->pos) & CTR_AUDIO_COUNT_MASK) < (CTR_AUDIO_COUNT >> 1)
- || (((ctr->pos - playpos) & CTR_AUDIO_COUNT_MASK) < (CTR_AUDIO_COUNT >> 4)));
+ /* todo: compute the correct sleep period */
+ rarch_sleep(1);
+ current_tick = svcGetSystemTick();
+ samples_played = (current_tick - ctr->cpu_ticks_last) / ctr->cpu_ticks_per_sample;
+ ctr->playpos = (ctr->playpos + samples_played) & CTR_AUDIO_COUNT_MASK;
+ ctr->cpu_ticks_last += samples_played * ctr->cpu_ticks_per_sample;
+ }while (((ctr->playpos - ctr->pos) & CTR_AUDIO_COUNT_MASK) < (CTR_AUDIO_COUNT >> 1)
+ || (((ctr->pos - ctr->playpos) & CTR_AUDIO_COUNT_MASK) < (CTR_AUDIO_COUNT >> 4)));
}
}
-
for (i = 0; i < (size >> 1); i += 2)
{
ctr->l[ctr->pos] = src[i];
@@ -153,6 +145,9 @@ static ssize_t ctr_audio_write(void *data, const void *buf, size_t size)
ctr->pos++;
ctr->pos &= CTR_AUDIO_COUNT_MASK;
}
+ GSPGPU_FlushDataCache(NULL, (u8*)ctr->l, CTR_AUDIO_SIZE);
+ GSPGPU_FlushDataCache(NULL, (u8*)ctr->r, CTR_AUDIO_SIZE);
+
RARCH_PERFORMANCE_STOP(ctraudio_f);
@@ -163,31 +158,51 @@ static bool ctr_audio_stop(void *data)
{
ctr_audio_t* ctr = (ctr_audio_t*)data;
- CSND_SetBlock(0x8, 1, ctr->silence_paddr, CTR_AUDIO_SIZE);
- CSND_SetBlock(0x9, 1, ctr->silence_paddr, CTR_AUDIO_SIZE);
+ /* using SetPlayState would make tracking the playback
+ * position more difficult */
+
+// CSND_SetPlayState(0x8, 0);
+// CSND_SetPlayState(0x9, 0);
+
+ /* setting the channel volume to 0 seems to make it
+ * impossible to set it back to full volume later */
+
+ CSND_SetVol(0x8, 0x00000001, 0);
+ CSND_SetVol(0x9, 0x00010000, 0);
csndExecCmds(false);
+ ctr->playing = false;
+
return true;
}
static bool ctr_audio_alive(void *data)
{
- (void)data;
- return true;
+ ctr_audio_t* ctr = (ctr_audio_t*)data;
+ return ctr->playing;
}
static bool ctr_audio_start(void *data)
{
ctr_audio_t* ctr = (ctr_audio_t*)data;
+ global_t *global = global_get_ptr();
-// csndPlaySound(0x8, SOUND_LOOPMODE(CSND_LOOPMODE_NORMAL)| SOUND_FORMAT(CSND_ENCODING_PCM16),
-// ctr->rate, ctr->l_paddr + ((ctr->pos + (CTR_AUDIO_SIZE / 2)) & CTR_AUDIO_SIZE_MASK),
-// (u32*)ctr->silence_paddr, CTR_AUDIO_SIZE);
+ /* prevents restarting audio when the menu
+ * is toggled off on shutdown */
+
+ if (global->system.shutdown)
+ return true;
+
+// CSND_SetPlayState(0x8, 1);
+// CSND_SetPlayState(0x9, 1);
+
+ CSND_SetVol(0x8, 0x00008000, 0);
+ CSND_SetVol(0x9, 0x80000000, 0);
- CSND_SetBlock(0x8, 1, ctr->l_paddr, CTR_AUDIO_SIZE);
- CSND_SetBlock(0x9, 1, ctr->r_paddr, CTR_AUDIO_SIZE);
csndExecCmds(false);
+ ctr->playing = true;
+
return true;
}
diff --git a/camera/camera_driver.c b/camera/camera_driver.c
index f0204cafa7..d99fd60200 100644
--- a/camera/camera_driver.c
+++ b/camera/camera_driver.c
@@ -31,7 +31,7 @@ static const camera_driver_t *camera_drivers[] = {
#ifdef ANDROID
&camera_android,
#endif
-#if defined(__IPHONE_4_0) && defined(IOS)
+#ifdef HAVE_AVFOUNDATION
&camera_apple,
#endif
&camera_null,
diff --git a/command_event.c b/command_event.c
index 0000667b87..04afd06280 100644
--- a/command_event.c
+++ b/command_event.c
@@ -622,12 +622,13 @@ static void event_set_savestate_auto_index(void)
static bool event_init_content(void)
{
+ driver_t *driver = driver_get_ptr();
global_t *global = global_get_ptr();
/* No content to be loaded for dummy core,
* just successfully exit. */
if (global->libretro_dummy)
- return true;
+ goto end;
if (!global->libretro_no_content)
rarch_fill_pathnames();
@@ -647,22 +648,30 @@ static bool event_init_content(void)
event_command(EVENT_CMD_BSV_MOVIE_INIT);
event_command(EVENT_CMD_NETPLAY_INIT);
+end:
+ retro_init_libretro_cbs(&driver->retro_ctx);
+ rarch_init_system_av_info();
+
return true;
}
static bool event_init_core(void)
{
- driver_t *driver = driver_get_ptr();
- global_t *global = global_get_ptr();
-
- if (config_load_override())
- global->overrides_active = true;
- else
- global->overrides_active = false;
+ global_t *global = global_get_ptr();
+ settings_t *settings = config_get_ptr();
+
+ if(settings->auto_overrides_enable)
+ {
+ if (config_load_override())
+ global->overrides_active = true;
+ else
+ global->overrides_active = false;
+ }
pretro_set_environment(rarch_environment_cb);
- config_load_remap();
+ if(settings->auto_remaps_enable)
+ config_load_remap();
rarch_verify_api_version();
pretro_init();
@@ -673,9 +682,6 @@ static bool event_init_core(void)
if (!event_init_content())
return false;
- retro_init_libretro_cbs(&driver->retro_ctx);
- rarch_init_system_av_info();
-
return true;
}
@@ -724,6 +730,7 @@ static bool event_save_core_config(void)
config_path[PATH_MAX_LENGTH], msg[PATH_MAX_LENGTH];
bool ret = false;
bool found_path = false;
+ bool overrides_active = false;
settings_t *settings = config_get_ptr();
global_t *global = global_get_ptr();
@@ -785,6 +792,13 @@ static bool event_save_core_config(void)
sizeof(config_path));
}
+ /* Overrides block config file saving, make it appear as overrides weren't enabled for a manual save */
+ if (global->overrides_active)
+ {
+ global->overrides_active = false;
+ overrides_active = true;
+ }
+
if ((ret = config_save_file(config_path)))
{
strlcpy(global->config_path, config_path,
@@ -801,7 +815,7 @@ static bool event_save_core_config(void)
}
rarch_main_msg_queue_push(msg, 1, 180, true);
-
+ global->overrides_active = overrides_active;
return ret;
}
diff --git a/config.def.h b/config.def.h
index c0aa4a5a86..b275755c84 100644
--- a/config.def.h
+++ b/config.def.h
@@ -88,7 +88,7 @@ enum
INPUT_XINPUT,
INPUT_UDEV,
INPUT_LINUXRAW,
- INPUT_APPLE,
+ INPUT_COCOA,
INPUT_QNX,
INPUT_RWEBINPUT,
INPUT_NULL,
@@ -111,7 +111,7 @@ enum
CAMERA_V4L2,
CAMERA_RWEBCAM,
CAMERA_ANDROID,
- CAMERA_APPLE,
+ CAMERA_AVFOUNDATION,
CAMERA_NULL,
LOCATION_ANDROID,
@@ -126,6 +126,9 @@ enum
MENU_RMENU_XUI,
MENU_GLUI,
MENU_XMB,
+
+ RECORD_FFMPEG,
+ RECORD_NULL,
};
#if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) || defined(__CELLOS_LV2__)
@@ -210,6 +213,12 @@ enum
#define AUDIO_DEFAULT_RESAMPLER_DRIVER AUDIO_RESAMPLER_SINC
#endif
+#if defined(HAVE_FFMPEG)
+#define RECORD_DEFAULT_DRIVER RECORD_FFMPEG
+#else
+#define RECORD_DEFAULT_DRIVER RECORD_NULL
+#endif
+
#if defined(XENON)
#define INPUT_DEFAULT_DRIVER INPUT_XENON360
#elif defined(_XBOX360) || defined(_XBOX) || defined(HAVE_XINPUT2) || defined(HAVE_XINPUT_XBOX1)
@@ -236,8 +245,8 @@ enum
#define INPUT_DEFAULT_DRIVER INPUT_X
#elif defined(HAVE_WAYLAND)
#define INPUT_DEFAULT_DRIVER INPUT_WAYLAND
-#elif defined(IOS) || defined(OSX)
-#define INPUT_DEFAULT_DRIVER INPUT_APPLE
+#elif defined(HAVE_COCOA) || defined(HAVE_COCOATOUCH)
+#define INPUT_DEFAULT_DRIVER INPUT_COCOA
#elif defined(__QNX__)
#define INPUT_DEFAULT_DRIVER INPUT_QNX
#elif defined(HAVE_SDL)
@@ -284,8 +293,8 @@ enum
#define CAMERA_DEFAULT_DRIVER CAMERA_RWEBCAM
#elif defined(ANDROID)
#define CAMERA_DEFAULT_DRIVER CAMERA_ANDROID
-#elif defined(MAC_OS_X_VERSION_10_7) || defined(__IPHONE_4_0)
-#define CAMERA_DEFAULT_DRIVER CAMERA_APPLE
+#elif defined(HAVE_AVFOUNDATION)
+#define CAMERA_DEFAULT_DRIVER CAMERA_AVFOUNDATION
#else
#define CAMERA_DEFAULT_DRIVER CAMERA_NULL
#endif
@@ -407,7 +416,11 @@ static unsigned swap_interval = 1;
*/
static const bool video_threaded = false;
+#ifdef HAVE_THREADS
+static const bool threaded_data_runloop_enable = true;
+#else
static const bool threaded_data_runloop_enable = false;
+#endif
/* Set to true if HW render cores should get their private context. */
static const bool video_shared_context = false;
@@ -478,6 +491,9 @@ static bool default_core_specific_config = true;
static bool default_core_specific_config = false;
#endif
+static bool default_auto_overrides_enable = false;
+static bool default_auto_remaps_enable = false;
+
/* Crop overscanned frames. */
static const bool crop_overscan = true;
diff --git a/config.features.h b/config.features.h
index 5c27f4dd90..140833311f 100644
--- a/config.features.h
+++ b/config.features.h
@@ -8,6 +8,36 @@
#include "config.h"
#endif
+#ifdef HAVE_OVERLAY
+static const bool _overlay_supp = true;
+#else
+static const bool _overlay_supp = false;
+#endif
+
+#ifdef HAVE_V4L2
+static const bool _v4l2_supp = true;
+#else
+static const bool _v4l2_supp = false;
+#endif
+
+#ifdef HAVE_COMMAND
+static const bool _command_supp = true;
+#else
+static const bool _command_supp = false;
+#endif
+
+#ifdef HAVE_NETWORK_CMD
+static const bool _network_command_supp = true;
+#else
+static const bool _network_command_supp = false;
+#endif
+
+#ifdef HAVE_LIBUSB
+static const bool _libusb_supp = true;
+#else
+static const bool _libusb_supp = false;
+#endif
+
#ifdef HAVE_SDL
static const bool _sdl_supp = true;
#else
@@ -32,6 +62,12 @@ static const bool _opengl_supp = true;
static const bool _opengl_supp = false;
#endif
+#if defined(HAVE_OPENGLES) || defined(HAVE_OPENGLES2) || defined(HAVE_OPENGLES3)
+static const bool _opengles_supp = true;
+#else
+static const bool _opengles_supp = false;
+#endif
+
#ifdef HAVE_KMS
static const bool _kms_supp = true;
#else
@@ -80,6 +116,12 @@ static const bool _alsa_supp = true;
static const bool _alsa_supp = false;
#endif
+#ifdef HAVE_COREAUDIO
+static const bool _coreaudio_supp = true;
+#else
+static const bool _coreaudio_supp = false;
+#endif
+
#if defined(HAVE_OSS) || defined(HAVE_OSS_BSD)
static const bool _oss_supp = true;
#else
@@ -92,6 +134,18 @@ static const bool _al_supp = true;
static const bool _al_supp = false;
#endif
+#ifdef HAVE_SL
+static const bool _sl_supp = true;
+#else
+static const bool _sl_supp = false;
+#endif
+
+#ifdef HAVE_LIBRETRODB
+static const bool _libretrodb_supp = true;
+#else
+static const bool _libretrodb_supp = false;
+#endif
+
#ifdef HAVE_RSOUND
static const bool _rsound_supp = true;
#else
@@ -134,6 +188,12 @@ static const bool _zlib_supp = true;
static const bool _zlib_supp = false;
#endif
+#ifdef HAVE_7ZIP
+static const bool _7zip_supp = true;
+#else
+static const bool _7zip_supp = false;
+#endif
+
#ifdef HAVE_DYLIB
static const bool _dylib_supp = true;
#else
@@ -146,6 +206,18 @@ static const bool _cg_supp = true;
static const bool _cg_supp = false;
#endif
+#ifdef HAVE_GLSL
+static const bool _glsl_supp = true;
+#else
+static const bool _glsl_supp = false;
+#endif
+
+#ifdef HAVE_HLSL
+static const bool _hlsl_supp = true;
+#else
+static const bool _hlsl_supp = false;
+#endif
+
#ifdef HAVE_LIBXML2
static const bool _libxml2_supp = true;
#else
@@ -194,6 +266,36 @@ static const bool _python_supp = true;
static const bool _python_supp = false;
#endif
+#if defined(HAVE_COCOA) || defined(HAVE_COCOATOUCH)
+static const bool _cocoa_supp = true;
+#else
+static const bool _cocoa_supp = false;
+#endif
+
+#ifdef HAVE_QT
+static const bool _qt_supp = true;
+#else
+static const bool _qt_supp = false;
+#endif
+
+#ifdef HAVE_RPNG
+static const bool _rpng_supp = true;
+#else
+static const bool _rpng_supp = false;
+#endif
+
+#ifdef HAVE_CORETEXT
+static const bool _coretext_supp = true;
+#else
+static const bool _coretext_supp = false;
+#endif
+
+#ifdef HAVE_AVFOUNDATION
+static const bool _avfoundation_supp = true;
+#else
+static const bool _avfoundation_supp = false;
+#endif
+
#if !defined(_WIN32) && !defined(GLOBAL_CONFIG_DIR)
#if defined(__HAIKU__)
#define GLOBAL_CONFIG_DIR "/system/settings"
diff --git a/configuration.c b/configuration.c
index 4b3fd54712..be7b4e907a 100644
--- a/configuration.c
+++ b/configuration.c
@@ -124,6 +124,19 @@ const char *config_get_default_audio(void)
return "null";
}
+const char *config_get_default_record(void)
+{
+ switch (RECORD_DEFAULT_DRIVER)
+ {
+ case RECORD_FFMPEG:
+ return "ffmpeg";
+ default:
+ break;
+ }
+
+ return "null";
+}
+
/**
* config_get_default_audio_resampler:
*
@@ -238,8 +251,8 @@ const char *config_get_default_input(void)
return "linuxraw";
case INPUT_UDEV:
return "udev";
- case INPUT_APPLE:
- return "apple_input";
+ case INPUT_COCOA:
+ return "cocoa";
case INPUT_QNX:
return "qnx_input";
case INPUT_RWEBINPUT:
@@ -346,8 +359,8 @@ const char *config_get_default_camera(void)
return "rwebcam";
case CAMERA_ANDROID:
return "android";
- case CAMERA_APPLE:
- return "apple";
+ case CAMERA_AVFOUNDATION:
+ return "avfoundation";
default:
break;
}
@@ -397,6 +410,7 @@ static void config_set_defaults(void)
#endif
const char *def_camera = config_get_default_camera();
const char *def_location = config_get_default_location();
+ const char *def_record = config_get_default_record();
if (def_camera)
strlcpy(settings->camera.driver,
@@ -419,6 +433,9 @@ static void config_set_defaults(void)
if (def_joypad)
strlcpy(settings->input.joypad_driver,
def_joypad, sizeof(settings->input.joypad_driver));
+ if (def_record)
+ strlcpy(settings->record.driver,
+ def_record, sizeof(settings->record.driver));
#ifdef HAVE_MENU
if (def_menu)
strlcpy(settings->menu.driver,
@@ -633,8 +650,8 @@ static void config_set_defaults(void)
if (!global->has_set_ips_pref)
global->ips_pref = false;
- *global->recording.output_dir = '\0';
- *global->recording.config_dir = '\0';
+ *global->record.output_dir = '\0';
+ *global->record.config_dir = '\0';
*settings->core_options_path = '\0';
*settings->content_history_path = '\0';
@@ -664,6 +681,8 @@ static void config_set_defaults(void)
*settings->menu_config_directory = '\0';
#endif
settings->core_specific_config = default_core_specific_config;
+ settings->auto_overrides_enable = default_auto_overrides_enable;
+ settings->auto_remaps_enable = default_auto_remaps_enable;
settings->user_language = 0;
global->console.sound.system_bgm_enable = false;
@@ -1068,7 +1087,7 @@ static void config_read_keybinds_conf(config_file_t *conf)
}
/* Also dumps inherited values, useful for logging. */
-
+#if 0
static void config_file_dump_all(config_file_t *conf)
{
struct config_entry_list *list = NULL;
@@ -1084,12 +1103,12 @@ static void config_file_dump_all(config_file_t *conf)
while (list)
{
- RARCH_LOG("%s = \"%s\" %s\n", list->key,
- list->value, list->readonly ? "(included)" : "");
+ RARCH_LOG("%s = \"%s\"%s\n", list->key,
+ list->value, list->readonly ? " (included)" : "");
list = list->next;
}
}
-
+#endif
/**
* config_load:
* @path : path to be read from.
@@ -1138,14 +1157,14 @@ static bool config_load_file(const char *path, bool set_defaults)
RARCH_ERR("Failed to append config \"%s\"\n", extra_path);
extra_path = strtok_r(NULL, "|", &save);
}
-
+#if 0
if (global->verbosity)
{
RARCH_LOG_OUTPUT("=== Config ===\n");
config_file_dump_all(conf);
RARCH_LOG_OUTPUT("=== Config end ===\n");
}
-
+#endif
CONFIG_GET_FLOAT_BASE(conf, settings, video.scale, "video_scale");
CONFIG_GET_INT_BASE (conf, settings, video.fullscreen_x, "video_fullscreen_x");
@@ -1420,8 +1439,8 @@ static bool config_load_file(const char *path, bool set_defaults)
CONFIG_GET_INT_BASE(conf, settings, archive.mode, "archive_mode");
- config_get_path(conf, "recording_output_directory", global->recording.output_dir, sizeof(global->recording.output_dir));
- config_get_path(conf, "recording_config_directory", global->recording.config_dir, sizeof(global->recording.config_dir));
+ config_get_path(conf, "recording_output_directory", global->record.output_dir, sizeof(global->record.output_dir));
+ config_get_path(conf, "recording_config_directory", global->record.config_dir, sizeof(global->record.config_dir));
#ifdef HAVE_OVERLAY
config_get_path(conf, "overlay_directory", global->overlay_dir, sizeof(global->overlay_dir));
@@ -1578,6 +1597,8 @@ static bool config_load_file(const char *path, bool set_defaults)
config_read_keybinds_conf(conf);
CONFIG_GET_BOOL_BASE(conf, settings, core_specific_config, "core_specific_config");
+ CONFIG_GET_BOOL_BASE(conf, settings, auto_overrides_enable, "auto_overrides_enable");
+ CONFIG_GET_BOOL_BASE(conf, settings, auto_remaps_enable, "auto_remaps_enable");
config_file_free(conf);
return true;
@@ -1712,7 +1733,7 @@ bool config_load_override(void)
if (settings->core_specific_config)
{
RARCH_LOG("Can't use overrides in conjunction with per-core configs, disabling overrides\n");
- return false;
+ return false;
}
RARCH_LOG("Core-specific overrides found at %s. Appending.\n", core_path);
strlcpy(global->append_config_path, core_path, sizeof(global->append_config_path));
@@ -1892,7 +1913,7 @@ bool config_load_remap(void)
{
RARCH_LOG("No core-specific remap found at %s.\n", core_path);
*settings->input.remapping_path= '\0';
- input_remapping_set_defaults();
+ input_remapping_set_defaults();
}
new_conf = NULL;
@@ -2176,8 +2197,8 @@ bool config_save_file(const char *path)
config_set_path(conf, "libretro_path", settings->libretro);
config_set_path(conf, "core_options_path", settings->core_options_path);
- config_set_path(conf, "recording_output_directory", global->recording.output_dir);
- config_set_path(conf, "recording_config_directory", global->recording.config_dir);
+ config_set_path(conf, "recording_output_directory", global->record.output_dir);
+ config_set_path(conf, "recording_config_directory", global->record.config_dir);
config_set_bool(conf, "suspend_screensaver_enable", settings->ui.suspend_screensaver_enable);
config_set_path(conf, "libretro_directory", settings->libretro_directory);
@@ -2450,6 +2471,10 @@ bool config_save_file(const char *path)
config_set_bool(conf, "core_specific_config",
settings->core_specific_config);
+ config_set_bool(conf, "auto_overrides_enable",
+ settings->auto_overrides_enable);
+ config_set_bool(conf, "auto_remaps_enable",
+ settings->auto_remaps_enable);
config_set_int(conf, "libretro_log_level", settings->libretro_log_level);
config_set_bool(conf, "log_verbosity", global->verbosity);
config_set_bool(conf, "perfcnt_enable", global->perfcnt_enable);
diff --git a/configuration.h b/configuration.h
index 2f6c87513b..cb82a7c52e 100644
--- a/configuration.h
+++ b/configuration.h
@@ -92,6 +92,11 @@ typedef struct settings
bool force_srgb_disable;
} video;
+ struct
+ {
+ char driver[32];
+ } record;
+
struct
{
bool menubar_enable;
@@ -303,6 +308,8 @@ typedef struct settings
bool load_dummy_on_core_shutdown;
bool core_specific_config;
+ bool auto_overrides_enable;
+ bool auto_remaps_enable;
char username[32];
unsigned int user_language;
@@ -393,6 +400,8 @@ const char *config_get_default_joypad(void);
const char *config_get_default_menu(void);
#endif
+const char *config_get_default_record(void);
+
/**
* config_load:
*
diff --git a/content.c b/content.c
index 060aafd42e..f1315e6e4c 100644
--- a/content.c
+++ b/content.c
@@ -73,9 +73,11 @@ static bool read_content_file(unsigned i, const char *path, void **buf,
if (!global->block_patch)
patch_content(&ret_buf, length);
+#ifdef HAVE_ZLIB
global->content_crc = zlib_crc32_calculate(ret_buf, *length);
RARCH_LOG("CRC32: 0x%x .\n", (unsigned)global->content_crc);
+#endif
*buf = ret_buf;
return true;
diff --git a/database_info.c b/database_info.c
index e9e16a3f2e..7214ef7895 100644
--- a/database_info.c
+++ b/database_info.c
@@ -141,9 +141,11 @@ static int database_info_iterate_rdl_write(
rarch_main_msg_queue_push(msg, 1, 180, true);
+#ifdef HAVE_ZLIB
crc = zlib_crc32_calculate(ret_buf, ret);
RARCH_LOG("CRC32: 0x%x .\n", (unsigned)crc);
+#endif
if (ret_buf)
free(ret_buf);
diff --git a/driver.c b/driver.c
index f2724047fa..755311e2e7 100644
--- a/driver.c
+++ b/driver.c
@@ -123,6 +123,12 @@ static const void *find_driver_nonempty(const char *label, int i,
if (drv)
strlcpy(str, audio_driver_find_ident(i), sizeof_str);
}
+ else if (!strcmp(label, "record_driver"))
+ {
+ drv = record_driver_find_handle(i);
+ if (drv)
+ strlcpy(str, record_driver_find_ident(i), sizeof_str);
+ }
else if (!strcmp(label, "audio_resampler_driver"))
{
drv = audio_resampler_driver_find_handle(i);
diff --git a/driver.h b/driver.h
index d2b8d6ca25..b1c319c53a 100644
--- a/driver.h
+++ b/driver.h
@@ -199,7 +199,7 @@ typedef struct driver
const camera_driver_t *camera;
const location_driver_t *location;
const rarch_resampler_t *resampler;
- const ffemu_backend_t *recording;
+ const record_driver_t *recording;
struct retro_callbacks retro_ctx;
void *audio_data;
diff --git a/file_path_special.c b/file_path_special.c
index 66e42566e1..bed8cfa8c7 100644
--- a/file_path_special.c
+++ b/file_path_special.c
@@ -66,6 +66,10 @@
#include
#endif
+#ifdef __APPLE__
+#include
+#endif
+
void fill_pathname_expand_special(char *out_path,
const char *in_path, size_t size)
{
diff --git a/frontend/drivers/platform_android.c b/frontend/drivers/platform_android.c
index 0936e6a639..113d36a0bf 100644
--- a/frontend/drivers/platform_android.c
+++ b/frontend/drivers/platform_android.c
@@ -869,5 +869,6 @@ const frontend_ctx_driver_t frontend_ctx_android = {
NULL, /* get_os */
frontend_android_get_rating, /* get_rating */
NULL, /* load_content */
+ NULL, /* get_powerstate */
"android",
};
diff --git a/frontend/drivers/platform_apple.c b/frontend/drivers/platform_apple.c
index d58d33010b..812e1ce5e2 100644
--- a/frontend/drivers/platform_apple.c
+++ b/frontend/drivers/platform_apple.c
@@ -15,123 +15,152 @@
* If not, see .
*/
+#include
+#include
+#include
#include "../../apple/common/CFExtensions.h"
#include "../frontend_driver.h"
#include "../../ui/ui_companion_driver.h"
+#include "../../general.h"
#include
#include
#include
#include
-#ifdef IOS
+#include
+
+#if defined(OSX)
+#include
+#include
+#include
+#endif
+
+#if defined(IOS)
void get_ios_version(int *major, int *minor);
+
+enum frontend_powerstate ios_get_powerstate(int *seconds, int *percent);
#endif
-static bool CopyModel(char** model, uint32_t *majorRev, uint32_t *minorRev)
+#if defined(OSX)
+
+#define PMGMT_STRMATCH(a,b) (CFStringCompare(a, b, 0) == kCFCompareEqualTo)
+#define PMGMT_GETVAL(k,v) CFDictionaryGetValueIfPresent(dict, CFSTR(k), (const void **) v)
+
+/* Note that AC power sources also include a laptop battery it is charging. */
+static void checkps(CFDictionaryRef dict, bool * have_ac, bool * have_battery,
+ bool * charging, int *seconds, int *percent)
{
-#ifdef OSX
- int mib[2];
- int count;
- unsigned long modelLen;
- char *revStr;
-#endif
- char *machineModel;
- bool success = true;
- size_t length = 1024;
-
- if (!model || !majorRev || !minorRev)
- {
- RARCH_ERR("CopyModel: Passing NULL arguments\n");
- return false;
- }
-
-#ifdef IOS
- sysctlbyname("hw.machine", NULL, &length, NULL, 0);
-#endif
-
- machineModel = malloc(length);
-
- if (!machineModel)
- {
- success = false;
- goto exit;
- }
-#ifdef IOS
- sysctlbyname("hw.machine", machineModel, &length, NULL, 0);
- *model = strndup(machineModel, length);
-#else
- mib[0] = CTL_HW;
- mib[1] = HW_MODEL;
-
- if (sysctl(mib, 2, machineModel, &length, NULL, 0))
- {
- printf("CopyModel: sysctl (error %d)\n", errno);
- success = false;
- goto exit;
- }
-
- modelLen = strcspn(machineModel, "0123456789");
-
- if (modelLen == 0)
- {
- RARCH_ERR("CopyModel: Could not find machine model name\n");
- success = false;
- goto exit;
- }
-
- *model = strndup(machineModel, modelLen);
-
- if (*model == NULL)
- {
- RARCH_ERR("CopyModel: Could not find machine model name\n");
- success = false;
- goto exit;
- }
-
- *majorRev = 0;
- *minorRev = 0;
- revStr = strpbrk(machineModel, "0123456789");
-
- if (!revStr)
- {
- RARCH_ERR("CopyModel: Could not find machine version number, inferred value is 0,0\n");
- success = true;
- goto exit;
- }
-
- count = sscanf(revStr, "%d,%d", majorRev, minorRev);
-
- if (count < 2)
- {
- RARCH_ERR("CopyModel: Could not find machine version number\n");
- if (count < 1)
- *majorRev = 0;
- *minorRev = 0;
- success = true;
- goto exit;
- }
-#endif
-
-exit:
- if (machineModel)
- free(machineModel);
- if (!success)
- {
- if (*model)
- free(*model);
- *model = NULL;
- *majorRev = 0;
- *minorRev = 0;
- }
- return success;
+ CFStringRef strval; /* don't CFRelease() this. */
+ CFBooleanRef bval;
+ CFNumberRef numval;
+ bool charge = false;
+ bool choose = false;
+ bool is_ac = false;
+ int secs = -1;
+ int maxpct = -1;
+ int pct = -1;
+
+ if ((PMGMT_GETVAL(kIOPSIsPresentKey, &bval)) && (bval == kCFBooleanFalse))
+ return; /* nothing to see here. */
+
+ if (!PMGMT_GETVAL(kIOPSPowerSourceStateKey, &strval))
+ return;
+
+ if (PMGMT_STRMATCH(strval, CFSTR(kIOPSACPowerValue)))
+ is_ac = *have_ac = true;
+ else if (!PMGMT_STRMATCH(strval, CFSTR(kIOPSBatteryPowerValue)))
+ return; /* not a battery? */
+
+ if ((PMGMT_GETVAL(kIOPSIsChargingKey, &bval)) && (bval == kCFBooleanTrue))
+ charge = true;
+
+ if (PMGMT_GETVAL(kIOPSMaxCapacityKey, &numval))
+ {
+ SInt32 val = -1;
+ CFNumberGetValue(numval, kCFNumberSInt32Type, &val);
+ if (val > 0)
+ {
+ *have_battery = true;
+ maxpct = (int) val;
+ }
+ }
+
+ if (PMGMT_GETVAL(kIOPSMaxCapacityKey, &numval))
+ {
+ SInt32 val = -1;
+ CFNumberGetValue(numval, kCFNumberSInt32Type, &val);
+ if (val > 0)
+ {
+ *have_battery = true;
+ maxpct = (int) val;
+ }
+ }
+
+ if (PMGMT_GETVAL(kIOPSTimeToEmptyKey, &numval))
+ {
+ SInt32 val = -1;
+ CFNumberGetValue(numval, kCFNumberSInt32Type, &val);
+
+ /* Mac OS X reports 0 minutes until empty if you're plugged in. :( */
+ if ((val == 0) && (is_ac))
+ val = -1; /* !!! FIXME: calc from timeToFull and capacity? */
+
+ secs = (int) val;
+ if (secs > 0)
+ secs *= 60; /* value is in minutes, so convert to seconds. */
+ }
+
+ if (PMGMT_GETVAL(kIOPSCurrentCapacityKey, &numval))
+ {
+ SInt32 val = -1;
+ CFNumberGetValue(numval, kCFNumberSInt32Type, &val);
+ pct = (int) val;
+ }
+
+ if ((pct > 0) && (maxpct > 0))
+ pct = (int) ((((double) pct) / ((double) maxpct)) * 100.0);
+
+ if (pct > 100)
+ pct = 100;
+
+ /*
+ * We pick the battery that claims to have the most minutes left.
+ * (failing a report of minutes, we'll take the highest percent.)
+ */
+ if ((secs < 0) && (*seconds < 0))
+ {
+ if ((pct < 0) && (*percent < 0))
+ choose = true; /* at least we know there's a battery. */
+ if (pct > *percent)
+ choose = true;
+ }
+ else if (secs > *seconds)
+ choose = true;
+
+ if (choose)
+ {
+ *seconds = secs;
+ *percent = pct;
+ *charging = charge;
+ }
}
+#endif
static void frontend_apple_get_name(char *name, size_t sizeof_name)
{
- uint32_t major_rev, minor_rev;
- CopyModel(&name, &major_rev, &minor_rev);
+#if defined(IOS)
+ struct utsname buffer;
+
+ if (uname(&buffer) != 0)
+ return;
+
+ strlcpy(name, buffer.machine, sizeof_name);
+#elif defined(OSX)
+ size_t length = 0;
+ sysctlbyname("hw.model", name, &length, NULL, 0);
+#endif
}
static void frontend_apple_get_os(char *name, size_t sizeof_name, int *major, int *minor)
@@ -141,15 +170,18 @@ static void frontend_apple_get_os(char *name, size_t sizeof_name, int *major, in
(void)major;
(void)minor;
-#ifdef IOS
+#if defined(IOS)
get_ios_version(major, minor);
- snprintf(name, sizeof_name, "iOS %d.%d", *major, *minor);
+ strlcpy(name, "iOS", sizeof_name);
+#elif defined(OSX)
+ strlcpy(name, "OSX", sizeof_name);
#endif
}
static void frontend_apple_get_environment_settings(int *argc, char *argv[],
void *args, void *params_data)
{
+#if defined(HAVE_COCOA) || defined(HAVE_COCOATOUCH)
char temp_dir[PATH_MAX_LENGTH];
char bundle_path_buf[PATH_MAX_LENGTH], home_dir_buf[PATH_MAX_LENGTH];
CFURLRef bundle_url;
@@ -214,9 +246,12 @@ static void frontend_apple_get_environment_settings(int *argc, char *argv[],
CFRelease(bundle_path);
CFRelease(bundle_url);
+#endif
}
+#if defined(HAVE_COCOA) || defined(HAVE_COCOATOUCH)
extern void apple_rarch_exited(void);
+#endif
static void frontend_apple_load_content(void)
{
@@ -229,7 +264,9 @@ static void frontend_apple_load_content(void)
static void frontend_apple_shutdown(bool unused)
{
+#if defined(HAVE_COCOA) || defined(HAVE_COCOATOUCH)
apple_rarch_exited();
+#endif
}
static int frontend_apple_get_rating(void)
@@ -297,20 +334,100 @@ static int frontend_apple_get_rating(void)
return -1;
}
+static enum frontend_powerstate frontend_apple_get_powerstate(int *seconds, int *percent)
+{
+ enum frontend_powerstate ret = FRONTEND_POWERSTATE_NONE;
+#if defined(OSX)
+ CFIndex i, total;
+ CFArrayRef list;
+ bool have_ac, have_battery, charging;
+ CFTypeRef blob = IOPSCopyPowerSourcesInfo();
+ *seconds = -1;
+ *percent = -1;
+
+ if (!blob)
+ goto end;
+
+ list = IOPSCopyPowerSourcesList(blob);
+
+ if (!list)
+ goto end;
+
+ /* don't CFRelease() the list items, or dictionaries! */
+ have_ac = false;
+ have_battery = false;
+ charging = false;
+ total = CFArrayGetCount(list);
+
+ for (i = 0; i < total; i++)
+ {
+ CFTypeRef ps = (CFTypeRef)CFArrayGetValueAtIndex(list, i);
+ CFDictionaryRef dict = IOPSGetPowerSourceDescription(blob, ps);
+ if (dict)
+ checkps(dict, &have_ac, &have_battery, &charging,
+ seconds, percent);
+ }
+
+ if (!have_battery)
+ ret = FRONTEND_POWERSTATE_NO_SOURCE;
+ else if (charging)
+ ret = FRONTEND_POWERSTATE_CHARGING;
+ else if (have_ac)
+ ret = FRONTEND_POWERSTATE_CHARGED;
+ else
+ ret = FRONTEND_POWERSTATE_ON_POWER_SOURCE;
+
+ CFRelease(list);
+end:
+ if (blob)
+ CFRelease(blob);
+#elif defined(IOS)
+ ret = ios_get_powerstate(seconds, percent);
+#endif
+ return ret;
+}
+
+enum frontend_architecture frontend_apple_get_architecture(void)
+{
+ struct utsname buffer;
+
+ if (uname(&buffer) != 0)
+ return FRONTEND_ARCH_NONE;
+
+#ifdef OSX
+ if (!strcmp(buffer.machine, "x86_64"))
+ return FRONTEND_ARCH_X86_64;
+ if (!strcmp(buffer.machine, "x86"))
+ return FRONTEND_ARCH_X86;
+ if (!strcmp(buffer.machine, "Power Macintosh"))
+ return FRONTEND_ARCH_PPC;
+#endif
+
+ return FRONTEND_ARCH_NONE;
+}
const frontend_ctx_driver_t frontend_ctx_apple = {
- frontend_apple_get_environment_settings, /* environment_get */
+ frontend_apple_get_environment_settings,
NULL, /* init */
NULL, /* deinit */
NULL, /* exitspawn */
NULL, /* process_args */
NULL, /* exec */
NULL, /* set_fork */
- frontend_apple_shutdown, /* shutdown */
- frontend_apple_get_name, /* get_name */
- frontend_apple_get_os, /* get_os */
- frontend_apple_get_rating, /* get_rating */
- frontend_apple_load_content, /* load_content */
+ frontend_apple_shutdown,
+ frontend_apple_get_name,
+ frontend_apple_get_os,
+ frontend_apple_get_rating,
+ frontend_apple_load_content,
+ frontend_apple_get_architecture,
+ frontend_apple_get_powerstate,
"apple",
};
+
+#if !defined(HAVE_COCOA) && !defined(HAVE_COCOATOUCH)
+int main(int argc, char *argv[])
+{
+ return rarch_main(argc, argv);
+}
+#endif
diff --git a/frontend/drivers/platform_ctr.c b/frontend/drivers/platform_ctr.c
index e5aea45e7f..4ad802bc1d 100644
--- a/frontend/drivers/platform_ctr.c
+++ b/frontend/drivers/platform_ctr.c
@@ -29,12 +29,11 @@
int __stacksize__ = 1*1024*1024;
-//char elf_path[512];
const char* elf_path_cst = "sdmc:/retroarch/test.3dsx";
-
void wait_for_input(void);
+
#define DEBUG_HOLD() do{printf("%s@%s:%d.\n",__FUNCTION__, __FILE__, __LINE__);fflush(stdout);wait_for_input();}while(0)
static void frontend_ctr_get_environment_settings(int *argc, char *argv[],
@@ -42,7 +41,6 @@ static void frontend_ctr_get_environment_settings(int *argc, char *argv[],
{
(void)args;
-// return;
#ifndef IS_SALAMANDER
#if defined(HAVE_LOGGER)
logger_init();
@@ -52,9 +50,6 @@ static void frontend_ctr_get_environment_settings(int *argc, char *argv[],
#endif
#endif
-// strlcpy(elf_path, argv[0], sizeof(elf_path));
-
-// fill_pathname_basedir(g_defaults.port_dir, argv[0], sizeof(g_defaults.port_dir));
fill_pathname_basedir(g_defaults.port_dir, elf_path_cst, sizeof(g_defaults.port_dir));
RARCH_LOG("port dir: [%s]\n", g_defaults.port_dir);
@@ -76,34 +71,36 @@ static void frontend_ctr_get_environment_settings(int *argc, char *argv[],
"retroarch.cfg", sizeof(g_defaults.config_path));
#ifndef IS_SALAMANDER
-// if (argv[1] && (argv[1][0] != '\0'))
-// {
-// static char path[PATH_MAX_LENGTH];
-// struct rarch_main_wrap *args = NULL;
+#if 0
+ if (argv[1] && (argv[1][0] != '\0'))
+ {
+ static char path[PATH_MAX_LENGTH];
+ struct rarch_main_wrap *args = NULL;
-// *path = '\0';
-// args = (struct rarch_main_wrap*)params_data;
+ *path = '\0';
+ args = (struct rarch_main_wrap*)params_data;
-// if (args)
-// {
-// strlcpy(path, argv[1], sizeof(path));
+ if (args)
+ {
+ strlcpy(path, argv[1], sizeof(path));
-// args->touched = true;
-// args->no_content = false;
-// args->verbose = false;
-// args->config_path = NULL;
-// args->sram_path = NULL;
-// args->state_path = NULL;
-// args->content_path = path;
-// args->libretro_path = NULL;
+ args->touched = true;
+ args->no_content = false;
+ args->verbose = false;
+ args->config_path = NULL;
+ args->sram_path = NULL;
+ args->state_path = NULL;
+ args->content_path = path;
+ args->libretro_path = NULL;
-// RARCH_LOG("argv[0]: %s\n", argv[0]);
-// RARCH_LOG("argv[1]: %s\n", argv[1]);
-// RARCH_LOG("argv[2]: %s\n", argv[2]);
+ RARCH_LOG("argv[0]: %s\n", argv[0]);
+ RARCH_LOG("argv[1]: %s\n", argv[1]);
+ RARCH_LOG("argv[2]: %s\n", argv[2]);
-// RARCH_LOG("Auto-start game %s.\n", argv[1]);
-// }
-// }
+ RARCH_LOG("Auto-start game %s.\n", argv[1]);
+ }
+ }
+#endif
#endif
}
@@ -125,11 +122,13 @@ static void frontend_ctr_deinit(void *data)
csndExit();
gfxExit();
-// sdmcExit();
-// fsExit();
-// hidExit();
-// aptExit();
-// srvExit();
+#if 0
+ sdmcExit();
+ fsExit();
+ hidExit();
+ aptExit();
+ srvExit();
+#endif
#endif
}
@@ -140,6 +139,7 @@ static void frontend_ctr_shutdown(bool unused)
#define PRINTFPOS(X,Y) "\x1b["#X";"#Y"H"
#define PRINTFPOS_STR(X,Y) "\x1b["X";"Y"H"
+
static void frontend_ctr_init(void *data)
{
#ifndef IS_SALAMANDER
@@ -147,20 +147,21 @@ static void frontend_ctr_init(void *data)
global_t *global = global_get_ptr();
global->verbosity = true;
-// srvInit();
-// aptInit();
-// hidInit();
-// fsInit();
-// sdmcInit();
+#if 0
+ srvInit();
+ aptInit();
+ hidInit();
+ fsInit();
+ sdmcInit();
-// APT_SetAppCpuTimeLimit(NULL, 80);
-// gfxInitDefault();
+ APT_SetAppCpuTimeLimit(NULL, 80);
+ gfxInitDefault();
+#endif
gfxInit(GSP_BGR8_OES,GSP_RGB565_OES,false);
csndInit();
gfxSet3D(false);
consoleInit(GFX_BOTTOM, NULL);
#endif
-
}
@@ -168,36 +169,51 @@ static int frontend_ctr_get_rating(void)
{
return 3;
}
+
bool select_pressed = false;
-void wait_for_input()
+
+void wait_for_input(void)
{
- printf("\n\nPress Start.\n\n");fflush(stdout);
+ printf("\n\nPress Start.\n\n");
+ fflush(stdout);
+
while(aptMainLoop())
{
+ u32 kDown;
+
hidScanInput();
- u32 kDown = hidKeysDown();
+
+ kDown = hidKeysDown();
+
if (kDown & KEY_START)
break;
if (kDown & KEY_SELECT)
select_pressed = true;
- svcSleepThread(1000000);
+ rarch_sleep(1);
}
}
+enum frontend_architecture frontend_ctr_get_architecture(void)
+{
+ return FRONTEND_ARCH_ARM;
+}
+
const frontend_ctx_driver_t frontend_ctx_ctr = {
- frontend_ctr_get_environment_settings, /* get_environment_settings */
- frontend_ctr_init, /* init */
- frontend_ctr_deinit, /* deinit */
+ frontend_ctr_get_environment_settings,
+ frontend_ctr_init,
+ frontend_ctr_deinit,
NULL, /* exitspawn */
NULL, /* process_args */
NULL, /* exec */
NULL, /* set_fork */
- frontend_ctr_shutdown, /* shutdown */
+ frontend_ctr_shutdown,
NULL, /* get_name */
NULL, /* get_os */
- frontend_ctr_get_rating, /* get_rating */
+ frontend_ctr_get_rating,
NULL, /* load_content */
+ frontend_ctr_get_architecture,
+ NULL, /* get_powerstate */
"ctr",
};
diff --git a/frontend/drivers/platform_gx.c b/frontend/drivers/platform_gx.c
index a3a5da4f1d..fe5b51c4d7 100644
--- a/frontend/drivers/platform_gx.c
+++ b/frontend/drivers/platform_gx.c
@@ -376,18 +376,25 @@ static int frontend_gx_get_rating(void)
#endif
}
+static enum frontend_architecture frontend_gx_get_architecture(void)
+{
+ return FRONTEND_ARCH_PPC;
+}
+
const frontend_ctx_driver_t frontend_ctx_gx = {
- frontend_gx_get_environment_settings, /* get_environment_settings */
- frontend_gx_init, /* init */
+ frontend_gx_get_environment_settings,
+ frontend_gx_init,
NULL, /* deinit */
- frontend_gx_exitspawn, /* exitspawn */
- frontend_gx_process_args, /* process_args */
- frontend_gx_exec, /* exec */
- frontend_gx_set_fork, /* set_fork */
+ frontend_gx_exitspawn,
+ frontend_gx_process_args,
+ frontend_gx_exec,
+ frontend_gx_set_fork,
NULL, /* shutdown */
NULL, /* get_name */
NULL, /* get_os */
- frontend_gx_get_rating, /* get_rating */
+ frontend_gx_get_rating,
NULL, /* load_content */
+ frontend_gx_get_architecture,
+ NULL, /* get_powerstate */
"gx",
};
diff --git a/frontend/drivers/platform_linux.c b/frontend/drivers/platform_linux.c
new file mode 100644
index 0000000000..b31b3a169f
--- /dev/null
+++ b/frontend/drivers/platform_linux.c
@@ -0,0 +1,441 @@
+/* RetroArch - A frontend for libretro.
+ * Copyright (C) 2010-2014 - Hans-Kristian Arntzen
+ * Copyright (C) 2011-2015 - Daniel De Matteis
+ * Copyright (C) 2012-2015 - 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.
+ *
+ * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ * * You should have received a copy of the GNU General Public License along with RetroArch.
+ * If not, see .
+ */
+
+#include "../frontend_driver.h"
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+#include
+
+static const char *proc_apm_path = "/proc/apm";
+static const char *proc_acpi_battery_path = "/proc/acpi/battery";
+static const char *proc_acpi_ac_adapter_path = "/proc/acpi/ac_adapter";
+
+static int open_acpi_file(const char *base, const char *node, const char *key)
+{
+ const size_t pathlen = strlen(base) + strlen(node) + strlen(key) + 3;
+ char *path = (char *)alloca(pathlen);
+ if (!path)
+ return -1;
+
+ snprintf(path, pathlen, "%s/%s/%s", base, node, key);
+ return open(path, O_RDONLY);
+}
+
+static bool load_acpi_file(const char *base, const char *node, const char *key,
+ char *buf, size_t buflen)
+{
+ ssize_t br = 0;
+ const int fd = open_acpi_file(base, node, key);
+ if (fd == -1)
+ return false;
+ br = read(fd, buf, buflen-1);
+ close(fd);
+ if (br < 0)
+ return false;
+ buf[br] = '\0'; /* null-terminate the string. */
+
+ return true;
+}
+
+static bool make_proc_acpi_key_val(char **_ptr, char **_key, char **_val)
+{
+ char *ptr = *_ptr;
+
+ while (*ptr == ' ')
+ ptr++; /* skip whitespace. */
+
+ if (*ptr == '\0')
+ return false; /* EOF. */
+
+ *_key = ptr;
+
+ while ((*ptr != ':') && (*ptr != '\0'))
+ ptr++;
+
+ if (*ptr == '\0')
+ return false; /* (unexpected) EOF. */
+
+ *(ptr++) = '\0'; /* terminate the key. */
+
+ while ((*ptr == ' ') && (*ptr != '\0'))
+ ptr++; /* skip whitespace. */
+
+ if (*ptr == '\0')
+ return false; /* (unexpected) EOF. */
+
+ *_val = ptr;
+
+ while ((*ptr != '\n') && (*ptr != '\0'))
+ ptr++;
+
+ if (*ptr != '\0')
+ *(ptr++) = '\0'; /* terminate the value. */
+
+ *_ptr = ptr; /* store for next time. */
+ return true;
+}
+
+static void
+check_proc_acpi_battery(const char * node, bool * have_battery,
+ bool * charging, int *seconds, int *percent)
+{
+ const char *base = proc_acpi_battery_path;
+ char info[1024];
+ char state[1024];
+ char *ptr = NULL;
+ char *key = NULL;
+ char *val = NULL;
+ bool charge = false;
+ bool choose = false;
+ int maximum = -1;
+ int remaining = -1;
+ int secs = -1;
+ int pct = -1;
+
+ if (!load_acpi_file(base, node, "state", state, sizeof (state)))
+ return;
+ else if (!load_acpi_file(base, node, "info", info, sizeof (info)))
+ return;
+
+ ptr = &state[0];
+ while (make_proc_acpi_key_val(&ptr, &key, &val))
+ {
+ if (!strcmp(key, "present"))
+ {
+ if (!strcmp(val, "yes"))
+ *have_battery = true;
+ }
+ else if (!strcmp(key, "charging state"))
+ {
+ /* !!! FIXME: what exactly _does_ charging/discharging mean? */
+ if (!strcmp(val, "charging/discharging"))
+ charge = true;
+ else if (!strcmp(val, "charging"))
+ charge = true;
+ }
+ else if (!strcmp(key, "remaining capacity"))
+ {
+ char *endptr = NULL;
+ const int cvt = (int) strtol(val, &endptr, 10);
+ if (*endptr == ' ')
+ remaining = cvt;
+ }
+ }
+
+ ptr = &info[0];
+ while (make_proc_acpi_key_val(&ptr, &key, &val))
+ {
+ if (!strcmp(key, "design capacity"))
+ {
+ char *endptr = NULL;
+ const int cvt = (int) strtol(val, &endptr, 10);
+ if (*endptr == ' ')
+ maximum = cvt;
+ }
+ }
+
+ if ((maximum >= 0) && (remaining >= 0))
+ {
+ pct = (int) ((((float) remaining) / ((float) maximum)) * 100.0f);
+ if (pct < 0)
+ pct = 0;
+ else if (pct > 100)
+ pct = 100;
+ }
+
+ /* !!! FIXME: calculate (secs). */
+
+ /*
+ * We pick the battery that claims to have the most minutes left.
+ * (failing a report of minutes, we'll take the highest percent.)
+ */
+ if ((secs < 0) && (*seconds < 0))
+ {
+ if ((pct < 0) && (*percent < 0))
+ choose = true; /* at least we know there's a battery. */
+ if (pct > *percent)
+ choose = true;
+ }
+ else if (secs > *seconds)
+ choose = true;
+
+ if (choose)
+ {
+ *seconds = secs;
+ *percent = pct;
+ *charging = charge;
+ }
+}
+
+static void
+check_proc_acpi_ac_adapter(const char * node, bool *have_ac)
+{
+ const char *base = proc_acpi_ac_adapter_path;
+ char state[256];
+ char *ptr = NULL;
+ char *key = NULL;
+ char *val = NULL;
+
+ if (!load_acpi_file(base, node, "state", state, sizeof (state)))
+ return;
+
+ ptr = &state[0];
+ while (make_proc_acpi_key_val(&ptr, &key, &val))
+ {
+ if (!strcmp(key, "state"))
+ {
+ if (!strcmp(val, "on-line"))
+ *have_ac = true;
+ }
+ }
+}
+
+static bool next_string(char **_ptr, char **_str)
+{
+ char *ptr = *_ptr;
+ char *str = *_str;
+
+ while (*ptr == ' ') /* skip any spaces... */
+ ptr++;
+
+ if (*ptr == '\0')
+ return false;
+
+ str = ptr;
+ while ((*ptr != ' ') && (*ptr != '\n') && (*ptr != '\0'))
+ ptr++;
+
+ if (*ptr != '\0')
+ *(ptr++) = '\0';
+
+ *_str = str;
+ *_ptr = ptr;
+ return true;
+}
+
+static bool int_string(char *str, int *val)
+{
+ char *endptr = NULL;
+ *val = (int) strtol(str, &endptr, 0);
+ return ((*str != '\0') && (*endptr == '\0'));
+}
+
+bool frontend_linux_powerstate_check_apm(enum frontend_powerstate *state,
+ int *seconds, int *percent)
+{
+ int ac_status = 0;
+ int battery_status = 0;
+ int battery_flag = 0;
+ int battery_percent = 0;
+ int battery_time = 0;
+ const int fd = open(proc_apm_path, O_RDONLY);
+ char buf[128];
+ char *ptr = &buf[0];
+ char *str = NULL;
+ ssize_t br;
+
+ if (fd == -1)
+ return false; /* can't use this interface. */
+
+ br = read(fd, buf, sizeof (buf) - 1);
+ close(fd);
+
+ if (br < 0)
+ return false;
+
+ buf[br] = '\0'; /* null-terminate the string. */
+ if (!next_string(&ptr, &str)) /* driver version */
+ return false;
+ if (!next_string(&ptr, &str)) /* BIOS version */
+ return false;
+ if (!next_string(&ptr, &str)) /* APM flags */
+ return false;
+
+ if (!next_string(&ptr, &str)) /* AC line status */
+ return false;
+ else if (!int_string(str, &ac_status))
+ return false;
+
+ if (!next_string(&ptr, &str)) /* battery status */
+ return false;
+ else if (!int_string(str, &battery_status))
+ return false;
+
+ if (!next_string(&ptr, &str)) /* battery flag */
+ return false;
+ else if (!int_string(str, &battery_flag))
+ return false;
+ if (!next_string(&ptr, &str)) /* remaining battery life percent */
+ return false;
+ if (str[strlen(str) - 1] == '%')
+ str[strlen(str) - 1] = '\0';
+ if (!int_string(str, &battery_percent))
+ return false;
+
+ if (!next_string(&ptr, &str)) /* remaining battery life time */
+ return false;
+ else if (!int_string(str, &battery_time))
+ return false;
+
+ if (!next_string(&ptr, &str)) /* remaining battery life time units */
+ return false;
+ else if (!strcmp(str, "min"))
+ battery_time *= 60;
+
+ if (battery_flag == 0xFF) /* unknown state */
+ *state = FRONTEND_POWERSTATE_NONE;
+ else if (battery_flag & (1 << 7)) /* no battery */
+ *state = FRONTEND_POWERSTATE_NO_SOURCE;
+ else if (battery_flag & (1 << 3)) /* charging */
+ *state = FRONTEND_POWERSTATE_CHARGING;
+ else if (ac_status == 1)
+ *state = FRONTEND_POWERSTATE_CHARGED; /* on AC, not charging. */
+ else
+ *state = FRONTEND_POWERSTATE_ON_POWER_SOURCE;
+
+ const int pct = battery_percent;
+ const int secs = battery_time;
+
+ if (pct >= 0) /* -1 == unknown */
+ *percent = (pct > 100) ? 100 : pct; /* clamp between 0%, 100% */
+ if (secs >= 0) /* -1 == unknown */
+ *seconds = secs;
+
+ return true;
+}
+
+bool frontend_linux_powerstate_check_acpi(enum frontend_powerstate *state,
+ int *seconds, int *percent)
+{
+ struct dirent *dent = NULL;
+ DIR *dirp = NULL;
+ bool have_battery = false;
+ bool have_ac = false;
+ bool charging = false;
+
+ *state = FRONTEND_POWERSTATE_NONE;
+
+ dirp = opendir(proc_acpi_battery_path);
+ if (dirp == NULL)
+ return false; /* can't use this interface. */
+
+ while ((dent = readdir(dirp)) != NULL)
+ {
+ const char *node = dent->d_name;
+ check_proc_acpi_battery(node, &have_battery, &charging,
+ seconds, percent);
+ }
+ closedir(dirp);
+
+ dirp = opendir(proc_acpi_ac_adapter_path);
+ if (dirp == NULL)
+ return false; /* can't use this interface. */
+
+ while ((dent = readdir(dirp)) != NULL)
+ {
+ const char *node = dent->d_name;
+ check_proc_acpi_ac_adapter(node, &have_ac);
+ }
+ closedir(dirp);
+
+ if (!have_battery)
+ *state = FRONTEND_POWERSTATE_NO_SOURCE;
+ else if (charging)
+ *state = FRONTEND_POWERSTATE_CHARGING;
+ else if (have_ac)
+ *state = FRONTEND_POWERSTATE_CHARGED;
+ else
+ *state = FRONTEND_POWERSTATE_ON_POWER_SOURCE;
+
+ return true; /* definitive answer. */
+}
+
+static enum frontend_powerstate
+frontend_linux_get_powerstate(int *seconds, int *percent)
+{
+ enum frontend_powerstate ret = FRONTEND_POWERSTATE_NONE;
+
+ if (frontend_linux_powerstate_check_apm(&ret, seconds, percent))
+ return ret;
+
+ if (frontend_linux_powerstate_check_acpi(&ret, seconds, percent))
+ return ret;
+
+ return FRONTEND_POWERSTATE_NONE;
+}
+
+enum frontend_architecture frontend_linux_get_architecture(void)
+{
+ struct utsname buffer;
+
+ if (uname(&buffer) != 0)
+ return FRONTEND_ARCH_NONE;
+
+ if (!strcmp(buffer.machine, "x86_64"))
+ return FRONTEND_ARCH_X86_64;
+ if (!strcmp(buffer.machine, "x86"))
+ return FRONTEND_ARCH_X86;
+ if (!strcmp(buffer.machine, "arm"))
+ return FRONTEND_ARCH_ARM;
+ if (!strcmp(buffer.machine, "ppc64"))
+ return FRONTEND_ARCH_PPC;
+ if (!strcmp(buffer.machine, "mips"))
+ return FRONTEND_ARCH_MIPS;
+ if (!strcmp(buffer.machine, "tile"))
+ return FRONTEND_ARCH_TILE;
+
+ return FRONTEND_ARCH_NONE;
+}
+
+static void frontend_linux_get_os(char *name, size_t sizeof_name, int *major, int *minor)
+{
+ unsigned krel;
+ struct utsname buffer;
+
+ if (uname(&buffer) != 0)
+ return;
+
+ sscanf(buffer.release, "%u.%u.%u", major, minor, &krel);
+ strlcpy(name, "Linux", sizeof_name);
+}
+
+const frontend_ctx_driver_t frontend_ctx_linux = {
+ NULL, /* environment_get */
+ NULL, /* init */
+ NULL, /* deinit */
+ NULL, /* exitspawn */
+ NULL, /* process_args */
+ NULL, /* exec */
+ NULL, /* set_fork */
+ NULL, /* shutdown */
+ NULL, /* get_name */
+ frontend_linux_get_os,
+ NULL, /* get_rating */
+ NULL, /* load_content */
+ frontend_linux_get_architecture,
+ frontend_linux_get_powerstate,
+ "linux",
+};
diff --git a/frontend/drivers/platform_null.c b/frontend/drivers/platform_null.c
index 07368acebc..711ee5748b 100644
--- a/frontend/drivers/platform_null.c
+++ b/frontend/drivers/platform_null.c
@@ -34,5 +34,7 @@ const frontend_ctx_driver_t frontend_ctx_null = {
NULL, /* get_os */
NULL, /* get_rating */
NULL, /* load_content */
+ NULL, /* get_architecture */
+ NULL, /* get_powerstate */
"null",
};
diff --git a/frontend/drivers/platform_ps3.c b/frontend/drivers/platform_ps3.c
index 3e439031fc..3e07b19674 100644
--- a/frontend/drivers/platform_ps3.c
+++ b/frontend/drivers/platform_ps3.c
@@ -439,18 +439,25 @@ static int frontend_ps3_get_rating(void)
return 10;
}
+enum frontend_architecture frontend_ps3_get_architecture(void)
+{
+ return FRONTEND_ARCH_PPC;
+}
+
const frontend_ctx_driver_t frontend_ctx_ps3 = {
- frontend_ps3_get_environment_settings, /* get_environment_settings */
- frontend_ps3_init, /* init */
- frontend_ps3_deinit, /* deinit */
- frontend_ps3_exitspawn, /* exitspawn */
+ frontend_ps3_get_environment_settings,
+ frontend_ps3_init,
+ frontend_ps3_deinit,
+ frontend_ps3_exitspawn,
NULL, /* process_args */
- frontend_ps3_exec, /* exec */
- frontend_ps3_set_fork, /* set_fork */
+ frontend_ps3_exec,
+ frontend_ps3_set_fork,
NULL, /* shutdown */
NULL, /* get_name */
NULL, /* get_os */
- frontend_ps3_get_rating, /* get_rating */
+ frontend_ps3_get_rating,
NULL, /* load_content */
+ frontend_ps3_get_architecture,
+ NULL, /* get_powerstate */
"ps3",
};
diff --git a/frontend/drivers/platform_psp.c b/frontend/drivers/platform_psp.c
index 35d3469e54..ef739ff863 100644
--- a/frontend/drivers/platform_psp.c
+++ b/frontend/drivers/platform_psp.c
@@ -236,18 +236,51 @@ static int frontend_psp_get_rating(void)
return 4;
}
+static enum frontend_powerstate frontend_psp_get_powerstate(int *seconds, int *percent)
+{
+ enum frontend_powerstate ret = FRONTEND_POWERSTATE_NONE;
+ int battery = scePowerIsBatteryExist();
+ int plugged = scePowerIsPowerOnline();
+ int charging = scePowerIsBatteryCharging();
+
+ *percent = scePowerGetBatteryLifePercent();
+ *seconds = scePowerGetBatteryLifeTime() * 60;
+
+ if (!battery)
+ {
+ ret = FRONTEND_POWERSTATE_NO_SOURCE;
+ *seconds = -1;
+ *percent = -1;
+ }
+ else if (charging)
+ ret = FRONTEND_POWERSTATE_CHARGING;
+ else if (plugged)
+ ret = FRONTEND_POWERSTATE_CHARGED;
+ else
+ ret = FRONTEND_POWERSTATE_ON_POWER_SOURCE;
+
+ return ret;
+}
+
+enum frontend_architecture frontend_psp_get_architecture(void)
+{
+ return FRONTEND_ARCH_MIPS;
+}
+
const frontend_ctx_driver_t frontend_ctx_psp = {
- frontend_psp_get_environment_settings, /* get_environment_settings */
- frontend_psp_init, /* init */
- frontend_psp_deinit, /* deinit */
- frontend_psp_exitspawn, /* exitspawn */
+ frontend_psp_get_environment_settings,
+ frontend_psp_init,
+ frontend_psp_deinit,
+ frontend_psp_exitspawn,
NULL, /* process_args */
- frontend_psp_exec, /* exec */
- frontend_psp_set_fork, /* set_fork */
- frontend_psp_shutdown, /* shutdown */
+ frontend_psp_exec,
+ frontend_psp_set_fork,
+ frontend_psp_shutdown,
NULL, /* get_name */
NULL, /* get_os */
- frontend_psp_get_rating, /* get_rating */
+ frontend_psp_get_rating,
NULL, /* load_content */
+ frontend_psp_get_architecture,
+ frontend_psp_get_powerstate,
"psp",
};
diff --git a/frontend/drivers/platform_qnx.c b/frontend/drivers/platform_qnx.c
index 02b56d68d2..e56124e589 100644
--- a/frontend/drivers/platform_qnx.c
+++ b/frontend/drivers/platform_qnx.c
@@ -59,18 +59,25 @@ static void frontend_qnx_get_environment_settings(int *argc, char *argv[],
"playlists", sizeof(g_defaults.playlist_dir));
}
+enum frontend_architecture frontend_qnx_get_architecture(void)
+{
+ return FRONTEND_ARCH_ARM;
+}
+
const frontend_ctx_driver_t frontend_ctx_qnx = {
- frontend_qnx_get_environment_settings, /* get_environment_settings */
- frontend_qnx_init, /* init */
+ frontend_qnx_get_environment_settings,
+ frontend_qnx_init,
NULL, /* deinit */
NULL, /* exitspawn */
NULL, /* process_args */
NULL, /* exec */
NULL, /* set_fork */
- frontend_qnx_shutdown, /* shutdown */
+ frontend_qnx_shutdown,
NULL, /* get_name */
NULL, /* get_os */
- frontend_qnx_get_rating, /* get_rating */
+ frontend_qnx_get_rating,
NULL, /* load_content */
+ frontend_qnx_get_architecture,
+ NULL, /* get_powerstate */
"qnx",
};
diff --git a/frontend/drivers/platform_win32.c b/frontend/drivers/platform_win32.c
index 862cc3498e..641cb779c8 100644
--- a/frontend/drivers/platform_win32.c
+++ b/frontend/drivers/platform_win32.c
@@ -103,6 +103,59 @@ static void frontend_win32_get_os(char *name, size_t sizeof_name, int *major, in
*major = (DWORD)(LOBYTE(LOWORD(version)));
*minor = (DWORD)(HIBYTE(LOWORD(version)));
+
+ switch (*major)
+ {
+ case 6:
+ switch (*minor)
+ {
+ case 3:
+ strlcpy(name, "Windows 8.1", sizeof_name);
+ break;
+ case 2:
+ strlcpy(name, "Windows 8", sizeof_name);
+ break;
+ case 1:
+ strlcpy(name, "Windows 7/2008 R2", sizeof_name);
+ break;
+ case 0:
+ strlcpy(name, "Windows Vista/2008", sizeof_name);
+ break;
+ default:
+ break;
+ }
+ break;
+ case 5:
+ switch (*minor)
+ {
+ case 2:
+ strlcpy(name, "Windows 2003", sizeof_name);
+ break;
+ case 1:
+ strlcpy(name, "Windows XP", sizeof_name);
+ break;
+ case 0:
+ strlcpy(name, "Windows 2000", sizeof_name);
+ break;
+ }
+ break;
+ case 4:
+ switch (*minor)
+ {
+ case 0:
+ strlcpy(name, "Windows NT 4.0", sizeof_name);
+ break;
+ case 90:
+ strlcpy(name, "Windows ME", sizeof_name);
+ break;
+ case 10:
+ strlcpy(name, "Windows 98", sizeof_name);
+ break;
+ }
+ break;
+ default:
+ break;
+ }
}
static void frontend_win32_init(void *data)
@@ -125,9 +178,40 @@ static void frontend_win32_init(void *data)
gfx_set_dwm();
}
+enum frontend_powerstate frontend_win32_get_powerstate(int *seconds, int *percent)
+{
+ SYSTEM_POWER_STATUS status;
+ enum frontend_powerstate ret = FRONTEND_POWERSTATE_NONE;
+
+ if (!GetSystemPowerStatus(&status))
+ return ret;
+
+ if (status.BatteryFlag == 0xFF)
+ ret = FRONTEND_POWERSTATE_NONE;
+ if (status.BatteryFlag & (1 << 7))
+ ret = FRONTEND_POWERSTATE_NO_SOURCE;
+ else if (status.BatteryFlag & (1 << 3))
+ ret = FRONTEND_POWERSTATE_CHARGING;
+ else if (status.ACLineStatus == 1)
+ ret = FRONTEND_POWERSTATE_CHARGED;
+ else
+ ret = FRONTEND_POWERSTATE_ON_POWER_SOURCE;
+
+ *percent = (int)status.BatteryLifePercent;
+ *seconds = (int)status.BatteryLifeTime;
+
+ return ret;
+}
+
+enum frontend_architecture frontend_win32_get_architecture(void)
+{
+ /* stub */
+ return FRONTEND_ARCH_NONE;
+}
+
const frontend_ctx_driver_t frontend_ctx_win32 = {
NULL, /* environment_get */
- frontend_win32_init, /* init */
+ frontend_win32_init,
NULL, /* deinit */
NULL, /* exitspawn */
NULL, /* process_args */
@@ -135,8 +219,10 @@ const frontend_ctx_driver_t frontend_ctx_win32 = {
NULL, /* set_fork */
NULL, /* shutdown */
NULL, /* get_name */
- frontend_win32_get_os, /* get_os */
+ frontend_win32_get_os,
NULL, /* get_rating */
NULL, /* load_content */
+ frontend_win32_get_architecture,
+ frontend_win32_get_powerstate,
"win32",
};
diff --git a/frontend/drivers/platform_xdk.c b/frontend/drivers/platform_xdk.c
index e8ecd06e8e..0cfa233006 100644
--- a/frontend/drivers/platform_xdk.c
+++ b/frontend/drivers/platform_xdk.c
@@ -367,18 +367,31 @@ static int frontend_xdk_get_rating(void)
#endif
}
+enum frontend_architecture frontend_xdk_get_architecture(void)
+{
+#if defined(_XBOX360)
+ return FRONTEND_ARCH_PPC;
+#elif defined(_XBOX1)
+ return FRONTEND_ARCH_X86;
+#else
+ return FRONTEND_ARCH_NONE;
+#endif
+}
+
const frontend_ctx_driver_t frontend_ctx_xdk = {
- frontend_xdk_get_environment_settings, /* get_environment_settings */
- frontend_xdk_init, /* init */
+ frontend_xdk_get_environment_settings,
+ frontend_xdk_init,
NULL, /* deinit */
- frontend_xdk_exitspawn, /* exitspawn */
+ frontend_xdk_exitspawn,
NULL, /* process_args */
- frontend_xdk_exec, /* exec */
- frontend_xdk_set_fork, /* set_fork */
+ frontend_xdk_exec,
+ frontend_xdk_set_fork,
NULL, /* shutdown */
NULL, /* get_name */
NULL, /* get_os */
- frontend_xdk_get_rating, /* get_rating */
+ frontend_xdk_get_rating,
NULL, /* load_content */
+ frontend_xdk_get_architecture,
+ NULL, /* get_powerstate */
"xdk",
};
diff --git a/frontend/frontend_driver.c b/frontend/frontend_driver.c
index c5538ce8c2..1733964533 100644
--- a/frontend/frontend_driver.c
+++ b/frontend/frontend_driver.c
@@ -35,12 +35,15 @@ static const frontend_ctx_driver_t *frontend_ctx_drivers[] = {
#if defined(__QNX__)
&frontend_ctx_qnx,
#endif
-#if defined(IOS) || defined(OSX)
+#if defined(__APPLE__)
&frontend_ctx_apple,
#endif
#if defined(ANDROID)
&frontend_ctx_android,
#endif
+#if defined(__linux__) && !defined(ANDROID)
+ &frontend_ctx_linux,
+#endif
#if defined(PSP)
&frontend_ctx_psp,
#endif
diff --git a/frontend/frontend_driver.h b/frontend/frontend_driver.h
index 96e7f6a5dc..df0ecef935 100644
--- a/frontend/frontend_driver.h
+++ b/frontend/frontend_driver.h
@@ -28,6 +28,26 @@
extern "C" {
#endif
+enum frontend_powerstate
+{
+ FRONTEND_POWERSTATE_NONE = 0,
+ FRONTEND_POWERSTATE_NO_SOURCE,
+ FRONTEND_POWERSTATE_CHARGING,
+ FRONTEND_POWERSTATE_CHARGED,
+ FRONTEND_POWERSTATE_ON_POWER_SOURCE,
+};
+
+enum frontend_architecture
+{
+ FRONTEND_ARCH_NONE = 0,
+ FRONTEND_ARCH_X86,
+ FRONTEND_ARCH_X86_64,
+ FRONTEND_ARCH_PPC,
+ FRONTEND_ARCH_ARM,
+ FRONTEND_ARCH_MIPS,
+ FRONTEND_ARCH_TILE,
+};
+
typedef void (*environment_get_t)(int *argc, char *argv[], void *args,
void *params_data);
typedef void (*process_args_t)(int *argc, char *argv[]);
@@ -47,6 +67,8 @@ typedef struct frontend_ctx_driver
void (*get_os)(char *, size_t, int *major, int *minor);
int (*get_rating)(void);
void (*content_loaded)(void);
+ enum frontend_architecture (*get_architecture)(void);
+ enum frontend_powerstate (*get_powerstate)(int *seconds, int *percent);
const char *ident;
@@ -59,6 +81,7 @@ extern const frontend_ctx_driver_t frontend_ctx_xdk;
extern const frontend_ctx_driver_t frontend_ctx_qnx;
extern const frontend_ctx_driver_t frontend_ctx_apple;
extern const frontend_ctx_driver_t frontend_ctx_android;
+extern const frontend_ctx_driver_t frontend_ctx_linux;
extern const frontend_ctx_driver_t frontend_ctx_psp;
extern const frontend_ctx_driver_t frontend_ctx_ctr;
extern const frontend_ctx_driver_t frontend_ctx_win32;
diff --git a/gfx/d3d/d3d.cpp b/gfx/d3d/d3d.cpp
index 60dea99791..24e515f7f4 100644
--- a/gfx/d3d/d3d.cpp
+++ b/gfx/d3d/d3d.cpp
@@ -759,7 +759,7 @@ static void *d3d_init(const video_info_t *info,
}
#endif
- vid = (d3d_video_t*)calloc(1, sizeof(*vid));
+ vid = new d3d_video_t();
if (!vid)
goto error;
@@ -800,7 +800,7 @@ static void *d3d_init(const video_info_t *info,
error:
if (vid)
- free(vid);
+ delete vid;
if (driver)
driver->video_context = NULL;
return NULL;
@@ -839,7 +839,7 @@ static void d3d_free(void *data)
#endif
if (d3d)
- free(d3d);
+ delete d3d;
#ifndef _XBOX
UnregisterClass("RetroArch", GetModuleHandle(NULL));
diff --git a/gfx/drivers/ctr_gfx.c b/gfx/drivers/ctr_gfx.c
index a92bc5a408..8aa241e751 100644
--- a/gfx/drivers/ctr_gfx.c
+++ b/gfx/drivers/ctr_gfx.c
@@ -228,28 +228,37 @@ static bool ctr_frame(void* data, const void* frame,
extern bool select_pressed;
- RARCH_PERFORMANCE_INIT(ctrframe_f);
- RARCH_PERFORMANCE_START(ctrframe_f);
-
if (!width || !height)
{
gspWaitForEvent(GSPEVENT_VBlank0, true);
- goto end;
+ return true;
}
if(!aptMainLoop())
{
event_command(EVENT_CMD_QUIT);
- goto end;
+ return true;
}
if (select_pressed)
{
event_command(EVENT_CMD_QUIT);
- goto end;
+ return true;
}
+ svcWaitSynchronization(gspEvents[GSPEVENT_P3D], 20000000);
+ svcClearEvent(gspEvents[GSPEVENT_P3D]);
+ svcWaitSynchronization(gspEvents[GSPEVENT_PPF], 20000000);
+ svcClearEvent(gspEvents[GSPEVENT_PPF]);
+
+ gfxSwapBuffersGpu();
frames++;
+
+ if (ctr->vsync)
+ svcWaitSynchronization(gspEvents[GSPEVENT_VBlank0], U64_MAX);
+
+ svcClearEvent(gspEvents[GSPEVENT_VBlank0]);
+
currentTick = svcGetSystemTick();
uint32_t diff = currentTick - lastTick;
if(diff > CTR_CPU_TICKS_PER_SECOND)
@@ -260,23 +269,10 @@ static bool ctr_frame(void* data, const void* frame,
}
printf("fps: %8.4f frames: %i\r", fps, total_frames++);
-// fflush(stdout);
+ fflush(stdout);
- /* enable this to profile the core without video output */
-#if 0
- if (!ctr->menu_texture_enable)
- goto end;
-#endif
-
- svcWaitSynchronization(gspEvents[GSPEVENT_P3D], 20000000);
- svcClearEvent(gspEvents[GSPEVENT_P3D]);
- svcWaitSynchronization(gspEvents[GSPEVENT_PPF], 20000000);
- svcClearEvent(gspEvents[GSPEVENT_PPF]);
-
- gfxSwapBuffersGpu();
-
- if (ctr->vsync)
- gspWaitForEvent(GSPEVENT_VBlank0, true);
+ RARCH_PERFORMANCE_INIT(ctrframe_f);
+ RARCH_PERFORMANCE_START(ctrframe_f);
ctrGuSetMemoryFill(true, (u32*)CTR_GPU_FRAMEBUFFER, 0x00000000,
(u32*)(CTR_GPU_FRAMEBUFFER + CTR_TOP_FRAMEBUFFER_WIDTH * CTR_TOP_FRAMEBUFFER_HEIGHT * sizeof(uint32_t)),
@@ -363,9 +359,6 @@ static bool ctr_frame(void* data, const void* frame,
ctrGuDisplayTransfer(true, CTR_GPU_FRAMEBUFFER, 240,400, CTRGU_RGBA8,
gfxGetFramebuffer(GFX_TOP, GFX_LEFT, NULL, NULL), 240,400,CTRGU_RGB8, CTRGU_MULTISAMPLE_NONE);
-
-end:
-// gspWaitForEvent(GSPEVENT_VBlank0, true);
RARCH_PERFORMANCE_STOP(ctrframe_f);
return true;
}
diff --git a/gfx/drivers/gl.c b/gfx/drivers/gl.c
index 0d3d92db88..4653c9e5d1 100644
--- a/gfx/drivers/gl.c
+++ b/gfx/drivers/gl.c
@@ -304,8 +304,8 @@ static void gl_disable_client_arrays(gl_t *gl)
#ifdef IOS
/* There is no default frame buffer on iOS. */
-void apple_bind_game_view_fbo(void);
-#define gl_bind_backbuffer() apple_bind_game_view_fbo()
+void cocoagl_bind_game_view_fbo(void);
+#define gl_bind_backbuffer() cocoagl_bind_game_view_fbo()
#else
#define gl_bind_backbuffer() glBindFramebuffer(RARCH_GL_FRAMEBUFFER, 0)
#endif
@@ -1197,7 +1197,7 @@ static void gl_init_textures(gl_t *gl, const video_info_t *video)
(void)texture_fmt;
#if defined(HAVE_EGL) && defined(HAVE_OPENGLES2)
- // Use regular textures if we use HW render.
+ /* Use regular textures if we use HW render. */
gl->egl_images = !gl->hw_render_use && gl_check_eglimage_proc() &&
gfx_ctx_image_buffer_init(gl, video);
#else
diff --git a/gfx/drivers_context/apple_cocoa_gl.m b/gfx/drivers_context/apple_cocoa_gl.m
index fcd621441d..57ae502035 100644
--- a/gfx/drivers_context/apple_cocoa_gl.m
+++ b/gfx/drivers_context/apple_cocoa_gl.m
@@ -109,7 +109,7 @@ void *glkitview_init(void)
}
#ifdef IOS
-void apple_bind_game_view_fbo(void)
+void cocoagl_bind_game_view_fbo(void)
{
if (g_context)
[g_view bindDrawable];
@@ -133,7 +133,7 @@ static RAScreen* get_chosen_screen(void)
#endif
}
-void apple_gfx_ctx_update(void)
+void cocoagl_gfx_ctx_update(void)
{
#ifdef OSX
#if MAC_OS_X_VERSION_10_7 && !defined(HAVE_NSOPENGL)
@@ -144,7 +144,7 @@ void apple_gfx_ctx_update(void)
#endif
}
-static bool apple_gfx_ctx_init(void *data)
+static bool cocoagl_gfx_ctx_init(void *data)
{
(void)data;
@@ -192,7 +192,7 @@ static bool apple_gfx_ctx_init(void *data)
return true;
}
-static void apple_gfx_ctx_destroy(void *data)
+static void cocoagl_gfx_ctx_destroy(void *data)
{
(void)data;
@@ -216,7 +216,7 @@ static void apple_gfx_ctx_destroy(void *data)
g_context = nil;
}
-static bool apple_gfx_ctx_bind_api(void *data, enum gfx_ctx_api api, unsigned major, unsigned minor)
+static bool cocoagl_gfx_ctx_bind_api(void *data, enum gfx_ctx_api api, unsigned major, unsigned minor)
{
(void)data;
#if defined(IOS)
@@ -233,7 +233,7 @@ static bool apple_gfx_ctx_bind_api(void *data, enum gfx_ctx_api api, unsigned ma
return true;
}
-static void apple_gfx_ctx_swap_interval(void *data, unsigned interval)
+static void cocoagl_gfx_ctx_swap_interval(void *data, unsigned interval)
{
(void)data;
#ifdef IOS // < No way to disable Vsync on iOS?
@@ -251,7 +251,7 @@ static void apple_gfx_ctx_swap_interval(void *data, unsigned interval)
#endif
}
-static bool apple_gfx_ctx_set_video_mode(void *data, unsigned width, unsigned height, bool fullscreen)
+static bool cocoagl_gfx_ctx_set_video_mode(void *data, unsigned width, unsigned height, bool fullscreen)
{
#ifdef OSX
RAGameView *g_view = (RAGameView*)nsview_get_ptr();
@@ -276,12 +276,12 @@ static bool apple_gfx_ctx_set_video_mode(void *data, unsigned width, unsigned he
(void)data;
- // TODO: Maybe iOS users should be apple to show/hide the status bar here?
+ // TODO: Maybe iOS users should be able to show/hide the status bar here?
return true;
}
-float apple_gfx_ctx_get_native_scale(void)
+float cocoagl_gfx_ctx_get_native_scale(void)
{
static float ret = 0.0f;
SEL selector = NSSelectorFromString(BOXSTRING("nativeScale"));
@@ -309,11 +309,11 @@ float apple_gfx_ctx_get_native_scale(void)
return ret;
}
-static void apple_gfx_ctx_get_video_size(void *data, unsigned* width, unsigned* height)
+static void cocoagl_gfx_ctx_get_video_size(void *data, unsigned* width, unsigned* height)
{
RAScreen *screen = (RAScreen*)get_chosen_screen();
CGRect size = screen.bounds;
- float screenscale = apple_gfx_ctx_get_native_scale();
+ float screenscale = cocoagl_gfx_ctx_get_native_scale();
#if defined(OSX)
RAGameView *g_view = (RAGameView*)nsview_get_ptr();
@@ -327,7 +327,7 @@ static void apple_gfx_ctx_get_video_size(void *data, unsigned* width, unsigned*
*height = CGRectGetHeight(size) * screenscale;
}
-static void apple_gfx_ctx_update_window_title(void *data)
+static void cocoagl_gfx_ctx_update_window_title(void *data)
{
static char buf[128], buf_fps[128];
bool got_text = video_monitor_get_fps(buf, sizeof(buf),
@@ -346,7 +346,7 @@ static void apple_gfx_ctx_update_window_title(void *data)
rarch_main_msg_queue_push(buf_fps, 1, 1, false);
}
-static bool apple_gfx_ctx_get_metrics(void *data, enum display_metric_types type,
+static bool cocoagl_gfx_ctx_get_metrics(void *data, enum display_metric_types type,
float *value)
{
#ifdef OSX
@@ -361,7 +361,7 @@ static bool apple_gfx_ctx_get_metrics(void *data, enum display_metric_types type
float physical_width = display_physical_size.width;
float physical_height = display_physical_size.height;
#elif defined(IOS)
- float scale = apple_gfx_ctx_get_native_scale();
+ float scale = cocoagl_gfx_ctx_get_native_scale();
CGRect screen_rect = [[UIScreen mainScreen] bounds];
float display_width = screen_rect.size.width;
@@ -393,7 +393,7 @@ static bool apple_gfx_ctx_get_metrics(void *data, enum display_metric_types type
return true;
}
-static bool apple_gfx_ctx_has_focus(void *data)
+static bool cocoagl_gfx_ctx_has_focus(void *data)
{
(void)data;
#ifdef IOS
@@ -403,7 +403,7 @@ static bool apple_gfx_ctx_has_focus(void *data)
#endif
}
-static bool apple_gfx_ctx_suppress_screensaver(void *data, bool enable)
+static bool cocoagl_gfx_ctx_suppress_screensaver(void *data, bool enable)
{
(void)data;
(void)enable;
@@ -411,7 +411,7 @@ static bool apple_gfx_ctx_suppress_screensaver(void *data, bool enable)
return false;
}
-static bool apple_gfx_ctx_has_windowed(void *data)
+static bool cocoagl_gfx_ctx_has_windowed(void *data)
{
(void)data;
@@ -422,24 +422,27 @@ static bool apple_gfx_ctx_has_windowed(void *data)
#endif
}
-static void apple_gfx_ctx_swap_buffers(void *data)
+static void cocoagl_gfx_ctx_swap_buffers(void *data)
{
if (!(--g_fast_forward_skips < 0))
return;
-#ifdef OSX
+#if defined(OSX)
#ifdef HAVE_NSOPENGL
[g_context flushBuffer];
#else
if (g_context.CGLContextObj)
CGLFlushDrawable(g_context.CGLContextObj);
#endif
+#elif defined(IOS)
+ if (g_view)
+ [g_view display];
#endif
g_fast_forward_skips = g_is_syncing ? 0 : 3;
}
-static gfx_ctx_proc_t apple_gfx_ctx_get_proc_address(const char *symbol_name)
+static gfx_ctx_proc_t cocoagl_gfx_ctx_get_proc_address(const char *symbol_name)
{
return (gfx_ctx_proc_t)CFBundleGetFunctionPointerForName(CFBundleGetBundleWithIdentifier(GLFrameworkID),
(
@@ -452,7 +455,7 @@ CFStringRef)BOXSTRING(symbol_name)
);
}
-static void apple_gfx_ctx_check_window(void *data, bool *quit,
+static void cocoagl_gfx_ctx_check_window(void *data, bool *quit,
bool *resize, unsigned *width, unsigned *height, unsigned frame_count)
{
unsigned new_width, new_height;
@@ -460,7 +463,7 @@ static void apple_gfx_ctx_check_window(void *data, bool *quit,
*quit = false;
- apple_gfx_ctx_get_video_size(data, &new_width, &new_height);
+ cocoagl_gfx_ctx_get_video_size(data, &new_width, &new_height);
if (new_width != *width || new_height != *height)
{
*width = new_width;
@@ -469,21 +472,21 @@ static void apple_gfx_ctx_check_window(void *data, bool *quit,
}
}
-static void apple_gfx_ctx_set_resize(void *data, unsigned width, unsigned height)
+static void cocoagl_gfx_ctx_set_resize(void *data, unsigned width, unsigned height)
{
(void)data;
(void)width;
(void)height;
}
-static void apple_gfx_ctx_input_driver(void *data, const input_driver_t **input, void **input_data)
+static void cocoagl_gfx_ctx_input_driver(void *data, const input_driver_t **input, void **input_data)
{
(void)data;
*input = NULL;
*input_data = NULL;
}
-static void apple_gfx_ctx_bind_hw_render(void *data, bool enable)
+static void cocoagl_gfx_ctx_bind_hw_render(void *data, bool enable)
{
(void)data;
g_use_hw_ctx = enable;
@@ -494,30 +497,30 @@ static void apple_gfx_ctx_bind_hw_render(void *data, bool enable)
[g_context makeCurrentContext];
}
-const gfx_ctx_driver_t gfx_ctx_apple = {
- apple_gfx_ctx_init,
- apple_gfx_ctx_destroy,
- apple_gfx_ctx_bind_api,
- apple_gfx_ctx_swap_interval,
- apple_gfx_ctx_set_video_mode,
- apple_gfx_ctx_get_video_size,
+const gfx_ctx_driver_t gfx_ctx_cocoagl = {
+ cocoagl_gfx_ctx_init,
+ cocoagl_gfx_ctx_destroy,
+ cocoagl_gfx_ctx_bind_api,
+ cocoagl_gfx_ctx_swap_interval,
+ cocoagl_gfx_ctx_set_video_mode,
+ cocoagl_gfx_ctx_get_video_size,
NULL, /* get_video_output_size */
NULL, /* get_video_output_prev */
NULL, /* get_video_output_next */
- apple_gfx_ctx_get_metrics,
+ cocoagl_gfx_ctx_get_metrics,
NULL,
- apple_gfx_ctx_update_window_title,
- apple_gfx_ctx_check_window,
- apple_gfx_ctx_set_resize,
- apple_gfx_ctx_has_focus,
- apple_gfx_ctx_suppress_screensaver,
- apple_gfx_ctx_has_windowed,
- apple_gfx_ctx_swap_buffers,
- apple_gfx_ctx_input_driver,
- apple_gfx_ctx_get_proc_address,
+ cocoagl_gfx_ctx_update_window_title,
+ cocoagl_gfx_ctx_check_window,
+ cocoagl_gfx_ctx_set_resize,
+ cocoagl_gfx_ctx_has_focus,
+ cocoagl_gfx_ctx_suppress_screensaver,
+ cocoagl_gfx_ctx_has_windowed,
+ cocoagl_gfx_ctx_swap_buffers,
+ cocoagl_gfx_ctx_input_driver,
+ cocoagl_gfx_ctx_get_proc_address,
NULL,
NULL,
NULL,
- "apple",
- apple_gfx_ctx_bind_hw_render,
+ "cocoagl",
+ cocoagl_gfx_ctx_bind_hw_render,
};
diff --git a/gfx/drivers_context/drm_egl_ctx.c b/gfx/drivers_context/drm_egl_ctx.c
index fb6c4011a3..5ec08db509 100644
--- a/gfx/drivers_context/drm_egl_ctx.c
+++ b/gfx/drivers_context/drm_egl_ctx.c
@@ -933,7 +933,7 @@ static bool gfx_ctx_drm_egl_bind_api(void *data,
case GFX_CTX_OPENVG_API:
return eglBindAPI(EGL_OPENVG_API);
default:
- return false;
+ break;
}
return false;
diff --git a/gfx/drivers_context/emscriptenegl_ctx.c b/gfx/drivers_context/emscriptenegl_ctx.c
index 5534376ee3..0ae0d6e3ef 100644
--- a/gfx/drivers_context/emscriptenegl_ctx.c
+++ b/gfx/drivers_context/emscriptenegl_ctx.c
@@ -200,8 +200,10 @@ static bool gfx_ctx_emscripten_bind_api(void *data,
case GFX_CTX_OPENGL_ES_API:
return eglBindAPI(EGL_OPENGL_ES_API);
default:
- return false;
+ break;
}
+
+ return false;
}
static void gfx_ctx_emscripten_destroy(void *data)
diff --git a/gfx/drivers_context/glx_ctx.c b/gfx/drivers_context/glx_ctx.c
index 9de508fbf3..93899e7e9a 100644
--- a/gfx/drivers_context/glx_ctx.c
+++ b/gfx/drivers_context/glx_ctx.c
@@ -22,8 +22,6 @@
#include
#include
-#include
-#include
#include
static int (*g_pglSwapInterval)(int);
diff --git a/gfx/drivers_context/vc_egl_ctx.c b/gfx/drivers_context/vc_egl_ctx.c
index 38a3996e2e..238d72b9b1 100644
--- a/gfx/drivers_context/vc_egl_ctx.c
+++ b/gfx/drivers_context/vc_egl_ctx.c
@@ -368,8 +368,10 @@ static bool gfx_ctx_vc_bind_api(void *data,
case GFX_CTX_OPENVG_API:
return eglBindAPI(EGL_OPENVG_API);
default:
- return false;
+ break;
}
+
+ return false;
}
static void gfx_ctx_vc_destroy(void *data)
diff --git a/gfx/drivers_context/wayland_ctx.c b/gfx/drivers_context/wayland_ctx.c
index b268846caa..20d4b1b451 100644
--- a/gfx/drivers_context/wayland_ctx.c
+++ b/gfx/drivers_context/wayland_ctx.c
@@ -721,8 +721,10 @@ static bool gfx_ctx_wl_bind_api(void *data,
case GFX_CTX_OPENVG_API:
return eglBindAPI(EGL_OPENVG_API);
default:
- return false;
+ break;
}
+
+ return false;
}
static void gfx_ctx_wl_bind_hw_render(void *data, bool enable)
diff --git a/gfx/drivers_context/xegl_ctx.c b/gfx/drivers_context/xegl_ctx.c
index b3153b270a..0f56588182 100644
--- a/gfx/drivers_context/xegl_ctx.c
+++ b/gfx/drivers_context/xegl_ctx.c
@@ -28,8 +28,6 @@
#include
#include
#include
-#include
-#include
#ifndef EGL_OPENGL_ES3_BIT_KHR
#define EGL_OPENGL_ES3_BIT_KHR 0x0040
@@ -783,8 +781,10 @@ static bool gfx_ctx_xegl_bind_api(void *data,
case GFX_CTX_OPENVG_API:
return eglBindAPI(EGL_OPENVG_API);
default:
- return false;
+ break;
}
+
+ return false;
}
static void gfx_ctx_xegl_show_mouse(void *data, bool state)
diff --git a/gfx/font_renderer_driver.c b/gfx/font_renderer_driver.c
index 78bc700703..f65f76e18a 100644
--- a/gfx/font_renderer_driver.c
+++ b/gfx/font_renderer_driver.c
@@ -25,7 +25,7 @@ static const font_renderer_driver_t *font_backends[] = {
#ifdef HAVE_FREETYPE
&freetype_font_renderer,
#endif
-#ifdef __APPLE__
+#if defined(__APPLE__) && defined(HAVE_CORETEXT)
&coretext_font_renderer,
#endif
&bitmap_font_renderer,
diff --git a/gfx/image/image.c b/gfx/image/image.c
index 18b9402122..08b2ad9cb3 100644
--- a/gfx/image/image.c
+++ b/gfx/image/image.c
@@ -19,7 +19,9 @@
#endif
#include
+#ifdef HAVE_RPNG
#include
+#endif
#include
#ifdef _XBOX1
#include "../d3d/d3d_wrapper.h"
@@ -46,7 +48,7 @@
#endif
-#ifdef HAVE_ZLIB
+#ifdef HAVE_RPNG
static bool rpng_image_load_argb_shift(const char *path,
struct texture_image *out_img,
unsigned a_shift, unsigned r_shift,
@@ -397,13 +399,12 @@ bool texture_image_load(struct texture_image *out_img, const char *path)
if (buf)
free(buf);
}
-#ifdef HAVE_ZLIB
+#ifdef HAVE_RPNG
else if (strstr(path, ".png"))
{
ret = rpng_image_load_argb_shift(path, out_img,
a_shift, r_shift, g_shift, b_shift);
}
-#endif
#ifdef GEKKO
if (ret)
@@ -416,6 +417,9 @@ bool texture_image_load(struct texture_image *out_img, const char *path)
}
#endif
+#endif
+
+
return ret;
}
#endif
diff --git a/gfx/video_context_driver.c b/gfx/video_context_driver.c
index 02369ddcd9..c3f8998556 100644
--- a/gfx/video_context_driver.c
+++ b/gfx/video_context_driver.c
@@ -59,9 +59,8 @@ static const gfx_ctx_driver_t *gfx_ctx_drivers[] = {
#if defined(__QNX__)
&gfx_ctx_bbqnx,
#endif
-#if defined(IOS) || defined(OSX)
- /* Don't use __APPLE__ as it breaks basic SDL builds. */
- &gfx_ctx_apple,
+#if defined(HAVE_COCOA) || defined(HAVE_COCOATOUCH)
+ &gfx_ctx_cocoagl,
#endif
#if (defined(HAVE_SDL) || defined(HAVE_SDL2)) && defined(HAVE_OPENGL)
&gfx_ctx_sdl_gl,
@@ -91,6 +90,15 @@ void gfx_ctx_free(void *data)
ctx = NULL;
}
+const char *gfx_ctx_get_ident(void)
+{
+ const gfx_ctx_driver_t *ctx = gfx_ctx_get_ptr();
+
+ if (!ctx)
+ return NULL;
+ return ctx->ident;
+}
+
void gfx_ctx_update_window_title(void *data)
{
const gfx_ctx_driver_t *ctx = gfx_ctx_get_ptr();
@@ -174,6 +182,8 @@ bool gfx_ctx_get_metrics(enum display_metric_types type, float *value)
const gfx_ctx_driver_t *ctx = gfx_ctx_get_ptr();
if (!ctx || !driver)
return false;
+ if (!ctx->get_metrics)
+ return false;
return ctx->get_metrics(driver->video_context_data, type,
value);
}
diff --git a/gfx/video_context_driver.h b/gfx/video_context_driver.h
index 8b3995f508..2dab64fca5 100644
--- a/gfx/video_context_driver.h
+++ b/gfx/video_context_driver.h
@@ -163,7 +163,7 @@ extern const gfx_ctx_driver_t gfx_ctx_ps3;
extern const gfx_ctx_driver_t gfx_ctx_wgl;
extern const gfx_ctx_driver_t gfx_ctx_videocore;
extern const gfx_ctx_driver_t gfx_ctx_bbqnx;
-extern const gfx_ctx_driver_t gfx_ctx_apple;
+extern const gfx_ctx_driver_t gfx_ctx_cocoagl;
extern const gfx_ctx_driver_t gfx_ctx_emscripten;
extern const gfx_ctx_driver_t gfx_ctx_null;
@@ -243,6 +243,8 @@ void gfx_ctx_get_video_output_prev(void *data);
void gfx_ctx_get_video_output_next(void *data);
+const char *gfx_ctx_get_ident(void);
+
void gfx_ctx_free(void *data);
void gfx_ctx_input_driver(void *data,
diff --git a/griffin/griffin.c b/griffin/griffin.c
index db43a6e9df..01fe51289a 100644
--- a/griffin/griffin.c
+++ b/griffin/griffin.c
@@ -116,13 +116,7 @@ VIDEO CONTEXT
#if defined(HAVE_VIDEOCORE)
#include "../gfx/drivers_context/vc_egl_ctx.c"
#endif
-#if defined(HAVE_X11) && !defined(HAVE_OPENGLES)
-#include "../gfx/drivers_context/glx_ctx.c"
-#endif
-#if defined(HAVE_EGL)
-#include "../gfx/drivers_context/xegl_ctx.c"
-#endif
#if defined(_WIN32) && !defined(_XBOX)
#include "../gfx/drivers_context/wgl_ctx.c"
@@ -131,8 +125,17 @@ VIDEO CONTEXT
#endif
-#ifdef HAVE_X11
+#if defined(HAVE_X11)
#include "../gfx/common/x11_common.c"
+
+#ifndef HAVE_OPENGLES
+#include "../gfx/drivers_context/glx_ctx.c"
+#endif
+
+#ifdef HAVE_EGL
+#include "../gfx/drivers_context/xegl_ctx.c"
+#endif
+
#endif
@@ -170,10 +173,13 @@ VIDEO IMAGE
#include "../gfx/video_texture.c"
#include "../libretro-common/formats/tga/tga_decode.c"
+
+#ifdef HAVE_RPNG
#include "../libretro-common/formats/png/rpng_fbio.c"
#include "../libretro-common/formats/png/rpng_nbio.c"
#include "../libretro-common/formats/png/rpng_decode.c"
#include "../libretro-common/formats/png/rpng_encode.c"
+#endif
/*============================================================
VIDEO DRIVER
@@ -244,7 +250,7 @@ FONTS
#include "../gfx/drivers_font_renderer/freetype.c"
#endif
-#if defined(__APPLE__)
+#if defined(__APPLE__) && defined(HAVE_CORETEXT)
#include "../gfx/drivers_font_renderer/coretext.c"
#endif
@@ -311,8 +317,8 @@ INPUT
#elif defined(ANDROID)
#include "../input/drivers/android_input.c"
#include "../input/drivers_joypad/android_joypad.c"
-#elif defined(__APPLE__)
-#include "../input/drivers/apple_input.c"
+#elif defined(HAVE_COCOA) || defined(HAVE_COCOATOUCH)
+#include "../input/drivers/cocoa_input.c"
#elif defined(__QNX__)
#include "../input/drivers/qnx_input.c"
#include "../input/drivers_joypad/qnx_joypad.c"
@@ -359,7 +365,7 @@ INPUT (HID)
#if defined(__APPLE__) && defined(IOS)
#include "../input/drivers_hid/btstack_hid.c"
-#elif defined(__APPLE__) && !defined(IOS)
+#elif defined(__APPLE__) && defined(HAVE_IOHIDMANAGER)
#include "../input/drivers_hid/apple_hid.c"
#endif
@@ -603,10 +609,12 @@ FRONTEND
#include "../frontend/drivers/platform_ctr.c"
#elif defined(__QNX__)
#include "../frontend/drivers/platform_qnx.c"
-#elif defined(OSX) || defined(IOS)
+#elif defined(__APPLE__)
#include "../frontend/drivers/platform_apple.c"
#elif defined(ANDROID)
#include "../frontend/drivers/platform_android.c"
+#elif defined(__linux__) && !defined(ANDROID)
+#include "../frontend/drivers/platform_linux.c"
#endif
#include "../frontend/drivers/platform_null.c"
@@ -632,6 +640,14 @@ MAIN
#include "../frontend/frontend.c"
#endif
+/*============================================================
+GIT
+============================================================ */
+
+#ifdef HAVE_GIT_VERSION
+#include "../git_version.c"
+#endif
+
/*============================================================
RETROARCH
============================================================ */
@@ -645,6 +661,7 @@ RECORDING
============================================================ */
#include "../movie.c"
#include "../record/record_driver.c"
+#include "../record/drivers/record_null.c"
/*============================================================
THREAD
@@ -817,6 +834,7 @@ XML
#include "../database_info.c"
#endif
+
#ifdef __cplusplus
}
#endif
diff --git a/griffin/griffin_objc.m b/griffin/griffin_objc.m
index b0fe28c0ff..6dc595db5a 100644
--- a/griffin/griffin_objc.m
+++ b/griffin/griffin_objc.m
@@ -23,19 +23,27 @@
#define __IPHONE_OS_VERSION_MAX_ALLOWED 00000
#endif
+#if defined(HAVE_COCOATOUCH) || defined(HAVE_COCOA)
#include "../gfx/drivers_context/apple_cocoa_gl.m"
#include "../apple/common/apple_cocoa_common.m"
+#if defined(HAVE_COCOATOUCH)
+
#if TARGET_OS_IPHONE
-#include "../apple/iOS/platform.m"
#include "../apple/iOS/menu.m"
#include "../apple/iOS/browser.m"
+#include "../apple/iOS/platform.m"
#include "../ui/drivers/ui_cocoatouch.m"
-#else
+#endif
+
+#elif defined(HAVE_COCOA)
+
#include "../apple/OSX/platform.m"
#include "../apple/OSX/settings.m"
#endif
+#endif
+
#ifdef HAVE_MFI
#include "../input/drivers_hid/mfi_hid.m"
#endif
diff --git a/input/drivers/apple_input.c b/input/drivers/cocoa_input.c
similarity index 78%
rename from input/drivers/apple_input.c
rename to input/drivers/cocoa_input.c
index f405ced392..4a2c4cc1f7 100644
--- a/input/drivers/apple_input.c
+++ b/input/drivers/cocoa_input.c
@@ -20,7 +20,7 @@
#include "../input_common.h"
#include "../input_joypad.h"
#include "../input_keymaps.h"
-#include "apple_input.h"
+#include "cocoa_input.h"
#include "../../general.h"
#include "../../driver.h"
@@ -125,18 +125,18 @@ const struct apple_key_name_map_entry apple_key_name_map[] =
{ "nul", 0x00},
};
-void apple_input_enable_small_keyboard(bool on)
+void cocoa_input_enable_small_keyboard(bool on)
{
driver_t *driver = driver_get_ptr();
- apple_input_data_t *apple = (apple_input_data_t*)driver->input_data;
+ cocoa_input_data_t *apple = (cocoa_input_data_t*)driver->input_data;
if (apple)
apple->small_keyboard_enabled = on;
}
-void apple_input_enable_icade(bool on)
+void cocoa_input_enable_icade(bool on)
{
driver_t *driver = driver_get_ptr();
- apple_input_data_t *apple = (apple_input_data_t*)driver->input_data;
+ cocoa_input_data_t *apple = (cocoa_input_data_t*)driver->input_data;
if (!apple)
return;
@@ -145,20 +145,20 @@ void apple_input_enable_icade(bool on)
apple->icade_buttons = 0;
}
-void apple_input_reset_icade_buttons(void)
+void cocoa_input_reset_icade_buttons(void)
{
driver_t *driver = driver_get_ptr();
- apple_input_data_t *apple = (apple_input_data_t*)driver->input_data;
+ cocoa_input_data_t *apple = (cocoa_input_data_t*)driver->input_data;
if (apple)
apple->icade_buttons = 0;
}
-int32_t apple_input_find_any_key(void)
+int32_t cocoa_input_find_any_key(void)
{
unsigned i;
driver_t *driver =driver_get_ptr();
- apple_input_data_t *apple = (apple_input_data_t*)driver->input_data;
+ cocoa_input_data_t *apple = (cocoa_input_data_t*)driver->input_data;
if (!apple)
return 0;
@@ -173,11 +173,11 @@ int32_t apple_input_find_any_key(void)
return 0;
}
-int32_t apple_input_find_any_button(uint32_t port)
+int32_t cocoa_input_find_any_button(uint32_t port)
{
unsigned i, buttons = 0;
driver_t *driver = driver_get_ptr();
- apple_input_data_t *apple = (apple_input_data_t*)driver->input_data;
+ cocoa_input_data_t *apple = (cocoa_input_data_t*)driver->input_data;
if (!apple)
return -1;
@@ -197,11 +197,11 @@ int32_t apple_input_find_any_button(uint32_t port)
return -1;
}
-int32_t apple_input_find_any_axis(uint32_t port)
+int32_t cocoa_input_find_any_axis(uint32_t port)
{
int i;
driver_t *driver = driver_get_ptr();
- apple_input_data_t *apple = (apple_input_data_t*)driver->input_data;
+ cocoa_input_data_t *apple = (cocoa_input_data_t*)driver->input_data;
if (apple && apple->joypad)
apple->joypad->poll();
@@ -217,7 +217,7 @@ int32_t apple_input_find_any_axis(uint32_t port)
return 0;
}
-static int16_t apple_input_is_pressed(apple_input_data_t *apple, unsigned port_num,
+static int16_t cocoa_input_is_pressed(cocoa_input_data_t *apple, unsigned port_num,
const struct retro_keybind *binds, unsigned id)
{
if (id < RARCH_BIND_LIST_END)
@@ -229,10 +229,10 @@ static int16_t apple_input_is_pressed(apple_input_data_t *apple, unsigned port_n
return 0;
}
-static void *apple_input_init(void)
+static void *cocoa_input_init(void)
{
settings_t *settings = config_get_ptr();
- apple_input_data_t *apple = (apple_input_data_t*)calloc(1, sizeof(*apple));
+ cocoa_input_data_t *apple = (cocoa_input_data_t*)calloc(1, sizeof(*apple));
if (!apple)
return NULL;
@@ -243,10 +243,10 @@ static void *apple_input_init(void)
return apple;
}
-static void apple_input_poll(void *data)
+static void cocoa_input_poll(void *data)
{
uint32_t i;
- apple_input_data_t *apple = (apple_input_data_t*)data;
+ cocoa_input_data_t *apple = (cocoa_input_data_t*)data;
if (!apple)
return;
@@ -267,7 +267,7 @@ static void apple_input_poll(void *data)
BIT32_SET(apple->buttons[0], apple->icade_buttons);
}
-static int16_t apple_mouse_state(apple_input_data_t *apple,
+static int16_t cocoa_mouse_state(cocoa_input_data_t *apple,
unsigned id)
{
switch (id)
@@ -289,7 +289,7 @@ static int16_t apple_mouse_state(apple_input_data_t *apple,
return 0;
}
-static int16_t apple_pointer_state(apple_input_data_t *apple,
+static int16_t cocoa_pointer_state(cocoa_input_data_t *apple,
unsigned device, unsigned idx, unsigned id)
{
const bool want_full = (device == RARCH_DEVICE_POINTER_SCREEN);
@@ -297,7 +297,7 @@ static int16_t apple_pointer_state(apple_input_data_t *apple,
if (idx < apple->touch_count && (idx < MAX_TOUCHES))
{
int16_t x, y;
- const apple_touch_data_t *touch = (const apple_touch_data_t *)
+ const cocoa_touch_data_t *touch = (const cocoa_touch_data_t *)
&apple->touches[idx];
if (!touch)
@@ -326,17 +326,17 @@ static int16_t apple_pointer_state(apple_input_data_t *apple,
return 0;
}
-static int16_t apple_keyboard_state(apple_input_data_t *apple, unsigned id)
+static int16_t cocoa_keyboard_state(cocoa_input_data_t *apple, unsigned id)
{
unsigned bit = input_keymaps_translate_rk_to_keysym((enum retro_key)id);
return (id < RETROK_LAST) && apple->key_state[bit];
}
-static int16_t apple_input_state(void *data,
+static int16_t cocoa_input_state(void *data,
const struct retro_keybind **binds, unsigned port,
unsigned device, unsigned idx, unsigned id)
{
- apple_input_data_t *apple = (apple_input_data_t*)data;
+ cocoa_input_data_t *apple = (cocoa_input_data_t*)data;
if (!apple || !apple->joypad)
return 0;
@@ -344,36 +344,36 @@ static int16_t apple_input_state(void *data,
switch (device)
{
case RETRO_DEVICE_JOYPAD:
- return apple_input_is_pressed(apple, port, binds[port], id) ||
+ return cocoa_input_is_pressed(apple, port, binds[port], id) ||
input_joypad_pressed(apple->joypad, port, binds[port], id);
case RETRO_DEVICE_ANALOG:
return input_joypad_analog(apple->joypad, port,
idx, id, binds[port]);
case RETRO_DEVICE_KEYBOARD:
- return apple_keyboard_state(apple, id);
+ return cocoa_keyboard_state(apple, id);
case RETRO_DEVICE_MOUSE:
- return apple_mouse_state(apple, id);
+ return cocoa_mouse_state(apple, id);
case RETRO_DEVICE_POINTER:
case RARCH_DEVICE_POINTER_SCREEN:
- return apple_pointer_state(apple, device, idx, id);
+ return cocoa_pointer_state(apple, device, idx, id);
}
return 0;
}
-static bool apple_input_bind_button_pressed(void *data, int key)
+static bool cocoa_input_bind_button_pressed(void *data, int key)
{
- apple_input_data_t *apple = (apple_input_data_t*)data;
+ cocoa_input_data_t *apple = (cocoa_input_data_t*)data;
settings_t *settings = config_get_ptr();
if (apple && apple->joypad)
- return apple_input_is_pressed(apple, 0, settings->input.binds[0], key) ||
+ return cocoa_input_is_pressed(apple, 0, settings->input.binds[0], key) ||
input_joypad_pressed(apple->joypad, 0, settings->input.binds[0], key);
return false;
}
-static void apple_input_free(void *data)
+static void cocoa_input_free(void *data)
{
- apple_input_data_t *apple = (apple_input_data_t*)data;
+ cocoa_input_data_t *apple = (cocoa_input_data_t*)data;
if (!apple || !data)
return;
@@ -384,10 +384,10 @@ static void apple_input_free(void *data)
free(apple);
}
-static bool apple_input_set_rumble(void *data,
+static bool cocoa_input_set_rumble(void *data,
unsigned port, enum retro_rumble_effect effect, uint16_t strength)
{
- apple_input_data_t *apple = (apple_input_data_t*)data;
+ cocoa_input_data_t *apple = (cocoa_input_data_t*)data;
if (apple && apple->joypad)
return input_joypad_set_rumble(apple->joypad,
@@ -395,7 +395,7 @@ static bool apple_input_set_rumble(void *data,
return false;
}
-static uint64_t apple_input_get_capabilities(void *data)
+static uint64_t cocoa_input_get_capabilities(void *data)
{
(void)data;
@@ -407,33 +407,33 @@ static uint64_t apple_input_get_capabilities(void *data)
(1 << RETRO_DEVICE_ANALOG);
}
-static void apple_input_grab_mouse(void *data, bool state)
+static void cocoa_input_grab_mouse(void *data, bool state)
{
/* Dummy for now. Might be useful in the future. */
(void)data;
(void)state;
}
-static const input_device_driver_t *apple_input_get_joypad_driver(void *data)
+static const input_device_driver_t *cocoa_input_get_joypad_driver(void *data)
{
- apple_input_data_t *apple = (apple_input_data_t*)data;
+ cocoa_input_data_t *apple = (cocoa_input_data_t*)data;
if (apple && apple->joypad)
return apple->joypad;
return NULL;
}
-input_driver_t input_apple = {
- apple_input_init,
- apple_input_poll,
- apple_input_state,
- apple_input_bind_button_pressed,
- apple_input_free,
+input_driver_t input_cocoa = {
+ cocoa_input_init,
+ cocoa_input_poll,
+ cocoa_input_state,
+ cocoa_input_bind_button_pressed,
+ cocoa_input_free,
NULL,
NULL,
- apple_input_get_capabilities,
- "apple_input",
- apple_input_grab_mouse,
- apple_input_set_rumble,
- apple_input_get_joypad_driver
+ cocoa_input_get_capabilities,
+ "cocoa",
+ cocoa_input_grab_mouse,
+ cocoa_input_set_rumble,
+ cocoa_input_get_joypad_driver
};
diff --git a/input/drivers/apple_input.h b/input/drivers/cocoa_input.h
similarity index 75%
rename from input/drivers/apple_input.h
rename to input/drivers/cocoa_input.h
index 702cb99817..911dfd86c5 100644
--- a/input/drivers/apple_input.h
+++ b/input/drivers/cocoa_input.h
@@ -14,8 +14,8 @@
* If not, see .
*/
-#ifndef __APPLE_RARCH_INPUT_H__
-#define __APPLE_RARCH_INPUT_H__
+#ifndef __COCOA_INPUT_H__
+#define __COCOA_INPUT_H__
#include
#include "../../general.h"
@@ -33,11 +33,11 @@ typedef struct
int16_t screen_x, screen_y;
int16_t fixed_x, fixed_y;
int16_t full_x, full_y;
-} apple_touch_data_t;
+} cocoa_touch_data_t;
typedef struct
{
- apple_touch_data_t touches[MAX_TOUCHES];
+ cocoa_touch_data_t touches[MAX_TOUCHES];
uint32_t touch_count;
uint32_t mouse_buttons;
@@ -58,21 +58,21 @@ typedef struct
uint32_t icade_buttons;
const input_device_driver_t *joypad;
-} apple_input_data_t;
+} cocoa_input_data_t;
-void apple_input_enable_icade(bool on);
+void cocoa_input_enable_icade(bool on);
-void apple_input_enable_small_keyboard(bool on);
+void cocoa_input_enable_small_keyboard(bool on);
-void apple_input_reset_icade_buttons(void);
+void cocoa_input_reset_icade_buttons(void);
-void apple_input_keyboard_event(bool down, unsigned code,
+void cocoa_input_keyboard_event(bool down, unsigned code,
uint32_t character, uint32_t mod, unsigned device);
-extern int32_t apple_input_find_any_key(void);
+extern int32_t cocoa_input_find_any_key(void);
-extern int32_t apple_input_find_any_button(uint32_t port);
+extern int32_t cocoa_input_find_any_button(uint32_t port);
-extern int32_t apple_input_find_any_axis(uint32_t port);
+extern int32_t cocoa_input_find_any_axis(uint32_t port);
#endif
diff --git a/input/drivers/dinput.c b/input/drivers/dinput.c
index e508b11aff..f1a9b8d41a 100644
--- a/input/drivers/dinput.c
+++ b/input/drivers/dinput.c
@@ -655,7 +655,7 @@ static const input_device_driver_t *dinput_get_joypad_driver(void *data)
{
struct dinput_input *di = (struct dinput_input*)data;
if (!di)
- return false;
+ return NULL;
return di->joypad;
}
diff --git a/input/drivers_hid/apple_hid.c b/input/drivers_hid/apple_hid.c
index 219ee8535c..6291b8f382 100644
--- a/input/drivers_hid/apple_hid.c
+++ b/input/drivers_hid/apple_hid.c
@@ -17,7 +17,7 @@
#include
#include
#include "../connect/joypad_connection.h"
-#include "../drivers/apple_input.h"
+#include "../drivers/cocoa_input.h"
#include "../input_hid_driver.h"
typedef struct apple_hid
@@ -139,7 +139,7 @@ static void apple_hid_device_input_callback(void *data, IOReturn result,
void* sender, IOHIDValueRef value)
{
driver_t *driver = driver_get_ptr();
- apple_input_data_t *apple = (apple_input_data_t*)driver->input_data;
+ cocoa_input_data_t *apple = (cocoa_input_data_t*)driver->input_data;
struct apple_hid_adapter *adapter = (struct apple_hid_adapter*)data;
IOHIDElementRef element = IOHIDValueGetElement(value);
uint32_t type = IOHIDElementGetType(element);
@@ -210,7 +210,7 @@ static void apple_hid_device_input_callback(void *data, IOReturn result,
static void apple_hid_device_remove(void *data, IOReturn result, void* sender)
{
driver_t *driver = driver_get_ptr();
- apple_input_data_t *apple = (apple_input_data_t*)driver->input_data;
+ cocoa_input_data_t *apple = (cocoa_input_data_t*)driver->input_data;
struct apple_hid_adapter *adapter = (struct apple_hid_adapter*)data;
apple_hid_t *hid = driver ? (apple_hid_t*)driver->hid_data : NULL;
diff --git a/input/drivers_hid/libusb_hid.c b/input/drivers_hid/libusb_hid.c
index 33fad45cad..6cb99542a7 100644
--- a/input/drivers_hid/libusb_hid.c
+++ b/input/drivers_hid/libusb_hid.c
@@ -188,6 +188,7 @@ static int add_adapter(void *data, struct libusb_device *dev)
if (!adapter || !hid)
{
+ free(adapter);
fprintf(stderr, "Allocation of adapter failed.\n");
return -1;
}
diff --git a/input/drivers_hid/mfi_hid.m b/input/drivers_hid/mfi_hid.m
index 94a8282e56..255b1eff7c 100644
--- a/input/drivers_hid/mfi_hid.m
+++ b/input/drivers_hid/mfi_hid.m
@@ -17,7 +17,7 @@
#import
#include
#include "mfi_hid.h"
-#include "../../input/drivers/apple_input.h"
+#include "../../input/drivers/cocoa_input.h"
enum
{
@@ -44,7 +44,7 @@ static void apple_gamecontroller_poll(GCController *controller)
{
uint32_t slot, pause;
driver_t *driver = driver_get_ptr();
- apple_input_data_t *apple = (apple_input_data_t*)driver->input_data;
+ cocoa_input_data_t *apple = (cocoa_input_data_t*)driver->input_data;
if (!apple || !controller || controller.playerIndex == MAX_USERS)
return;
@@ -105,7 +105,7 @@ void apple_gamecontroller_poll_all(void)
static void apple_gamecontroller_register(GCGamepad *gamepad)
{
driver_t *driver = driver_get_ptr();
- apple_input_data_t *apple = (apple_input_data_t*)driver->input_data;
+ cocoa_input_data_t *apple = (cocoa_input_data_t*)driver->input_data;
gamepad.valueChangedHandler = ^(GCGamepad *updateGamepad, GCControllerElement *element) {
apple_gamecontroller_poll(updateGamepad.controller);
};
diff --git a/input/drivers_keyboard/keyboard_event_apple.c b/input/drivers_keyboard/keyboard_event_apple.c
index f7e92aa2dd..15607acf45 100644
--- a/input/drivers_keyboard/keyboard_event_apple.c
+++ b/input/drivers_keyboard/keyboard_event_apple.c
@@ -19,7 +19,7 @@
#include "../input_common.h"
#include "../input_keymaps.h"
-#include "../drivers/apple_input.h"
+#include "../drivers/cocoa_input.h"
#include "../../general.h"
#include "../../driver.h"
@@ -70,7 +70,7 @@ static bool handle_small_keyboard(unsigned* code, bool down)
{ 0 }
};
driver_t *driver = driver_get_ptr();
- apple_input_data_t *apple = (apple_input_data_t*)driver->input_data;
+ cocoa_input_data_t *apple = (cocoa_input_data_t*)driver->input_data;
unsigned translated_code = 0;
if (!map_initialized)
@@ -122,7 +122,7 @@ static void handle_icade_event(unsigned keycode)
{ false, 4 }, { true , 1 }, { false, -1 }, { false, -1 } // C
};
driver_t *driver = driver_get_ptr();
- apple_input_data_t *apple = (apple_input_data_t*)driver->input_data;
+ cocoa_input_data_t *apple = (cocoa_input_data_t*)driver->input_data;
if (apple->icade_enabled && (keycode < 0x20)
&& (icade_map[keycode].button >= 0))
@@ -136,11 +136,11 @@ static void handle_icade_event(unsigned keycode)
}
}
-void apple_input_keyboard_event(bool down,
+void cocoa_input_keyboard_event(bool down,
unsigned code, uint32_t character, uint32_t mod, unsigned device)
{
driver_t *driver = driver_get_ptr();
- apple_input_data_t *apple = (apple_input_data_t*)driver->input_data;
+ cocoa_input_data_t *apple = (cocoa_input_data_t*)driver->input_data;
if (!apple)
return;
diff --git a/input/input_driver.c b/input/input_driver.c
index c5807204f1..bbc1882686 100644
--- a/input/input_driver.c
+++ b/input/input_driver.c
@@ -59,9 +59,8 @@ static const input_driver_t *input_drivers[] = {
#if defined(__linux__) && !defined(ANDROID)
&input_linuxraw,
#endif
-#if defined(IOS) || defined(OSX)
- /* Don't use __APPLE__ as it breaks basic SDL builds */
- &input_apple,
+#if defined(HAVE_COCOA) || defined(HAVE_COCOATOUCH)
+ &input_cocoa,
#endif
#ifdef __QNX__
&input_qnx,
diff --git a/input/input_driver.h b/input/input_driver.h
index f20478ae0a..374d158548 100644
--- a/input/input_driver.h
+++ b/input/input_driver.h
@@ -90,7 +90,7 @@ extern input_driver_t input_gx;
extern input_driver_t input_xinput;
extern input_driver_t input_linuxraw;
extern input_driver_t input_udev;
-extern input_driver_t input_apple;
+extern input_driver_t input_cocoa;
extern input_driver_t input_qnx;
extern input_driver_t input_rwebinput;
extern input_driver_t input_null;
diff --git a/input/input_hid_driver.c b/input/input_hid_driver.c
index 60bb6c5077..2912384e85 100644
--- a/input/input_hid_driver.c
+++ b/input/input_hid_driver.c
@@ -26,7 +26,7 @@ static hid_driver_t *hid_drivers[] = {
#if defined(__APPLE__) && defined(IOS)
&btstack_hid,
#endif
-#if defined(__APPLE__) && !defined(IOS)
+#if defined(__APPLE__) && defined(HAVE_IOHIDMANAGER)
&apple_hid,
#endif
#ifdef HAVE_LIBUSB
diff --git a/libretro-common/include/string/stdstring.h b/libretro-common/include/string/stdstring.h
index 2b40080d42..1217de9b4b 100644
--- a/libretro-common/include/string/stdstring.h
+++ b/libretro-common/include/string/stdstring.h
@@ -34,6 +34,8 @@ extern "C" {
bool string_is_empty(const char *data);
+char *string_to_upper(char *s);
+
char *string_replace_substring(const char *in, const char *pattern,
const char *by);
diff --git a/libretro-common/string/stdstring.c b/libretro-common/string/stdstring.c
index 706ceefb93..75aa149542 100644
--- a/libretro-common/string/stdstring.c
+++ b/libretro-common/string/stdstring.c
@@ -21,6 +21,7 @@
*/
#include
+#include
bool string_is_empty(const char *data)
{
@@ -35,6 +36,14 @@ bool string_is_empty(const char *data)
return false;
}
+char *string_to_upper(char *s)
+{
+ unsigned char *ucs = (unsigned char *)s;
+ for ( ; *ucs != '\0'; ucs++)
+ *ucs = toupper(*ucs);
+ return s;
+}
+
char *string_replace_substring(const char *in, const char *pattern, const char *replacement)
{
char *needle = NULL;
diff --git a/menu/drivers/glui.c b/menu/drivers/glui.c
index dd92f05987..46a1abe26b 100644
--- a/menu/drivers/glui.c
+++ b/menu/drivers/glui.c
@@ -35,10 +35,8 @@
typedef struct glui_handle
{
unsigned line_height;
- unsigned glyph_width;
unsigned margin;
- unsigned term_width;
- unsigned term_height;
+ unsigned ticker_limit;
char box_message[PATH_MAX_LENGTH];
struct
{
@@ -49,7 +47,7 @@ typedef struct glui_handle
} bg;
} textures;
- gl_font_raster_block_t raster_block;
+ gl_font_raster_block_t list_block;
bool use_blocks;
} glui_handle_t;
@@ -81,7 +79,7 @@ static int glui_entry_iterate(unsigned action)
return -1;
}
-static void glui_blit_line(gl_t *gl, float x, float y, const char *message, uint32_t color)
+static void glui_blit_line(gl_t *gl, float x, float y, const char *message, uint32_t color, enum text_alignment text_align)
{
struct font_params params = {0};
@@ -90,6 +88,7 @@ static void glui_blit_line(gl_t *gl, float x, float y, const char *message, uint
params.scale = 1.0;
params.color = color;
params.full_screen = true;
+ params.text_align = text_align;
video_driver_set_osd_msg(message, ¶ms, NULL);
}
@@ -160,9 +159,9 @@ static void glui_render_background(settings_t *settings,
gl->coords.color = gl->white_color_ptr;
}
-static void glui_draw_cursor(gl_t *gl, float x, float y)
+static void glui_render_quad(gl_t *gl, int x, int y, int w, int h,
+ float r, float g, float b, float a)
{
- struct gl_coords coords;
static const GLfloat vertex[] = {
0, 0,
1, 0,
@@ -176,14 +175,17 @@ static void glui_draw_cursor(gl_t *gl, float x, float y)
0, 0,
1, 0,
};
+
+ struct gl_coords coords;
+
GLfloat color[] = {
- 1.0f, 1.0f, 1.0f, 1.0f,
- 1.0f, 1.0f, 1.0f, 1.0f,
- 1.0f, 1.0f, 1.0f, 1.0f,
- 1.0f, 1.0f, 1.0f, 1.0f,
+ r, g, b, a,
+ r, g, b, a,
+ r, g, b, a,
+ r, g, b, a,
};
- glViewport(x - 5, gl->win_height - y + 5, 11, 11);
+ glViewport(x, gl->win_height - y - h, w, h);
coords.vertices = 4;
coords.vertex = vertex;
@@ -204,6 +206,11 @@ static void glui_draw_cursor(gl_t *gl, float x, float y)
gl->coords.color = gl->white_color_ptr;
}
+static void glui_draw_cursor(gl_t *gl, float x, float y)
+{
+ glui_render_quad(gl, x-5, y-5, 10, 10, 1, 1, 1, 1);
+}
+
static void glui_get_message(const char *message)
{
glui_handle_t *glui = NULL;
@@ -253,8 +260,8 @@ static void glui_render_messagebox(const char *message)
if (list->elems == 0)
goto end;
- x = gl->win_width / 2 - strlen(list->elems[0].data) * glui->glyph_width / 2;
- y = gl->win_height / 2 - list->size * glui->line_height / 2;
+ x = gl->win_width / 2;
+ y = gl->win_height / 2 - list->size * settings->video.font_size / 2;
normal_color = FONT_COLOR_ARGB_TO_RGBA(settings->menu.entry_normal_color);
@@ -262,7 +269,7 @@ static void glui_render_messagebox(const char *message)
{
const char *msg = list->elems[i].data;
if (msg)
- glui_blit_line(gl, x, y + i * glui->line_height, msg, normal_color);
+ glui_blit_line(gl, x, y + i * settings->video.font_size, msg, normal_color, TEXT_ALIGN_CENTER);
}
end:
@@ -271,6 +278,7 @@ end:
static void glui_render(void)
{
+ int bottom;
glui_handle_t *glui = NULL;
gl_t *gl = NULL;
menu_handle_t *menu = menu_driver_get_ptr();
@@ -289,46 +297,121 @@ static void glui_render(void)
if (!gl)
return;
- glui->line_height = settings->video.font_size * 4 / 3;
- glui->glyph_width = glui->line_height / 2;
- glui->margin = gl->win_width / 20 ;
- glui->term_width = (gl->win_width - glui->margin * 2) / glui->glyph_width;
- glui->term_height = (gl->win_height - glui->margin * 2) / glui->line_height - 2;
-
menu->frame_buf.width = gl->win_width;
menu->frame_buf.height = gl->win_height;
- menu->mouse.ptr = (menu->mouse.y - glui->margin) /
- glui->line_height - 2 + menu->begin;
+ if (settings->menu.pointer.enable)
+ {
+ menu->pointer.ptr =
+ (menu->pointer.y - glui->line_height + menu->scroll_y - 16)
+ / glui->line_height;
- if (menu->mouse.wheeldown && menu->begin
- < menu_list_get_size(menu->menu_list) - glui->term_height)
- menu->begin++;
+ if (menu->pointer.dragging)
+ menu->scroll_y -= menu->pointer.dy;
+ }
- if (menu->mouse.wheelup && menu->begin > 0)
- menu->begin--;
+ if (settings->menu.mouse.enable)
+ {
+ if (menu->mouse.scrolldown)
+ menu->scroll_y += 10;
- /* Do not scroll if all items are visible. */
- if (menu_list_get_size(menu->menu_list) <= glui->term_height)
- menu->begin = 0;
+ if (menu->mouse.scrollup)
+ menu->scroll_y -= 10;
+
+ menu->mouse.ptr =
+ (menu->mouse.y - glui->line_height + menu->scroll_y - 16)
+ / glui->line_height;
+ }
+
+ if (menu->scroll_y < 0)
+ menu->scroll_y = 0;
+
+ bottom = (menu_list_get_size(menu->menu_list)-1) * glui->line_height
+ - gl->win_height + menu->header_height * 2;
+ if (menu->scroll_y > bottom)
+ menu->scroll_y = bottom;
+
+ if ((menu_list_get_size(menu->menu_list)-1) * glui->line_height
+ < gl->win_height - menu->header_height*2)
+ menu->scroll_y = 0;
+}
+
+static void glui_render_menu_list(runloop_t *runloop, gl_t *gl, glui_handle_t *glui,
+ menu_handle_t *menu, const char *label, uint32_t normal_color,
+ uint32_t hover_color)
+{
+ const struct font_renderer *font_driver = (const struct font_renderer *)gl->font_driver;
+ size_t i = 0;
+
+ if (glui->use_blocks)
+ font_driver->bind_block(gl->font_handle, &glui->list_block);
+
+ if (!menu_display_update_pending())
+ goto draw_text;
+
+ glui->list_block.carr.coords.vertices = 0;
+
+ for (i = 0; i < menu_list_get_size(menu->menu_list); i++)
+ {
+ char message[PATH_MAX_LENGTH], type_str[PATH_MAX_LENGTH],
+ entry_title_buf[PATH_MAX_LENGTH], type_str_buf[PATH_MAX_LENGTH],
+ path_buf[PATH_MAX_LENGTH];
+ const char *path = NULL, *entry_label = NULL;
+ unsigned type = 0, w = 0;
+ bool selected = false;
+ menu_file_list_cbs_t *cbs = NULL;
+
+ menu_list_get_at_offset(menu->menu_list->selection_buf, i, &path,
+ &entry_label, &type);
+
+ cbs = (menu_file_list_cbs_t*)
+ menu_list_get_actiondata_at_offset(menu->menu_list->selection_buf, i);
+
+ if (cbs && cbs->action_get_representation)
+ cbs->action_get_representation(menu->menu_list->selection_buf,
+ &w, type, i, label,
+ type_str, sizeof(type_str),
+ entry_label, path,
+ path_buf, sizeof(path_buf));
+
+ selected = (i == menu->navigation.selection_ptr);
+
+ menu_animation_ticker_line(entry_title_buf, glui->ticker_limit,
+ runloop->frames.video.count / 100, path_buf, selected);
+ menu_animation_ticker_line(type_str_buf, glui->ticker_limit,
+ runloop->frames.video.count / 100, type_str, selected);
+
+ strlcpy(message, entry_title_buf, sizeof(message));
+
+ unsigned y = menu->header_height - menu->scroll_y + (glui->line_height * i);
+
+ glui_blit_line(gl, glui->margin, y, message,
+ selected ? hover_color : normal_color, TEXT_ALIGN_LEFT);
+
+ glui_blit_line(gl, gl->win_width - glui->margin, y, type_str_buf,
+ selected ? hover_color : normal_color, TEXT_ALIGN_RIGHT);
+ }
+
+draw_text:
+ if (glui->use_blocks)
+ {
+ font_driver->flush(gl->font_handle);
+ font_driver->bind_block(gl->font_handle, NULL);
+ }
}
static void glui_frame(void)
{
- unsigned x, y;
- size_t i;
char title[PATH_MAX_LENGTH], title_buf[PATH_MAX_LENGTH],
title_msg[PATH_MAX_LENGTH];
char timedate[PATH_MAX_LENGTH];
const char *dir = NULL;
const char *label = NULL;
unsigned menu_type = 0;
- size_t end;
gl_t *gl = NULL;
glui_handle_t *glui = NULL;
const char *core_name = NULL;
const char *core_version = NULL;
- const struct font_renderer *font_driver = NULL;
menu_handle_t *menu = menu_driver_get_ptr();
settings_t *settings = config_get_ptr();
const uint32_t normal_color = FONT_COLOR_ARGB_TO_RGBA(settings->menu.entry_normal_color);
@@ -345,8 +428,6 @@ static void glui_frame(void)
if (!gl)
return;
- font_driver = (const struct font_renderer*)gl->font_driver;
-
glui = (glui_handle_t*)menu->userdata;
if (!glui)
@@ -361,34 +442,35 @@ static void glui_frame(void)
glui_render_background(settings, gl, glui, false);
- if (glui->use_blocks)
- {
- font_driver->bind_block(gl->font_handle, &glui->raster_block);
+ menu_list_get_last_stack(menu->menu_list, &dir, &label, &menu_type);
- if (!menu_display_update_pending())
- goto draw_text;
- }
+ get_title(label, dir, menu_type, title, sizeof(title));
- glui->raster_block.carr.coords.vertices = 0;
+ glui_render_quad(gl, 0,
+ menu->header_height - menu->scroll_y + glui->line_height *
+ menu->navigation.selection_ptr - glui->line_height / 2 - 4,
+ gl->win_width, glui->line_height, 1, 1, 1, 0.1);
+
+ glui_render_menu_list(runloop, gl, glui, menu, label, normal_color, hover_color);
runloop->frames.video.current.menu.animation.is_active = false;
runloop->frames.video.current.menu.label.is_updated = false;
runloop->frames.video.current.menu.framebuf.dirty = false;
- end = (menu->begin + glui->term_height <=
- menu_list_get_size(menu->menu_list)) ?
- menu->begin + glui->term_height :
- menu_list_get_size(menu->menu_list);
+ glui_render_quad(gl, 0, 0, gl->win_width,
+ menu->header_height - glui->line_height/2 - 4, 0.2, 0.2, 0.2, 1);
+ menu_animation_ticker_line(title_buf, glui->ticker_limit,
+ runloop->frames.video.count / 100, title, true);
+ glui_blit_line(gl, gl->win_width/2, glui->line_height, title_buf, title_color, TEXT_ALIGN_CENTER);
- menu_list_get_last_stack(menu->menu_list, &dir, &label, &menu_type);
+ if (file_list_get_size(menu->menu_list->menu_stack) > 1)
+ glui_blit_line(gl, glui->margin, glui->line_height, "BACK", title_color, TEXT_ALIGN_LEFT);
- get_title(label, dir, menu_type, title, sizeof(title));
-
- menu_animation_ticker_line(title_buf, glui->term_width - 3,
- runloop->frames.video.count / glui->margin, title, true);
- glui_blit_line(gl, glui->margin * 2, glui->margin + glui->line_height,
- title_buf, title_color);
+ glui_render_quad(gl, 0,
+ gl->win_height - (menu->header_height - glui->line_height/2 + 4),
+ gl->win_width, menu->header_height - glui->line_height/2 + 4,
+ 0.2, 0.2, 0.2, 1);
core_name = global->menu.info.library_name;
if (!core_name)
@@ -407,69 +489,16 @@ static void glui_frame(void)
snprintf(title_msg, sizeof(title_msg), "%s - %s %s", PACKAGE_VERSION,
core_name, core_version);
- glui_blit_line(gl,
- glui->margin * 2,
- glui->margin + glui->term_height * glui->line_height
- + glui->line_height * 2, title_msg, title_color);
+ glui_blit_line(gl, glui->margin, gl->win_height - glui->line_height, title_msg,
+ title_color, TEXT_ALIGN_LEFT);
}
if (settings->menu.timedate_enable)
{
disp_timedate_set_label(timedate, sizeof(timedate), 0);
- glui_blit_line(gl,
- glui->margin * 14,
- glui->margin + glui->term_height * glui->line_height
- + glui->line_height * 2, timedate, hover_color);
- }
-
- x = glui->margin;
- y = glui->margin + glui->line_height * 2;
-
- for (i = menu->begin; i < end; i++, y += glui->line_height)
- {
- char message[PATH_MAX_LENGTH], type_str[PATH_MAX_LENGTH],
- entry_title_buf[PATH_MAX_LENGTH], type_str_buf[PATH_MAX_LENGTH],
- path_buf[PATH_MAX_LENGTH];
- const char *path = NULL, *entry_label = NULL;
- unsigned type = 0, w = 0;
- bool selected = false;
- menu_file_list_cbs_t *cbs = NULL;
-
- menu_list_get_at_offset(menu->menu_list->selection_buf, i, &path,
- &entry_label, &type);
-
- cbs = (menu_file_list_cbs_t*)
- menu_list_get_actiondata_at_offset(menu->menu_list->selection_buf,
- i);
-
- if (cbs && cbs->action_get_representation)
- cbs->action_get_representation(menu->menu_list->selection_buf,
- &w, type, i, label,
- type_str, sizeof(type_str),
- entry_label, path,
- path_buf, sizeof(path_buf));
-
- selected = (i == menu->navigation.selection_ptr);
-
- menu_animation_ticker_line(entry_title_buf, glui->term_width - (w + 1 + 2),
- runloop->frames.video.count / glui->margin, path_buf, selected);
- menu_animation_ticker_line(type_str_buf, w,
- runloop->frames.video.count / glui->margin, type_str, selected);
-
- strlcpy(message, entry_title_buf, sizeof(message));
-
- glui_blit_line(gl, x, y, message, selected ? hover_color : normal_color);
-
- glui_blit_line(gl, gl->win_width - glui->glyph_width * w - glui->margin ,
- y, type_str_buf, selected ? hover_color : normal_color);
- }
-
-draw_text:
-
- if (glui->use_blocks)
- {
- font_driver->flush(gl->font_handle);
- font_driver->bind_block(gl->font_handle, NULL);
+ glui_blit_line(gl, gl->win_width - glui->margin,
+ gl->win_height - glui->line_height, timedate, hover_color,
+ TEXT_ALIGN_RIGHT);
}
if (menu->keyboard.display)
@@ -512,7 +541,7 @@ static void *glui_init(void)
}
font_driver = (const struct font_renderer*)gl->font_driver;
- menu = (menu_handle_t*)calloc(1, sizeof(*menu));
+ menu = (menu_handle_t*)calloc(1, sizeof(*menu));
if (!menu)
goto error;
@@ -522,7 +551,12 @@ static void *glui_init(void)
if (!menu->userdata)
goto error;
- glui = (glui_handle_t*)menu->userdata;
+ glui = (glui_handle_t*)menu->userdata;
+
+ glui->line_height = 44;
+ glui->margin = 22;
+ glui->ticker_limit = 44;
+ menu->header_height = 88;
glui->textures.bg.id = 0;
if (font_driver->bind_block && font_driver->flush)
@@ -548,7 +582,7 @@ static void glui_free(void *data)
if (!glui)
return;
- gl_coord_array_free(&glui->raster_block.carr);
+ gl_coord_array_free(&glui->list_block.carr);
font_driver = (const struct font_renderer*)gl->font_driver;
@@ -562,8 +596,6 @@ static void glui_free(void *data)
free(menu->userdata);
}
-
-
static void glui_context_destroy(void)
{
glui_handle_t *glui = NULL;
@@ -606,14 +638,18 @@ static bool glui_load_wallpaper(void *data)
static void glui_navigation_clear(bool pending_push)
{
menu_handle_t *menu = menu_driver_get_ptr();
- if (menu)
- menu->begin = 0;
+ if (!menu)
+ return;
+
+ menu->begin = 0;
+ menu->scroll_y = 0;
}
static void glui_navigation_set(bool scroll)
{
glui_handle_t *glui = NULL;
menu_handle_t *menu = menu_driver_get_ptr();
+ gl_t *gl = (gl_t*)video_driver_get_ptr(NULL);
if (!menu)
return;
@@ -625,16 +661,12 @@ static void glui_navigation_set(bool scroll)
if (!scroll)
return;
- if (menu->navigation.selection_ptr < glui->term_height/2)
- menu->begin = 0;
- else if (menu->navigation.selection_ptr >= glui->term_height/2
- && menu->navigation.selection_ptr <
- menu_list_get_size(menu->menu_list) - glui->term_height/2)
- menu->begin = menu->navigation.selection_ptr - glui->term_height/2;
- else if (menu->navigation.selection_ptr >=
- menu_list_get_size(menu->menu_list) - glui->term_height/2)
- menu->begin = menu_list_get_size(menu->menu_list)
- - glui->term_height;
+ int half = (gl->win_height / glui->line_height) / 2;
+
+ if (menu->navigation.selection_ptr < half)
+ menu->scroll_y = 0;
+ else
+ menu->scroll_y = ((menu->navigation.selection_ptr + 2 - half) * glui->line_height);
}
static void glui_navigation_set_last(void)
diff --git a/menu/drivers/rgui.c b/menu/drivers/rgui.c
index 98cbbfc043..87f9b610e0 100644
--- a/menu/drivers/rgui.c
+++ b/menu/drivers/rgui.c
@@ -349,6 +349,7 @@ static void rgui_blit_cursor(menu_handle_t *menu)
static void rgui_render(void)
{
size_t i, end;
+ int bottom;
char title[256], title_buf[256], title_msg[64];
char timedate[PATH_MAX_LENGTH];
unsigned x, y, menu_type = 0;
@@ -383,19 +384,39 @@ static void rgui_render(void)
runloop->frames.video.current.menu.animation.is_active = false;
runloop->frames.video.current.menu.label.is_updated = false;
- menu->mouse.ptr = menu->mouse.y / 11 - 2 + menu->begin;
+ if (settings->menu.pointer.enable)
+ {
+ menu->pointer.ptr = menu->pointer.y / 11 - 2 + menu->begin;
- if (menu->mouse.scrolldown && menu->begin
- < menu_list_get_size(menu->menu_list) - RGUI_TERM_HEIGHT)
- menu->begin++;
+ if (menu->pointer.dragging)
+ {
+ menu->scroll_y += menu->pointer.dy;
+ menu->begin = -menu->scroll_y / 11 + 2;
+ if (menu->scroll_y > 0)
+ menu->scroll_y = 0;
+ }
+ }
+
+ if (settings->menu.mouse.enable)
+ {
+ if (menu->mouse.scrolldown && menu->begin
+ < menu_list_get_size(menu->menu_list) - RGUI_TERM_HEIGHT)
+ menu->begin++;
- if (menu->mouse.scrollup && menu->begin > 0)
- menu->begin--;
+ if (menu->mouse.scrollup && menu->begin > 0)
+ menu->begin--;
+
+ menu->mouse.ptr = menu->mouse.y / 11 - 2 + menu->begin;
+ }
/* Do not scroll if all items are visible. */
if (menu_list_get_size(menu->menu_list) <= RGUI_TERM_HEIGHT)
menu->begin = 0;
+ bottom = menu_list_get_size(menu->menu_list) - RGUI_TERM_HEIGHT;
+ if (menu->begin > bottom)
+ menu->begin = bottom;
+
end = (menu->begin + RGUI_TERM_HEIGHT <=
menu_list_get_size(menu->menu_list)) ?
menu->begin + RGUI_TERM_HEIGHT :
@@ -412,13 +433,20 @@ static void rgui_render(void)
get_title(label, dir, menu_type, title, sizeof(title));
- menu_animation_ticker_line(title_buf, RGUI_TERM_WIDTH - 3,
+ menu_animation_ticker_line(title_buf, RGUI_TERM_WIDTH - 10,
runloop->frames.video.count / RGUI_TERM_START_X, title, true);
hover_color = HOVER_COLOR(settings);
normal_color = NORMAL_COLOR(settings);
- blit_line(menu, RGUI_TERM_START_X + RGUI_TERM_START_X, RGUI_TERM_START_X, title_buf, TITLE_COLOR(settings));
+ if (file_list_get_size(menu->menu_list->menu_stack) > 1)
+ blit_line(menu,
+ RGUI_TERM_START_X, RGUI_TERM_START_X,
+ "BACK", TITLE_COLOR(settings));
+
+ blit_line(menu,
+ RGUI_TERM_START_X + (RGUI_TERM_WIDTH - strlen(title_buf)) * FONT_WIDTH_STRIDE / 2,
+ RGUI_TERM_START_X, title_buf, TITLE_COLOR(settings));
core_name = global->menu.info.library_name;
if (!core_name)
@@ -434,11 +462,10 @@ static void rgui_render(void)
if (!core_version)
core_version = "";
-
snprintf(title_msg, sizeof(title_msg), "%s - %s %s", PACKAGE_VERSION,
core_name, core_version);
blit_line(menu,
- RGUI_TERM_START_X + RGUI_TERM_START_X,
+ RGUI_TERM_START_X,
(RGUI_TERM_HEIGHT * FONT_HEIGHT_STRIDE) +
RGUI_TERM_START_Y + 2, title_msg, hover_color);
}
@@ -448,12 +475,11 @@ static void rgui_render(void)
disp_timedate_set_label(timedate, sizeof(timedate), 3);
blit_line(menu,
- (RGUI_TERM_WIDTH * FONT_HEIGHT_STRIDE) + (60),
+ RGUI_TERM_WIDTH * FONT_WIDTH_STRIDE - RGUI_TERM_START_X,
(RGUI_TERM_HEIGHT * FONT_HEIGHT_STRIDE) +
RGUI_TERM_START_Y + 2, timedate, hover_color);
}
-
x = RGUI_TERM_START_X;
y = RGUI_TERM_START_Y;
@@ -546,6 +572,7 @@ static void *rgui_init(void)
menu->frame_buf.width = 320;
menu->frame_buf.height = 240;
+ menu->header_height = FONT_HEIGHT_STRIDE * 2;
menu->begin = 0;
menu->frame_buf.pitch = menu->frame_buf.width * sizeof(uint16_t);
@@ -608,8 +635,11 @@ static void rgui_set_texture(void)
static void rgui_navigation_clear(bool pending_push)
{
menu_handle_t *menu = menu_driver_get_ptr();
- if (menu)
- menu->begin = 0;
+ if (!menu)
+ return;
+
+ menu->begin = 0;
+ menu->scroll_y = 0;
}
static void rgui_navigation_set(bool scroll)
diff --git a/menu/drivers/shared.h b/menu/drivers/shared.h
index 365eb90321..8435974d29 100644
--- a/menu/drivers/shared.h
+++ b/menu/drivers/shared.h
@@ -18,6 +18,7 @@
#include "../../settings.h"
#include
+#include
#include
static INLINE void get_title(const char *label, const char *dir,
@@ -57,8 +58,8 @@ static INLINE void get_title(const char *label, const char *dir,
#endif
if (!strcmp(label, "core_list"))
snprintf(title, sizeof_title, "CORE SELECTION %s", dir);
- else if (!strcmp(label, "core_updater_list"))
- snprintf(title, sizeof_title, "CORE UPDATER %s", dir);
+ else if (!strcmp(label, "deferred_core_updater_list"))
+ strlcpy(title, "CORE UPDATER", sizeof_title);
else if (!strcmp(label, "deferred_database_manager_list"))
snprintf(title, sizeof_title, "DATABASE SELECTION - %s", (elem0_path[0] != '\0') ? path_basename(elem0_path) : "");
else if (!strcmp(label, "database_manager_list"))
@@ -103,127 +104,53 @@ static INLINE void get_title(const char *label, const char *dir,
snprintf(title, sizeof_title, "CONFIG %s", dir);
else if (!strcmp(label, "disk_image_append"))
snprintf(title, sizeof_title, "DISK APPEND %s", dir);
- else if (!strcmp(elem0, "Recording Settings"))
- strlcpy(title, "RECORDING SETTINGS", sizeof_title);
- else if (!strcmp(elem0, "Video Settings"))
+ else if (!strcmp(elem0, "Video Settings")
+ || !strcmp(elem0, "Overlay Settings")
+ || !strcmp(elem0, "Recording Settings")
+ || !strcmp(elem0, "Menu Settings")
+ || !strcmp(elem0, "General Settings")
+ || !strcmp(elem0, "Patch Settings")
+ || !strcmp(elem0, "UI Settings")
+ || !strcmp(elem0, "Playlist Settings")
+ || !strcmp(elem0, "Network Settings")
+ || !strcmp(elem0, "Core Updater Settings")
+ || !strcmp(elem0, "User Settings")
+ || !strcmp(elem0, "Path Settings")
+ || !strcmp(elem0, "Driver Settings")
+ || !strcmp(elem0, "Privacy Settings")
+ || !strcmp(elem0, "Onscreen Keyboard Overlay Settings")
+ || !strcmp(elem0, "Audio Settings")
+ || !strcmp(elem0, "Font Settings")
+ || !strcmp(elem0, "Shader Settings")
+ || !strcmp(elem0, "Archive Settings")
+ || !strcmp(elem0, "Input Settings")
+ )
{
- strlcpy(title, "VIDEO SETTINGS", sizeof_title);
- if (!strcmp(elem1, "Monitor"))
- strlcat(title, " - MONITOR", sizeof_title);
- else if (!strcmp(elem1, "Aspect"))
- strlcat(title, " - ASPECT", sizeof_title);
- else if (!strcmp(elem1, "Scaling"))
- strlcat(title, " - SCALING", sizeof_title);
- else if (!strcmp(elem1, "Synchronization"))
- strlcat(title, " - SYNCHRONIZATION", sizeof_title);
- else if (!strcmp(elem1, "Miscellaneous"))
- strlcat(title, " - MISCELLANEOUS", sizeof_title);
- else if (!strcmp(elem1, "State"))
- strlcat(title, " - STATE", sizeof_title);
+ strlcpy(title, string_to_upper(elem0), sizeof_title);
+ if (elem1[0] != '\0')
+ {
+ strlcat(title, " - ", sizeof_title);
+ strlcat(title, string_to_upper(elem1), sizeof_title);
+ }
}
- else if (!strcmp(elem0, "Input Settings") ||
- menu_type == MENU_SETTINGS_CUSTOM_BIND ||
+ else if (menu_type == MENU_SETTINGS_CUSTOM_BIND ||
menu_type == MENU_SETTINGS_CUSTOM_BIND_KEYBOARD)
{
strlcpy(title, "INPUT SETTINGS", sizeof_title);
- if (strstr(elem1, "User"))
- strlcat(title, " - USER", sizeof_title);
- else if (!strcmp(elem1, "Meta Keys"))
- strlcat(title, " - META KEYS", sizeof_title);
- else if (!strcmp(elem1, "Turbo/Deadzone"))
- strlcat(title, " - TURBO / DEADZONE", sizeof_title);
- else if (!strcmp(elem1, "Input Device Mapping"))
- strlcat(title, " - INPUT DEVICE MAPPING", sizeof_title);
- else if (!strcmp(elem1, "State"))
- strlcat(title, " - STATE", sizeof_title);
- else if (!strcmp(elem1, "Miscellaneous"))
- strlcat(title, " - MISCELLANEOUS", sizeof_title);
+ if (elem1[0] != '\0')
+ {
+ strlcat(title, " - ", sizeof_title);
+ strlcat(title, string_to_upper(elem1), sizeof_title);
+ }
}
- else if (!strcmp(elem0, "Overlay Settings"))
+ else if (!strcmp(label, "management")
+ || !strcmp(label, "options")
+ || !strcmp(label, "settings")
+ )
{
- strlcpy(title, "OVERLAY SETTINGS", sizeof_title);
- if (!strcmp(elem1, "State"))
- strlcat(title, " - STATE", sizeof_title);
- }
- else if (!strcmp(elem0, "Menu Settings"))
- {
- strlcpy(title, "MENU SETTINGS", sizeof_title);
- if (!strcmp(elem1, "State"))
- strlcat(title, " - STATE", sizeof_title);
- else if (!strcmp(elem1, "Navigation"))
- strlcat(title, " - NAVIGATION", sizeof_title);
- else if (!strcmp(elem1, "Settings View"))
- strlcat(title, " - SETTINGS VIEW", sizeof_title);
- else if (!strcmp(elem1, "Browser"))
- strlcat(title, " - BROWSER", sizeof_title);
- }
- else if (!strcmp(elem0, "Onscreen Keyboard Overlay Settings"))
- {
- strlcpy(title, "ONSCREEN KEYBOARD OVERLAY SETTINGS", sizeof_title);
- if (!strcmp(elem1, "State"))
- strlcat(title, " - STATE", sizeof_title);
- }
- else if (!strcmp(elem0, "Patch Settings"))
- {
- strlcpy(title, "PATCH SETTINGS", sizeof_title);
- if (!strcmp(elem1, "State"))
- strlcat(title, " - STATE", sizeof_title);
- }
- else if (!strcmp(elem0, "UI Settings"))
- {
- strlcpy(title, "UI SETTINGS", sizeof_title);
- if (!strcmp(elem1, "State"))
- strlcat(title, " - STATE", sizeof_title);
- }
- else if (!strcmp(elem0, "Playlist Settings"))
- {
- strlcpy(title, "PLAYLIST SETTINGS", sizeof_title);
- if (!strcmp(elem1, "State"))
- strlcat(title, " - STATE", sizeof_title);
- if (!strcmp(elem1, "History"))
- strlcat(title, " - HISTORY", sizeof_title);
- }
- else if (!strcmp(elem0, "Network Settings"))
- {
- strlcpy(title, "NETWORK SETTINGS", sizeof_title);
- if (!strcmp(elem1, "State"))
- strlcat(title, " - STATE", sizeof_title);
- if (!strcmp(elem1, "Netplay"))
- strlcat(title, " - NETPLAY", sizeof_title);
- if (!strcmp(elem1, "Miscellaneous"))
- strlcat(title, " - MISCELLANEOUS", sizeof_title);
- }
- else if (!strcmp(elem0, "Core Updater Settings"))
- {
- strlcpy(title, "CORE UPDATER SETTINGS", sizeof_title);
- if (!strcmp(elem1, "State"))
- strlcat(title, " - STATE", sizeof_title);
- }
- else if (!strcmp(elem0, "User Settings"))
- {
- strlcpy(title, "USER SETTINGS", sizeof_title);
- if (!strcmp(elem1, "State"))
- strlcat(title, " - STATE", sizeof_title);
- }
- else if (!strcmp(elem0, "Path Settings"))
- {
- strlcpy(title, "PATH SETTINGS", sizeof_title);
- if (!strcmp(elem1, "State"))
- strlcat(title, " - STATE", sizeof_title);
- if (!strcmp(elem1, "Paths"))
- strlcat(title, " - PATHS", sizeof_title);
- }
- else if (!strcmp(label, "management"))
- strlcpy(title, "MANAGEMENT", sizeof_title);
- else if (!strcmp(label, "options"))
- strlcpy(title, "OPTIONS", sizeof_title);
- else if (!strcmp(label, "settings"))
- strlcpy(title, "SETTINGS", sizeof_title);
- else if (!strcmp(elem0, "Driver Settings"))
- {
- strlcpy(title, "DRIVER SETTINGS", sizeof_title);
- if (!strcmp(elem1, "State"))
- strlcat(title, " - STATE", sizeof_title);
+ char upper_label[PATH_MAX_LENGTH];
+ strlcpy(upper_label, label, sizeof(upper_label));
+ strlcpy(title, string_to_upper(upper_label), sizeof_title);
}
else if (!strcmp(label, "performance_counters"))
strlcpy(title, "PERFORMANCE COUNTERS", sizeof_title);
@@ -231,44 +158,10 @@ static INLINE void get_title(const char *label, const char *dir,
strlcpy(title, "FRONTEND PERFORMANCE COUNTERS", sizeof_title);
else if (!strcmp(label, "core_counters"))
strlcpy(title, "CORE PERFORMANCE COUNTERS", sizeof_title);
- else if (!strcmp(elem0, "Shader Settings"))
- {
- strlcpy(title, "SHADER SETTINGS", sizeof_title);
- if (!strcmp(elem1, "State"))
- strlcat(title, " - STATE", sizeof_title);
- }
- else if (!strcmp(elem0, "Archive Settings"))
- {
- strlcpy(title, "ARCHIVE SETTINGS", sizeof_title);
- if (!strcmp(elem1, "State"))
- strlcat(title, " - STATE", sizeof_title);
- }
else if (!strcmp(label, "video_shader_parameters"))
strlcpy(title, "SHADER PARAMETERS (CURRENT)", sizeof_title);
else if (!strcmp(label, "video_shader_preset_parameters"))
strlcpy(title, "SHADER PARAMETERS (MENU PRESET)", sizeof_title);
- else if (!strcmp(elem0, "Font Settings"))
- {
- strlcpy(title, "FONT SETTINGS", sizeof_title);
- if (!strcmp(elem1, "Messages"))
- strlcat(title, " - MESSAGES", sizeof_title);
- }
- else if (!strcmp(elem0, "General Settings"))
- {
- strlcpy(title, "GENERAL SETTINGS", sizeof_title);
- if (!strcmp(elem1, "State"))
- strlcat(title, " - STATE", sizeof_title);
- }
- else if (!strcmp(elem0, "Audio Settings"))
- {
- strlcpy(title, "AUDIO SETTINGS", sizeof_title);
- if (!strcmp(elem1, "State"))
- strlcat(title, " - STATE", sizeof_title);
- else if (!strcmp(elem1, "Synchronization"))
- strlcat(title, " - SYNCHRONIZATION", sizeof_title);
- else if (!strcmp(elem1, "Miscellaneous"))
- strlcat(title, " - MISCELLANEOUS", sizeof_title);
- }
else if (!strcmp(label, "disk_options"))
strlcpy(title, "DISK OPTIONS", sizeof_title);
else if (!strcmp(label, "core_options"))
@@ -283,12 +176,8 @@ static INLINE void get_title(const char *label, const char *dir,
strlcpy(title, "CORE INPUT REMAPPING OPTIONS", sizeof_title);
else if (!strcmp(label, "core_information"))
strlcpy(title, "CORE INFO", sizeof_title);
- else if (!strcmp(elem0, "Privacy Settings"))
- {
- strlcpy(title, "PRIVACY SETTINGS", sizeof_title);
- if (!strcmp(elem1, "State"))
- strlcat(title, " - STATE", sizeof_title);
- }
+ else if (!strcmp(label, "system_information"))
+ strlcpy(title, "SYSTEM INFO", sizeof_title);
else if (!strcmp(label, "video_shader_pass"))
snprintf(title, sizeof_title, "SHADER %s", dir);
else if (!strcmp(label, "video_shader_preset"))
diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c
index ac9f70282e..54e6bbc799 100644
--- a/menu/drivers/xmb.c
+++ b/menu/drivers/xmb.c
@@ -1211,6 +1211,8 @@ static void xmb_render(void)
{
unsigned i, current, end;
runloop_t *runloop = rarch_main_get_ptr();
+ settings_t *settings = config_get_ptr();
+
menu_handle_t *menu = menu_driver_get_ptr();
if (!menu)
@@ -1226,12 +1228,26 @@ static void xmb_render(void)
current = menu->navigation.selection_ptr;
end = menu_list_get_size(menu->menu_list);
- for (i = 0; i < end; i++)
+ if (settings->menu.pointer.enable)
{
- float item_y = xmb->margins.screen.top + xmb_item_y(xmb, i, current);
+ for (i = 0; i < end; i++)
+ {
+ float item_y = xmb->margins.screen.top + xmb_item_y(xmb, i, current);
- if (menu->mouse.y > item_y && menu->mouse.y < item_y + xmb->icon.size)
- menu->mouse.ptr = i;
+ if (menu->pointer.y > item_y && menu->pointer.y < item_y + xmb->icon.size)
+ menu->pointer.ptr = i;
+ }
+ }
+
+ if (settings->menu.mouse.enable)
+ {
+ for (i = 0; i < end; i++)
+ {
+ float item_y = xmb->margins.screen.top + xmb_item_y(xmb, i, current);
+
+ if (menu->mouse.y > item_y && menu->mouse.y < item_y + xmb->icon.size)
+ menu->mouse.ptr = i;
+ }
}
runloop->frames.video.current.menu.animation.is_active = false;
@@ -1498,6 +1514,7 @@ static void *xmb_init(void)
xmb->margins.setting.left = 600.0 * scale_factor;
menu->categories.size = 1;
+ menu->header_height = xmb->icon.size;
if (global->core_info)
menu->categories.size = global->core_info->count + 1;
diff --git a/menu/menu.h b/menu/menu.h
index a457cd0c7c..81e35cbb4d 100644
--- a/menu/menu.h
+++ b/menu/menu.h
@@ -87,6 +87,7 @@ typedef enum
MENU_FILE_RDB,
MENU_FILE_RDB_ENTRY,
MENU_FILE_CURSOR,
+ MENU_FILE_RECORD_CONFIG,
MENU_SETTINGS,
MENU_SETTING_DRIVER,
MENU_SETTING_ACTION,
diff --git a/menu/menu_driver.h b/menu/menu_driver.h
index ff5ea8ba35..4c4a47e784 100644
--- a/menu/menu_driver.h
+++ b/menu/menu_driver.h
@@ -112,6 +112,8 @@ typedef struct
} delay;
size_t begin;
+ unsigned header_height;
+ int scroll_y;
menu_list_t *menu_list;
menu_navigation_t navigation;
@@ -175,13 +177,20 @@ typedef struct
struct
{
+ int16_t x;
+ int16_t y;
+ int16_t dx;
+ int16_t dy;
int16_t old_x;
int16_t old_y;
- bool pressed[2];
- bool oldpressed[2];
- bool back;
- bool oldback;
- bool cancel;
+ int16_t start_x;
+ int16_t start_y;
+ bool pressed[2];
+ bool oldpressed[2];
+ bool dragging;
+ bool back;
+ bool oldback;
+ unsigned ptr;
} pointer;
struct
diff --git a/menu/menu_entries_cbs.c b/menu/menu_entries_cbs.c
index 5280010756..2a76d12d65 100644
--- a/menu/menu_entries_cbs.c
+++ b/menu/menu_entries_cbs.c
@@ -39,18 +39,12 @@ void menu_entries_common_load_content(bool persist)
menu->msg_force = true;
}
-int menu_action_setting_set_current_string(
- rarch_setting_t *setting, const char *str)
-{
- strlcpy(setting->value.string, str, setting->size);
- return menu_setting_generic(setting);
-}
-
#ifdef HAVE_NETWORKING
/* HACK - we have to find some way to pass state inbetween
* function pointer callback functions that don't necessarily
* call each other. */
+#ifdef HAVE_ZLIB
static int zlib_extract_core_callback(const char *name, const char *valid_exts,
const uint8_t *cdata, unsigned cmode, uint32_t csize, uint32_t size,
uint32_t crc32, void *userdata)
@@ -92,6 +86,7 @@ error:
RARCH_ERR("Failed to deflate to: %s.\n", path);
return 0;
}
+#endif
int cb_core_updater_download(void *data, size_t len)
{
@@ -138,6 +133,7 @@ int menu_entries_common_is_settings_entry(const char *label)
!strcmp(label, "Driver Settings") ||
!strcmp(label, "General Settings") ||
!strcmp(label, "Video Settings") ||
+ !strcmp(label, "Recording Settings") ||
!strcmp(label, "Shader Settings") ||
!strcmp(label, "Font Settings") ||
!strcmp(label, "Audio Settings") ||
diff --git a/menu/menu_entries_cbs_deferred_push.c b/menu/menu_entries_cbs_deferred_push.c
index 2245ce1c91..d57123e59c 100644
--- a/menu/menu_entries_cbs_deferred_push.c
+++ b/menu/menu_entries_cbs_deferred_push.c
@@ -30,6 +30,8 @@
#include "menu_database.h"
#include "../gfx/video_shader_driver.h"
+#include "../git_version.h"
+#include "../config.features.h"
#ifdef HAVE_LIBRETRODB
static int create_string_list_rdb_entry_string(const char *desc, const char *label,
@@ -268,6 +270,412 @@ static int deferred_push_core_information(void *data, void *userdata,
return 0;
}
+static int deferred_push_system_information(void *data, void *userdata,
+ const char *path, const char *label, unsigned type)
+{
+ file_list_t *list = (file_list_t*)data;
+ file_list_t *menu_list = (file_list_t*)userdata;
+
+ if (!list || !menu_list)
+ return -1;
+
+ menu_list_clear(list);
+
+ {
+ char tmp[PATH_MAX_LENGTH];
+ const char *tmp_string;
+ char tmp2[PATH_MAX_LENGTH];
+ const frontend_ctx_driver_t *frontend = frontend_get_ptr();
+
+ snprintf(tmp, sizeof(tmp), "Build date: %s", __DATE__);
+ menu_list_push(list, tmp, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+#ifdef HAVE_GIT_VERSION
+ snprintf(tmp, sizeof(tmp), "Git version: %s", rarch_git_version);
+ menu_list_push(list, tmp, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+#endif
+
+ rarch_print_compiler(tmp, sizeof(tmp));
+ menu_list_push(list, tmp, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ {
+ char cpu_str[PATH_MAX_LENGTH];
+ uint64_t cpu = rarch_get_cpu_features();
+
+ snprintf(cpu_str, sizeof(cpu_str), "CPU Features: ");
+
+ if (cpu & RETRO_SIMD_MMX)
+ strlcat(cpu_str, "MMX ", sizeof(cpu_str));
+ if (cpu & RETRO_SIMD_MMXEXT)
+ strlcat(cpu_str, "MMXEXT ", sizeof(cpu_str));
+ if (cpu & RETRO_SIMD_SSE)
+ strlcat(cpu_str, "SSE1 ", sizeof(cpu_str));
+ if (cpu & RETRO_SIMD_SSE2)
+ strlcat(cpu_str, "SSE2 ", sizeof(cpu_str));
+ if (cpu & RETRO_SIMD_SSE3)
+ strlcat(cpu_str, "SSE3 ", sizeof(cpu_str));
+ if (cpu & RETRO_SIMD_SSSE3)
+ strlcat(cpu_str, "SSSE3 ", sizeof(cpu_str));
+ if (cpu & RETRO_SIMD_SSE4)
+ strlcat(cpu_str, "SSE4 ", sizeof(cpu_str));
+ if (cpu & RETRO_SIMD_SSE42)
+ strlcat(cpu_str, "SSE4.2 ", sizeof(cpu_str));
+ if (cpu & RETRO_SIMD_AVX)
+ strlcat(cpu_str, "AVX ", sizeof(cpu_str));
+ if (cpu & RETRO_SIMD_AVX2)
+ strlcat(cpu_str, "AVX2 ", sizeof(cpu_str));
+ if (cpu & RETRO_SIMD_VFPU)
+ strlcat(cpu_str, "VFPU ", sizeof(cpu_str));
+ if (cpu & RETRO_SIMD_NEON)
+ strlcat(cpu_str, "NEON ", sizeof(cpu_str));
+ if (cpu & RETRO_SIMD_PS)
+ strlcat(cpu_str, "PS ", sizeof(cpu_str));
+ if (cpu & RETRO_SIMD_AES)
+ strlcat(cpu_str, "AES ", sizeof(cpu_str));
+ if (cpu & RETRO_SIMD_VMX)
+ strlcat(cpu_str, "VMX ", sizeof(cpu_str));
+ if (cpu & RETRO_SIMD_VMX128)
+ strlcat(cpu_str, "VMX128 ", sizeof(cpu_str));
+ menu_list_push(list, cpu_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+ }
+
+ if (frontend)
+ {
+ int major = 0, minor = 0;
+
+ snprintf(tmp, sizeof(tmp), "Frontend identifier: %s",
+ frontend->ident);
+ menu_list_push(list, tmp, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ if (frontend->get_name)
+ {
+ frontend->get_name(tmp2, sizeof(tmp2));
+ snprintf(tmp, sizeof(tmp), "Frontend name: %s",
+ frontend->get_name ? tmp2 : "N/A");
+ menu_list_push(list, tmp, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+ }
+
+ if (frontend->get_os)
+ {
+ frontend->get_os(tmp2, sizeof(tmp2), &major, &minor);
+ snprintf(tmp, sizeof(tmp), "Frontend OS: %s %d.%d",
+ frontend->get_os ? tmp2 : "N/A", major, minor);
+ menu_list_push(list, tmp, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+ }
+
+ snprintf(tmp, sizeof(tmp), "RetroRating level: %d",
+ frontend->get_rating ? frontend->get_rating() : -1);
+ menu_list_push(list, tmp, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ if (frontend->get_powerstate)
+ {
+ int seconds = 0, percent = 0;
+ enum frontend_powerstate state = frontend->get_powerstate(&seconds, &percent);
+
+ tmp2[0] = '\0';
+
+ if (percent != 0)
+ snprintf(tmp2, sizeof(tmp2), "%d%%", percent);
+
+ switch (state)
+ {
+ case FRONTEND_POWERSTATE_NONE:
+ strlcat(tmp2, " N/A", sizeof(tmp));
+ break;
+ case FRONTEND_POWERSTATE_NO_SOURCE:
+ strlcat(tmp2, " (No source)", sizeof(tmp));
+ break;
+ case FRONTEND_POWERSTATE_CHARGING:
+ strlcat(tmp2, " (Charging)", sizeof(tmp));
+ break;
+ case FRONTEND_POWERSTATE_CHARGED:
+ strlcat(tmp2, " (Charged)", sizeof(tmp));
+ break;
+ case FRONTEND_POWERSTATE_ON_POWER_SOURCE:
+ strlcat(tmp2, " (Discharging)", sizeof(tmp));
+ break;
+ }
+
+ snprintf(tmp, sizeof(tmp), "Power source : %s",
+ tmp2);
+ menu_list_push(list, tmp, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+ }
+ }
+
+ tmp_string = gfx_ctx_get_ident();
+
+ snprintf(tmp, sizeof(tmp), "Video context driver: %s",
+ tmp_string ? tmp_string : "N/A");
+ menu_list_push(list, tmp, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ {
+ float val = 0.0f;
+ if (gfx_ctx_get_metrics(DISPLAY_METRIC_MM_WIDTH, &val))
+ {
+ snprintf(tmp, sizeof(tmp), "Display metric width (mm): %.2f",
+ val);
+ menu_list_push(list, tmp, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+ }
+
+ if (gfx_ctx_get_metrics(DISPLAY_METRIC_MM_HEIGHT, &val))
+ {
+ snprintf(tmp, sizeof(tmp), "Display metric height (mm): %.2f",
+ val);
+ menu_list_push(list, tmp, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+ }
+
+ if (gfx_ctx_get_metrics(DISPLAY_METRIC_DPI, &val))
+ {
+ snprintf(tmp, sizeof(tmp), "Display metric DPI: %.2f",
+ val);
+ menu_list_push(list, tmp, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+ }
+ }
+ }
+
+ {
+ char feat_str[PATH_MAX_LENGTH];
+
+ snprintf(feat_str, sizeof(feat_str),
+ "LibretroDB support: %s", _libretrodb_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "Overlay support: %s", _overlay_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "Command interface support: %s", _command_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "Network Command interface support: %s", _network_command_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "Cocoa support: %s", _cocoa_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "PNG support (RPNG): %s", _rpng_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "SDL1.2 support: %s", _sdl_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "SDL2 support: %s", _sdl2_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+
+ snprintf(feat_str, sizeof(feat_str),
+ "OpenGL support: %s", _opengl_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "OpenGL ES support: %s", _opengles_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "Threading support: %s", _thread_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "KMS/EGL support: %s", _kms_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "Udev support: %s", _udev_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "OpenVG support: %s", _vg_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "EGL support: %s", _egl_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "X11 support: %s", _x11_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "Wayland support: %s", _wayland_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "XVideo support: %s", _xvideo_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "ALSA support: %s", _alsa_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "OSS support: %s", _oss_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "OpenAL support: %s", _al_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "OpenSL support: %s", _sl_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "RSound support: %s", _rsound_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "RoarAudio support: %s", _roar_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "JACK support: %s", _jack_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "PulseAudio support: %s", _pulse_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "DirectSound support: %s", _dsound_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "XAudio2 support: %s", _xaudio_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "Zlib support: %s", _zlib_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "7zip support: %s", _7zip_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "Dynamic library support: %s", _dylib_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "Cg support: %s", _cg_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "GLSL support: %s", _glsl_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "HLSL support: %s", _hlsl_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "libxml2 XML parsing support: %s", _libxml2_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "SDL image support: %s", _sdl_image_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "OpenGL/Direct3D render-to-texture (multi-pass shaders) support: %s", _fbo_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "FFmpeg support: %s", _ffmpeg_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "CoreText support: %s", _coretext_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "FreeType support: %s", _freetype_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "Netplay (peer-to-peer) support: %s", _netplay_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "Python (script support in shaders) support: %s", _python_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "Video4Linux2 support: %s", _v4l2_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+
+ snprintf(feat_str, sizeof(feat_str),
+ "Libusb support: %s", _libusb_supp ? "true" : "false");
+ menu_list_push(list, feat_str, "",
+ MENU_SETTINGS_CORE_INFO_NONE, 0);
+ }
+
+ menu_driver_populate_entries(path, label, type);
+
+ return 0;
+}
+
static int deferred_push_rdb_entry_detail(void *data, void *userdata,
const char *path, const char *label, unsigned type)
{
@@ -1550,9 +1958,6 @@ static void print_buf_lines(file_list_t *list, char *buf, int buf_size,
/* HACK - we have to find some way to pass state inbetween
* function pointer callback functions that don't necessarily
* call each other. */
-extern char core_updater_list_path[PATH_MAX_LENGTH];
-extern char core_updater_list_label[PATH_MAX_LENGTH];
-extern unsigned core_updater_list_type;
static char *core_buf;
static size_t core_len;
@@ -1566,6 +1971,9 @@ int cb_core_updater_list(void *data_, size_t len)
if (!data)
return -1;
+ if (core_buf)
+ free(core_buf);
+
core_buf = (char*)malloc(len * sizeof(char));
if (!core_buf)
@@ -1587,11 +1995,7 @@ static int deferred_push_core_updater_list(void *data, void *userdata,
print_buf_lines(list, core_buf, core_len, MENU_FILE_DOWNLOAD_CORE);
- if (core_buf)
- free(core_buf);
-
- menu_list_populate_generic(list, core_updater_list_path,
- core_updater_list_label, core_updater_list_type);
+ menu_list_populate_generic(list, path, label, type);
return 0;
}
@@ -1763,6 +2167,13 @@ static int deferred_push_remap_file_load(void *data, void *userdata,
MENU_FILE_REMAP, "rmp", NULL);
}
+static int deferred_push_record_configfile(void *data, void *userdata,
+ const char *path, const char *label, unsigned type)
+{
+ return menu_entries_parse_list((file_list_t*)data, (file_list_t*)userdata, path, label, type,
+ MENU_FILE_RECORD_CONFIG, "cfg", NULL);
+}
+
static int deferred_push_input_overlay(void *data, void *userdata,
const char *path, const char *label, unsigned type)
{
@@ -1875,6 +2286,8 @@ void menu_entries_cbs_init_bind_deferred_push(menu_file_list_cbs_t *cbs,
cbs->action_deferred_push = deferred_push_cheat_file_load;
else if (!strcmp(label, "remap_file_load"))
cbs->action_deferred_push = deferred_push_remap_file_load;
+ else if (!strcmp(label, "record_config"))
+ cbs->action_deferred_push = deferred_push_record_configfile;
else if (!strcmp(label, "content_actions"))
cbs->action_deferred_push = deferred_push_content_actions;
else if (!strcmp(label, "shader_options"))
@@ -1916,6 +2329,8 @@ void menu_entries_cbs_init_bind_deferred_push(menu_file_list_cbs_t *cbs,
cbs->action_deferred_push = deferred_push_cursor_manager_list_deferred_query_subsearch;
else if (!strcmp(label, "core_information"))
cbs->action_deferred_push = deferred_push_core_information;
+ else if (!strcmp(label, "system_information"))
+ cbs->action_deferred_push = deferred_push_system_information;
else if (!strcmp(label, "performance_counters"))
cbs->action_deferred_push = deferred_push_performance_counters;
else if (!strcmp(label, "core_counters"))
diff --git a/menu/menu_entries_cbs_iterate.c b/menu/menu_entries_cbs_iterate.c
index 2bce56e227..f7e9995a57 100644
--- a/menu/menu_entries_cbs_iterate.c
+++ b/menu/menu_entries_cbs_iterate.c
@@ -137,19 +137,6 @@ static int load_or_open_zip_iterate(unsigned action)
return 0;
}
-static INLINE struct video_shader *shader_manager_get_current_shader(const char *label, unsigned type)
-{
- menu_handle_t *menu = menu_driver_get_ptr();
- if (!menu)
- return NULL;
-
- if (!strcmp(label, "video_shader_preset_parameters"))
- return menu->shader;
- else if (!strcmp(label, "video_shader_parameters"))
- return video_shader_driver_get_current_shader();
- return NULL;
-}
-
static int action_iterate_help(const char *label, unsigned action)
{
unsigned i;
diff --git a/menu/menu_entries_cbs_ok.c b/menu/menu_entries_cbs_ok.c
index 0e700dd8bd..b3e96dfd16 100644
--- a/menu/menu_entries_cbs_ok.c
+++ b/menu/menu_entries_cbs_ok.c
@@ -27,9 +27,6 @@
#include "../input/input_remapping.h"
/* FIXME - Global variables, refactor */
-char core_updater_list_path[PATH_MAX_LENGTH];
-char core_updater_list_label[PATH_MAX_LENGTH];
-unsigned core_updater_list_type;
unsigned rdb_entry_start_game_selection_ptr;
size_t hack_shader_pass = 0;
#ifdef HAVE_NETWORKING
@@ -288,11 +285,6 @@ static int action_ok_core_updater_list(const char *path,
driver->menu->nonblocking_refresh = true;
(void)url_path;
-#ifdef HAVE_NETWORKING
- strlcpy(core_updater_list_path, path, sizeof(core_updater_list_path));
- strlcpy(core_updater_list_label, label, sizeof(core_updater_list_label));
- core_updater_list_type = type;
-#endif
if (settings->network.buildbot_url[0] == '\0')
return -1;
@@ -327,6 +319,21 @@ static int action_ok_remap_file(const char *path,
label, type, idx);
}
+static int action_ok_record_configfile(const char *path,
+ const char *label, unsigned type, size_t idx)
+{
+ menu_handle_t *menu = menu_driver_get_ptr();
+ global_t *global = global_get_ptr();
+
+ if (!menu)
+ return -1;
+
+ return menu_list_push_stack_refresh(
+ menu->menu_list,
+ global->record.config_dir,
+ label, type, idx);
+}
+
static int action_ok_core_list(const char *path,
const char *label, unsigned type, size_t idx)
{
@@ -342,6 +349,24 @@ static int action_ok_core_list(const char *path,
label, type, idx);
}
+static int action_ok_record_configfile_load(const char *path,
+ const char *label, unsigned type, size_t idx)
+{
+ const char *menu_path = NULL;
+ global_t *global = global_get_ptr();
+ menu_handle_t *menu = menu_driver_get_ptr();
+ if (!menu || !global)
+ return -1;
+
+ menu_list_get_last_stack(menu->menu_list, &menu_path, NULL,
+ NULL);
+
+ fill_pathname_join(global->record.config, menu_path, path, sizeof(global->record.config));
+
+ menu_list_flush_stack_by_needle(menu->menu_list, "Recording Settings");
+ return 0;
+}
+
static int action_ok_remap_file_load(const char *path,
const char *label, unsigned type, size_t idx)
{
@@ -593,7 +618,8 @@ static int action_ok_path_use_directory(const char *path,
if (setting->type != ST_DIR)
return -1;
- menu_action_setting_set_current_string(setting, menu_path);
+ strlcpy(setting->value.string, menu_path, setting->size);
+ menu_setting_generic(setting);
menu_list_pop_stack_by_needle(menu->menu_list, setting->name);
return 0;
@@ -1231,7 +1257,9 @@ void menu_entries_cbs_init_bind_ok(menu_file_list_cbs_t *cbs,
if (!menu)
return;
+#if 0
RARCH_LOG("path: %s, label: %s, elem0 : %s, elem1: %s\n", path, label, elem0, elem1);
+#endif
cbs->action_ok = action_ok_lookup_setting;
@@ -1287,6 +1315,8 @@ void menu_entries_cbs_init_bind_ok(menu_file_list_cbs_t *cbs,
cbs->action_ok = action_ok_video_filter;
else if (!strcmp(label, "remap_file_load"))
cbs->action_ok = action_ok_remap_file;
+ else if (!strcmp(label, "record_config"))
+ cbs->action_ok = action_ok_record_configfile;
else if (!strcmp(label, "core_updater_list"))
cbs->action_ok = action_ok_core_updater_list;
else if (!strcmp(label, "video_shader_parameters") ||
@@ -1301,6 +1331,7 @@ void menu_entries_cbs_init_bind_ok(menu_file_list_cbs_t *cbs,
!strcmp(label, "core_cheat_options") ||
!strcmp(label, "core_input_remapping_options") ||
!strcmp(label, "core_information") ||
+ !strcmp(label, "system_information") ||
!strcmp(label, "disk_options") ||
!strcmp(label, "settings") ||
!strcmp(label, "performance_counters") ||
@@ -1359,6 +1390,9 @@ void menu_entries_cbs_init_bind_ok(menu_file_list_cbs_t *cbs,
case MENU_FILE_CHEAT:
cbs->action_ok = action_ok_cheat_file_load;
break;
+ case MENU_FILE_RECORD_CONFIG:
+ cbs->action_ok = action_ok_record_configfile_load;
+ break;
case MENU_FILE_REMAP:
cbs->action_ok = action_ok_remap_file_load;
break;
diff --git a/menu/menu_input.c b/menu/menu_input.c
index ff3c3b6a15..1cd2459fa9 100644
--- a/menu/menu_input.c
+++ b/menu/menu_input.c
@@ -134,7 +134,10 @@ void menu_input_st_string_callback(void *userdata, const char *str)
if ((current_setting = (rarch_setting_t*)
setting_find_setting(
menu->list_settings, menu->keyboard.label_setting)))
- menu_action_setting_set_current_string(current_setting, str);
+ {
+ strlcpy(current_setting->value.string, str, current_setting->size);
+ menu_setting_generic(current_setting);
+ }
else
{
if (!strcmp(menu->keyboard.label_setting, "video_shader_preset_save_as"))
@@ -664,7 +667,7 @@ static int menu_input_mouse(unsigned *action)
static int menu_input_pointer(unsigned *action)
{
- int pointer_device, pointer_x, pointer_y, screen_x, screen_y;
+ int pointer_device, pointer_x, pointer_y;
const struct retro_keybind *binds[MAX_USERS];
menu_handle_t *menu = menu_driver_get_ptr();
runloop_t *runloop = rarch_main_get_ptr();
@@ -680,11 +683,6 @@ static int menu_input_pointer(unsigned *action)
return 0;
}
-#if defined(HAVE_XMB)
- if (driver->menu_ctx == &menu_ctx_xmb)
- return 0;
-#endif
-
pointer_device = driver->menu_ctx->set_texture?
RETRO_DEVICE_POINTER : RARCH_DEVICE_POINTER_SCREEN;
@@ -698,65 +696,13 @@ static int menu_input_pointer(unsigned *action)
pointer_x = input_driver_state(binds, 0, pointer_device, 0, RETRO_DEVICE_ID_POINTER_X);
pointer_y = input_driver_state(binds, 0, pointer_device, 0, RETRO_DEVICE_ID_POINTER_Y);
- /* by multiple presses, the main press will be the one closest to the previous coordinates */
- if(menu->pointer.pressed[1])
- {
- int pointer_x2, pointer_y2, dist1, dist2;
+ menu->pointer.x = ((pointer_x + 0x7fff) * (int)menu->frame_buf.width) / 0xFFFF;
+ menu->pointer.y = ((pointer_y + 0x7fff) * (int)menu->frame_buf.height) / 0xFFFF;
- pointer_x2 = input_driver_state(binds, 0, pointer_device, 1, RETRO_DEVICE_ID_POINTER_X);
- pointer_y2 = input_driver_state(binds, 0, pointer_device, 1, RETRO_DEVICE_ID_POINTER_Y);
-
- dist1 = (pointer_x - menu->pointer.old_x) * (pointer_x - menu->pointer.old_x) +
- (pointer_y - menu->pointer.old_y) * (pointer_y - menu->pointer.old_y);
- dist2 = (pointer_x2 - menu->pointer.old_x) * (pointer_x2 - menu->pointer.old_x) +
- (pointer_y2 - menu->pointer.old_y) * (pointer_y2 - menu->pointer.old_y);
-
- if (dist2 < dist1)
- {
- int temp;
- pointer_x = pointer_x2;
- pointer_y = pointer_y2;
- temp = menu->pointer.pressed[0];
- menu->pointer.pressed[0] = menu->pointer.pressed[1];
- menu->pointer.pressed[1] = temp;
- }
- }
- menu->pointer.old_x = pointer_x;
- menu->pointer.old_y = pointer_y;
-
- screen_x = ((pointer_x + 0x7fff) * (int)menu->frame_buf.width) / 0xFFFF;
- screen_y = ((pointer_y + 0x7fff) * (int)menu->frame_buf.height) / 0xFFFF;
-
- if (menu->pointer.pressed[0])
- {
- menu->mouse.x = screen_x;
- menu->mouse.y = screen_y;
- if (menu->mouse.x < 5)
- menu->mouse.x = 5;
- if (menu->mouse.y < 5)
- menu->mouse.y = 5;
- if (menu->mouse.x > (int)menu->frame_buf.width - 5)
- menu->mouse.x = menu->frame_buf.width - 5;
- if (menu->mouse.y > (int)menu->frame_buf.height - 5)
- menu->mouse.y = menu->frame_buf.height - 5;
-
- menu->mouse.scrollup = (menu->mouse.y == 5);
- menu->mouse.scrolldown = (menu->mouse.y == (int)menu->frame_buf.height - 5);
-
- menu->pointer.cancel = false;
-
- if(menu->pointer.oldpressed[1] && !menu->pointer.pressed[1])
- menu->pointer.back = true;
- }
- else
- menu->pointer.cancel = screen_x < 5 || screen_x > (int)menu->frame_buf.width - 5
- || screen_x < 5 || screen_x > (int)menu->frame_buf.height - 5;
-
- menu->pointer.oldpressed[1] = menu->pointer.pressed[1];
-
-
- if (menu->pointer.pressed[0] || menu->pointer.back || menu->mouse.x != screen_x || menu->mouse.y != screen_y)
- runloop->frames.video.current.menu.animation.is_active = true;
+ if (menu->pointer.pressed[0] || menu->pointer.oldpressed[0]
+ || menu->pointer.back || menu->pointer.dragging
+ || menu->pointer.dy != 0 || menu->pointer.dx != 0)
+ runloop->frames.video.current.menu.animation.is_active = true;
return 0;
}
@@ -839,13 +785,38 @@ static int menu_input_mouse_post_iterate(menu_file_list_cbs_t *cbs,
return 0;
}
+static int pointer_tap(menu_file_list_cbs_t *cbs, const char *path,
+ const char *label, unsigned type, unsigned action)
+{
+ menu_handle_t *menu = menu_driver_get_ptr();
+
+ driver_t *driver = driver_get_ptr();
+ rarch_setting_t *setting =
+ (rarch_setting_t*)setting_find_setting
+ (driver->menu->list_settings,
+ driver->menu->menu_list->selection_buf->list[menu->navigation.selection_ptr].label);
+
+ if (menu->pointer.ptr == menu->navigation.selection_ptr
+ && cbs && cbs->action_toggle && setting &&
+ (setting->type == ST_BOOL || setting->type == ST_UINT
+ || setting->type == ST_FLOAT || setting->type == ST_STRING))
+ return cbs->action_toggle(type, label, MENU_ACTION_RIGHT, true);
+ else if (menu->pointer.ptr == menu->navigation.selection_ptr)
+ return cbs->action_ok(path, label, type, menu->navigation.selection_ptr);
+ else
+ menu_navigation_set(&menu->navigation, menu->pointer.ptr, false);
+
+ return 0;
+}
+
static int menu_input_pointer_post_iterate(menu_file_list_cbs_t *cbs,
const char *path,
const char *label, unsigned type, unsigned action)
{
- menu_handle_t *menu = menu_driver_get_ptr();
- settings_t *settings = config_get_ptr();
- driver_t *driver = driver_get_ptr();
+ int ret = 0;
+ menu_handle_t *menu = menu_driver_get_ptr();
+ driver_t *driver = driver_get_ptr();
+ settings_t *settings = config_get_ptr();
if (!menu)
return -1;
@@ -854,46 +825,53 @@ static int menu_input_pointer_post_iterate(menu_file_list_cbs_t *cbs,
#ifdef HAVE_OVERLAY
|| (settings->input.overlay_enable && driver && driver->overlay)
#endif
- )
+ )
return 0;
-#if defined(HAVE_XMB)
- if (driver->menu_ctx == &menu_ctx_xmb)
- return 0;
-#endif
-
if (menu->pointer.pressed[0])
{
- if (menu->pointer.oldpressed[0])
+ if (!menu->pointer.oldpressed[0])
{
- if (menu->mouse.ptr <= menu_list_get_size(menu->menu_list)-1)
- menu_navigation_set(&menu->navigation, menu->mouse.ptr, false);
- }
- else
+ menu->pointer.start_x = menu->pointer.x;
+ menu->pointer.start_y = menu->pointer.y;
+ menu->pointer.old_x = menu->pointer.x;
+ menu->pointer.old_y = menu->pointer.y;
menu->pointer.oldpressed[0] = true;
+ }
+ else if (menu->pointer.x != menu->pointer.start_x
+ && menu->pointer.y != menu->pointer.start_y)
+ {
+ menu->pointer.dragging = true;
+ menu->pointer.dx = menu->pointer.x - menu->pointer.old_x;
+ menu->pointer.dy = menu->pointer.y - menu->pointer.old_y;
+ menu->pointer.old_x = menu->pointer.x;
+ menu->pointer.old_y = menu->pointer.y;
+ }
}
else
{
if (menu->pointer.oldpressed[0])
{
- rarch_setting_t *setting = NULL;
-
+ if (!menu->pointer.dragging)
+ {
+ if (menu->pointer.start_y < menu->header_height)
+ {
+ menu_list_pop_stack(menu->menu_list);
+ }
+ else if (menu->pointer.ptr <= menu_list_get_size(menu->menu_list)-1)
+ {
+ menu->pointer.oldpressed[0] = false;
+ ret = pointer_tap(cbs, path, label, type, action);
+ }
+ }
menu->pointer.oldpressed[0] = false;
- setting = (rarch_setting_t*)setting_find_setting
- (menu->list_settings,
- menu->menu_list->selection_buf->list[menu->navigation.selection_ptr].label);
-
- if (menu->mouse.ptr == menu->navigation.selection_ptr && !menu->pointer.cancel
- && cbs && cbs->action_toggle && setting &&
- (setting->type == ST_BOOL || setting->type == ST_UINT || setting->type == ST_FLOAT
- || setting->type == ST_STRING))
- return cbs->action_toggle(type, label, MENU_ACTION_RIGHT, true);
- if (menu->mouse.ptr == menu->navigation.selection_ptr && !menu->pointer.cancel
- && cbs && cbs->action_ok)
- return cbs->action_ok(path, label, type,
- menu->navigation.selection_ptr);
- else if (menu->mouse.ptr <= menu_list_get_size(menu->menu_list) - 1)
- menu_navigation_set(&menu->navigation, menu->mouse.ptr, false);
+ menu->pointer.start_x = 0;
+ menu->pointer.start_y = 0;
+ menu->pointer.old_x = 0;
+ menu->pointer.old_y = 0;
+ menu->pointer.dx = 0;
+ menu->pointer.dy = 0;
+ menu->pointer.dragging = false;
}
}
@@ -907,14 +885,18 @@ static int menu_input_pointer_post_iterate(menu_file_list_cbs_t *cbs,
}
menu->pointer.oldback = menu->pointer.back;
- return 0;
+ return ret;
}
void menu_input_post_iterate(int *ret, menu_file_list_cbs_t *cbs, const char *path,
const char *label, unsigned type, unsigned action)
{
- *ret = menu_input_mouse_post_iterate (cbs, path, label, type, action);
- *ret |= menu_input_pointer_post_iterate(cbs, path, label, type, action);
+ settings_t *settings = config_get_ptr();
+
+ if (settings->menu.mouse.enable)
+ *ret = menu_input_mouse_post_iterate (cbs, path, label, type, action);
+ if (settings->menu.pointer.enable)
+ *ret |= menu_input_pointer_post_iterate(cbs, path, label, type, action);
}
unsigned menu_input_frame(retro_input_t input, retro_input_t trigger_input)
@@ -931,6 +913,7 @@ unsigned menu_input_frame(retro_input_t input, retro_input_t trigger_input)
| (1ULL << RETRO_DEVICE_ID_JOYPAD_R);
menu_handle_t *menu = menu_driver_get_ptr();
driver_t *driver = driver_get_ptr();
+ settings_t *settings = config_get_ptr();
if (!menu || !driver)
return 0;
@@ -999,8 +982,11 @@ unsigned menu_input_frame(retro_input_t input, retro_input_t trigger_input)
else
ret = MENU_ACTION_NOOP;
- menu_input_mouse(&ret);
- menu_input_pointer(&ret);
+ if (settings->menu.mouse.enable)
+ menu_input_mouse(&ret);
+
+ if (settings->menu.pointer.enable)
+ menu_input_pointer(&ret);
return ret;
}
diff --git a/menu/menu_setting.h b/menu/menu_setting.h
index 3837424e17..874f8f8d3c 100644
--- a/menu/menu_setting.h
+++ b/menu/menu_setting.h
@@ -27,9 +27,6 @@ int menu_setting_generic(rarch_setting_t *setting);
int menu_setting_handler(rarch_setting_t *setting, unsigned action);
-int menu_action_setting_set_current_string(
- rarch_setting_t *setting, const char *str);
-
int menu_setting_set(unsigned type, const char *label,
unsigned action, bool wraparound);
diff --git a/patch.c b/patch.c
index e0ea5de493..321998be4b 100644
--- a/patch.c
+++ b/patch.c
@@ -50,7 +50,9 @@ struct bps_data
static uint8_t bps_read(struct bps_data *bps)
{
uint8_t data = bps->modify_data[bps->modify_offset++];
+#ifdef HAVE_ZLIB
bps->modify_checksum = zlib_crc32_adjust(bps->modify_checksum, data);
+#endif
return data;
}
@@ -77,7 +79,9 @@ static void bps_write(struct bps_data *bps, uint8_t data)
return;
bps->target_data[bps->output_offset++] = data;
+#ifdef HAVE_ZLIB
bps->target_checksum = zlib_crc32_adjust(bps->target_checksum, data);
+#endif
}
patch_error_t bps_apply_patch(
@@ -175,7 +179,12 @@ patch_error_t bps_apply_patch(
for (i = 0; i < 32; i += 8)
modify_modify_checksum |= bps_read(&bps) << i;
+#ifdef HAVE_ZLIB
bps.source_checksum = zlib_crc32_calculate(bps.source_data, bps.source_length);
+#else
+ return PATCH_PATCH_CHECKSUM_INVALID;
+#endif
+
bps.target_checksum = ~bps.target_checksum;
if (bps.source_checksum != modify_source_checksum)
@@ -204,7 +213,9 @@ static uint8_t ups_patch_read(struct ups_data *data)
if (data && data->patch_offset < data->patch_length)
{
uint8_t n = data->patch_data[data->patch_offset++];
+#ifdef HAVE_ZLIB
data->patch_checksum = zlib_crc32_adjust(data->patch_checksum, n);
+#endif
return n;
}
return 0x00;
@@ -215,7 +226,9 @@ static uint8_t ups_source_read(struct ups_data *data)
if (data && data->source_offset < data->source_length)
{
uint8_t n = data->source_data[data->source_offset++];
+#ifdef HAVE_ZLIB
data->source_checksum = zlib_crc32_adjust(data->source_checksum, n);
+#endif
return n;
}
return 0x00;
@@ -226,7 +239,9 @@ static void ups_target_write(struct ups_data *data, uint8_t n)
if (data && data->target_offset < data->target_length)
{
data->target_data[data->target_offset] = n;
+#ifdef HAVE_ZLIB
data->target_checksum = zlib_crc32_adjust(data->target_checksum, n);
+#endif
}
if (data)
diff --git a/qb/config.libs.sh b/qb/config.libs.sh
index dcd5745691..3f95252ea7 100644
--- a/qb/config.libs.sh
+++ b/qb/config.libs.sh
@@ -258,7 +258,12 @@ if [ "$HAVE_THREADS" != 'no' ]; then
check_pkgconf AVUTIL libavutil 51
check_pkgconf SWSCALE libswscale 2.1
check_header AV_CHANNEL_LAYOUT libavutil/channel_layout.h
- ( [ "$HAVE_FFMPEG" = 'auto' ] && ( [ "$HAVE_AVCODEC" = 'no' ] || [ "$HAVE_AVFORMAT" = 'no' ] || [ "$HAVE_AVUTIL" = 'no' ] || [ "$HAVE_SWSCALE" = 'no' ] ) && HAVE_FFMPEG='no' ) || HAVE_FFMPEG='yes'
+
+ HAVE_FFMPEG='yes'
+ if [ "$HAVE_AVCODEC" = 'no' ] || [ "$HAVE_AVFORMAT" = 'no' ] || [ "$HAVE_AVUTIL" = 'no' ] || [ "$HAVE_SWSCALE" = 'no' ]; then
+ HAVE_FFMPEG='no'
+ echo "Notice: FFmpeg recording disabled due to missing or unsuitable packages."
+ fi
fi
else
echo "Notice: Not building with threading support. Will skip FFmpeg."
diff --git a/qb/qb.comp.sh b/qb/qb.comp.sh
index 6fa7110f83..e695d6d938 100644
--- a/qb/qb.comp.sh
+++ b/qb/qb.comp.sh
@@ -26,7 +26,13 @@ if [ -z "$CROSS_COMPILE" ] || [ -z "$OS" ]; then
esac
fi
-echo "$ECHOBUF ... $OS"
+DISTRO=''
+if [ -e /etc/lsb-release ]; then
+ . /etc/lsb-release
+ DISTRO="(${DISTRIB_DESCRIPTION} ${DISTRIB_RELEASE})"
+fi
+
+echo "$ECHOBUF ... $OS ${DISTRO}"
# Checking for working C compiler
if [ "$USE_LANG_C" = 'yes' ]; then
@@ -37,7 +43,7 @@ if [ "$USE_LANG_C" = 'yes' ]; then
int main(void) { puts("Hai world!"); return 0; }
EOF
if [ -z "$CC" ]; then
- for CC in ${CC:=$(which ${CROSS_COMPILE}gcc ${CROSS_COMPILE}cc ${CROSS_COMPILE}clang)} ''; do
+ for CC in ${CC:=$(which ${CROSS_COMPILE}gcc ${CROSS_COMPILE}cc ${CROSS_COMPILE}clang 2>/dev/null)} ''; do
"$CC" -o "$TEMP_EXE" "$TEMP_C" >/dev/null 2>&1 && break
done
fi
@@ -55,7 +61,7 @@ if [ "$USE_LANG_CXX" = 'yes' ]; then
int main() { std::cout << "Hai guise" << std::endl; return 0; }
EOF
if [ -z "$CXX" ]; then
- for CXX in ${CXX:=$(which ${CROSS_COMPILE}g++ ${CROSS_COMPILE}c++ ${CROSS_COMPILE}clang++)} ''; do
+ for CXX in ${CXX:=$(which ${CROSS_COMPILE}g++ ${CROSS_COMPILE}c++ ${CROSS_COMPILE}clang++ 2>/dev/null)} ''; do
"$CXX" -o "$TEMP_EXE" "$TEMP_CXX" >/dev/null 2>&1 && break
done
fi
@@ -72,3 +78,23 @@ if [ "$OS" = "Win32" ]; then
fi
echo "$ECHOBUF ... $WINDRES"
fi
+
+ECHOBUF="Checking for pkg-config"
+
+[ -n "$PKG_CONF_PATH" ] || {
+ PKG_CONF_PATH="none"
+
+ for path in $(which "${CROSS_COMPILE}pkg-config" 2>/dev/null) ''; do
+ [ -n "$path" ] && {
+ PKG_CONF_PATH=$path;
+ break;
+ }
+ done
+
+}
+
+echo "$ECHOBUF ... $PKG_CONF_PATH"
+
+if [ "$PKG_CONF_PATH" = "none" ]; then
+ echo "Warning: pkg-config not found, package checks will fail."
+fi
diff --git a/qb/qb.libs.sh b/qb/qb.libs.sh
index f73ebca7a2..e56d9b7eea 100644
--- a/qb/qb.libs.sh
+++ b/qb/qb.libs.sh
@@ -104,25 +104,26 @@ check_pkgconf() #$1 = HAVE_$1 $2 = package $3 = version $4 = critical error mess
{ tmpval="$(eval echo \$HAVE_$1)"
[ "$tmpval" = 'no' ] && return 0
- [ "$PKG_CONF_PATH" ] || {
- ECHOBUF="Checking for pkg-config"
-# echo -n "Checking for pkg-config"
- for PKG_CONF_PATH in $(which "${CROSS_COMPILE}pkg-config") ''; do [ "$PKG_CONF_PATH" ] && break; done
- [ "$PKG_CONF_PATH" ] || { echo "pkg-config not found. Exiting ..."; exit 1;}
- echo "$ECHOBUF ... $PKG_CONF_PATH"
+ ECHOBUF="Checking presence of package $2"
+ [ "$3" ] && ECHOBUF="$ECHOBUF >= $3"
+
+ [ "$PKG_CONF_PATH" = "none" ] && {
+ eval HAVE_$1="no"
+ echo "$ECHOBUF ... no"
+ return 0
}
- ECHOBUF="Checking presence of package $2"
- [ "$3" ] && ECHOBUF="$ECHOBUF with minimum version $3"
-# echo -n "$ECHOBUF ... "
answer='no'
+ 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)\"
}
- eval HAVE_$1="$answer"; echo "$ECHOBUF ... $answer"
+ eval HAVE_$1="$answer";
+ echo "$ECHOBUF ... $version"
PKG_CONF_USED="$PKG_CONF_USED $1"
[ "$answer" = 'no' ] && {
[ "$4" ] && { echo "$4"; exit 1;}
diff --git a/record/drivers/ffmpeg.c b/record/drivers/ffmpeg.c
index e632d4e22f..585d788468 100644
--- a/record/drivers/ffmpeg.c
+++ b/record/drivers/ffmpeg.c
@@ -1408,7 +1408,7 @@ static void ffmpeg_thread(void *data)
av_free(audio_buf);
}
-const ffemu_backend_t ffemu_ffmpeg = {
+const record_driver_t ffemu_ffmpeg = {
ffmpeg_new,
ffmpeg_free,
ffmpeg_push_video,
diff --git a/record/drivers/record_null.c b/record/drivers/record_null.c
new file mode 100644
index 0000000000..252752cb80
--- /dev/null
+++ b/record/drivers/record_null.c
@@ -0,0 +1,62 @@
+/* RetroArch - A frontend for libretro.
+ * Copyright (C) 2010-2014 - Hans-Kristian Arntzen
+ * Copyright (C) 2011-2015 - Daniel De Matteis
+ *
+ * RetroArch is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Found-
+ * ation, either version 3 of the License, or (at your option) any later version.
+ *
+ * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with RetroArch.
+ * If not, see .
+ */
+
+#include
+
+#ifdef HAVE_CONFIG_H
+#include "../../config.h"
+#endif
+
+#include
+#include
+#include
+#include
+#include "../record_driver.h"
+
+static void record_null_free(void *data)
+{
+}
+
+static void *record_null_new(const struct ffemu_params *params)
+{
+ return NULL;
+}
+
+static bool record_null_push_video(void *data,
+ const struct ffemu_video_data *video_data)
+{
+ return false;
+}
+
+static bool record_null_push_audio(void *data,
+ const struct ffemu_audio_data *audio_data)
+{
+ return false;
+}
+
+static bool record_null_finalize(void *data)
+{
+ return false;
+}
+
+const record_driver_t ffemu_null = {
+ record_null_new,
+ record_null_free,
+ record_null_push_video,
+ record_null_push_audio,
+ record_null_finalize,
+ "null",
+};
diff --git a/record/record_driver.c b/record/record_driver.c
index 61c71a5a78..a0f880a517 100644
--- a/record/record_driver.c
+++ b/record/record_driver.c
@@ -15,6 +15,7 @@
*/
#include
+#include
#include "record_driver.h"
#include "../driver.h"
@@ -30,13 +31,114 @@
#include "../config.h"
#endif
-static const ffemu_backend_t *ffemu_backends[] = {
+static const record_driver_t *record_drivers[] = {
#ifdef HAVE_FFMPEG
&ffemu_ffmpeg,
#endif
+ &ffemu_null,
NULL,
};
+/**
+ * record_driver_find_ident:
+ * @idx : index of driver to get handle to.
+ *
+ * Returns: Human-readable identifier of record driver at index. Can be NULL
+ * if nothing found.
+ **/
+const char *record_driver_find_ident(int idx)
+{
+ const record_driver_t *drv = record_drivers[idx];
+ if (!drv)
+ return NULL;
+ return drv->ident;
+}
+
+/**
+ * record_driver_find_handle:
+ * @idx : index of driver to get handle to.
+ *
+ * Returns: handle to record driver at index. Can be NULL
+ * if nothing found.
+ **/
+const void *record_driver_find_handle(int idx)
+{
+ const void *drv = record_drivers[idx];
+ if (!drv)
+ return NULL;
+ return drv;
+}
+
+/**
+ * config_get_record_driver_options:
+ *
+ * Get an enumerated list of all record driver names, separated by '|'.
+ *
+ * Returns: string listing of all record driver names, separated by '|'.
+ **/
+const char* config_get_record_driver_options(void)
+{
+ union string_list_elem_attr attr;
+ unsigned i;
+ char *options = NULL;
+ int options_len = 0;
+ struct string_list *options_l = string_list_new();
+
+ attr.i = 0;
+
+ if (!options_l)
+ return NULL;
+
+ for (i = 0; record_driver_find_handle(i); i++)
+ {
+ const char *opt = record_driver_find_ident(i);
+ options_len += strlen(opt) + 1;
+ string_list_append(options_l, opt, attr);
+ }
+
+ options = (char*)calloc(options_len, sizeof(char));
+
+ if (!options)
+ {
+ string_list_free(options_l);
+ options_l = NULL;
+ return NULL;
+ }
+
+ string_list_join_concat(options, options_len, options_l, "|");
+
+ string_list_free(options_l);
+ options_l = NULL;
+
+ return options;
+}
+
+void find_record_driver(void)
+{
+ driver_t *driver = driver_get_ptr();
+ settings_t *settings = config_get_ptr();
+
+ int i = find_driver_index("record_driver", settings->record.driver);
+
+ if (i >= 0)
+ driver->recording = (const record_driver_t*)audio_driver_find_handle(i);
+ else
+ {
+ unsigned d;
+ RARCH_ERR("Couldn't find any audio driver named \"%s\"\n",
+ settings->audio.driver);
+ RARCH_LOG_OUTPUT("Available audio drivers are:\n");
+ for (d = 0; audio_driver_find_handle(d); d++)
+ RARCH_LOG_OUTPUT("\t%s\n", record_driver_find_ident(d));
+ RARCH_WARN("Going to default to first audio driver...\n");
+
+ driver->audio = (const audio_driver_t*)audio_driver_find_handle(0);
+
+ if (!driver->audio)
+ rarch_fail(1, "find_audio_driver()");
+ }
+}
+
/**
* ffemu_find_backend:
* @ident : Identifier of driver to find.
@@ -46,19 +148,20 @@ static const ffemu_backend_t *ffemu_backends[] = {
* Returns: recording driver handle if successful, otherwise
* NULL.
**/
-const ffemu_backend_t *ffemu_find_backend(const char *ident)
+const record_driver_t *ffemu_find_backend(const char *ident)
{
unsigned i;
- for (i = 0; ffemu_backends[i]; i++)
+ for (i = 0; record_drivers[i]; i++)
{
- if (!strcmp(ffemu_backends[i]->ident, ident))
- return ffemu_backends[i];
+ if (!strcmp(record_drivers[i]->ident, ident))
+ return record_drivers[i];
}
return NULL;
}
+
/**
* gfx_ctx_init_first:
* @backend : Recording backend handle.
@@ -69,19 +172,19 @@ const ffemu_backend_t *ffemu_find_backend(const char *ident)
*
* Returns: true (1) if successful, otherwise false (0).
**/
-bool ffemu_init_first(const ffemu_backend_t **backend, void **data,
+bool record_driver_init_first(const record_driver_t **backend, void **data,
const struct ffemu_params *params)
{
unsigned i;
- for (i = 0; ffemu_backends[i]; i++)
+ for (i = 0; record_drivers[i]; i++)
{
- void *handle = ffemu_backends[i]->init(params);
+ void *handle = record_drivers[i]->init(params);
if (!handle)
continue;
- *backend = ffemu_backends[i];
+ *backend = record_drivers[i];
*data = handle;
return true;
}
@@ -183,6 +286,7 @@ bool recording_deinit(void)
**/
bool recording_init(void)
{
+ char recording_file[PATH_MAX_LENGTH];
struct ffemu_params params = {0};
global_t *global = global_get_ptr();
driver_t *driver = driver_get_ptr();
@@ -209,12 +313,19 @@ bool recording_init(void)
(float)global->system.av_info.timing.fps,
(float)global->system.av_info.timing.sample_rate);
+ strlcpy(recording_file, global->record.path, sizeof(recording_file));
+
+ if (global->record.use_output_dir)
+ fill_pathname_join(recording_file,
+ global->record.output_dir,
+ global->record.path, sizeof(recording_file));
+
params.out_width = info->geometry.base_width;
params.out_height = info->geometry.base_height;
params.fb_width = info->geometry.max_width;
params.fb_height = info->geometry.max_height;
params.channels = 2;
- params.filename = global->record.path;
+ params.filename = recording_file;
params.fps = global->system.av_info.timing.fps;
params.samplerate = global->system.av_info.timing.sample_rate;
params.pix_fmt = (global->system.pix_fmt == RETRO_PIXEL_FORMAT_XRGB8888) ?
@@ -299,7 +410,7 @@ bool recording_init(void)
params.fb_width, params.fb_height,
(unsigned)params.pix_fmt);
- if (!ffemu_init_first(&driver->recording, &driver->recording_data, ¶ms))
+ if (!record_driver_init_first(&driver->recording, &driver->recording_data, ¶ms))
{
RARCH_ERR(RETRO_LOG_INIT_RECORDING_FAILED);
event_command(EVENT_CMD_GPU_RECORD_DEINIT);
diff --git a/record/record_driver.h b/record/record_driver.h
index 86c0caa657..54e5eb0f3f 100644
--- a/record/record_driver.h
+++ b/record/record_driver.h
@@ -13,7 +13,6 @@
* You should have received a copy of the GNU General Public License along with RetroArch.
* If not, see .
*/
-
#ifndef __RECORD_DRIVER_H
#define __RECORD_DRIVER_H
@@ -81,7 +80,7 @@ struct ffemu_audio_data
size_t frames;
};
-typedef struct ffemu_backend
+typedef struct record_driver
{
void *(*init)(const struct ffemu_params *params);
void (*free)(void *data);
@@ -89,9 +88,19 @@ typedef struct ffemu_backend
bool (*push_audio)(void *data, const struct ffemu_audio_data *audio_data);
bool (*finalize)(void *data);
const char *ident;
-} ffemu_backend_t;
+} record_driver_t;
-extern const ffemu_backend_t ffemu_ffmpeg;
+extern const record_driver_t ffemu_ffmpeg;
+extern const record_driver_t ffemu_null;
+
+/**
+ * config_get_record_driver_options:
+ *
+ * Get an enumerated list of all record driver names, separated by '|'.
+ *
+ * Returns: string listing of all record driver names, separated by '|'.
+ **/
+const char* config_get_record_driver_options(void);
/**
* ffemu_find_backend:
@@ -102,7 +111,25 @@ extern const ffemu_backend_t ffemu_ffmpeg;
* Returns: recording driver handle if successful, otherwise
* NULL.
**/
-const ffemu_backend_t *ffemu_find_backend(const char *ident);
+const record_driver_t *ffemu_find_backend(const char *ident);
+
+/**
+ * record_driver_find_handle:
+ * @idx : index of driver to get handle to.
+ *
+ * Returns: handle to record driver at index. Can be NULL
+ * if nothing found.
+ **/
+const void *record_driver_find_handle(int idx);
+
+/**
+ * record_driver_find_ident:
+ * @idx : index of driver to get handle to.
+ *
+ * Returns: Human-readable identifier of record driver at index. Can be NULL
+ * if nothing found.
+ **/
+const char *record_driver_find_ident(int idx);
/**
* gfx_ctx_init_first:
@@ -114,7 +141,7 @@ const ffemu_backend_t *ffemu_find_backend(const char *ident);
*
* Returns: true (1) if successful, otherwise false (0).
**/
-bool ffemu_init_first(const ffemu_backend_t **backend, void **data,
+bool record_driver_init_first(const record_driver_t **backend, void **data,
const struct ffemu_params *params);
void recording_dump_frame(const void *data, unsigned width,
diff --git a/retroarch.c b/retroarch.c
index 1e0f6460bb..a70e5eefab 100644
--- a/retroarch.c
+++ b/retroarch.c
@@ -92,70 +92,84 @@ static void print_features(void)
{
puts("");
puts("Features:");
- _PSUPP(sdl, "SDL", "SDL drivers");
- _PSUPP(sdl2, "SDL2", "SDL2 drivers");
- _PSUPP(x11, "X11", "X11 drivers");
- _PSUPP(wayland, "wayland", "Wayland drivers");
+ _PSUPP(libretrodb, "LibretroDB", "LibretroDB support");
+ _PSUPP(command, "Command", "Command interface support");
+ _PSUPP(network_command, "Network Command", "Network Command interface support");
+ _PSUPP(sdl, "SDL", "SDL input/audio/video drivers");
+ _PSUPP(sdl2, "SDL2", "SDL2 input/audio/video drivers");
+ _PSUPP(x11, "X11", "X11 input/video drivers");
+ _PSUPP(wayland, "wayland", "Wayland input/video drivers");
_PSUPP(thread, "Threads", "Threading support");
_PSUPP(opengl, "OpenGL", "OpenGL driver");
- _PSUPP(kms, "KMS", "KMS/EGL context support");
+ _PSUPP(opengles, "OpenGL ES", "OpenGL ES driver");
+ _PSUPP(xvideo, "XVideo", "Video driver");
_PSUPP(udev, "UDEV", "UDEV/EVDEV input driver support");
- _PSUPP(egl, "EGL", "EGL context support");
- _PSUPP(vg, "OpenVG", "OpenVG output support");
- _PSUPP(xvideo, "XVideo", "XVideo output");
- _PSUPP(alsa, "ALSA", "audio driver");
- _PSUPP(oss, "OSS", "audio driver");
- _PSUPP(jack, "Jack", "audio driver");
- _PSUPP(rsound, "RSound", "audio driver");
- _PSUPP(roar, "RoarAudio", "audio driver");
- _PSUPP(pulse, "PulseAudio", "audio driver");
- _PSUPP(dsound, "DirectSound", "audio driver");
- _PSUPP(xaudio, "XAudio2", "audio driver");
- _PSUPP(zlib, "zlib", "PNG encode/decode and .zip extraction");
- _PSUPP(al, "OpenAL", "audio driver");
+ _PSUPP(egl, "EGL", "video context driver");
+ _PSUPP(kms, "KMS", "video context driver");
+ _PSUPP(vg, "OpenVG", "video context driver");
+ _PSUPP(coreaudio, "CoreAudio", "Audio driver");
+ _PSUPP(alsa, "ALSA", "Audio driver");
+ _PSUPP(oss, "OSS", "Audio driver");
+ _PSUPP(jack, "Jack", "Audio driver");
+ _PSUPP(rsound, "RSound", "Audio driver");
+ _PSUPP(roar, "RoarAudio", "Audio driver");
+ _PSUPP(pulse, "PulseAudio", "Audio driver");
+ _PSUPP(dsound, "DirectSound", "Audio driver");
+ _PSUPP(xaudio, "XAudio2", "Audio driver");
+ _PSUPP(al, "OpenAL", "Audio driver");
+ _PSUPP(sl, "OpenSL", "Audio driver");
+ _PSUPP(7zip, "7zip", "7zip support");
+ _PSUPP(zlib, "zlib", ".zip extraction");
_PSUPP(dylib, "External", "External filter and plugin support");
- _PSUPP(cg, "Cg", "Cg pixel shaders");
+ _PSUPP(cg, "Cg", "Fragment/vertex shader driver");
+ _PSUPP(glsl, "GLSL", "Fragment/vertex shader driver");
+ _PSUPP(glsl, "HLSL", "Fragment/vertex shader driver");
_PSUPP(libxml2, "libxml2", "libxml2 XML parsing");
_PSUPP(sdl_image, "SDL_image", "SDL_image image loading");
+ _PSUPP(rpng, "rpng", "PNG image loading/encoding");
_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 with libavcodec");
- _PSUPP(freetype, "FreeType", "TTF font rendering with FreeType");
+ _PSUPP(freetype, "FreeType", "TTF font rendering driver");
+ _PSUPP(coretext, "CoreText", "TTF font rendering driver (for OSX and/or iOS)");
_PSUPP(netplay, "Netplay", "Peer-to-peer netplay");
_PSUPP(python, "Python", "Script support in shaders");
+ _PSUPP(libusb, "Libusb", "Libusb support");
+ _PSUPP(cocoa, "Cocoa", "Cocoa UI companion support (for OSX and/or iOS)");
+ _PSUPP(qt, "QT", "QT UI companion support");
+ _PSUPP(avfoundation, "AVFoundation", "Camera driver");
+ _PSUPP(v4l2, "Video4Linux2", "Camera driver");
}
#undef _PSUPP
/**
- * print_compiler:
+ * rarch_print_compiler:
*
* Prints compiler that was used for compiling RetroArch.
**/
-static void print_compiler(FILE *file)
+void rarch_print_compiler(char *str, size_t sizeof_str)
{
- fprintf(file, "\nCompiler: ");
#if defined(_MSC_VER)
- fprintf(file, "MSVC (%d) %u-bit\n", _MSC_VER, (unsigned)
+ snprintf(str, sizeof_str, "Compiler: MSVC (%d) %u-bit", _MSC_VER, (unsigned)
(CHAR_BIT * sizeof(size_t)));
#elif defined(__SNC__)
- fprintf(file, "SNC (%d) %u-bit\n",
+ snprintf(str, sizeof_str, "Compiler: SNC (%d) %u-bit",
__SN_VER__, (unsigned)(CHAR_BIT * sizeof(size_t)));
#elif defined(_WIN32) && defined(__GNUC__)
- fprintf(file, "MinGW (%d.%d.%d) %u-bit\n",
+ snprintf(str, sizeof_str, "Compiler: MinGW (%d.%d.%d) %u-bit",
__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__, (unsigned)
(CHAR_BIT * sizeof(size_t)));
#elif defined(__clang__)
- fprintf(file, "Clang/LLVM (%s) %u-bit\n",
+ snprintf(str, sizeof_str, "Compiler: Clang/LLVM (%s) %u-bit",
__clang_version__, (unsigned)(CHAR_BIT * sizeof(size_t)));
#elif defined(__GNUC__)
- fprintf(file, "GCC (%d.%d.%d) %u-bit\n",
+ snprintf(str, sizeof_str, "Compiler: GCC (%d.%d.%d) %u-bit",
__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__, (unsigned)
(CHAR_BIT * sizeof(size_t)));
#else
- fprintf(file, "Unknown compiler %u-bit\n",
+ snprintf(str, sizeof_str, "Unknown compiler %u-bit",
(unsigned)(CHAR_BIT * sizeof(size_t)));
#endif
- fprintf(file, "Built: %s\n", __DATE__);
}
/**
@@ -165,13 +179,17 @@ static void print_compiler(FILE *file)
**/
static void print_help(void)
{
+ char str[PATH_MAX_LENGTH];
+
puts("===================================================================");
#ifdef HAVE_GIT_VERSION
printf(RETRO_FRONTEND ": Frontend for libretro -- v" PACKAGE_VERSION " -- %s --\n", rarch_git_version);
#else
puts(RETRO_FRONTEND ": Frontend for libretro -- v" PACKAGE_VERSION " --");
#endif
- print_compiler(stdout);
+ rarch_print_compiler(str, sizeof(str));
+ fprintf(stdout, "%s", str);
+ fprintf(stdout, "Built: %s\n", __DATE__);
puts("===================================================================");
puts("Usage: retroarch [content file] [options...]");
puts("\t-h/--help: Show this help message.");
@@ -1097,8 +1115,12 @@ int rarch_main_init(int argc, char *argv[])
if (global->verbosity)
{
+ char str[PATH_MAX_LENGTH];
+
RARCH_LOG_OUTPUT("=== Build =======================================");
- print_compiler(stderr);
+ rarch_print_compiler(str, sizeof(str));
+ fprintf(stderr, "%s", str);
+ fprintf(stderr, "Built: %s\n", __DATE__);
RARCH_LOG_OUTPUT("Version: %s\n", PACKAGE_VERSION);
#ifdef HAVE_GIT_VERSION
RARCH_LOG_OUTPUT("Git: %s\n", rarch_git_version);
diff --git a/retroarch.h b/retroarch.h
index 402497f576..6367f0d769 100644
--- a/retroarch.h
+++ b/retroarch.h
@@ -167,6 +167,13 @@ void rarch_init_system_av_info(void);
void rarch_set_paths(const char *path);
+/**
+ * rarch_print_compiler:
+ *
+ * Prints compiler that was used for compiling RetroArch.
+ **/
+void rarch_print_compiler(char *str, size_t sizeof_str);
+
#ifdef __cplusplus
}
#endif
diff --git a/runloop.h b/runloop.h
index 0619cf91f7..843d376caa 100644
--- a/runloop.h
+++ b/runloop.h
@@ -192,11 +192,6 @@ typedef struct global
unsigned windowed_scale;
} pending;
- struct
- {
- char output_dir[PATH_MAX_LENGTH];
- char config_dir[PATH_MAX_LENGTH];
- } recording;
struct
{
@@ -348,6 +343,9 @@ typedef struct global
uint8_t *gpu_buffer;
size_t gpu_width;
size_t gpu_height;
+ char output_dir[PATH_MAX_LENGTH];
+ char config_dir[PATH_MAX_LENGTH];
+ bool use_output_dir;
} record;
struct
diff --git a/runloop_data.c b/runloop_data.c
index 23b3275ad7..8ca11842ea 100644
--- a/runloop_data.c
+++ b/runloop_data.c
@@ -59,7 +59,9 @@ typedef struct nbio_image_handle
bool is_blocking_on_processing;
bool is_finished;
transfer_cb_t cb;
+#ifdef HAVE_RPNG
struct rpng_t *handle;
+#endif
unsigned processing_pos_increment;
unsigned pos_increment;
uint64_t frame_count;
@@ -301,6 +303,8 @@ static int rarch_main_data_http_iterate_poll(http_handle_t *http)
#endif
#ifdef HAVE_MENU
+
+#ifdef HAVE_RPNG
static int cb_image_menu_wallpaper_upload(void *data, size_t len)
{
nbio_handle_t *nbio = (nbio_handle_t*)data;
@@ -395,7 +399,6 @@ static int cb_nbio_image_menu_wallpaper(void *data, size_t len)
return 0;
}
-#endif
static int rarch_main_data_image_iterate_poll(nbio_handle_t *nbio)
{
@@ -511,6 +514,9 @@ static int rarch_main_data_image_iterate_transfer_parse(nbio_handle_t *nbio)
return 0;
}
+#endif
+
+#endif
static int cb_nbio_default(void *data, size_t len)
{
@@ -569,7 +575,7 @@ static int rarch_main_data_nbio_iterate_poll(nbio_handle_t *nbio)
if (elem1[0] != '\0')
{
-#ifdef HAVE_MENU
+#if defined(HAVE_MENU) && defined(HAVE_RPNG)
if (!strcmp(elem1, "cb_menu_wallpaper"))
nbio->cb = &cb_nbio_image_menu_wallpaper;
#endif
@@ -648,6 +654,7 @@ static int rarch_main_data_nbio_iterate_parse(nbio_handle_t *nbio)
#ifdef HAVE_LIBRETRODB
#ifdef HAVE_MENU
+
static void rarch_main_data_db_iterate(bool is_thread,
data_runloop_t *runloop)
{
@@ -670,10 +677,12 @@ static void rarch_main_data_db_iterate(bool is_thread,
break;
}
}
+
#endif
#endif
+#ifdef HAVE_RPNG
static void rarch_main_data_nbio_image_iterate(bool is_thread,
data_runloop_t *runloop)
{
@@ -708,6 +717,7 @@ static void rarch_main_data_nbio_image_iterate(bool is_thread,
break;
}
}
+#endif
static void rarch_main_data_nbio_iterate(bool is_thread, data_runloop_t *runloop)
{
@@ -893,7 +903,9 @@ void rarch_main_data_free(void)
static void data_runloop_iterate(bool is_thread, data_runloop_t *runloop)
{
rarch_main_data_nbio_iterate (is_thread, runloop);
+#ifdef HAVE_RPNG
rarch_main_data_nbio_image_iterate (is_thread, runloop);
+#endif
#ifdef HAVE_OVERLAY
rarch_main_data_overlay_iterate (is_thread, runloop);
#endif
@@ -970,6 +982,7 @@ error:
}
#endif
+#ifdef HAVE_RPNG
static void rarch_main_data_nbio_image_upload_iterate(bool is_thread,
data_runloop_t *runloop)
{
@@ -994,6 +1007,7 @@ static void rarch_main_data_nbio_image_upload_iterate(bool is_thread,
break;
}
}
+#endif
void rarch_main_data_iterate(void)
{
@@ -1019,7 +1033,9 @@ void rarch_main_data_iterate(void)
#ifdef HAVE_OVERLAY
rarch_main_data_overlay_image_upload_iterate(false, runloop);
#endif
+#ifdef HAVE_RPNG
rarch_main_data_nbio_image_upload_iterate(false, runloop);
+#endif
if (data_runloop_msg[0] != '\0')
{
diff --git a/screenshot.c b/screenshot.c
index cc2b7315cc..4ad81d25be 100644
--- a/screenshot.c
+++ b/screenshot.c
@@ -41,8 +41,7 @@
#include
#endif
-#ifdef HAVE_ZLIB_DEFLATE
-
+#if defined(HAVE_ZLIB_DEFLATE) && defined(HAVE_RPNG)
#include
#define IMG_EXT "png"
@@ -379,7 +378,7 @@ bool screenshot_dump(const char *folder, const void *frame,
}
ret = false;
-#elif defined(HAVE_ZLIB_DEFLATE)
+#elif defined(HAVE_ZLIB_DEFLATE) && defined(HAVE_RPNG)
out_buffer = (uint8_t*)malloc(width * height * 3);
if (!out_buffer)
return false;
diff --git a/settings.c b/settings.c
index 9def82af2f..4634c18369 100644
--- a/settings.c
+++ b/settings.c
@@ -3353,6 +3353,12 @@ static bool setting_append_list_main_menu_options(
group_info.name,
subgroup_info.name);
+ CONFIG_ACTION(
+ "system_information",
+ "System Information",
+ group_info.name,
+ subgroup_info.name);
+
if (global->perfcnt_enable)
{
CONFIG_ACTION(
@@ -3437,12 +3443,16 @@ static bool setting_append_list_main_menu_options(
group_info.name,
subgroup_info.name);
+
+#if !defined(IOS)
+ /* Apple rejects iOS apps that lets you forcibly quit an application. */
CONFIG_ACTION(
"quit_retroarch",
"Quit RetroArch",
group_info.name,
subgroup_info.name);
settings_list_current_add_cmd(list, list_info, EVENT_CMD_QUIT_RETROARCH);
+#endif
END_SUB_GROUP(list, list_info);
END_GROUP(list, list_info);
@@ -3560,6 +3570,17 @@ static bool setting_append_list_driver_options(
settings_data_list_current_add_flags(list, list_info, SD_FLAG_IS_DRIVER);
#endif
+ CONFIG_STRING_OPTIONS(
+ settings->record.driver,
+ "record_driver",
+ "Record Driver",
+ config_get_default_record(),
+ config_get_record_driver_options(),
+ group_info.name,
+ subgroup_info.name,
+ NULL,
+ NULL);
+ settings_data_list_current_add_flags(list, list_info, SD_FLAG_IS_DRIVER);
END_SUB_GROUP(list, list_info);
END_GROUP(list, list_info);
@@ -3605,6 +3626,29 @@ static bool setting_append_list_general_options(
general_write_handler,
general_read_handler);
+ CONFIG_BOOL(
+ settings->auto_overrides_enable,
+ "auto_overrides_enable",
+ "Load Override Files Automatically",
+ default_auto_overrides_enable,
+ "OFF",
+ "ON",
+ group_info.name,
+ subgroup_info.name,
+ general_write_handler,
+ general_read_handler);
+
+ CONFIG_BOOL(
+ settings->auto_remaps_enable,
+ "auto_remaps_enable",
+ "Load Remap Files Automatically",
+ default_auto_remaps_enable,
+ "OFF",
+ "ON",
+ group_info.name,
+ subgroup_info.name,
+ general_write_handler,
+ general_read_handler);
END_SUB_GROUP(list, list_info);
@@ -3867,6 +3911,18 @@ static bool setting_append_list_recording_options(
general_read_handler);
settings_data_list_current_add_flags(list, list_info, SD_FLAG_ALLOW_INPUT);
+ CONFIG_BOOL(
+ global->record.use_output_dir,
+ "record_use_output_dir",
+ "Use output directory",
+ false,
+ "OFF",
+ "ON",
+ group_info.name,
+ subgroup_info.name,
+ general_write_handler,
+ general_read_handler);
+
END_SUB_GROUP(list, list_info);
START_SUB_GROUP(list, list_info, "Miscellaneous", group_info.name, subgroup_info);
@@ -6103,7 +6159,7 @@ static bool setting_append_list_path_options(
SD_FLAG_ALLOW_EMPTY | SD_FLAG_PATH_DIR | SD_FLAG_BROWSER_ACTION);
CONFIG_DIR(
- global->recording.output_dir,
+ global->record.output_dir,
"recording_output_directory",
"Recording Output Directory",
"",
@@ -6118,7 +6174,7 @@ static bool setting_append_list_path_options(
SD_FLAG_ALLOW_EMPTY | SD_FLAG_PATH_DIR | SD_FLAG_BROWSER_ACTION);
CONFIG_DIR(
- global->recording.config_dir,
+ global->record.config_dir,
"recording_config_directory",
"Recording Config Directory",
"",
diff --git a/ui/ui_companion_driver.c b/ui/ui_companion_driver.c
index 4e5d141a80..010f1c0922 100644
--- a/ui/ui_companion_driver.c
+++ b/ui/ui_companion_driver.c
@@ -22,7 +22,7 @@
#endif
static const ui_companion_driver_t *ui_companion_drivers[] = {
-#ifdef IOS
+#ifdef HAVE_COCOATOUCH
&ui_companion_cocoatouch,
#endif
#ifdef HAVE_QT