* Move control loaders to CustomControlsUtils.m
* WIP Drawer support (currently broken)
Also, updated MetalANGLE for helping debug stuff on crash.
* temp
* ControlDrawer: free orientation
* Avoid scrolling the hotbar in grab mode
* Popover: fix the frame inside the arrow
* Changes
- Attempt to allow Microsoft login when offline.
- Custom controls: drawer and sub-buttons are now visible.
- Pickers in Preferences: pre-select at the saved index.
* Bump version code to 4, hide sub-button by default
* Fix text trucanting
* impl scroll buttons, rewrite some parts to objc
* Virtual mouse implementation
Also, possible fix for popover crashes on iPad
Exception type: NSInternalInconsistencyException
> Reason: Tried to set <UIBarButtonItem: 0x10fee5660> menuOnTouchDown
menu=0x2810dce10 image=<UIImage:0x280149050 symbol(system:
ellipsis.circle) {20, 19} baseline=3.5,contentInsets={1, 1.5, 1,
1.5},alignmentRectInsets={-0.5, 0, -0.5, 0}
config=<traits=(UserInterfaceIdiom = Pad, DisplayScale = 2,
DisplayGamut = sRGB, HorizontalSizeClass = Regular, VerticalSizeClass
= Regular, UserInterfaceStyle = Dark, UserInterfaceLayoutDirection =
LTR, PreferredContentSizeCategory = L, AccessibilityContrast =
Normal)>> as sourceView of
<_UIAlertControllerActionSheetRegularPresentationController:
0x12043f5a0>, even though it is not a kind of UIView.
Co-authored-by: Duy Tran Khanh <[email protected]>
104 lines
3.2 KiB
Objective-C
104 lines
3.2 KiB
Objective-C
#include "jni.h"
|
|
#include <dlfcn.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
|
|
#include "log.h"
|
|
|
|
#include "utils.h"
|
|
|
|
CGFloat MathUtils_dist(CGFloat x1, CGFloat y1, CGFloat x2, CGFloat y2) {
|
|
const CGFloat x = (x2 - x1);
|
|
const CGFloat y = (y2 - y1);
|
|
return (CGFloat) hypot(x, y);
|
|
}
|
|
void _CGDataProviderReleaseBytePointerCallback(void *info,const void *pointer) {
|
|
}
|
|
|
|
char** convert_to_char_array(JNIEnv *env, jobjectArray jstringArray) {
|
|
int num_rows = (*env)->GetArrayLength(env, jstringArray);
|
|
char **cArray = (char **) malloc((num_rows + 1) * sizeof(char*));
|
|
jstring row;
|
|
|
|
for (int i = 0; i < num_rows; i++) {
|
|
row = (jstring) (*env)->GetObjectArrayElement(env, jstringArray, i);
|
|
cArray[i] = (char*)(*env)->GetStringUTFChars(env, row, 0);
|
|
}
|
|
cArray[num_rows] = NULL;
|
|
|
|
return cArray;
|
|
}
|
|
|
|
jobjectArray convert_from_char_array(JNIEnv *env, char **charArray, int num_rows) {
|
|
jobjectArray resultArr = (*env)->NewObjectArray(env, num_rows, (*env)->FindClass(env, "java/lang/String"), NULL);
|
|
jstring row;
|
|
|
|
for (int i = 0; i < num_rows; i++) {
|
|
row = (jstring) (*env)->NewStringUTF(env, charArray[i]);
|
|
(*env)->SetObjectArrayElement(env, resultArr, i, row);
|
|
}
|
|
|
|
return resultArr;
|
|
}
|
|
|
|
void free_char_array(JNIEnv *env, jobjectArray jstringArray, char **charArray) {
|
|
int num_rows = (*env)->GetArrayLength(env, jstringArray);
|
|
jstring row;
|
|
|
|
for (int i = 0; i < num_rows; i++) {
|
|
row = (jstring) (*env)->GetObjectArrayElement(env, jstringArray, i);
|
|
(*env)->ReleaseStringUTFChars(env, row, charArray[i]);
|
|
}
|
|
|
|
free(charArray);
|
|
}
|
|
|
|
CGFloat dpToPx(CGFloat dp) {
|
|
CGFloat screenScale = [[UIScreen mainScreen] scale];
|
|
return dp * screenScale;
|
|
}
|
|
|
|
CGFloat pxToDp(CGFloat px) {
|
|
CGFloat screenScale = [[UIScreen mainScreen] scale];
|
|
return px / screenScale;
|
|
}
|
|
|
|
jstring convertStringJVM(JNIEnv* srcEnv, JNIEnv* dstEnv, jstring srcStr) {
|
|
if (srcStr == NULL) {
|
|
return NULL;
|
|
}
|
|
|
|
const char* srcStrC = (*srcEnv)->GetStringUTFChars(srcEnv, srcStr, 0);
|
|
jstring dstStr = (*dstEnv)->NewStringUTF(dstEnv, srcStrC);
|
|
(*srcEnv)->ReleaseStringUTFChars(srcEnv, srcStr, srcStrC);
|
|
return dstStr;
|
|
}
|
|
|
|
JNIEXPORT void JNICALL Java_net_kdt_pojavlaunch_utils_JREUtils_setLdLibraryPath(JNIEnv *env, jclass clazz, jstring ldLibraryPath) {
|
|
// jclass exception_cls = (*env)->FindClass(env, "java/lang/UnsatisfiedLinkError");
|
|
|
|
const char* ldLibPathUtf = (*env)->GetStringUTFChars(env, ldLibraryPath, 0);
|
|
setenv("LD_LIBRARY_PATH", ldLibPathUtf, 1);
|
|
(*env)->ReleaseStringUTFChars(env, ldLibraryPath, ldLibPathUtf);
|
|
}
|
|
|
|
JNIEXPORT jboolean JNICALL Java_net_kdt_pojavlaunch_utils_JREUtils_dlopen(JNIEnv *env, jclass clazz, jstring name) {
|
|
const char *nameUtf = (*env)->GetStringUTFChars(env, name, 0);
|
|
void* handle = dlopen(nameUtf, RTLD_GLOBAL | RTLD_LAZY);
|
|
if (!handle) {
|
|
printf("dlopen %s failed: %s\n", nameUtf, dlerror());
|
|
} else {
|
|
printf("dlopen %s success\n", nameUtf);
|
|
}
|
|
(*env)->ReleaseStringUTFChars(env, name, nameUtf);
|
|
return handle != NULL;
|
|
}
|
|
|
|
JNIEXPORT jint JNICALL Java_net_kdt_pojavlaunch_utils_JREUtils_chdir(JNIEnv *env, jclass clazz, jstring nameStr) {
|
|
const char *name = (*env)->GetStringUTFChars(env, nameStr, NULL);
|
|
int retval = chdir(name);
|
|
(*env)->ReleaseStringUTFChars(env, nameStr, name);
|
|
return retval;
|
|
}
|