Use Application Support directory on macOS. (#553)

This commit is contained in:
squidbus 2025-03-25 09:22:48 -07:00 committed by GitHub
parent 3d3524ffe7
commit fd16c379ff
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 19 additions and 0 deletions

View File

@ -122,6 +122,7 @@ You'll probably also want to change the default behavior so that you don't need
#### Where is the savefile stored?
- Windows: `%LOCALAPPDATA%\Zelda64Recompiled\saves`
- Linux: `~/.config/Zelda64Recompiled/saves`
- macOS: `~/Library/Application Support/Zelda64Recompiled/saves`
#### How do I choose a different ROM?
**You don't.** This project is **only** a port of Majora's Mask (and Ocarina of Time in the future), and it will only accept one specific ROM: the US version of the N64 release of Majora's Mask. ROMs in formats other than .z64 will be automatically converted, as long as it is the correct ROM. **It is not an emulator and it cannot run any arbitrary ROM.**

View File

@ -3,6 +3,7 @@
#include <functional>
#include <filesystem>
#include <optional>
namespace zelda64 {
std::filesystem::path get_asset_path(const char* asset);
@ -12,6 +13,7 @@ namespace zelda64 {
// Apple specific methods that usually require Objective-C. Implemented in support_apple.mm.
#ifdef __APPLE__
void dispatch_on_ui_thread(std::function<void()> func);
std::optional<std::filesystem::path> get_application_support_directory();
std::filesystem::path get_bundle_resource_directory();
std::filesystem::path get_bundle_directory();
#endif

View File

@ -162,6 +162,13 @@ std::filesystem::path zelda64::get_app_folder_path() {
return std::filesystem::path{getenv("APP_FOLDER_PATH")};
}
#if defined(__APPLE__)
const auto supportdir = zelda64::get_application_support_directory();
if (supportdir) {
return *supportdir / zelda64::program_id;
}
#endif
const char *homedir;
if ((homedir = getenv("HOME")) == nullptr) {

View File

@ -12,6 +12,15 @@ namespace zelda64 {
});
}
std::optional<std::filesystem::path> get_application_support_directory() {
NSArray *dirs = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES);
if ([dirs count] > 0) {
NSString *dir = [dirs firstObject];
return std::filesystem::path([dir UTF8String]);
}
return std::nullopt;
}
std::filesystem::path get_bundle_resource_directory() {
NSString *bundlePath = [[NSBundle mainBundle] resourcePath];
return std::filesystem::path([bundlePath UTF8String]);