Files
PojavLauncher_iOS/Natives/LauncherPreferences.m

190 lines
5.8 KiB
Objective-C

#import "config.h"
#import "utils.h"
#import "LauncherPreferences.h"
#import "PLPreferences.h"
#import "UIKit+hook.h"
#import <CoreFoundation/CoreFoundation.h>
static PLPreferences* pref;
void loadPreferences(BOOL reset) {
assert(getenv("POJAV_HOME"));
if (reset) {
[pref reset];
} else {
pref = [[PLPreferences alloc] initWithAutomaticMigrator];
}
}
void toggleIsolatedPref(BOOL forceEnable) {
if (!pref.instancePath) {
pref.instancePath = [NSString stringWithFormat:@"%s/launcher_preferences.plist", getenv("POJAV_GAME_DIR")];
}
[pref toggleIsolationForced:forceEnable];
}
id getPrefObject(NSString *key) {
return [pref getObject:key];
}
BOOL getPrefBool(NSString *key) {
return [getPrefObject(key) boolValue];
}
float getPrefFloat(NSString *key) {
return [getPrefObject(key) floatValue];
}
NSInteger getPrefInt(NSString *key) {
return [getPrefObject(key) intValue];
}
void setPrefObject(NSString *key, id value) {
[pref setObject:key value:value];
}
void setPrefBool(NSString *key, BOOL value) {
setPrefObject(key, @(value));
}
void setPrefFloat(NSString *key, float value) {
setPrefObject(key, @(value));
}
void setPrefInt(NSString *key, NSInteger value) {
setPrefObject(key, @(value));
}
void resetWarnings() {
for (int i = 0; i < pref.globalPref[@"warnings"].count; i++) {
NSString *key = pref.globalPref[@"warnings"].allKeys[i];
pref.globalPref[@"warnings"][key] = @YES;
}
}
#pragma mark Safe area
CGRect getSafeArea() {
CGRect screenBounds = UIScreen.mainScreen.bounds;
UIEdgeInsets safeArea = UIEdgeInsetsFromString(getPrefObject(@"control.control_safe_area"));
if (screenBounds.size.width < screenBounds.size.height) {
safeArea = UIEdgeInsetsMake(safeArea.right, safeArea.top, safeArea.left, safeArea.bottom);
}
return UIEdgeInsetsInsetRect(screenBounds, safeArea);
}
void setSafeArea(CGRect frame) {
CGSize screenSize = UIScreen.mainScreen.bounds.size;
UIEdgeInsets safeArea;
// TODO: make safe area consistent across opposite orientations?
if (screenSize.width < screenSize.height) {
safeArea = UIEdgeInsetsMake(
frame.origin.x,
screenSize.height - CGRectGetMaxY(frame),
screenSize.width - CGRectGetMaxX(frame),
frame.origin.y);
} else {
safeArea = UIEdgeInsetsMake(
frame.origin.y,
frame.origin.x,
screenSize.height - CGRectGetMaxY(frame),
screenSize.width - CGRectGetMaxX(frame));
}
setPrefObject(@"control.control_safe_area", NSStringFromUIEdgeInsets(safeArea));
}
UIEdgeInsets getDefaultSafeArea() {
UIEdgeInsets safeArea = UIApplication.sharedApplication.windows.firstObject.safeAreaInsets;
CGSize screenSize = UIScreen.mainScreen.bounds.size;
if (screenSize.width < screenSize.height) {
safeArea.left = safeArea.top;
safeArea.right = safeArea.bottom;
}
safeArea.top = safeArea.bottom = 0;
return safeArea;
}
#pragma mark Java runtime
NSString* getSelectedJavaHome(NSString* defaultJRETag, int minVersion) {
NSDictionary *pref = getPrefObject(@"java.java_homes");
NSDictionary<NSString *, NSString *> *selected = pref[@"0"];
NSString *selectedVer = selected[defaultJRETag];
if (minVersion > selectedVer.intValue) {
NSArray *sortedVersions = [pref.allKeys valueForKeyPath:@"self.integerValue"];
sortedVersions = [sortedVersions sortedArrayUsingSelector:@selector(compare:)];
for (NSNumber *version in sortedVersions) {
if (version.intValue >= minVersion) {
selectedVer = version.stringValue;
break;
}
}
if (!selectedVer) {
NSLog(@"Error: requested Java >= %d was not installed!", minVersion);
return nil;
}
}
id selectedDir = pref[selectedVer];
if ([selectedDir isEqualToString:@"internal"]) {
selectedDir = [NSString stringWithFormat:@"%@/java_runtimes/java-%@-openjdk", NSBundle.mainBundle.bundlePath, selectedVer];
} else {
selectedDir = [NSString stringWithFormat:@"%s/java_runtimes/%@", getenv("POJAV_HOME"), selectedDir];
}
if ([NSFileManager.defaultManager fileExistsAtPath:selectedDir]) {
return selectedDir;
} else {
NSLog(@"Error: selected runtime for %@ does not exist: %@", defaultJRETag, selectedDir);
return nil;
}
}
#pragma mark Renderer
NSArray* getRendererKeys(BOOL containsDefault) {
NSMutableArray *array = @[
@"auto",
@ RENDERER_NAME_GL4ES,
@ RENDERER_NAME_MTL_ANGLE
].mutableCopy;
if (containsDefault) {
[array insertObject:@"(default)" atIndex:0];
}
#if CONFIG_RELEASE
if(@available(iOS 16.0, *)) {
// Disabling Zink on iOS 16.0+ to figure out what's wrong with it
} else {
#endif
[array addObject:@ RENDERER_NAME_VK_ZINK];
#if CONFIG_RELEASE
}
#endif
return array;
}
NSArray* getRendererNames(BOOL containsDefault) {
NSMutableArray *array;
#if CONFIG_RELEASE
if(@available(iOS 16.0, *)) {
// Disabling Zink on iOS 16.0+ to figure out what's wrong with it
array = @[
localize(@"preference.title.renderer.release.auto", nil),
localize(@"preference.title.renderer.release.gl4es", nil),
localize(@"preference.title.renderer.release.angle", nil)
].mutableCopy;
} else {
#endif
array = @[
localize(@"preference.title.renderer.debug.auto", nil),
localize(@"preference.title.renderer.debug.gl4es", nil),
localize(@"preference.title.renderer.debug.angle", nil),
localize(@"preference.title.renderer.debug.zink", nil)
].mutableCopy;
#if CONFIG_RELEASE
}
#endif
if (containsDefault) {
[array insertObject:@"(default)" atIndex:0];
}
return array;
}