Path: blob/main/Natives/LauncherPreferences.m
589 views
#import "config.h"1#import "utils.h"2#import "LauncherPreferences.h"3#import "PLPreferences.h"4#import "UIKit+hook.h"5#import <CoreFoundation/CoreFoundation.h>67static PLPreferences* pref;89void loadPreferences(BOOL reset) {10assert(getenv("POJAV_HOME"));11if (reset) {12[pref reset];13} else {14pref = [[PLPreferences alloc] initWithAutomaticMigrator];15}16}1718void toggleIsolatedPref(BOOL forceEnable) {19if (!pref.instancePath) {20pref.instancePath = [NSString stringWithFormat:@"%s/launcher_preferences.plist", getenv("POJAV_GAME_DIR")];21}22[pref toggleIsolationForced:forceEnable];23}2425id getPrefObject(NSString *key) {26return [pref getObject:key];27}28BOOL getPrefBool(NSString *key) {29return [getPrefObject(key) boolValue];30}31float getPrefFloat(NSString *key) {32return [getPrefObject(key) floatValue];33}34NSInteger getPrefInt(NSString *key) {35return [getPrefObject(key) intValue];36}3738void setPrefObject(NSString *key, id value) {39[pref setObject:key value:value];40}41void setPrefBool(NSString *key, BOOL value) {42setPrefObject(key, @(value));43}44void setPrefFloat(NSString *key, float value) {45setPrefObject(key, @(value));46}47void setPrefInt(NSString *key, NSInteger value) {48setPrefObject(key, @(value));49}5051void resetWarnings() {52for (int i = 0; i < pref.globalPref[@"warnings"].count; i++) {53NSString *key = pref.globalPref[@"warnings"].allKeys[i];54pref.globalPref[@"warnings"][key] = @YES;55}56}5758#pragma mark Safe area5960CGRect getSafeArea() {61CGRect screenBounds = UIScreen.mainScreen.bounds;62UIEdgeInsets safeArea = UIEdgeInsetsFromString(getPrefObject(@"control.control_safe_area"));63if (screenBounds.size.width < screenBounds.size.height) {64safeArea = UIEdgeInsetsMake(safeArea.right, safeArea.top, safeArea.left, safeArea.bottom);65}66return UIEdgeInsetsInsetRect(screenBounds, safeArea);67}6869void setSafeArea(CGRect frame) {70CGSize screenSize = UIScreen.mainScreen.bounds.size;71UIEdgeInsets safeArea;72// TODO: make safe area consistent across opposite orientations?73if (screenSize.width < screenSize.height) {74safeArea = UIEdgeInsetsMake(75frame.origin.x,76screenSize.height - CGRectGetMaxY(frame),77screenSize.width - CGRectGetMaxX(frame),78frame.origin.y);79} else {80safeArea = UIEdgeInsetsMake(81frame.origin.y,82frame.origin.x,83screenSize.height - CGRectGetMaxY(frame),84screenSize.width - CGRectGetMaxX(frame));85}86setPrefObject(@"control.control_safe_area", NSStringFromUIEdgeInsets(safeArea));87}8889UIEdgeInsets getDefaultSafeArea() {90UIEdgeInsets safeArea = UIApplication.sharedApplication.windows.firstObject.safeAreaInsets;91CGSize screenSize = UIScreen.mainScreen.bounds.size;92if (screenSize.width < screenSize.height) {93safeArea.left = safeArea.top;94safeArea.right = safeArea.bottom;95}96safeArea.top = safeArea.bottom = 0;97return safeArea;98}99100#pragma mark Java runtime101102NSString* getSelectedJavaHome(NSString* defaultJRETag, int minVersion) {103NSDictionary *pref = getPrefObject(@"java.java_homes");104NSDictionary<NSString *, NSString *> *selected = pref[@"0"];105NSString *selectedVer = selected[defaultJRETag];106if (minVersion > selectedVer.intValue) {107NSArray *sortedVersions = [pref.allKeys valueForKeyPath:@"self.integerValue"];108sortedVersions = [sortedVersions sortedArrayUsingSelector:@selector(compare:)];109for (NSNumber *version in sortedVersions) {110if (version.intValue >= minVersion) {111selectedVer = version.stringValue;112break;113}114}115if (!selectedVer) {116NSLog(@"Error: requested Java >= %d was not installed!", minVersion);117return nil;118}119}120121id selectedDir = pref[selectedVer];122if ([selectedDir isEqualToString:@"internal"]) {123selectedDir = [NSString stringWithFormat:@"%@/java_runtimes/java-%@-openjdk", NSBundle.mainBundle.bundlePath, selectedVer];124} else {125selectedDir = [NSString stringWithFormat:@"%s/java_runtimes/%@", getenv("POJAV_HOME"), selectedDir];126}127128if ([NSFileManager.defaultManager fileExistsAtPath:selectedDir]) {129return selectedDir;130} else {131NSLog(@"Error: selected runtime for %@ does not exist: %@", defaultJRETag, selectedDir);132return nil;133}134}135136#pragma mark Renderer137NSArray* getRendererKeys(BOOL containsDefault) {138NSMutableArray *array = @[139@"auto",140@ RENDERER_NAME_GL4ES,141@ RENDERER_NAME_MTL_ANGLE142].mutableCopy;143144if (containsDefault) {145[array insertObject:@"(default)" atIndex:0];146}147148#if CONFIG_RELEASE149if(@available(iOS 16.0, *)) {150// Disabling Zink on iOS 16.0+ to figure out what's wrong with it151} else {152#endif153[array addObject:@ RENDERER_NAME_VK_ZINK];154#if CONFIG_RELEASE155}156#endif157return array;158}159160NSArray* getRendererNames(BOOL containsDefault) {161NSMutableArray *array;162163#if CONFIG_RELEASE164if(@available(iOS 16.0, *)) {165// Disabling Zink on iOS 16.0+ to figure out what's wrong with it166array = @[167localize(@"preference.title.renderer.release.auto", nil),168localize(@"preference.title.renderer.release.gl4es", nil),169localize(@"preference.title.renderer.release.angle", nil)170].mutableCopy;171} else {172#endif173array = @[174localize(@"preference.title.renderer.debug.auto", nil),175localize(@"preference.title.renderer.debug.gl4es", nil),176localize(@"preference.title.renderer.debug.angle", nil),177localize(@"preference.title.renderer.debug.zink", nil)178].mutableCopy;179#if CONFIG_RELEASE180}181#endif182183if (containsDefault) {184[array insertObject:@"(default)" atIndex:0];185}186187return array;188}189190191