mirror of
https://github.com/libretro/RetroArch
synced 2025-04-09 21:45:45 +00:00
(iOS/OSX) Bring the two closer together - for OSX, everything gets
saved now to NSDocumentDirectory/RetroArch - should be compatible with sandboxed Mac Apps too
This commit is contained in:
parent
4ad2bd97dc
commit
309128f7ed
@ -41,16 +41,6 @@ NS_INLINE CF_RETURNS_RETAINED CFTypeRef CFBridgingRetainCompat(id X)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef IOS
|
|
||||||
NS_INLINE CF_RETURNS_RETAINED CFStringRef CFBridgingRetainStringRefCompat(id X)
|
|
||||||
{
|
|
||||||
#if __has_feature(objc_arc)
|
|
||||||
return (__bridge_retained CFStringRef)X;
|
|
||||||
#else
|
|
||||||
return (CFStringRef)X;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static NSSearchPathDirectory NSConvertFlagsCF(unsigned flags)
|
static NSSearchPathDirectory NSConvertFlagsCF(unsigned flags)
|
||||||
{
|
{
|
||||||
switch (flags)
|
switch (flags)
|
||||||
@ -73,6 +63,16 @@ static NSSearchPathDomainMask NSConvertDomainFlagsCF(unsigned flags)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef IOS
|
||||||
|
NS_INLINE CF_RETURNS_RETAINED CFStringRef CFBridgingRetainStringRefCompat(id X)
|
||||||
|
{
|
||||||
|
#if __has_feature(objc_arc)
|
||||||
|
return (__bridge_retained CFStringRef)X;
|
||||||
|
#else
|
||||||
|
return (CFStringRef)X;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
void CFTemporaryDirectory(char *buf, size_t sizeof_buf)
|
void CFTemporaryDirectory(char *buf, size_t sizeof_buf)
|
||||||
{
|
{
|
||||||
CFStringRef path = (CFStringRef)(CFBridgingRetainStringRefCompat(NSTemporaryDirectory()));
|
CFStringRef path = (CFStringRef)(CFBridgingRetainStringRefCompat(NSTemporaryDirectory()));
|
||||||
@ -86,11 +86,7 @@ void CFSearchPathForDirectoriesInDomains(unsigned flags,
|
|||||||
unsigned domain_mask, unsigned expand_tilde,
|
unsigned domain_mask, unsigned expand_tilde,
|
||||||
char *buf, size_t sizeof_buf)
|
char *buf, size_t sizeof_buf)
|
||||||
{
|
{
|
||||||
#ifdef OSX
|
|
||||||
CFTypeRef array_val = (CFTypeRef)CFBridgingRetainCompat(NSSearchPathForDirectoriesInDomains(flags, domain_mask, (BOOL)expand_tilde));
|
|
||||||
#else
|
|
||||||
CFTypeRef array_val = (CFTypeRef)CFBridgingRetainCompat(NSSearchPathForDirectoriesInDomains(NSConvertFlagsCF(flags), NSConvertDomainFlagsCF(domain_mask), (BOOL)expand_tilde));
|
CFTypeRef array_val = (CFTypeRef)CFBridgingRetainCompat(NSSearchPathForDirectoriesInDomains(NSConvertFlagsCF(flags), NSConvertDomainFlagsCF(domain_mask), (BOOL)expand_tilde));
|
||||||
#endif
|
|
||||||
CFArrayRef array = array_val ? CFRetain(array_val) : NULL;
|
CFArrayRef array = array_val ? CFRetain(array_val) : NULL;
|
||||||
CFTypeRef path_val = (CFTypeRef)CFArrayGetValueAtIndex(array, 0);
|
CFTypeRef path_val = (CFTypeRef)CFArrayGetValueAtIndex(array, 0);
|
||||||
CFStringRef path = path_val ? CFRetain(path_val) : NULL;
|
CFStringRef path = path_val ? CFRetain(path_val) : NULL;
|
||||||
|
@ -31,13 +31,11 @@ static void frontend_apple_get_environment_settings(int *argc, char *argv[],
|
|||||||
void *args, void *params_data)
|
void *args, void *params_data)
|
||||||
{
|
{
|
||||||
char temp_dir[PATH_MAX_LENGTH];
|
char temp_dir[PATH_MAX_LENGTH];
|
||||||
char bundle_path_buf[PATH_MAX_LENGTH], home_dir_buf[PATH_MAX_LENGTH],
|
char bundle_path_buf[PATH_MAX_LENGTH], home_dir_buf[PATH_MAX_LENGTH];
|
||||||
support_path_buf[PATH_MAX_LENGTH];
|
|
||||||
CFURLRef bundle_url;
|
CFURLRef bundle_url;
|
||||||
CFStringRef bundle_path;
|
CFStringRef bundle_path;
|
||||||
CFBundleRef bundle = CFBundleGetMainBundle();
|
CFBundleRef bundle = CFBundleGetMainBundle();
|
||||||
|
|
||||||
(void)support_path_buf;
|
|
||||||
(void)temp_dir;
|
(void)temp_dir;
|
||||||
|
|
||||||
if (!bundle)
|
if (!bundle)
|
||||||
@ -49,59 +47,47 @@ static void frontend_apple_get_environment_settings(int *argc, char *argv[],
|
|||||||
CFStringGetCString(bundle_path, bundle_path_buf, sizeof(bundle_path_buf), kCFStringEncodingUTF8);
|
CFStringGetCString(bundle_path, bundle_path_buf, sizeof(bundle_path_buf), kCFStringEncodingUTF8);
|
||||||
(void)home_dir_buf;
|
(void)home_dir_buf;
|
||||||
|
|
||||||
|
CFSearchPathForDirectoriesInDomains(CFDocumentDirectory, CFUserDomainMask, 1, home_dir_buf, sizeof(home_dir_buf));
|
||||||
|
|
||||||
|
#ifdef OSX
|
||||||
|
strlcat(home_dir_buf, "/RetroArch", sizeof(home_dir_buf));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
fill_pathname_join(g_defaults.core_dir, home_dir_buf, "modules", sizeof(g_defaults.core_dir));
|
||||||
|
fill_pathname_join(g_defaults.core_info_dir, home_dir_buf, "info", sizeof(g_defaults.core_info_dir));
|
||||||
|
fill_pathname_join(g_defaults.overlay_dir, home_dir_buf, "overlays", sizeof(g_defaults.overlay_dir));
|
||||||
|
fill_pathname_join(g_defaults.autoconfig_dir, home_dir_buf, "autoconfig/apple", sizeof(g_defaults.autoconfig_dir));
|
||||||
|
fill_pathname_join(g_defaults.assets_dir, home_dir_buf, "assets", sizeof(g_defaults.assets_dir));
|
||||||
|
fill_pathname_join(g_defaults.system_dir, home_dir_buf, ".RetroArch", sizeof(g_defaults.system_dir));
|
||||||
|
strlcpy(g_defaults.menu_config_dir, g_defaults.system_dir, sizeof(g_defaults.menu_config_dir));
|
||||||
|
fill_pathname_join(g_defaults.config_path, g_defaults.menu_config_dir, "retroarch.cfg", sizeof(g_defaults.config_path));
|
||||||
|
fill_pathname_join(g_defaults.database_dir, home_dir_buf, "rdb", sizeof(g_defaults.database_dir));
|
||||||
|
fill_pathname_join(g_defaults.cursor_dir, home_dir_buf, "cursors", sizeof(g_defaults.cursor_dir));
|
||||||
|
fill_pathname_join(g_defaults.cheats_dir, home_dir_buf, "cht", sizeof(g_defaults.cheats_dir));
|
||||||
|
strlcpy(g_defaults.sram_dir, g_defaults.system_dir, sizeof(g_defaults.sram_dir));
|
||||||
|
strlcpy(g_defaults.savestate_dir, g_defaults.system_dir, sizeof(g_defaults.savestate_dir));
|
||||||
#ifdef IOS
|
#ifdef IOS
|
||||||
CFTemporaryDirectory(temp_dir, sizeof(temp_dir));
|
CFTemporaryDirectory(temp_dir, sizeof(temp_dir));
|
||||||
strlcpy(g_defaults.extraction_dir, temp_dir, sizeof(g_defaults.extraction_dir));
|
strlcpy(g_defaults.extraction_dir, temp_dir, sizeof(g_defaults.extraction_dir));
|
||||||
|
|
||||||
CFSearchPathForDirectoriesInDomains(CFDocumentDirectory, CFUserDomainMask, 1, home_dir_buf, sizeof(home_dir_buf));
|
|
||||||
|
|
||||||
|
|
||||||
fill_pathname_join(g_defaults.system_dir, home_dir_buf, ".RetroArch", sizeof(g_defaults.system_dir));
|
|
||||||
fill_pathname_join(g_defaults.database_dir, home_dir_buf, "rdb", sizeof(g_defaults.database_dir));
|
|
||||||
fill_pathname_join(g_defaults.cursor_dir, home_dir_buf, "cursors", sizeof(g_defaults.cursor_dir));
|
|
||||||
fill_pathname_join(g_defaults.core_dir, home_dir_buf, "modules", sizeof(g_defaults.core_dir));
|
|
||||||
fill_pathname_join(g_defaults.core_info_dir, home_dir_buf, "info", sizeof(g_defaults.core_info_dir));
|
|
||||||
fill_pathname_join(g_defaults.autoconfig_dir, home_dir_buf, "autoconfig/apple", sizeof(g_defaults.autoconfig_dir));
|
|
||||||
fill_pathname_join(g_defaults.assets_dir, home_dir_buf, "assets", sizeof(g_defaults.assets_dir));
|
|
||||||
fill_pathname_join(g_defaults.cheats_dir, home_dir_buf, "cht", sizeof(g_defaults.cheats_dir));
|
|
||||||
fill_pathname_join(g_defaults.shader_dir, home_dir_buf, "shaders_glsl", sizeof(g_defaults.shader_dir));
|
fill_pathname_join(g_defaults.shader_dir, home_dir_buf, "shaders_glsl", sizeof(g_defaults.shader_dir));
|
||||||
fill_pathname_join(g_defaults.overlay_dir, home_dir_buf, "overlays", sizeof(g_defaults.overlay_dir));
|
#elif defined(OSX)
|
||||||
strlcpy(g_defaults.menu_config_dir, g_defaults.system_dir, sizeof(g_defaults.menu_config_dir));
|
fill_pathname_join(g_defaults.shader_dir, home_dir_buf, "shaders_cg", sizeof(g_defaults.shader_dir));
|
||||||
fill_pathname_join(g_defaults.config_path, g_defaults.menu_config_dir, "retroarch.cfg", sizeof(g_defaults.config_path));
|
fill_pathname_join(g_defaults.audio_filter_dir, home_dir_buf, "audio_filters", sizeof(g_defaults.audio_filter_dir));
|
||||||
|
fill_pathname_join(g_defaults.video_filter_dir, home_dir_buf, "video_filters", sizeof(g_defaults.video_filter_dir));
|
||||||
strlcpy(g_defaults.sram_dir, g_defaults.system_dir, sizeof(g_defaults.sram_dir));
|
#endif
|
||||||
strlcpy(g_defaults.savestate_dir, g_defaults.system_dir, sizeof(g_defaults.savestate_dir));
|
|
||||||
|
|
||||||
path_mkdir(bundle_path_buf);
|
path_mkdir(bundle_path_buf);
|
||||||
|
|
||||||
if (access(bundle_path_buf, 0755) != 0)
|
if (access(bundle_path_buf, 0755) != 0)
|
||||||
RARCH_ERR("Failed to create or access base directory: %s\n", bundle_path_buf);
|
RARCH_ERR("Failed to create or access base directory: %s\n", bundle_path_buf);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
path_mkdir(g_defaults.system_dir);
|
path_mkdir(g_defaults.system_dir);
|
||||||
|
|
||||||
if (access(g_defaults.system_dir, 0755) != 0)
|
if (access(g_defaults.system_dir, 0755) != 0)
|
||||||
RARCH_ERR("Failed to create or access system directory: %s.\n", g_defaults.system_dir);
|
RARCH_ERR("Failed to create or access system directory: %s.\n", g_defaults.system_dir);
|
||||||
}
|
}
|
||||||
#elif defined(OSX)
|
|
||||||
CFSearchPathForDirectoriesInDomains(CFApplicationSupportDirectory, CFUserDomainMask, 1, support_path_buf, sizeof(support_path_buf));
|
|
||||||
|
|
||||||
fill_pathname_join(g_defaults.core_dir, "~/Library/Application Support/RetroArch", "cores", sizeof(g_defaults.core_dir));
|
|
||||||
fill_pathname_join(g_defaults.core_info_dir, "~/Library/Application Support/RetroArch", "info", sizeof(g_defaults.core_info_dir));
|
|
||||||
/* TODO/FIXME - we might need to update all these paths too and put them all in ~/Library/Application Support, but that would
|
|
||||||
* require copying all the resource files that are bundled in the app bundle over first to this new directory.
|
|
||||||
*
|
|
||||||
* Ideas: There's some overlap here with how the Android APK has to extract all its resource files over to the actual sandboxed
|
|
||||||
* app dir, maybe try to create something standardized for both platforms (OSX/Android) */
|
|
||||||
fill_pathname_join(g_defaults.overlay_dir, bundle_path_buf, "Contents/Resources/overlays", sizeof(g_defaults.overlay_dir));
|
|
||||||
fill_pathname_join(g_defaults.autoconfig_dir, bundle_path_buf, "Contents/Resources/autoconfig/apple", sizeof(g_defaults.autoconfig_dir));
|
|
||||||
fill_pathname_join(g_defaults.assets_dir, bundle_path_buf, "Contents/Resources/assets", sizeof(g_defaults.assets_dir));
|
|
||||||
fill_pathname_join(g_defaults.shader_dir, bundle_path_buf, "Contents/Resources/shaders", sizeof(g_defaults.shader_dir));
|
|
||||||
fill_pathname_join(g_defaults.audio_filter_dir, bundle_path_buf, "Contents/Resources/audio_filters", sizeof(g_defaults.audio_filter_dir));
|
|
||||||
fill_pathname_join(g_defaults.video_filter_dir, bundle_path_buf, "Contents/Resources/video_filters", sizeof(g_defaults.video_filter_dir));
|
|
||||||
fill_pathname_join(g_defaults.menu_config_dir, support_path_buf, "RetroArch", sizeof(g_defaults.menu_config_dir));
|
|
||||||
fill_pathname_join(g_defaults.config_path, g_defaults.menu_config_dir, "retroarch.cfg", sizeof(g_defaults.config_path));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
CFRelease(bundle_path);
|
CFRelease(bundle_path);
|
||||||
CFRelease(bundle_url);
|
CFRelease(bundle_url);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user