190 lines
5.8 KiB
Objective-C
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;
|
|
}
|