Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/PojavLauncher_iOS
Path: blob/main/Natives/LauncherPreferences.m
589 views
1
#import "config.h"
2
#import "utils.h"
3
#import "LauncherPreferences.h"
4
#import "PLPreferences.h"
5
#import "UIKit+hook.h"
6
#import <CoreFoundation/CoreFoundation.h>
7
8
static PLPreferences* pref;
9
10
void loadPreferences(BOOL reset) {
11
assert(getenv("POJAV_HOME"));
12
if (reset) {
13
[pref reset];
14
} else {
15
pref = [[PLPreferences alloc] initWithAutomaticMigrator];
16
}
17
}
18
19
void toggleIsolatedPref(BOOL forceEnable) {
20
if (!pref.instancePath) {
21
pref.instancePath = [NSString stringWithFormat:@"%s/launcher_preferences.plist", getenv("POJAV_GAME_DIR")];
22
}
23
[pref toggleIsolationForced:forceEnable];
24
}
25
26
id getPrefObject(NSString *key) {
27
return [pref getObject:key];
28
}
29
BOOL getPrefBool(NSString *key) {
30
return [getPrefObject(key) boolValue];
31
}
32
float getPrefFloat(NSString *key) {
33
return [getPrefObject(key) floatValue];
34
}
35
NSInteger getPrefInt(NSString *key) {
36
return [getPrefObject(key) intValue];
37
}
38
39
void setPrefObject(NSString *key, id value) {
40
[pref setObject:key value:value];
41
}
42
void setPrefBool(NSString *key, BOOL value) {
43
setPrefObject(key, @(value));
44
}
45
void setPrefFloat(NSString *key, float value) {
46
setPrefObject(key, @(value));
47
}
48
void setPrefInt(NSString *key, NSInteger value) {
49
setPrefObject(key, @(value));
50
}
51
52
void resetWarnings() {
53
for (int i = 0; i < pref.globalPref[@"warnings"].count; i++) {
54
NSString *key = pref.globalPref[@"warnings"].allKeys[i];
55
pref.globalPref[@"warnings"][key] = @YES;
56
}
57
}
58
59
#pragma mark Safe area
60
61
CGRect getSafeArea() {
62
CGRect screenBounds = UIScreen.mainScreen.bounds;
63
UIEdgeInsets safeArea = UIEdgeInsetsFromString(getPrefObject(@"control.control_safe_area"));
64
if (screenBounds.size.width < screenBounds.size.height) {
65
safeArea = UIEdgeInsetsMake(safeArea.right, safeArea.top, safeArea.left, safeArea.bottom);
66
}
67
return UIEdgeInsetsInsetRect(screenBounds, safeArea);
68
}
69
70
void setSafeArea(CGRect frame) {
71
CGSize screenSize = UIScreen.mainScreen.bounds.size;
72
UIEdgeInsets safeArea;
73
// TODO: make safe area consistent across opposite orientations?
74
if (screenSize.width < screenSize.height) {
75
safeArea = UIEdgeInsetsMake(
76
frame.origin.x,
77
screenSize.height - CGRectGetMaxY(frame),
78
screenSize.width - CGRectGetMaxX(frame),
79
frame.origin.y);
80
} else {
81
safeArea = UIEdgeInsetsMake(
82
frame.origin.y,
83
frame.origin.x,
84
screenSize.height - CGRectGetMaxY(frame),
85
screenSize.width - CGRectGetMaxX(frame));
86
}
87
setPrefObject(@"control.control_safe_area", NSStringFromUIEdgeInsets(safeArea));
88
}
89
90
UIEdgeInsets getDefaultSafeArea() {
91
UIEdgeInsets safeArea = UIApplication.sharedApplication.windows.firstObject.safeAreaInsets;
92
CGSize screenSize = UIScreen.mainScreen.bounds.size;
93
if (screenSize.width < screenSize.height) {
94
safeArea.left = safeArea.top;
95
safeArea.right = safeArea.bottom;
96
}
97
safeArea.top = safeArea.bottom = 0;
98
return safeArea;
99
}
100
101
#pragma mark Java runtime
102
103
NSString* getSelectedJavaHome(NSString* defaultJRETag, int minVersion) {
104
NSDictionary *pref = getPrefObject(@"java.java_homes");
105
NSDictionary<NSString *, NSString *> *selected = pref[@"0"];
106
NSString *selectedVer = selected[defaultJRETag];
107
if (minVersion > selectedVer.intValue) {
108
NSArray *sortedVersions = [pref.allKeys valueForKeyPath:@"self.integerValue"];
109
sortedVersions = [sortedVersions sortedArrayUsingSelector:@selector(compare:)];
110
for (NSNumber *version in sortedVersions) {
111
if (version.intValue >= minVersion) {
112
selectedVer = version.stringValue;
113
break;
114
}
115
}
116
if (!selectedVer) {
117
NSLog(@"Error: requested Java >= %d was not installed!", minVersion);
118
return nil;
119
}
120
}
121
122
id selectedDir = pref[selectedVer];
123
if ([selectedDir isEqualToString:@"internal"]) {
124
selectedDir = [NSString stringWithFormat:@"%@/java_runtimes/java-%@-openjdk", NSBundle.mainBundle.bundlePath, selectedVer];
125
} else {
126
selectedDir = [NSString stringWithFormat:@"%s/java_runtimes/%@", getenv("POJAV_HOME"), selectedDir];
127
}
128
129
if ([NSFileManager.defaultManager fileExistsAtPath:selectedDir]) {
130
return selectedDir;
131
} else {
132
NSLog(@"Error: selected runtime for %@ does not exist: %@", defaultJRETag, selectedDir);
133
return nil;
134
}
135
}
136
137
#pragma mark Renderer
138
NSArray* getRendererKeys(BOOL containsDefault) {
139
NSMutableArray *array = @[
140
@"auto",
141
@ RENDERER_NAME_GL4ES,
142
@ RENDERER_NAME_MTL_ANGLE
143
].mutableCopy;
144
145
if (containsDefault) {
146
[array insertObject:@"(default)" atIndex:0];
147
}
148
149
#if CONFIG_RELEASE
150
if(@available(iOS 16.0, *)) {
151
// Disabling Zink on iOS 16.0+ to figure out what's wrong with it
152
} else {
153
#endif
154
[array addObject:@ RENDERER_NAME_VK_ZINK];
155
#if CONFIG_RELEASE
156
}
157
#endif
158
return array;
159
}
160
161
NSArray* getRendererNames(BOOL containsDefault) {
162
NSMutableArray *array;
163
164
#if CONFIG_RELEASE
165
if(@available(iOS 16.0, *)) {
166
// Disabling Zink on iOS 16.0+ to figure out what's wrong with it
167
array = @[
168
localize(@"preference.title.renderer.release.auto", nil),
169
localize(@"preference.title.renderer.release.gl4es", nil),
170
localize(@"preference.title.renderer.release.angle", nil)
171
].mutableCopy;
172
} else {
173
#endif
174
array = @[
175
localize(@"preference.title.renderer.debug.auto", nil),
176
localize(@"preference.title.renderer.debug.gl4es", nil),
177
localize(@"preference.title.renderer.debug.angle", nil),
178
localize(@"preference.title.renderer.debug.zink", nil)
179
].mutableCopy;
180
#if CONFIG_RELEASE
181
}
182
#endif
183
184
if (containsDefault) {
185
[array insertObject:@"(default)" atIndex:0];
186
}
187
188
return array;
189
}
190
191