Same keycode names as the on-screen editor to make it easier to identify the possible values. Xbox and PlayStation button names for familiarity. Saving configs handled by the Save and Exit buttons on the navigation bar. Currently known issues: - may be jumpy when cells reload or load onto the screen - loading a new configuration file does not update the value of the cells - loading a new configuration file does not update the "Controller configurator" item in the main Settings window - both of these are solved by closing and reopening the view controller for now
198 lines
8.3 KiB
Objective-C
198 lines
8.3 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);
|
|
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;
|
|
|
|
[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;
|
|
}
|