diff --git a/JavaApp/src/main/java/net/kdt/pojavlaunch/Tools.java b/JavaApp/src/main/java/net/kdt/pojavlaunch/Tools.java index 239b42c5..1a134a0d 100644 --- a/JavaApp/src/main/java/net/kdt/pojavlaunch/Tools.java +++ b/JavaApp/src/main/java/net/kdt/pojavlaunch/Tools.java @@ -28,71 +28,34 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; -import java.util.zip.ZipOutputStream; import net.kdt.pojavlaunch.uikit.UIKit; -import net.kdt.pojavlaunch.utils.DownloadUtils; import net.kdt.pojavlaunch.utils.JSONUtils; import net.kdt.pojavlaunch.value.DependentLibrary; import net.kdt.pojavlaunch.value.MinecraftAccount; import net.kdt.pojavlaunch.value.MinecraftLibraryArtifact; -import org.lwjgl.glfw.GLFW; -public final class Tools -{ - public static final boolean ENABLE_DEV_FEATURES = true; // BuildConfig.DEBUG; - - public static String APP_NAME = "PojavLauncher"; - +public final class Tools { public static final Gson GLOBAL_GSON = new GsonBuilder().setPrettyPrinting().create(); - - public static final String URL_HOME = "https://pojav.ml"; - public static String DIR_BUNDLE = System.getenv("BUNDLE_PATH"); // path to "PojavLauncher.app" - public static String CURRENT_ARCHITECTURE; + public static final String DIR_BUNDLE = System.getenv("BUNDLE_PATH"); // path to "PojavLauncher.app" public static final String DIR_GAME_HOME = System.getenv("POJAV_HOME"); public static final String DIR_GAME_NEW = System.getenv("POJAV_GAME_DIR"); // path to "Library/Application Support/minecraft" public static final String DIR_GAME_PROFILE = System.getProperty("user.dir"); public static final String DIR_APP_DATA = System.getenv("POJAV_HOME"); public static final String DIR_ACCOUNT_NEW = DIR_APP_DATA + "/accounts"; - - // New since 3.0.0 - public static String DIR_HOME_JRE = System.getProperty("java.home"); - public static String DIRNAME_HOME_JRE = "lib"; // New since 2.4.2 public static final String DIR_HOME_VERSION = DIR_GAME_NEW + "/versions"; public static final String DIR_HOME_LIBRARY = DIR_GAME_NEW + "/libraries"; - public static final String DIR_HOME_CRASH = DIR_GAME_NEW + "/crash-reports"; - public static final String ASSETS_PATH = DIR_GAME_NEW + "/assets"; public static final String OBSOLETE_RESOURCES_PATH=DIR_GAME_NEW + "/resources"; - public static final String CTRLMAP_PATH = DIR_GAME_NEW + "/controlmap"; - public static final String CTRLDEF_FILE = DIR_GAME_NEW + "/controlmap/default.json"; - public static final String NATIVE_LIB_DIR = DIR_BUNDLE + "/Frameworks"; + public static final String NATIVE_LIB_DIR = "@executable_path/Frameworks"; public static void launchMinecraft(MinecraftAccount profile, final JMinecraftVersionList.Version versionInfo) throws Throwable { - String javaVersion = System.getProperty("java.version"); - if (javaVersion.startsWith("1.")) { - javaVersion = javaVersion.substring(2); - } - int splitIndex = javaVersion.indexOf('.'); - if (splitIndex == -1) { - splitIndex = javaVersion.indexOf('-'); - } - if (splitIndex != -1) { - javaVersion = javaVersion.substring(0, splitIndex); - } - if (versionInfo.javaVersion != null && versionInfo.javaVersion.majorVersion > Integer.parseInt(javaVersion)) { - throw new UnsupportedOperationException("Minecraft " + versionInfo.id + " requires Java " + versionInfo.javaVersion.majorVersion + " in order to run. Please switch to Java " + versionInfo.javaVersion.majorVersion + " in launcher settings."); - } - String[] launchArgs = getMinecraftArgs(profile, versionInfo); - // System.out.println("Minecraft Args: " + Arrays.toString(launchArgs)); final String launchClassPath = generateLaunchClassPath(versionInfo); @@ -533,98 +496,4 @@ createLibraryInfo(libItem); public static void write(String path, String content) throws IOException { write(path, content.getBytes()); } - - public static void downloadFile(String urlInput, String nameOutput) throws IOException { - File file = new File(nameOutput); - DownloadUtils.downloadFile(urlInput, file); - } - public abstract static class DownloaderFeedback { - public abstract void updateProgress(int curr, int max); - } - - public static void downloadFileMonitored(String urlInput,String nameOutput, DownloaderFeedback monitor) throws IOException { - if(!new File(nameOutput).exists()){ - new File(nameOutput).getParentFile().mkdirs(); - } - HttpURLConnection conn = (HttpURLConnection) new URL(urlInput).openConnection(); - InputStream readStr = conn.getInputStream(); - FileOutputStream fos = new FileOutputStream(new File(nameOutput)); - int cur = 0; int oval=0; int len = conn.getContentLength(); byte[] buf = new byte[65535]; - while((cur = readStr.read(buf)) != -1) { - oval += cur; - fos.write(buf,0,cur); - monitor.updateProgress(oval,len); - } - fos.close(); - conn.disconnect(); - } - public static class ZipTool - { - private ZipTool(){} - public static void zip(List files, File zipFile) throws IOException { - final int BUFFER_SIZE = 2048; - - BufferedInputStream origin = null; - ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile))); - - try { - byte data[] = new byte[BUFFER_SIZE]; - - for (File file : files) { - FileInputStream fileInputStream = new FileInputStream( file ); - - origin = new BufferedInputStream(fileInputStream, BUFFER_SIZE); - - try { - ZipEntry entry = new ZipEntry(file.getName()); - - out.putNextEntry(entry); - - int count; - while ((count = origin.read(data, 0, BUFFER_SIZE)) != -1) { - out.write(data, 0, count); - } - } - finally { - origin.close(); - } - } - } finally { - out.close(); - } - } - public static void unzip(File zipFile, File targetDirectory) throws IOException { - final int BUFFER_SIZE = 1024; - ZipInputStream zis = new ZipInputStream( - new BufferedInputStream(new FileInputStream(zipFile))); - try { - ZipEntry ze; - int count; - byte[] buffer = new byte[BUFFER_SIZE]; - while ((ze = zis.getNextEntry()) != null) { - File file = new File(targetDirectory, ze.getName()); - File dir = ze.isDirectory() ? file : file.getParentFile(); - if (!dir.isDirectory() && !dir.mkdirs()) - throw new FileNotFoundException("Failed to ensure directory: " + - dir.getAbsolutePath()); - if (ze.isDirectory()) - continue; - FileOutputStream fout = new FileOutputStream(file); - try { - while ((count = zis.read(buffer)) != -1) - fout.write(buffer, 0, count); - } finally { - fout.close(); - } - /* if time should be restored as well - long time = ze.getTime(); - if (time > 0) - file.setLastModified(time); - */ - } - } finally { - zis.close(); - } - } - } } diff --git a/JavaApp/src/main/java/net/kdt/pojavlaunch/utils/DownloadUtils.java b/JavaApp/src/main/java/net/kdt/pojavlaunch/utils/DownloadUtils.java deleted file mode 100644 index 1ff8c08e..00000000 --- a/JavaApp/src/main/java/net/kdt/pojavlaunch/utils/DownloadUtils.java +++ /dev/null @@ -1,88 +0,0 @@ -package net.kdt.pojavlaunch.utils; - -import java.io.*; -import java.net.*; -import java.nio.charset.*; - -import net.kdt.pojavlaunch.*; - -public class DownloadUtils { - public static final String USER_AGENT = Tools.APP_NAME; - public static final Charset utf8 = Charset.forName("UTF-8"); - - public static void download(String url, OutputStream os) throws IOException { - download(new URL(url), os); - } - - public static void download(URL url, OutputStream os) throws IOException { - InputStream is = null; - try { - // System.out.println("Connecting: " + url.toString()); - HttpURLConnection conn = (HttpURLConnection) url.openConnection(); - conn.setRequestProperty("User-Agent", USER_AGENT); - conn.setConnectTimeout(10000); - conn.setDoInput(true); - conn.connect(); - if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) { - throw new IOException("Server returned HTTP " + conn.getResponseCode() - + ": " + conn.getResponseMessage()); - } - is = conn.getInputStream(); - Tools.copy(is, os); - } catch (IOException e) { - throw new IOException("Unable to download from " + url.toString(), e); - } finally { - if (is != null) { - try { - is.close(); - } catch (Exception e) { - e.printStackTrace(); - } - } - } - } - - public static String downloadString(String url) throws IOException { - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - download(url, bos); - bos.close(); - return new String(bos.toByteArray(), utf8); - } - - public static void downloadFile(String url, File out) throws IOException { - out.getParentFile().mkdirs(); - File tempOut = File.createTempFile(out.getName(), ".part", out.getParentFile()); - BufferedOutputStream bos = null; - try { - OutputStream bos2 = new BufferedOutputStream(new FileOutputStream(tempOut)); - try { - download(url, bos2); - tempOut.renameTo(out); - if (bos2 != null) { - bos2.close(); - } - if (tempOut.exists()) { - tempOut.delete(); - } - } catch (IOException th2) { - if (bos != null) { - bos.close(); - } - if (tempOut.exists()) { - tempOut.delete(); - } - throw th2; - } - } catch (IOException th3) { - - if (bos != null) { - bos.close(); - } - if (tempOut.exists()) { - tempOut.delete(); - } - throw th3; - } - } -} - diff --git a/Natives/AccountListViewController.m b/Natives/AccountListViewController.m index 4257a174..3165fe91 100644 --- a/Natives/AccountListViewController.m +++ b/Natives/AccountListViewController.m @@ -8,14 +8,6 @@ #import "ios_uikit_bridge.h" #import "utils.h" -@interface ATableViewCell : UITableViewCell -@end - -@implementation ATableViewCell - -@end - - @interface AccountListViewController() @property(nonatomic, strong) NSMutableArray *accountList; diff --git a/Natives/CMakeLists.txt b/Natives/CMakeLists.txt index d56d0406..8cb8fd79 100644 --- a/Natives/CMakeLists.txt +++ b/Natives/CMakeLists.txt @@ -56,15 +56,7 @@ set(CMAKE_FRAMEWORK_PATH "${CMAKE_CURRENT_LIST_DIR}/resources/Frameworks") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -rpath @executable_path/Frameworks -rpath @loader_path/Frameworks") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -rpath @executable_path/Frameworks -rpath @loader_path/Frameworks") - -add_library(OSMesaOverride SHARED gl_mesa3d_patch.m) -target_link_libraries(OSMesaOverride - "${GLOBAL_LDFLAGS}" - "-L${CMAKE_FRAMEWORK_PATH}" - "-lOSMesa.8" -) - - +# ANGLE wrapper for 1.17+ add_library(tinygl4angle SHARED external/gl4es/string_utils.c external/gl4es/tinygl4angle.c @@ -76,7 +68,7 @@ target_link_libraries(tinygl4angle "-framework libGLESv2" ) - +# AFNetworking add_library(AFNetworking SHARED external/AFNetworking/AFNetworking/AFSecurityPolicy.m external/AFNetworking/AFNetworking/AFHTTPSessionManager.m @@ -98,7 +90,7 @@ target_link_libraries(AFNetworking "-framework UIKit" ) - +# PojavLauncher add_executable(PojavLauncher dyld_bypass_validation.m main.m diff --git a/Natives/CustomControlsViewController.m b/Natives/CustomControlsViewController.m index d5e03a19..6218b0f7 100644 --- a/Natives/CustomControlsViewController.m +++ b/Natives/CustomControlsViewController.m @@ -8,13 +8,9 @@ #import "customcontrols/ControlJoystick.h" #import "customcontrols/CustomControlsUtils.h" -#include - #include "glfw_keycodes.h" #include "utils.h" -BOOL shouldDismissPopover = YES; - @implementation ControlHandleView // Nothing @end @@ -102,8 +98,8 @@ BOOL shouldDismissPopover = YES; - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; + isControlModifiable = NO; if (isInGame) { - isControlModifiable = NO; [self.presentingViewController performSelector:@selector(loadCustomControls)]; } } @@ -215,19 +211,9 @@ BOOL shouldDismissPopover = YES; - (void)showControlPopover:(UIGestureRecognizer *)sender { self.currentGesture = sender; - switch (sender.state) { - case UIGestureRecognizerStateBegan: - if (![sender isKindOfClass:[UILongPressGestureRecognizer class]]) { - return; - } - break; - case UIGestureRecognizerStateEnded: - if ([sender isKindOfClass:[UILongPressGestureRecognizer class]]) { - return; - } - break; - default: - return; + if (sender.state != UIGestureRecognizerStateBegan && + sender.state != UIGestureRecognizerStateEnded) { + return; } UIMenuController *menuController = [UIMenuController sharedMenuController]; @@ -468,7 +454,6 @@ BOOL shouldDismissPopover = YES; } - (void)actionMenuBtnEdit { - shouldDismissPopover = NO; CCMenuViewController *vc = [[CCMenuViewController alloc] init]; vc.modalPresentationStyle = UIModalPresentationOverFullScreen; vc.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; @@ -602,22 +587,9 @@ BOOL shouldDismissPopover = YES; return UIModalPresentationNone; } -- (BOOL)popoverPresentationControllerShouldDismissPopover:(UIPopoverPresentationController *)popoverPresentationController -{ - return shouldDismissPopover; -} - -- (BOOL)presentationControllerShouldDismiss:(UIPresentationController *)presentationController -{ - return shouldDismissPopover; -} - @end #define TAG_SLIDER_STROKEWIDTH 10 -#define TAG_SLIDER_CORNERRADIUS 11 -#define TAG_SLIDER_OPACITY 12 -#define TAG_SWITCH_DYNAMICPOS 13 #define VISIBILITY_ALWAYS 0 #define VISIBILITY_IN_GAME 1 @@ -641,7 +613,7 @@ CGFloat currentY; @property(nonatomic) UIPickerView* pickerMapping; @property(nonatomic) UISegmentedControl *ctrlOrientation, *ctrlVisibility; @property(nonatomic) UISwitch *switchFwdLock, *switchToggleable, *switchMousePass, *switchSwipeable; -@property(nonatomic) UIColorWell *colorWellINTBackground, *colorWellINTStroke; +@property(nonatomic) UIColorWell *colorWellBackground, *colorWellStroke; @property(nonatomic) DBNumberedSlider *sliderStrokeWidth, *sliderCornerRadius, *sliderOpacity; @end @@ -825,10 +797,10 @@ CGFloat currentY; // Property: Background color UILabel *labelBGColor = [self addLabel:localize(@"custom_controls.button_edit.bg_color", nil)]; - self.colorWellINTBackground = [[UIColorWell alloc] initWithFrame:CGRectMake(width - 42.0, currentY - 5.0, 30.0, 30.0)]; - [self.colorWellINTBackground addTarget:self action:@selector(colorWellChanged) forControlEvents:UIControlEventValueChanged]; - self.colorWellINTBackground.selectedColor = convertARGB2UIColor([self.targetButton.properties[@"bgColor"] intValue]); - [self.scrollView addSubview:self.colorWellINTBackground]; + self.colorWellBackground = [[UIColorWell alloc] initWithFrame:CGRectMake(width - 42.0, currentY - 5.0, 30.0, 30.0)]; + [self.colorWellBackground addTarget:self action:@selector(colorWellChanged) forControlEvents:UIControlEventValueChanged]; + self.colorWellBackground.selectedColor = convertARGB2UIColor([self.targetButton.properties[@"bgColor"] intValue]); + [self.scrollView addSubview:self.colorWellBackground]; currentY += labelBGColor.frame.size.height + 15.0; // Property: Stroke width @@ -845,10 +817,10 @@ CGFloat currentY; // Property: Stroke color UILabel *labelStrokeColor = [self addLabel:localize(@"custom_controls.button_edit.stroke_color", nil)]; - self.colorWellINTStroke = [[UIColorWell alloc] initWithFrame:CGRectMake(width - 42.0, currentY - 5.0, 30.0, 30.0)]; - [self.colorWellINTStroke addTarget:self action:@selector(colorWellChanged) forControlEvents:UIControlEventValueChanged]; - self.colorWellINTStroke.selectedColor = convertARGB2UIColor([self.targetButton.properties[@"strokeColor"] intValue]); - [self.scrollView addSubview:self.colorWellINTStroke]; + self.colorWellStroke = [[UIColorWell alloc] initWithFrame:CGRectMake(width - 42.0, currentY - 5.0, 30.0, 30.0)]; + [self.colorWellStroke addTarget:self action:@selector(colorWellChanged) forControlEvents:UIControlEventValueChanged]; + self.colorWellStroke.selectedColor = convertARGB2UIColor([self.targetButton.properties[@"strokeColor"] intValue]); + [self.scrollView addSubview:self.colorWellStroke]; currentY += labelStrokeColor.frame.size.height + 15.0; @@ -858,7 +830,6 @@ CGFloat currentY; self.sliderCornerRadius = [[DBNumberedSlider alloc] initWithFrame:CGRectMake(labelCornerRadius.frame.size.width + 5.0, currentY - 5.0, width - labelCornerRadius.frame.size.width - 5.0, 30.0)]; self.sliderCornerRadius.continuous = YES; self.sliderCornerRadius.maximumValue = 100; - self.sliderCornerRadius.tag = TAG_SLIDER_CORNERRADIUS; self.sliderCornerRadius.value = [self.targetButton.properties[@"cornerRadius"] intValue]; [self.sliderCornerRadius addTarget:self action:@selector(sliderValueChanged:) forControlEvents:UIControlEventValueChanged]; [self.scrollView addSubview:self.sliderCornerRadius]; @@ -872,7 +843,6 @@ CGFloat currentY; self.sliderOpacity.continuous = YES; self.sliderOpacity.minimumValue = 1; self.sliderOpacity.maximumValue = 100; - self.sliderOpacity.tag = TAG_SLIDER_OPACITY; self.sliderOpacity.value = [self.targetButton.properties[@"opacity"] floatValue] * 100.0; [self.sliderOpacity addTarget:self action:@selector(sliderValueChanged:) forControlEvents:UIControlEventValueChanged]; [self.scrollView addSubview:self.sliderOpacity]; @@ -913,11 +883,11 @@ CGFloat currentY; lastPoint = point; } -#pragma mark - Alderis functions +#pragma mark - Color picker functions - (void)colorWellChanged { - self.targetButton.properties[@"bgColor"] = @(convertUIColor2ARGB(self.colorWellINTBackground.selectedColor)); - self.targetButton.properties[@"strokeColor"] = @(convertUIColor2ARGB(self.colorWellINTStroke.selectedColor)); + self.targetButton.properties[@"bgColor"] = @(convertUIColor2ARGB(self.colorWellBackground.selectedColor)); + self.targetButton.properties[@"strokeColor"] = @(convertUIColor2ARGB(self.colorWellStroke.selectedColor)); [self.targetButton update]; } @@ -932,7 +902,6 @@ CGFloat currentY; - (void)actionEditCancel { self.targetButton.properties = self.oldProperties; [self.targetButton update]; - shouldDismissPopover = YES; [self dismissViewControllerAnimated:YES completion:nil]; } @@ -955,7 +924,6 @@ CGFloat currentY; [(CustomControlsViewController *)self.presentingViewController doUpdateButton:self.targetButton from:self.oldProperties to:newProperties]; self.oldProperties = nil; - shouldDismissPopover = YES; [self dismissViewControllerAnimated:YES completion:nil]; } @@ -967,7 +935,7 @@ CGFloat currentY; - (void)sliderValueChanged:(DBNumberedSlider *)sender { if (sender.tag == TAG_SLIDER_STROKEWIDTH) { - self.colorWellINTStroke.enabled = sender.value != 0; + self.colorWellStroke.enabled = sender.value != 0; self.targetButton.properties[@"strokeWidth"] = @((NSInteger) self.sliderStrokeWidth.value); } else { [sender setValue:(NSInteger)sender.value animated:NO]; @@ -1019,7 +987,7 @@ CGFloat currentY; } - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { - return [self.keyCodeMap objectAtIndex:row]; + return self.keyCodeMap[row]; } - (void)closeTextField { diff --git a/Natives/GameSurfaceView.h b/Natives/GameSurfaceView.h index 70791d11..62ab71a5 100644 --- a/Natives/GameSurfaceView.h +++ b/Natives/GameSurfaceView.h @@ -2,11 +2,5 @@ #import @interface GameSurfaceView : UIView -{ - CALayer* layer; - CGColorSpaceRef colorSpace; - CGDataProviderDirectCallbacks callbacks; -} - - (void)displayLayer; @end diff --git a/Natives/GameSurfaceView.m b/Natives/GameSurfaceView.m index cdff0032..42d13e6a 100644 --- a/Natives/GameSurfaceView.m +++ b/Natives/GameSurfaceView.m @@ -3,11 +3,15 @@ #import "PLProfiles.h" #import "utils.h" +@interface GameSurfaceView() +@property(nonatomic) CGColorSpaceRef colorSpace; +@end + @implementation GameSurfaceView - (void)displayLayer { CGDataProviderRef bitmapProvider = CGDataProviderCreateWithData(NULL, gbuffer, windowWidth * windowHeight * 4, NULL); - CGImageRef bitmap = CGImageCreate(windowWidth, windowHeight, 8, 32, 4 * windowWidth, colorSpace, kCGImageAlphaNoneSkipLast | kCGBitmapByteOrderDefault, bitmapProvider, NULL, FALSE, kCGRenderingIntentDefault); + CGImageRef bitmap = CGImageCreate(windowWidth, windowHeight, 8, 32, 4 * windowWidth, _colorSpace, kCGImageAlphaNoneSkipLast | kCGBitmapByteOrderDefault, bitmapProvider, NULL, FALSE, kCGRenderingIntentDefault); self.layer.contents = (__bridge id) bitmap; CGImageRelease(bitmap); CGDataProviderRelease(bitmapProvider); @@ -20,18 +24,14 @@ self.layer.opaque = YES; if ([[PLProfiles resolveKeyForCurrentProfile:@"renderer"] hasPrefix:@"libOSMesa"]) { - colorSpace = CGColorSpaceCreateDeviceRGB(); + self.colorSpace = CGColorSpaceCreateDeviceRGB(); } return self; } + (Class)layerClass { - if ([[PLProfiles resolveKeyForCurrentProfile:@"renderer"] hasPrefix:@"libOSMesa"]) { - return CALayer.class; - } else { - return CAMetalLayer.class; - } + return CAMetalLayer.class; } @end diff --git a/Natives/JavaGUIViewController.h b/Natives/JavaGUIViewController.h index 854fc49a..69cae8da 100644 --- a/Natives/JavaGUIViewController.h +++ b/Natives/JavaGUIViewController.h @@ -1,10 +1,6 @@ #import -@interface SurfaceView : UIView { - CGColorSpaceRef colorSpace; - CGDataProviderDirectCallbacks callbacks; -} - +@interface SurfaceView : UIView - (void)displayLayer; @end diff --git a/Natives/JavaGUIViewController.m b/Natives/JavaGUIViewController.m index 8c4fa708..4a04dfbd 100644 --- a/Natives/JavaGUIViewController.m +++ b/Natives/JavaGUIViewController.m @@ -75,14 +75,14 @@ void AWTInputBridge_sendKey(int keycode) { AWTInputBridge_nativeSendData(EVENT_TYPE_KEY, ' ', keycode, 0, 0); } +@interface SurfaceView() +@property(nonatomic) CGColorSpaceRef colorSpace; +@end + @implementation SurfaceView -const void * _CGDataProviderGetBytePointerCallbackAWT(void *info) { - return (const void *)rgbArray; -} - - (void)displayLayer { - CGDataProviderRef bitmapProvider = CGDataProviderCreateDirect(NULL, windowWidth * windowHeight * 4, &callbacks); - CGImageRef bitmap = CGImageCreate(windowWidth, windowHeight, 8, 32, 4 * windowWidth, colorSpace, kCGImageAlphaFirst | kCGBitmapByteOrder32Little, bitmapProvider, NULL, FALSE, kCGRenderingIntentDefault); + CGDataProviderRef bitmapProvider = CGDataProviderCreateWithData(NULL, rgbArray, windowWidth * windowHeight * 4, NULL); + CGImageRef bitmap = CGImageCreate(windowWidth, windowHeight, 8, 32, 4 * windowWidth, _colorSpace, kCGImageAlphaFirst | kCGBitmapByteOrder32Little, bitmapProvider, NULL, FALSE, kCGRenderingIntentDefault); self.layer.contents = (__bridge id) bitmap; CGImageRelease(bitmap); @@ -90,19 +90,10 @@ const void * _CGDataProviderGetBytePointerCallbackAWT(void *info) { // CGColorSpaceRelease(colorSpace); } -- (id)initWithFrame:(CGRect)frame -{ +- (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; self.layer.opaque = YES; - - colorSpace = CGColorSpaceCreateDeviceRGB(); - - callbacks.version = 0; - callbacks.getBytePointer = _CGDataProviderGetBytePointerCallbackAWT; - callbacks.releaseBytePointer = _CGDataProviderReleaseBytePointerCallback; - callbacks.getBytesAtPosition = NULL; - callbacks.releaseInfo = NULL; - + self.colorSpace = CGColorSpaceCreateDeviceRGB(); return self; } @end diff --git a/Natives/JavaLauncher.m b/Natives/JavaLauncher.m index 78768f46..55be4be1 100644 --- a/Natives/JavaLauncher.m +++ b/Natives/JavaLauncher.m @@ -146,7 +146,7 @@ int launchJVM(NSString *username, id launchTarget, int width, int height, int mi // Symlink libawt_xawt.dylib NSString *dest = [NSString stringWithFormat:@"%@/lib/libawt_xawt.dylib", javaHome]; - NSString *source = [NSString stringWithFormat:@"%s/Frameworks/libawt_xawt.dylib", getenv("BUNDLE_PATH")]; + NSString *source = [NSString stringWithFormat:@"%@/Frameworks/libawt_xawt.dylib", NSBundle.mainBundle.bundlePath]; NSError *error; [fm createSymbolicLinkAtPath:dest withDestinationPath:source error:&error]; if (error) { @@ -174,8 +174,8 @@ int launchJVM(NSString *username, id launchTarget, int width, int height, int mi margv[++margc] = "-Djava.system.class.loader=net.kdt.pojavlaunch.PojavClassLoader"; margv[++margc] = "-Xms128M"; margv[++margc] = [NSString stringWithFormat:@"-Xmx%dM", allocmem].UTF8String; - margv[++margc] = [NSString stringWithFormat:@"-Djava.library.path=%1$s/Frameworks", getenv("BUNDLE_PATH")].UTF8String; - margv[++margc] = [NSString stringWithFormat:@"-Djna.boot.library.path=%s/Frameworks", getenv("BUNDLE_PATH")].UTF8String; + margv[++margc] = [NSString stringWithFormat:@"-Djava.library.path=%@/Frameworks", NSBundle.mainBundle.bundlePath].UTF8String; + margv[++margc] = [NSString stringWithFormat:@"-Djna.boot.library.path=%@/Frameworks", NSBundle.mainBundle.bundlePath].UTF8String; margv[++margc] = [NSString stringWithFormat:@"-Duser.dir=%@", gameDir].UTF8String; margv[++margc] = [NSString stringWithFormat:@"-Duser.home=%s", getenv("POJAV_HOME")].UTF8String; margv[++margc] = [NSString stringWithFormat:@"-Duser.timezone=%@", NSTimeZone.localTimeZone.name].UTF8String; @@ -195,7 +195,7 @@ int launchJVM(NSString *username, id launchTarget, int width, int height, int mi margv[++margc] = [NSString stringWithFormat:@"-Dorg.lwjgl.opengl.libname=%s", glLibName].UTF8String; } - NSString *librariesPath = [NSString stringWithFormat:@"%s/libs", getenv("BUNDLE_PATH")]; + NSString *librariesPath = [NSString stringWithFormat:@"%@/libs", NSBundle.mainBundle.bundlePath]; if(getPrefBool(@"general.cosmetica")) { margv[++margc] = [NSString stringWithFormat:@"-javaagent:%@/arc_dns_injector.jar=23.95.137.176", librariesPath].UTF8String; } @@ -264,7 +264,7 @@ int launchJVM(NSString *username, id launchTarget, int width, int height, int mi // Add Caciocavallo bootclasspath NSString *cacio_classpath = [NSString stringWithFormat:@"-Xbootclasspath/%s", isJava8 ? "p" : "a"]; - NSString *cacio_libs_path = [NSString stringWithFormat:@"%s/libs_caciocavallo%s", getenv("BUNDLE_PATH"), isJava8 ? "" : "17"]; + NSString *cacio_libs_path = [NSString stringWithFormat:@"%@/libs_caciocavallo%s", NSBundle.mainBundle.bundlePath, isJava8 ? "" : "17"]; NSArray *files = [fm contentsOfDirectoryAtPath:cacio_libs_path error:nil]; for(NSString *file in files) { if ([file hasSuffix:@".jar"]) { diff --git a/Natives/LauncherNewsViewController.m b/Natives/LauncherNewsViewController.m index 721bd7d8..d222026a 100644 --- a/Natives/LauncherNewsViewController.m +++ b/Natives/LauncherNewsViewController.m @@ -45,7 +45,7 @@ UIEdgeInsets insets; [webView loadRequest:request]; [self.view addSubview:webView]; - if(!getenv("POJAV_DETECTEDJB") && getPrefBool(@"warnings.limited_ram_warn") && (roundf(NSProcessInfo.processInfo.physicalMemory / 1048576) < 3900)) { + if(!isJailbroken && getPrefBool(@"warnings.limited_ram_warn") && (roundf(NSProcessInfo.processInfo.physicalMemory / 0x1000000) < 3900)) { // "This device has a limited amount of memory available." [self showWarningAlert:@"limited_ram" hasPreference:YES]; } diff --git a/Natives/LauncherPrefManageJREViewController.m b/Natives/LauncherPrefManageJREViewController.m index 9ecfb49f..90b0bb56 100644 --- a/Natives/LauncherPrefManageJREViewController.m +++ b/Natives/LauncherPrefManageJREViewController.m @@ -69,7 +69,7 @@ static WFWorkflowProgressView* currentProgressView; self.selectedRTTags = @[@"1_16_5_older", @"1_17_newer", @"install_jar"]; self.selectedRuntimes = getPrefObject(@"java.java_homes"); - NSString *internalPath = [NSString stringWithFormat:@"%s/java_runtimes", getenv("BUNDLE_PATH")]; + NSString *internalPath = [NSString stringWithFormat:@"%@/java_runtimes", NSBundle.mainBundle.bundlePath]; NSString *externalPath = [NSString stringWithFormat:@"%s/java_runtimes", getenv("POJAV_HOME")]; [self listJREInPath:internalPath markInternal:YES]; [self listJREInPath:externalPath markInternal:NO]; @@ -235,8 +235,8 @@ static WFWorkflowProgressView* currentProgressView; // Display size dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ unsigned long long folderSize = 0; - NSString *directory = [NSString stringWithFormat:@"%s/java_runtimes/%@", - getenv(isInternal ? "BUNDLE_PATH" : "POJAV_HOME"), + NSString *directory = [NSString stringWithFormat:@"%@/java_runtimes/%@", + isInternal ? NSBundle.mainBundle.bundlePath : @(getenv("POJAV_HOME")), name]; [NSFileManager.defaultManager nr_getAllocatedSize:&folderSize ofDirectoryAtURL:[NSURL fileURLWithPath:directory] error:nil]; dispatch_async(dispatch_get_main_queue(), ^{ diff --git a/Natives/LauncherPreferences.m b/Natives/LauncherPreferences.m index aa949f61..4d8793ed 100644 --- a/Natives/LauncherPreferences.m +++ b/Natives/LauncherPreferences.m @@ -103,7 +103,7 @@ NSString* getSelectedJavaHome(NSString* defaultJRETag, int minVersion) { id selectedDir = pref[selectedVer]; if ([selectedDir isEqualToString:@"internal"]) { - selectedDir = [NSString stringWithFormat:@"%s/java_runtimes/java-%@-openjdk", getenv("BUNDLE_PATH"), selectedVer]; + selectedDir = [NSString stringWithFormat:@"%@/java_runtimes/java-%@-openjdk", NSBundle.mainBundle.bundlePath, selectedVer]; } else { selectedDir = [NSString stringWithFormat:@"%s/java_runtimes/%@", getenv("POJAV_HOME"), selectedDir]; } diff --git a/Natives/LauncherPreferencesViewController.m b/Natives/LauncherPreferencesViewController.m index af5c04b4..d47f22be 100644 --- a/Natives/LauncherPreferencesViewController.m +++ b/Natives/LauncherPreferencesViewController.m @@ -1,6 +1,7 @@ #import #import "DBNumberedSlider.h" +#import "HostManagerBridge.h" #import "LauncherNavigationController.h" #import "LauncherMenuViewController.h" #import "LauncherPreferences.h" @@ -329,7 +330,7 @@ @"type": self.typeSwitch, @"enableCondition": whenNotInGame, @"warnCondition": ^BOOL(){ - return getenv("POJAV_DETECTEDJB") == NULL; + return !isJailbroken; }, @"warnKey": @"auto_ram_warn", @"requestReload": @YES @@ -398,10 +399,10 @@ - (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section { if (section == 0) { // Add to general section - return [NSString stringWithFormat:@"PojavLauncher %@-%s (%s/%s)\niOS %s on %s (%s)\nPID: %d", + return [NSString stringWithFormat:@"PojavLauncher %@-%s (%s/%s)\n%@ on %@ (%s)\nPID: %d", NSBundle.mainBundle.infoDictionary[@"CFBundleShortVersionString"], CONFIG_TYPE, CONFIG_BRANCH, CONFIG_COMMIT, - getenv("POJAV_DETECTEDSW"), getenv("POJAV_DETECTEDHW"), getenv("POJAV_DETECTEDINST"), getpid()]; + UIDevice.currentDevice.completeOSVersion, [HostManager GetModelName], getenv("POJAV_DETECTEDINST"), getpid()]; } NSString *footer = NSLocalizedStringWithDefaultValue(([NSString stringWithFormat:@"preference.section.footer.%@", self.prefSections[section]]), @"Localizable", NSBundle.mainBundle, @" ", nil); diff --git a/Natives/LauncherSplitViewController.m b/Natives/LauncherSplitViewController.m index ced9330e..bca5164e 100644 --- a/Natives/LauncherSplitViewController.m +++ b/Natives/LauncherSplitViewController.m @@ -16,7 +16,7 @@ extern NSMutableDictionary *prefDict; - (void)viewDidLoad { [super viewDidLoad]; UIApplication.sharedApplication.idleTimerDisabled = YES; - setViewBackgroundColor(self.view); + self.view.backgroundColor = UIColor.systemBackgroundColor; if ([getPrefObject(@"control.control_safe_area") length] == 0) { setPrefObject(@"control.control_safe_area", NSStringFromUIEdgeInsets(getDefaultSafeArea())); } diff --git a/Natives/UIKit+hook.h b/Natives/UIKit+hook.h index 14576a0b..ea933c6b 100644 --- a/Natives/UIKit+hook.h +++ b/Natives/UIKit+hook.h @@ -3,6 +3,8 @@ #define realUIIdiom UIDevice.currentDevice.hook_userInterfaceIdiom @interface UIDevice(hook) +- (NSString *)buildVersion; +- (NSString *)completeOSVersion; - (UIUserInterfaceIdiom)hook_userInterfaceIdiom; @end diff --git a/Natives/UIKit+hook.m b/Natives/UIKit+hook.m index 67a52e85..dc040988 100644 --- a/Natives/UIKit+hook.m +++ b/Natives/UIKit+hook.m @@ -32,6 +32,10 @@ void init_hookUIKitConstructor(void) { @implementation UIDevice(hook) +- (NSString *)completeOSVersion { + return [NSString stringWithFormat:@"%@ %@ (%@)", self.systemName, self.systemVersion, self.buildVersion]; +} + - (UIUserInterfaceIdiom)hook_userInterfaceIdiom { if (getPrefBool(@"debug.debug_ipad_ui")) { return UIUserInterfaceIdiomPad; diff --git a/Natives/dyld_bypass_validation.m b/Natives/dyld_bypass_validation.m index aff6b21b..893d1b93 100644 --- a/Natives/dyld_bypass_validation.m +++ b/Natives/dyld_bypass_validation.m @@ -105,38 +105,22 @@ void *getDyldBase(void) { } void* hooked_mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset) { - char filePath[PATH_MAX]; - memset(filePath, 0, sizeof(filePath)); - - // Check if the file is our "in-memory" file - if (fd && __fcntl(fd, F_GETPATH, filePath) != -1) { - const char *homeDir = getenv("POJAV_HOME"); - if (!strncmp(filePath, homeDir, strlen(homeDir))) { - int newFlags = MAP_PRIVATE | MAP_ANONYMOUS; - if (addr != 0) { - newFlags |= MAP_FIXED; - } - void *alloc = __mmap(addr, len, PROT_READ | PROT_WRITE, newFlags, 0, 0); - - void *memoryLoadedFile = __mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, offset); - memcpy(alloc, memoryLoadedFile, len); - munmap(memoryLoadedFile, len); - - //vm_protect(mach_task_self(), (vm_address_t)alloc, len, false, prot); - mprotect(alloc, len, prot); - return alloc; - } + void *map = __mmap(addr, len, prot, flags, fd, offset); + if (map == MAP_FAILED && fd && (prot & PROT_EXEC)) { + map = __mmap(addr, len, PROT_READ | PROT_WRITE, flags | MAP_PRIVATE | MAP_ANON, 0, 0); + void *memoryLoadedFile = __mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, offset); + memcpy(map, memoryLoadedFile, len); + munmap(memoryLoadedFile, len); + mprotect(map, len, prot); } - - // If for another file, we pass through - return __mmap(addr, len, prot, flags, fd, offset); + return map; } int hooked___fcntl(int fildes, int cmd, void *param) { if (cmd == F_ADDFILESIGS_RETURN) { const char *homeDir = getenv("POJAV_HOME"); char filePath[PATH_MAX]; - memset(filePath, 0, sizeof(filePath)); + bzero(filePath, sizeof(filePath)); // Check if the file is our "in-memory" file if (__fcntl(fildes, F_GETPATH, filePath) != -1) { diff --git a/Natives/egl_bridge.m b/Natives/egl_bridge.m index 5e7a62e4..14214a32 100644 --- a/Natives/egl_bridge.m +++ b/Natives/egl_bridge.m @@ -32,7 +32,6 @@ struct PotatoBridge { */ }; EGLConfig config; -pid_t mainThreadID; struct PotatoBridge potatoBridge; /* OSMesa functions */ @@ -73,8 +72,7 @@ void* egl_make_current(void* window); #define RENDERER_MTL_ANGLE 1 #define RENDERER_VK_ZINK 2 -#define RENDERER_VIRGL 3 -#define RENDERER_VULKAN 4 +#define RENDERER_VULKAN 3 typedef jint RegalMakeCurrent_func(EGLContext context); @@ -126,7 +124,6 @@ void* pojavGetCurrentContext() { case RENDERER_MTL_ANGLE: return (void *)eglGetCurrentContext_p(); - case RENDERER_VIRGL: case RENDERER_VK_ZINK: return (void *)OSMesaGetCurrentContext_p(); @@ -171,10 +168,10 @@ void loadSymbols(int renderer) { char fileName[2048]; switch (renderer) { case RENDERER_VK_ZINK: - sprintf((char *)fileName, "%s/Frameworks/%s", getenv("BUNDLE_PATH"), getenv("POJAV_RENDERER")); + sprintf((char *)fileName, "@rpath/%s", getenv("POJAV_RENDERER")); break; case RENDERER_MTL_ANGLE: - sprintf((char *)fileName, "%s/Frameworks/libtinygl4angle.dylib", getenv("BUNDLE_PATH")); + sprintf((char *)fileName, "@rpath/libtinygl4angle.dylib"); break; } void* dl_handle = dlopen(fileName,RTLD_NOW|RTLD_GLOBAL|RTLD_NODELETE); @@ -193,26 +190,9 @@ void loadSymbols(int renderer) { } } -void loadSymbolsVirGL() { - loadSymbols(RENDERER_MTL_ANGLE); - loadSymbols(RENDERER_VK_ZINK); - - char fileName[2048]; - sprintf((char *)fileName, "%s/Frameworks/libvirgl_test_server.dylib", getenv("BUNDLE_PATH")); - void *handle = dlopen(fileName, RTLD_LAZY); - NSLog(@"VirGL: libvirgl_test_server = %p", handle); - if (!handle) { - NSLog(@"VirGL: %s", dlerror()); - return; - } - vtest_main_p = dlsym(handle, "vtest_main"); - vtest_swap_buffers_p = dlsym(handle, "vtest_swap_buffers"); -} - int pojavInit(BOOL useStackQueue) { isInputReady = 1; isUseStackQueueCall = useStackQueue; - mainThreadID = gettid(); return JNI_TRUE; } @@ -222,11 +202,7 @@ jboolean pojavInitOpenGL() { NSString *renderer = @(getenv("POJAV_RENDERER")); BOOL isAuto = [renderer isEqualToString:@"auto"]; BOOL angleDesktopGL = NO; - /* if ([renderer isEqualToString:@"libOSMesa.8.dylib"]) { - config_renderer = RENDERER_VIRGL; - setenv("GALLIUM_DRIVER", "virpipe", 1); - loadSymbolsVirGL(); - } else */ if (isAuto || [renderer isEqualToString:@ RENDERER_NAME_GL4ES]) { + if (isAuto || [renderer isEqualToString:@ RENDERER_NAME_GL4ES]) { // At this point, if renderer is still auto (unspecified major version), pick gl4es angleDesktopGL = NO; config_renderer = RENDERER_MTL_ANGLE; @@ -242,7 +218,7 @@ jboolean pojavInitOpenGL() { JNI_LWJGL_changeRenderer(renderer.UTF8String); loadSymbols(config_renderer); - if (config_renderer == RENDERER_MTL_ANGLE || config_renderer == RENDERER_VIRGL) { + if (config_renderer == RENDERER_MTL_ANGLE) { if (potatoBridge.eglDisplay == EGL_NO_DISPLAY) { potatoBridge.eglDisplay = eglGetDisplay_p((void *)EGL_DEFAULT_DISPLAY); if (potatoBridge.eglDisplay == EGL_NO_DISPLAY) { @@ -313,27 +289,10 @@ jboolean pojavInitOpenGL() { potatoBridge.eglDisplay, potatoBridge.eglSurface ); - if (config_renderer != RENDERER_VIRGL) { - return JNI_TRUE; - } - // } else if (strcmp(renderer, "vulkan_zink") == 0) { + return JNI_TRUE; } - if (config_renderer == RENDERER_VIRGL) { - // Init EGL context and vtest server - const EGLint ctx_attribs[] = { - EGL_CONTEXT_CLIENT_VERSION, 3, - EGL_NONE - }; - EGLContext* ctx = eglCreateContext_p(potatoBridge.eglDisplay, config, NULL, ctx_attribs); - NSLog(@"VirGL: created EGL context %p", ctx); - - pthread_t t; - pthread_create(&t, NULL, egl_make_current, (void *)ctx); - usleep(100*1000); // need enough time for the server to init - } - - if (config_renderer == RENDERER_VK_ZINK || config_renderer == RENDERER_VIRGL) { + if (config_renderer == RENDERER_VK_ZINK) { if(OSMesaCreateContext_p == NULL) { NSLog(@"OSMDroid: %s",dlerror()); return JNI_FALSE; @@ -403,11 +362,6 @@ void pojavSwapBuffers() { } } break; - case RENDERER_VIRGL: { - glFinish_p(); - vtest_swap_buffers_p(); - } break; - case RENDERER_VK_ZINK: { glFinish_p(); dispatch_async(dispatch_get_main_queue(), ^{ @@ -431,12 +385,6 @@ void* egl_make_current(void* window) { NSDebugLog(@"EGLBridge: eglMakeCurrent() succeed!"); } - if (config_renderer == RENDERER_VIRGL) { - NSDebugLog(@"VirGL: vtest_main = %p", vtest_main_p); - NSDebugLog(@"VirGL: Calling VTest server's main function"); - vtest_main_p(3, (const char*[]){"vtest", "--no-loop-or-fork", "--use-gles", NULL, NULL}); - } - return NULL; } @@ -467,7 +415,7 @@ void pojavMakeCurrent(void* window) { } } - if (config_renderer == RENDERER_VK_ZINK || config_renderer == RENDERER_VIRGL) { + if (config_renderer == RENDERER_VK_ZINK) { NSLog(@"OSMDroid: making current"); OSMesaMakeCurrent_p((OSMesaContext)window,gbuffer,GL_UNSIGNED_BYTE,windowWidth,windowHeight); if (config_renderer == RENDERER_VK_ZINK) { @@ -514,7 +462,7 @@ void* pojavCreateContext(void* contextSrc) { return (void *)ctx; } - if (config_renderer == RENDERER_VK_ZINK || config_renderer == RENDERER_VIRGL) { + if (config_renderer == RENDERER_VK_ZINK) { NSDebugLog(@"OSMDroid: generating context"); void* ctx = OSMesaCreateContext_p(OSMESA_RGBA,contextSrc); NSDebugLog(@"OSMDroid: context=%p",ctx); @@ -549,8 +497,7 @@ Java_org_lwjgl_opengl_GL_getNativeWidthHeight(JNIEnv *env, jobject thiz) { void pojavSwapInterval(int interval) { switch (config_renderer) { - case RENDERER_MTL_ANGLE: - case RENDERER_VIRGL: { + case RENDERER_MTL_ANGLE: { eglSwapInterval_p(potatoBridge.eglDisplay, interval); } break; diff --git a/Natives/environ.h b/Natives/environ.h index 2ab385fc..0beb205a 100644 --- a/Natives/environ.h +++ b/Natives/environ.h @@ -46,7 +46,7 @@ jmethodID method_SystemClipboardDataReceived; double cursorX, cursorY, cLastX, cLastY; //jmethodID method_accessAndroidClipboard; //jmethodID method_onGrabStateChanged; - jmethodID method_glfwSetWindowAttrib; + //jmethodID method_glfwSetWindowAttrib; jmethodID method_internalWindowSizeChanged; jclass bridgeClazz; jclass vmGlfwClass; diff --git a/Natives/gl_mesa3d_patch.m b/Natives/gl_mesa3d_patch.m deleted file mode 100644 index e374e98a..00000000 --- a/Natives/gl_mesa3d_patch.m +++ /dev/null @@ -1,25 +0,0 @@ -#include -#include -// #include "log.h" - -#include "GL/gl.h" - -void (*glDrawArrays_p) (GLenum mode, GLint first, GLsizei count); - -GLAPI void GLAPIENTRY glDrawArrays(GLenum mode, GLint first, GLsizei count) { - if (!glDrawArrays_p) { - glDrawArrays_p = dlsym(RTLD_NEXT, "glDrawArrays"); - } - - // NSDebugLog(@"func=%p, next=%p", glDrawArrays, glDrawArrays_real); - // NSDebugLog(@"glDrawArrays mode=%p", mode); - if (mode == GL_TRIANGLE_FAN) { - // NSDebugLog(@"ERROR: GL_TRIANGLE_FAN unsupported!"); - - // this is wrong but idk how to deal with it yet... - // minecraft stills works with this for unknown reason - glDrawArrays_p(GL_TRIANGLE_STRIP, first, count); - } else { - glDrawArrays_p(mode, first, count); - } -} diff --git a/Natives/input_bridge_v3.m b/Natives/input_bridge_v3.m index 9830f7bf..62071e4f 100644 --- a/Natives/input_bridge_v3.m +++ b/Natives/input_bridge_v3.m @@ -197,7 +197,6 @@ void registerOpenHandler() { // JNI_OnLoad void JNI_OnLoadGLFW() { vmGlfwClass = (*runtimeJNIEnvPtr)->NewGlobalRef(runtimeJNIEnvPtr, (*runtimeJNIEnvPtr)->FindClass(runtimeJNIEnvPtr, "org/lwjgl/glfw/GLFW")); - method_glfwSetWindowAttrib = (*runtimeJNIEnvPtr)->GetStaticMethodID(runtimeJNIEnvPtr, vmGlfwClass, "glfwSetWindowAttrib", "(JII)V"); method_internalWindowSizeChanged = (*runtimeJNIEnvPtr)->GetStaticMethodID(runtimeJNIEnvPtr, vmGlfwClass, "internalWindowSizeChanged", "(JII)V"); jfieldID field_keyDownBuffer = (*runtimeJNIEnvPtr)->GetStaticFieldID(runtimeJNIEnvPtr, vmGlfwClass, "keyDownBuffer", "Ljava/nio/ByteBuffer;"); jobject keyDownBufferJ = (*runtimeJNIEnvPtr)->GetStaticObjectField(runtimeJNIEnvPtr, vmGlfwClass, field_keyDownBuffer); diff --git a/Natives/ios_uikit_bridge.m b/Natives/ios_uikit_bridge.m index cdf947dc..a686eea1 100644 --- a/Natives/ios_uikit_bridge.m +++ b/Natives/ios_uikit_bridge.m @@ -10,12 +10,6 @@ #include "ios_uikit_bridge.h" #include "utils.h" -jclass class_CTCScreen; -jmethodID method_GetRGB; - -jclass class_CTCAndroidInput; -jmethodID method_ReceiveInput; - void internal_showDialog(NSString* title, NSString* message) { NSLog(@"[UI] Dialog shown: %@: %@", title, message); @@ -159,11 +153,11 @@ void UIKit_returnToSplitView() { void launchInitialViewController(UIWindow *window) { window.rootViewController = [[LauncherSplitViewController alloc] initWithStyle:UISplitViewControllerStyleDoubleColumn]; -/* +#if 0 if (getPrefBool(@"internal.internal_launch_on_boot")) { window.rootViewController = [[SurfaceViewController alloc] init]; } else { window.rootViewController = [[LauncherSplitViewController alloc] initWithStyle:UISplitViewControllerStyleDoubleColumn]; } -*/ +#endif } diff --git a/Natives/main.m b/Natives/main.m index 44d97efc..63ac2293 100644 --- a/Natives/main.m +++ b/Natives/main.m @@ -1,15 +1,16 @@ #import -#import -#import #import #import #import #import "AppDelegate.h" #import "customcontrols/CustomControlsUtils.h" +#import "HostManagerBridge.h" +#import "JavaLauncher.h" #import "LauncherPreferences.h" #import "PLProfiles.h" #import "SurfaceViewController.h" +#import "UIKit+hook.h" #import "config.h" #include @@ -17,15 +18,9 @@ #include #include #include -#include -#include -#include -#include #include -#include "JavaLauncher.h" #include "utils.h" #include "codesign.h" -#include "HostManagerBridge.h" #define CS_PLATFORM_BINARY 0x4000000 #define PT_TRACE_ME 0 @@ -79,38 +74,29 @@ bool init_checkForsubstrated() { return false; } -void init_checkForJailbreak() { - bool jbDyld = false; - bool jbFlag = false; - bool jbProc = init_checkForsubstrated(); - bool jbFile = false; - - int imageCount = _dyld_image_count(); - uint32_t flags = CS_PLATFORM_BINARY; - - for (int i=0; i < imageCount; i++) { +bool init_checkForJailbreak() { + if (NSProcessInfo.processInfo.macCatalystApp) { + // macOS doesn't automatically enable JIT. + return false; + } else if (init_checkForsubstrated()) { + return true; + } + + // Check if posix_spawn is hooked + for (int i=0; i < _dyld_image_count(); i++) { if (strcmp(_dyld_get_image_name(i),"/usr/lib/pspawn_payload-stg2.dylib") == 0) { - jbDyld = true; + return true; } } - if (csops(0, CS_OPS_STATUS, &flags, sizeof(flags)) != -1) { - if ((flags & CS_PLATFORM_BINARY) != 0) { - jbFlag = true; - } + // Check if we have platform bit set + uint32_t flags; + csops(0, CS_OPS_STATUS, &flags, sizeof(flags)); + if ((flags & CS_PLATFORM_BINARY) != 0) { + return true; } - DIR *apps = opendir("/Applications"); - if(apps != NULL) { - jbFile = true; - } - - if (jbDyld || jbFlag || jbProc || jbFile) { - if (!NSProcessInfo.processInfo.macCatalystApp) { - // macOS doesn't automatically enable JIT. - setenv("POJAV_DETECTEDJB", "1", 1); - } - } + return opendir("/Applications") != NULL; } void init_logDeviceAndVer(char *argument) { @@ -118,23 +104,20 @@ void init_logDeviceAndVer(char *argument) { NSLog(@"[Pre-Init] PojavLauncher INIT!"); NSLog(@"[Pre-Init] Version: %@-%s", NSBundle.mainBundle.infoDictionary[@"CFBundleShortVersionString"], CONFIG_TYPE); NSLog(@"[Pre-Init] Commit: %s (%s)", CONFIG_COMMIT, CONFIG_BRANCH); - - // Hardware + Software - setenv("POJAV_DETECTEDSW", [HostManager GetPlatformVersion].UTF8String, 1); - setenv("POJAV_DETECTEDHW", [HostManager GetModelName].UTF8String, 1); - NSString *tsPath = [NSString stringWithFormat:@"%s/../_TrollStore", getenv("BUNDLE_PATH")]; - const char *type = "Unjailbroken"; + NSString *tsPath = [NSString stringWithFormat:@"%@/../_TrollStore", NSBundle.mainBundle.bundlePath]; + const char *type; if ([fm fileExistsAtPath:tsPath]) { type = "TrollStore"; - } else if (getenv("POJAV_DETECTEDJB")) { + } else if (isJailbroken) { type = "Jailbroken"; + } else { + type = "Unjailbroken"; } - setenv("POJAV_DETECTEDINST", type, 1); - NSLog(@"[Pre-Init] Device: %s", getenv("POJAV_DETECTEDHW")); - NSLog(@"[Pre-Init] iOS %s (%s)", getenv("POJAV_DETECTEDSW"), getenv("POJAV_DETECTEDINST")); + NSLog(@"[Pre-Init] Device: %@", [HostManager GetModelName]); + NSLog(@"[Pre-Init] %@ (%s)", UIDevice.currentDevice.completeOSVersion, type); NSLog(@"[Pre-init] Entitlements availability:"); printEntitlementAvailability(@"com.apple.developer.kernel.extended-virtual-addressing"); @@ -181,8 +164,9 @@ void init_migrateToPlist(char* prefKey, char* filename) { void init_redirectStdio() { NSLog(@"[Pre-init] Starting logging STDIO to latestlog.txt\n"); - NSString *currName = [@(getenv("POJAV_HOME")) stringByAppendingPathComponent:@"latestlog.txt"]; - NSString *oldName = [@(getenv("POJAV_HOME")) stringByAppendingPathComponent:@"latestlog.old.txt"]; + NSString *home = @(getenv("POJAV_HOME")); + NSString *currName = [home stringByAppendingPathComponent:@"latestlog.txt"]; + NSString *oldName = [home stringByAppendingPathComponent:@"latestlog.old.txt"]; [fm removeItemAtPath:oldName error:nil]; [fm moveItemAtPath:currName toPath:oldName error:nil]; @@ -260,10 +244,11 @@ void init_setupMultiDir() { NSLog(@"[Pre-init] Restored game directory preference (%@)\n", multidir); } - NSString *jvmPath = [NSString stringWithFormat:@"%s/java_runtimes", getenv("POJAV_HOME")]; - NSString *lasmPath = [NSString stringWithFormat:@"%s/Library/Application Support/minecraft", getenv("POJAV_HOME")]; - NSString *multidirPath = [NSString stringWithFormat:@"%s/instances/%@", getenv("POJAV_HOME"), multidir]; - NSString *demoPath = [NSString stringWithFormat:@"%s/.demo", getenv("POJAV_HOME")]; + const char *home = getenv("POJAV_HOME"); + NSString *jvmPath = [NSString stringWithFormat:@"%s/java_runtimes", home]; + NSString *lasmPath = [NSString stringWithFormat:@"%s/Library/Application Support/minecraft", home]; + NSString *multidirPath = [NSString stringWithFormat:@"%s/instances/%@", home, multidir]; + NSString *demoPath = [NSString stringWithFormat:@"%s/.demo", home]; [fm createDirectoryAtPath:jvmPath withIntermediateDirectories:YES attributes:nil error:nil]; [fm createDirectoryAtPath:demoPath withIntermediateDirectories:YES attributes:nil error:nil]; @@ -314,7 +299,6 @@ int main(int argc, char *argv[]) { return pJLI_Launch(argc, (const char **)argv, 0, NULL, // sizeof(const_jargs) / sizeof(char *), const_jargs, 0, NULL, // sizeof(const_appclasspath) / sizeof(char *), const_appclasspath, - // PojavLancher: fixme: are these wrong? "1.8.0-internal", "1.8", @@ -332,8 +316,7 @@ int main(int argc, char *argv[]) { } setenv("BUNDLE_PATH", dirname(argv[0]), 1); - init_checkForJailbreak(); - + isJailbroken = init_checkForJailbreak(); init_migrateDirIfNecessary(); init_setupHomeDirectory(); init_redirectStdio(); diff --git a/Natives/utils.h b/Natives/utils.h index 6f4c6540..a8ba2175 100644 --- a/Natives/utils.h +++ b/Natives/utils.h @@ -49,7 +49,7 @@ #define SPECIALBTN_MENU -9 #define NSDebugLog(...) if (debugLogEnabled) { NSLog(__VA_ARGS__); } -BOOL debugLogEnabled; +BOOL debugLogEnabled, isJailbroken; //__weak UIViewController *viewController; @@ -83,7 +83,6 @@ CGFloat MathUtils_map(CGFloat x, CGFloat in_min, CGFloat in_max, CGFloat out_min CGFloat dpToPx(CGFloat dp); CGFloat pxToDp(CGFloat px); void setButtonPointerInteraction(UIButton *button); -void setViewBackgroundColor(UIView* view); void _CGDataProviderReleaseBytePointerCallback(void *info,const void *pointer); jboolean attachThread(bool isAndroid, JNIEnv** secondJNIEnvPtr); diff --git a/Natives/utils.m b/Natives/utils.m index fac5095a..16d342c8 100644 --- a/Natives/utils.m +++ b/Natives/utils.m @@ -23,7 +23,7 @@ BOOL getEntitlementValue(NSString *key) { } BOOL isJITEnabled(BOOL checkCSFlags) { - if (!checkCSFlags && (getEntitlementValue(@"dynamic-codesigning") || getenv("POJAV_DETECTEDJB"))) { + if (!checkCSFlags && (getEntitlementValue(@"dynamic-codesigning") || isJailbroken)) { return YES; } @@ -132,9 +132,6 @@ CGFloat MathUtils_map(CGFloat x, CGFloat in_min, CGFloat in_max, CGFloat out_min return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; } -void _CGDataProviderReleaseBytePointerCallback(void *info,const void *pointer) { -} - CGFloat dpToPx(CGFloat dp) { CGFloat screenScale = [[UIScreen mainScreen] scale]; return dp * screenScale; @@ -152,8 +149,3 @@ void setButtonPointerInteraction(UIButton *button) { return [UIPointerStyle styleWithEffect:[UIPointerHighlightEffect effectWithPreview:preview] shape:proposedShape]; }; } - -void setViewBackgroundColor(UIView* view) { - view.backgroundColor = UIColor.systemBackgroundColor; -} -