207 lines
8.7 KiB
Objective-C
207 lines
8.7 KiB
Objective-C
#import "config.h"
|
|
#import "LauncherPreferences.h"
|
|
#import "UIKit+hook.h"
|
|
#import <CoreFoundation/CoreFoundation.h>
|
|
|
|
NSMutableDictionary *prefDict;
|
|
NSString* prefPath;
|
|
// developer debug dict
|
|
NSMutableDictionary *debugPrefDict;
|
|
// environment variables dict
|
|
NSMutableDictionary *envPrefDict;
|
|
// warnings dict
|
|
NSMutableDictionary *warnPrefDict;
|
|
|
|
id getPreference(NSString* key) {
|
|
if (!(debugPrefDict[key] == [NSNull null] || debugPrefDict[key] == nil)) {
|
|
return debugPrefDict[key];
|
|
} else if (!(envPrefDict[key] == [NSNull null] || envPrefDict[key] == nil)) {
|
|
return envPrefDict[key];
|
|
} else if (!(warnPrefDict[key] == [NSNull null] || warnPrefDict[key] == nil)) {
|
|
return warnPrefDict[key];
|
|
} else if (!(prefDict[key] == [NSNull null] || prefDict[key] == nil) || [key hasPrefix:@"internal_"]) {
|
|
return prefDict[key];
|
|
} else {
|
|
NSLog(@"LauncherPreferences: Unknown key %@", key);
|
|
}
|
|
|
|
NSLog(@"[Pre-init] LauncherPreferences: %@ is NULL", key);
|
|
return nil;
|
|
}
|
|
|
|
NSMutableDictionary *getDictionary(NSString *type) {
|
|
if([type containsString:@"env"]) {
|
|
return envPrefDict;
|
|
} else if([type containsString:@"warn"]) {
|
|
return warnPrefDict;
|
|
} else if([type containsString:@"base"]) {
|
|
return prefDict;
|
|
}
|
|
|
|
return nil;
|
|
}
|
|
|
|
int getJavaVersion(NSString* java) {
|
|
if (java.length == 0) {
|
|
return 0;
|
|
} else if ([java hasPrefix:@"java-"] && [java hasSuffix:@"-openjdk"]) {
|
|
return [java substringWithRange:NSMakeRange(5, java.length - 13)].intValue;
|
|
} else {
|
|
NSLog(@"FIXME: What is the Java version of %@?", java);
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
int getSelectedJavaVersion() {
|
|
return getJavaVersion([getPreference(@"java_home") lastPathComponent]);
|
|
}
|
|
|
|
void setDefaultValueForPref(NSMutableDictionary *dict, NSString* key, id value) {
|
|
if (!dict[key]) {
|
|
dict[key] = value;
|
|
NSLog(@"[Pre-init] LauncherPreferences: Set default %@: %@", key, value);
|
|
}
|
|
}
|
|
|
|
void setPreference(NSString* key, id value) {
|
|
if (!(debugPrefDict[key] == [NSNull null] || debugPrefDict[key] == nil)) {
|
|
debugPrefDict[key] = value;
|
|
prefDict[@"debugs"] = debugPrefDict;
|
|
} else if (!(envPrefDict[key] == [NSNull null] || envPrefDict[key] == nil)) {
|
|
envPrefDict[key] = value;
|
|
prefDict[@"env_vars"] = envPrefDict;
|
|
} else if (!(warnPrefDict[key] == [NSNull null] || warnPrefDict[key] == nil)) {
|
|
warnPrefDict[key] = value;
|
|
prefDict[@"warnings"] = warnPrefDict;
|
|
} else if (!(prefDict[key] == [NSNull null] || prefDict[key] == nil) || [key hasPrefix:@"internal_"]) {
|
|
prefDict[key] = value;
|
|
} else {
|
|
NSLog(@"LauncherPreferences: Unknown key %@", key);
|
|
}
|
|
[prefDict writeToFile:prefPath atomically:YES];
|
|
}
|
|
|
|
void fillDefaultWarningDict() {
|
|
setDefaultValueForPref(warnPrefDict, @"option_warn", @YES);
|
|
setDefaultValueForPref(warnPrefDict, @"local_warn", @YES);
|
|
setDefaultValueForPref(warnPrefDict, @"mem_warn", @YES);
|
|
setDefaultValueForPref(warnPrefDict, @"java_warn", @YES);
|
|
setDefaultValueForPref(warnPrefDict, @"jb_warn", @YES);
|
|
setDefaultValueForPref(warnPrefDict, @"int_warn", @YES);
|
|
setDefaultValueForPref(warnPrefDict, @"auto_ram_warn", @YES);
|
|
}
|
|
|
|
NSMutableDictionary* getDictionarySafe(NSString* key) {
|
|
if (prefDict[key] == nil) {
|
|
return [[NSMutableDictionary alloc] init];
|
|
}
|
|
return prefDict[key];
|
|
}
|
|
|
|
void loadPreferences(BOOL reset) {
|
|
assert(getenv("POJAV_HOME"));
|
|
prefPath = [@(getenv("POJAV_HOME"))
|
|
stringByAppendingPathComponent:@"launcher_preferences.plist"];
|
|
|
|
NSFileManager *fileManager = [NSFileManager defaultManager];
|
|
prefDict = [NSMutableDictionary dictionaryWithContentsOfFile:prefPath];
|
|
if (reset) {
|
|
[prefDict removeAllObjects];
|
|
} else if (![fileManager fileExistsAtPath:prefPath]) {
|
|
prefDict = [[NSMutableDictionary alloc] init];
|
|
}
|
|
debugPrefDict = getDictionarySafe(@"debugs");
|
|
envPrefDict = getDictionarySafe(@"env_vars");
|
|
warnPrefDict = getDictionarySafe(@"warnings");
|
|
|
|
// set default value
|
|
setDefaultValueForPref(envPrefDict, @"resolution", @(100));
|
|
setDefaultValueForPref(prefDict, @"button_scale", @(100));
|
|
setDefaultValueForPref(prefDict, @"selected_account", @"");
|
|
setDefaultValueForPref(prefDict, @"selected_version", @"1.7.10");
|
|
setDefaultValueForPref(prefDict, @"selected_version_type", @(0));
|
|
|
|
setDefaultValueForPref(envPrefDict, @"gesture_mouse", @YES);
|
|
setDefaultValueForPref(envPrefDict, @"gesture_hotbar", @YES);
|
|
|
|
setDefaultValueForPref(envPrefDict, @"press_duration", @(400));
|
|
setDefaultValueForPref(envPrefDict, @"mouse_scale", @(100));
|
|
setDefaultValueForPref(envPrefDict, @"mouse_speed", @(100));
|
|
setDefaultValueForPref(envPrefDict, @"gyroscope_enable", @NO);
|
|
setDefaultValueForPref(envPrefDict, @"gyroscope_invert_x_axis", @NO);
|
|
setDefaultValueForPref(envPrefDict, @"gyroscope_sensitivity", @(100));
|
|
setDefaultValueForPref(envPrefDict, @"default_ctrl", @"default.json");
|
|
setDefaultValueForPref(envPrefDict, @"default_gamepad_ctrl", @"default.json");
|
|
setDefaultValueForPref(envPrefDict, @"game_directory", @"default");
|
|
setDefaultValueForPref(envPrefDict, @"java_args", @"");
|
|
setDefaultValueForPref(envPrefDict, @"allocated_memory", [NSNumber numberWithFloat:roundf((NSProcessInfo.processInfo.physicalMemory / 1048576) * 0.25)]);
|
|
setDefaultValueForPref(envPrefDict, @"jitstreamer_server", @"69.69.0.1");
|
|
setDefaultValueForPref(envPrefDict, @"max_framerate", @YES);
|
|
setDefaultValueForPref(prefDict, @"appicon", @"AppIcon-Light");
|
|
setDefaultValueForPref(prefDict, @"debug_logging", @(CONFIG_RELEASE != 1));
|
|
setDefaultValueForPref(prefDict, @"cosmetica", @YES);
|
|
setDefaultValueForPref(prefDict, @"controller_type", @"xbox");
|
|
setDefaultValueForPref(envPrefDict, @"java_home", @"java-8-openjdk");
|
|
setDefaultValueForPref(envPrefDict, @"renderer", @"auto");
|
|
setDefaultValueForPref(envPrefDict, @"fullscreen_airplay", @YES);
|
|
setDefaultValueForPref(envPrefDict, @"hardware_hide", @NO);
|
|
setDefaultValueForPref(prefDict, @"slimmed", @NO);
|
|
fillDefaultWarningDict();
|
|
setDefaultValueForPref(prefDict, @"force_unsupported_launch", @NO);
|
|
setDefaultValueForPref(prefDict, @"slideable_hotbar", @NO);
|
|
setDefaultValueForPref(prefDict, @"virtmouse_enable", @NO);
|
|
setDefaultValueForPref(prefDict, @"check_sha", @YES);
|
|
setDefaultValueForPref(prefDict, @"auto_ram", @(!getEntitlementValue(@"com.apple.private.memorystatus")));
|
|
setDefaultValueForPref(prefDict, @"unsupported_warn_counter", @(0));
|
|
setDefaultValueForPref(prefDict, @"hidden_sidebar", @YES);
|
|
setDefaultValueForPref(prefDict, @"enable_altkit", @YES);
|
|
|
|
// Debug settings
|
|
setDefaultValueForPref(debugPrefDict, @"debug_skip_wait_jit", @NO);
|
|
setDefaultValueForPref(debugPrefDict, @"debug_hide_home_indicator", @NO);
|
|
setDefaultValueForPref(debugPrefDict, @"debug_ipad_ui", @(realUIIdiom == UIUserInterfaceIdiomPad));
|
|
setDefaultValueForPref(debugPrefDict, @"debug_auto_correction", @YES);
|
|
setDefaultValueForPref(debugPrefDict, @"debug_show_layout_bounds", @NO);
|
|
setDefaultValueForPref(debugPrefDict, @"debug_show_layout_overlap", @NO);
|
|
|
|
// Migrate some prefs
|
|
setPreference(@"java_home", [getPreference(@"java_home") lastPathComponent]);
|
|
|
|
prefDict[@"debugs"] = debugPrefDict;
|
|
prefDict[@"env_vars"] = envPrefDict;
|
|
prefDict[@"warnings"] = warnPrefDict;
|
|
|
|
NSString *ipajre = [NSString stringWithFormat:@"%s/jvm/java-17-openjdk", getenv("BUNDLE_PATH")];
|
|
NSString *sysjre = @"/usr/lib/jvm/java-17-openjdk";
|
|
if ((![fileManager fileExistsAtPath:ipajre]) && (![fileManager fileExistsAtPath:sysjre])) {
|
|
setPreference(@"slimmed", @YES);
|
|
} else {
|
|
setPreference(@"slimmed", @NO);
|
|
}
|
|
|
|
[prefDict writeToFile:prefPath atomically:YES];
|
|
}
|
|
|
|
void resetWarnings() {
|
|
[warnPrefDict removeAllObjects];
|
|
fillDefaultWarningDict();
|
|
prefDict[@"warnings"] = warnPrefDict;
|
|
[prefDict writeToFile:prefPath atomically:YES];
|
|
}
|
|
|
|
CGRect getDefaultSafeArea() {
|
|
CGRect defaultSafeArea = UIScreen.mainScreen.bounds;
|
|
UIEdgeInsets insets = UIApplication.sharedApplication.windows.firstObject.safeAreaInsets;
|
|
defaultSafeArea.origin.x = insets.left;
|
|
//defaultSafeArea.origin.y = insets.top;
|
|
defaultSafeArea.size.width -= insets.left + insets.right;
|
|
//defaultSafeArea.size.height -= insets.bottom;
|
|
// In some cases, the returned bounds is portrait instead of landscape
|
|
if (defaultSafeArea.size.width < defaultSafeArea.size.height) {
|
|
CGFloat height = defaultSafeArea.size.width;
|
|
defaultSafeArea.size.width = defaultSafeArea.size.height;
|
|
defaultSafeArea.size.height = height;
|
|
}
|
|
return defaultSafeArea;
|
|
}
|