filesystem: SDL_GetUserFolder() now follows the SDL_GetStringRule.

It also now caches at the higher level, so the platform-specific bits don't
change their interface much.

Reference Issue #10229.
This commit is contained in:
Ryan C. Gordon
2024-07-15 20:03:15 -04:00
parent d40b89dff6
commit 2321726ff1
19 changed files with 48 additions and 31 deletions

View File

@@ -411,14 +411,38 @@ const char *SDL_GetBasePath(void)
return CachedBasePath;
}
static char *CachedUserFolders[SDL_FOLDER_TOTAL];
const char *SDL_GetUserFolder(SDL_Folder folder)
{
const int idx = (int) folder;
if ((idx < 0) || (idx >= SDL_arraysize(CachedUserFolders))) {
SDL_InvalidParamError("folder");
return NULL;
}
if (!CachedUserFolders[idx]) {
CachedUserFolders[idx] = SDL_SYS_GetUserFolder(folder);
}
return CachedUserFolders[idx];
}
void SDL_InitFilesystem(void)
{
CachedBasePath = NULL; // just in case.
SDL_zeroa(CachedUserFolders);
}
void SDL_QuitFilesystem(void)
{
SDL_free(CachedBasePath);
CachedBasePath = NULL;
for (int i = 0; i < SDL_arraysize(CachedUserFolders); i++) {
SDL_free(CachedUserFolders[i]);
CachedUserFolders[i] = NULL;
}
}

View File

@@ -24,6 +24,7 @@
// return a string that we can SDL_free(). It will be cached at the higher level.
extern char *SDL_SYS_GetBasePath(void);
extern char *SDL_SYS_GetUserFolder(SDL_Folder folder);
int SDL_SYS_EnumerateDirectory(const char *path, const char *dirname, SDL_EnumerateDirectoryCallback cb, void *userdata);
int SDL_SYS_RemovePath(const char *path);

View File

@@ -49,7 +49,7 @@ char *SDL_GetPrefPath(const char *org, const char *app)
return NULL;
}
char *SDL_GetUserFolder(SDL_Folder folder)
char *SDL_SYS_GetUserFolder(SDL_Folder folder)
{
/* TODO: see https://developer.android.com/reference/android/os/Environment#lfields
and https://stackoverflow.com/questions/39332085/get-path-to-pictures-directory */

View File

@@ -126,7 +126,7 @@ char *SDL_GetPrefPath(const char *org, const char *app)
}
}
char *SDL_GetUserFolder(SDL_Folder folder)
char *SDL_SYS_GetUserFolder(SDL_Folder folder)
{
@autoreleasepool {
#ifdef SDL_PLATFORM_TVOS

View File

@@ -37,7 +37,7 @@ char *SDL_GetPrefPath(const char *org, const char *app)
return NULL;
}
char *SDL_GetUserFolder(SDL_Folder folder)
char *SDL_SYS_GetUserFolder(SDL_Folder folder)
{
SDL_Unsupported();
return NULL;

View File

@@ -81,7 +81,7 @@ char *SDL_GetPrefPath(const char *org, const char *app)
return retval;
}
char *SDL_GetUserFolder(SDL_Folder folder)
char *SDL_SYS_GetUserFolder(SDL_Folder folder)
{
const char *home = NULL;

View File

@@ -97,7 +97,7 @@ char *SDL_GetPrefPath(const char *org, const char *app)
return retval;
}
char *SDL_GetUserFolder(SDL_Folder folder)
char *SDL_SYS_GetUserFolder(SDL_Folder folder)
{
const char *home = NULL;
char *retval;

View File

@@ -60,7 +60,7 @@ char *SDL_GetPrefPath(const char *org, const char *app)
}
/* TODO */
char *SDL_GetUserFolder(SDL_Folder folder)
char *SDL_SYS_GetUserFolder(SDL_Folder folder)
{
SDL_Unsupported();
return NULL;

View File

@@ -108,7 +108,7 @@ char *SDL_GetPrefPath(const char *org, const char *app)
}
/* TODO */
char *SDL_GetUserFolder(SDL_Folder folder)
char *SDL_SYS_GetUserFolder(SDL_Folder folder)
{
SDL_Unsupported();
return NULL;

View File

@@ -78,7 +78,7 @@ char *SDL_GetPrefPath(const char *org, const char *app)
}
/* TODO */
char *SDL_GetUserFolder(SDL_Folder folder)
char *SDL_SYS_GetUserFolder(SDL_Folder folder)
{
SDL_Unsupported();
return NULL;

View File

@@ -197,7 +197,7 @@ char *SDL_GetPrefPath(const char *org, const char *app)
}
/* TODO */
char *SDL_GetUserFolder(SDL_Folder folder)
char *SDL_SYS_GetUserFolder(SDL_Folder folder)
{
SDL_Unsupported();
return NULL;

View File

@@ -510,7 +510,7 @@ static char *xdg_user_dir_lookup (const char *type)
return NULL;
}
char *SDL_GetUserFolder(SDL_Folder folder)
char *SDL_SYS_GetUserFolder(SDL_Folder folder)
{
const char *param = NULL;
char *retval;

View File

@@ -81,7 +81,7 @@ char *SDL_GetPrefPath(const char *org, const char *app)
}
/* TODO */
char *SDL_GetUserFolder(SDL_Folder folder)
char *SDL_SYS_GetUserFolder(SDL_Folder folder)
{
SDL_Unsupported();
return NULL;

View File

@@ -174,7 +174,7 @@ char *SDL_GetPrefPath(const char *org, const char *app)
return retval;
}
char *SDL_GetUserFolder(SDL_Folder folder)
char *SDL_SYS_GetUserFolder(SDL_Folder folder)
{
typedef HRESULT (WINAPI *pfnSHGetKnownFolderPath)(REFGUID /* REFKNOWNFOLDERID */, DWORD, HANDLE, PWSTR*);
HMODULE lib = LoadLibrary(L"Shell32.dll");

View File

@@ -227,7 +227,7 @@ extern "C" char *SDL_GetPrefPath(const char *org, const char *app)
return retval;
}
char *SDL_GetUserFolder(SDL_Folder folder)
char *SDL_SYS_GetUserFolder(SDL_Folder folder)
{
wstring wpath;