SDL_RWFromFile: On Apple platforms, offer a hint to not look in resource dirs.

Fixes #8403.
This commit is contained in:
Ryan C. Gordon 2024-07-29 15:04:40 -04:00
parent e306cbcbee
commit 0ba3d9862d
2 changed files with 27 additions and 0 deletions

View File

@ -3093,6 +3093,27 @@ extern "C" {
*/
#define SDL_HINT_SHUTDOWN_DBUS_ON_QUIT "SDL_SHUTDOWN_DBUS_ON_QUIT"
/**
* Specify if SDL_RWFromFile should use the resource dir on Apple platforms.
*
* SDL2 has always done this on Apple platforms, but it can be surprising to
* try opening a path to discover that SDL adjusts the path to elsewhere, so
* this hint allows that behavior to be disabled.
*
* If running from a App Bundle, this will be MyApp.app/Contents/Resources.
* If running as a normal Unix-like process, this will be the directory where
* the running binary lives. Setting this hint to 0 avoids this and just
* uses the requested path as-is.
*
* This variable can be set to the following values:
*
* - "0": SDL will not use the app resource directory.
* - "1": SDL will use the app's resource directory (default).
*
* This hint is available since SDL 2.32.0.
*/
#define SDL_HINT_APPLE_RWFROMFILE_USE_RESOURCES "SDL_APPLE_RWFROMFILE_USE_RESOURCES"
/**
* An enumeration of hint priorities

View File

@ -24,6 +24,7 @@
#import <Foundation/Foundation.h>
#include "SDL_rwopsbundlesupport.h"
#include "SDL_hints.h"
/* For proper OS X applications, the resources are contained inside the application bundle.
So the strategy is to first check the application bundle for the file, then fallback to the current working directory.
@ -41,6 +42,11 @@ FILE *SDL_OpenFPFromBundleOrFallback(const char *file, const char *mode)
NSString *ns_string_file_component;
NSString *full_path_with_file_to_try;
/* if the app doesn't want this app bundle behavior, just use the path as-is. */
if (!SDL_GetHintBoolean(SDL_HINT_APPLE_RWFROMFILE_USE_RESOURCES, SDL_TRUE)) {
return fopen(file, mode);
}
/* If the file mode is writable, skip all the bundle stuff because generally the bundle is read-only. */
if (SDL_strchr(mode, 'r') == NULL) {
return fopen(file, mode);