diff --git a/JavaApp/src/main/java/net/kdt/pojavlaunch/PLaunchApp.java b/JavaApp/src/main/java/net/kdt/pojavlaunch/PLaunchApp.java index f531b6c8..494d1cf0 100644 --- a/JavaApp/src/main/java/net/kdt/pojavlaunch/PLaunchApp.java +++ b/JavaApp/src/main/java/net/kdt/pojavlaunch/PLaunchApp.java @@ -8,6 +8,7 @@ import javafx.application.Application; import org.lwjgl.glfw.CallbackBridge; import net.kdt.pojavlaunch.prefs.*; +import net.kdt.pojavlaunch.uikit.*; import net.kdt.pojavlaunch.utils.*; import net.kdt.pojavlaunch.value.*; @@ -29,7 +30,7 @@ public class PLaunchApp { if (args[0].startsWith("/Applications/")) { System.out.println("We are on java now! Starting UI..."); - org.lwjgl.glfw.CallbackBridge.nativeLaunchUI(args); + UIKit.launchUI(args); } else { launchMinecraft(); } diff --git a/JavaApp/src/main/java/net/kdt/pojavlaunch/uikit/UIKit.java b/JavaApp/src/main/java/net/kdt/pojavlaunch/uikit/UIKit.java new file mode 100644 index 00000000..8f48a3f3 --- /dev/null +++ b/JavaApp/src/main/java/net/kdt/pojavlaunch/uikit/UIKit.java @@ -0,0 +1,46 @@ +package net.kdt.pojavlaunch.uikit; + +import org.lwjgl.glfw.*; + +public class UIKit { + static { + System.loadLibrary("pojavexec"); + } + + public static native int launchUI(String[] uiArgs); + public static native void runOnUIThread(UIKitCallback callback); + + + public static void callback_AppDelegate_didFinishLaunching(int width, int height) { + GLFW.mGLFWWindowWidth = CallbackBridge.width; + GLFW.mGLFWWindowHeight = CallbackBridge.height; + CallbackBridge.mouseX = CallbackBridge.width / 2; + CallbackBridge.mouseY = height / 2; + net.kdt.pojavlaunch.PLaunchApp.applicationDidFinishLaunching(); + } + + public static void callback_SurfaceViewController_onTouch(int event, int x, int y) { + switch (event) { + case ACTION_DOWN: + case ACTION_UP: + CallbackBridge.mouseLastX = x; + CallbackBridge.mouseLastY = y; + break; + + case ACTION_MOVE: + if (GLFW.mGLFWIsGrabbing) { + CallbackBridge.mouseX += x - CallbackBridge.mouseLastX; + CallbackBridge.mouseY += y - CallbackBridge.mouseLastY; + + CallbackBridge.mouseLastX = CallbackBridge.x; + CallbackBridge.mouseLastY = CallbackBridge.y; + } else { + CallbackBridge.mouseX = CallbackBridge.x; + CallbackBridge.mouseY = CallbackBridge.y; + } + break; + } + + sendCursorPos(CallbackBridge.mouseX, CallbackBridge.mouseY); + } +} diff --git a/JavaApp/src/main/java/net/kdt/pojavlaunch/uikit/UIKitCallback.java b/JavaApp/src/main/java/net/kdt/pojavlaunch/uikit/UIKitCallback.java new file mode 100644 index 00000000..f4cd901e --- /dev/null +++ b/JavaApp/src/main/java/net/kdt/pojavlaunch/uikit/UIKitCallback.java @@ -0,0 +1,5 @@ +package net.kdt.pojavlaunch.uikit; + +public interface UIKitCallback { + public void onCallback(); +} diff --git a/JavaApp/src/main/java/org/lwjgl/glfw/CallbackBridge.java b/JavaApp/src/main/java/org/lwjgl/glfw/CallbackBridge.java index 3ab48ccd..7dd1a13f 100644 --- a/JavaApp/src/main/java/org/lwjgl/glfw/CallbackBridge.java +++ b/JavaApp/src/main/java/org/lwjgl/glfw/CallbackBridge.java @@ -47,41 +47,6 @@ public class CallbackBridge { public static boolean mouseLeft; public static StringBuilder DEBUG_STRING = new StringBuilder(); - - public static native void nativeLaunchUI(String[] uiArgs); - public static void callback_AppDelegate_didFinishLaunching(int width, int height) { - GLFW.mGLFWWindowWidth = width; - GLFW.mGLFWWindowHeight = height; - mouseX = width / 2; - mouseY = height / 2; - net.kdt.pojavlaunch.PLaunchApp.applicationDidFinishLaunching(); - } - - public static void callback_SurfaceViewController_onTouch(int event, int x, int y) { - switch (event) { - case ACTION_DOWN: - case ACTION_UP: - mouseLastX = x; - mouseLastY = y; - break; - - case ACTION_MOVE: - if (GLFW.mGLFWIsGrabbing) { - mouseX += x - mouseLastX; - mouseY += y - mouseLastY; - - mouseLastX = x; - mouseLastY = y; - } else { - mouseX = x; - mouseY = y; - } - break; - } - - sendCursorPos(mouseX, mouseY); - } - public static boolean nativeIsGrabbing() { return GLFW.mGLFWIsGrabbing; } diff --git a/Natives/AppDelegate.m b/Natives/AppDelegate.m index 3998613f..6a82e52d 100644 --- a/Natives/AppDelegate.m +++ b/Natives/AppDelegate.m @@ -9,7 +9,8 @@ self.window = window; [self.window setWindowLevel:3000.0]; [self.window makeKeyAndVisible]; - self.window.backgroundColor = [UIColor blackColor]; + self.window.backgroundColor = [UIColor whiteColor]; + LauncherViewController *vc = [[LauncherViewController alloc] init]; self.window.rootViewController = vc; diff --git a/Natives/CMakeLists.txt b/Natives/CMakeLists.txt index dfc58b3a..88d66376 100644 --- a/Natives/CMakeLists.txt +++ b/Natives/CMakeLists.txt @@ -13,7 +13,7 @@ set_target_properties(PojavLauncher PROPERTIES MACOSX_FRAMEWORK_IDENTIFIER org.cmake.ExecutableTarget MACOSX_BUNDLE_INFO_PLIST "../Info.plist") -add_library(pojavexec SHARED log.m AppDelegate.m UILauncher.m LauncherViewController.m SurfaceViewController.m egl_bridge_ios.m egl_bridge.c input_bridge_v3.c utils.c) +add_library(pojavexec SHARED log.m AppDelegate.m UILauncher.m LauncherViewController.m SurfaceViewController.m egl_bridge_ios.m ios_uikit_bridge.m egl_bridge.c input_bridge_v3.c utils.c) target_link_libraries(pojavexec "-Fresources/Frameworks" "-framework UIKit" diff --git a/Natives/LauncherViewController.m b/Natives/LauncherViewController.m index ab51c650..a016e88d 100644 --- a/Natives/LauncherViewController.m +++ b/Natives/LauncherViewController.m @@ -19,8 +19,12 @@ CGRect screenBounds = [[UIScreen mainScreen] bounds]; CGFloat screenScale = [[UIScreen mainScreen] scale]; - UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0.0, 0.0, screenBounds.size.width, screenBounds.size.height)]; + UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, screenBounds.size.width, screenBounds.size.height)]; scrollView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; + + UIProgressView *progress = [[UIProgressView alloc] initWithFrame:CGRectMake(4.0, 4.0, screenBounds.size.width - 8.0, 40.0)]; + progress.progress = 0.5; + [scrollView addSubview:progress]; UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; button.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleWidth; diff --git a/Natives/aminimake.sh b/Natives/aminimake.sh index 210fe3df..7d46cfae 100644 --- a/Natives/aminimake.sh +++ b/Natives/aminimake.sh @@ -5,7 +5,7 @@ set -e CFLAGS="-fmessage-length=0 -fdiagnostics-show-note-include-stack -fmacro-backtrace-limit=0 -Wno-trigraphs -fpascal-strings -O3 -Wno-missing-field-initializers -Wno-missing-prototypes -Wno-return-type -Wno-missing-braces -Wparentheses -Wswitch -Wno-unused-function -Wno-unused-label -Wno-unused-parameter -Wno-unused-variable -Wunused-value -Wno-empty-body -Wno-uninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-conversion -Wno-constant-conversion -Wno-int-conversion -Wno-bool-conversion -Wno-enum-conversion -Wno-float-conversion -Wno-non-literal-null-conversion -Wno-objc-literal-conversion -Wshorten-64-to-32 -Wpointer-sign -Wno-newline-eof" -clang -Wl,-rpath,/Applications/PojavLauncher.app/Frameworks -fobjc-arc -x objective-c -Fresources/Frameworks -framework UIKit -framework MetalANGLE -Iresources/Frameworks/MetalANGLE.framework/Headers -dynamiclib -isysroot /var/mobile/theos/sdks/iPhoneOS11.2.sdk $CFLAGS -o libpojavexec.dylib log.m AppDelegate.m UILauncher.m LauncherViewController.m SurfaceViewController.m egl_bridge_ios.m egl_bridge.c input_bridge_v3.c utils.c -DGLES_TESTZ -DUSE_EGLZ +clang -Wl,-rpath,/Applications/PojavLauncher.app/Frameworks -fobjc-arc -x objective-c -Fresources/Frameworks -framework UIKit -framework MetalANGLE -Iresources/Frameworks/MetalANGLE.framework/Headers -dynamiclib -isysroot /var/mobile/theos/sdks/iPhoneOS11.2.sdk $CFLAGS -o libpojavexec.dylib log.m AppDelegate.m UILauncher.m LauncherViewController.m SurfaceViewController.m egl_bridge_ios.m ios_uikit_bridge.m egl_bridge.c input_bridge_v3.c utils.c -DGLES_TESTZ -DUSE_EGLZ ldid -S../entitlements.xml libpojavexec.dylib diff --git a/Natives/input_bridge_v3.c b/Natives/input_bridge_v3.c index 361d3869..5bdbd399 100644 --- a/Natives/input_bridge_v3.c +++ b/Natives/input_bridge_v3.c @@ -14,6 +14,8 @@ #include #include +#include "ios_uikit_bridge.h" + #include "log.h" #include "utils.h" @@ -44,7 +46,8 @@ int grabCursorX, grabCursorY, lastCursorX, lastCursorY; jclass inputBridgeClass_ANDROID, inputBridgeClass_JRE; jmethodID inputBridgeMethod_ANDROID, inputBridgeMethod_JRE; -jmethodID touchBridgeMethod; +jclass uikitBridgeClass; +jmethodID uikitBridgeTouchMethod; jboolean isGrabbing; @@ -161,7 +164,7 @@ void callback_AppDelegate_didFinishLaunching(int width, int height) { // Because UI init after JVM init, this should not be null assert(runtimeJNIEnvPtr_JRE != NULL); - jclass clazz = (*runtimeJNIEnvPtr_JRE)->FindClass(runtimeJNIEnvPtr_JRE, "org/lwjgl/glfw/CallbackBridge"); + jclass clazz = (*runtimeJNIEnvPtr_JRE)->FindClass(runtimeJNIEnvPtr_JRE, "net/kdt/pojavlaunch/uikit/UIKit"); assert(clazz != NULL); jmethodID method = (*runtimeJNIEnvPtr_JRE)->GetStaticMethodID(runtimeJNIEnvPtr_JRE, clazz, "callback_AppDelegate_didFinishLaunching", "(II)V"); @@ -178,24 +181,28 @@ void callback_SurfaceViewController_onTouch(int event, int x, int y) { // Because UI init after JVM init, this should not be null assert (runtimeJNIEnvPtr_JRE != NULL); - if (!inputBridgeClass_ANDROID) { - inputBridgeClass_ANDROID = (*runtimeJNIEnvPtr_JRE)->FindClass(runtimeJNIEnvPtr_JRE, "org/lwjgl/glfw/CallbackBridge"); - assert(inputBridgeClass_ANDROID != NULL); + if (!uikitBridgeClass) { + uikitBridgeClass = (*runtimeJNIEnvPtr_JRE)->FindClass(runtimeJNIEnvPtr_JRE, "net/kdt/pojavlaunch/uikit/UIKit"); + assert(uikitBridgeClass != NULL); } - if (!touchBridgeMethod) { - touchBridgeMethod = (*runtimeJNIEnvPtr_JRE)->GetStaticMethodID(runtimeJNIEnvPtr_JRE, inputBridgeClass_ANDROID, "callback_SurfaceViewController_onTouch", "(III)V"); - assert(touchBridgeMethod != NULL); + if (!uikitBridgeTouchMethod) { + uikitBridgeTouchMethod = (*runtimeJNIEnvPtr_JRE)->GetStaticMethodID(uikitBridgeClass, inputBridgeClass_ANDROID, "callback_SurfaceViewController_onTouch", "(III)V"); + assert(uikitBridgeTouchMethod != NULL); } (*runtimeJNIEnvPtr_JRE)->CallStaticVoidMethod( runtimeJNIEnvPtr_JRE, - inputBridgeClass_ANDROID, touchBridgeMethod, + uikitBridgeClass, uikitBridgeTouchMethod, event, x, y ); } -JNIEXPORT jint JNICALL Java_org_lwjgl_glfw_CallbackBridge_nativeLaunchUI(JNIEnv* env, jclass clazz, jobjectArray args) { +JNIEXPORT void JNICALL Java_net_kdt_pojavlaunch_uikit_UIKit_runOnUIThread(JNIEnv* env, jclass clazz, jobject callback) { + UIKit_runOnUIThread(callback); +} + +JNIEXPORT jint JNICALL Java_net_kdt_pojavlaunch_uikit_UIKit_launchUI(JNIEnv* env, jclass clazz, jobjectArray args) { int argc = (*env)->GetArrayLength(env, args); char **argv = convert_to_char_array(env, args); return launchUI(argc, argv); diff --git a/Natives/ios_uikit_bridge.h b/Natives/ios_uikit_bridge.h new file mode 100644 index 00000000..0f74e8cc --- /dev/null +++ b/Natives/ios_uikit_bridge.h @@ -0,0 +1,4 @@ +#pragma once +#include "jni.h" + +void UIKit_runOnUIThread(jobject callback); diff --git a/Natives/ios_uikit_bridge.m b/Natives/ios_uikit_bridge.m new file mode 100644 index 00000000..63d819d9 --- /dev/null +++ b/Natives/ios_uikit_bridge.m @@ -0,0 +1,16 @@ +#import + +#include "ios_uikit_bridge.h" +#include "utils.h" + +void UIKit_runOnUIThread(jobject callback) { + dispatch_async(dispatch_get_main_queue(), ^{ + JNIEnv *env; + (*runtimeJavaVMPtr)->GetEnv(runtimeJavaVMPtr, &env, JNI_VERSION_1_4); + jclass clazz = (*env)->GetObjectClass(env, object); + jmethodID method = (*env)->GetStaticMethodID(env, clazz, "onCallback", "()V"); + (*env)->CallStaticVoidMethod( + env, callback, method + ); + }); +}