diff --git a/app_pojavlauncher/src/main/assets/components/caciocavallo/cacio-androidnw-1.10-SNAPSHOT.jar b/app_pojavlauncher/src/main/assets/components/caciocavallo/cacio-androidnw-1.10-SNAPSHOT.jar index d6c653f43..778ad9356 100644 Binary files a/app_pojavlauncher/src/main/assets/components/caciocavallo/cacio-androidnw-1.10-SNAPSHOT.jar and b/app_pojavlauncher/src/main/assets/components/caciocavallo/cacio-androidnw-1.10-SNAPSHOT.jar differ diff --git a/app_pojavlauncher/src/main/assets/components/caciocavallo/version b/app_pojavlauncher/src/main/assets/components/caciocavallo/version index 2a8e424de..a902c66f7 100644 --- a/app_pojavlauncher/src/main/assets/components/caciocavallo/version +++ b/app_pojavlauncher/src/main/assets/components/caciocavallo/version @@ -1 +1 @@ -HEllo PeoplE \ No newline at end of file +HEllo PeopLE \ No newline at end of file diff --git a/app_pojavlauncher/src/main/jni/input_bridge_v3.c b/app_pojavlauncher/src/main/jni/input_bridge_v3.c index b3fdff771..b0475165a 100644 --- a/app_pojavlauncher/src/main/jni/input_bridge_v3.c +++ b/app_pojavlauncher/src/main/jni/input_bridge_v3.c @@ -252,11 +252,14 @@ JNIEXPORT jstring JNICALL Java_org_lwjgl_glfw_CallbackBridge_nativeClipboard(JNI return pasteDst; } +void Java_org_lwjgl_glfw_CallbackBridge_nativeSendScreenSize(JNIEnv* env, jclass clazz, jint width, jint height); + JNIEXPORT jboolean JNICALL Java_org_lwjgl_glfw_CallbackBridge_nativeSetInputReady(JNIEnv* env, jclass clazz, jboolean inputReady) { #ifdef DEBUG LOGD("Debug: Changing input state, isReady=%d, isUseStackQueueCall=%d\n", inputReady, isUseStackQueueCall); #endif isInputReady = inputReady; + if(isInputReady) Java_org_lwjgl_glfw_CallbackBridge_nativeSendScreenSize(NULL, NULL, savedWidth, savedHeight); return isUseStackQueueCall; } diff --git a/jre_lwjgl3glfw/build.gradle b/jre_lwjgl3glfw/build.gradle index 57ce98e4f..5420e7268 100644 --- a/jre_lwjgl3glfw/build.gradle +++ b/jre_lwjgl3glfw/build.gradle @@ -20,6 +20,7 @@ jar { it.isDirectory() ? it : zipTree(it) } } + exclude 'net/java/openjdk/cacio/ctc/**' } java { diff --git a/jre_lwjgl3glfw/src/main/java/net/java/openjdk/cacio/ctc/ExternalMouseReader.java b/jre_lwjgl3glfw/src/main/java/net/java/openjdk/cacio/ctc/ExternalMouseReader.java new file mode 100644 index 000000000..4dfa6934b --- /dev/null +++ b/jre_lwjgl3glfw/src/main/java/net/java/openjdk/cacio/ctc/ExternalMouseReader.java @@ -0,0 +1,6 @@ +package net.java.openjdk.cacio.ctc; + +public interface ExternalMouseReader { + int getX(); + int getY(); +} diff --git a/jre_lwjgl3glfw/src/main/java/net/java/openjdk/cacio/ctc/InfdevGrabHandler.java b/jre_lwjgl3glfw/src/main/java/net/java/openjdk/cacio/ctc/InfdevGrabHandler.java new file mode 100644 index 000000000..3af42ce5a --- /dev/null +++ b/jre_lwjgl3glfw/src/main/java/net/java/openjdk/cacio/ctc/InfdevGrabHandler.java @@ -0,0 +1,10 @@ +package net.java.openjdk.cacio.ctc; + +public class InfdevGrabHandler { + public static void setMouseReader(ExternalMouseReader reader) { + + } + public static void setGrabbed(boolean grabbed) { + + } +} diff --git a/jre_lwjgl3glfw/src/main/java/org/lwjgl/input/Cursor.java b/jre_lwjgl3glfw/src/main/java/org/lwjgl/input/Cursor.java index 9604aea47..b59e322d9 100644 --- a/jre_lwjgl3glfw/src/main/java/org/lwjgl/input/Cursor.java +++ b/jre_lwjgl3glfw/src/main/java/org/lwjgl/input/Cursor.java @@ -29,6 +29,9 @@ public class Cursor { /** Flag set when the cursor has been destroyed */ private boolean destroyed; + /** Flag set if the cursor is empty */ + private boolean isEmpty; + /** * Constructs a new Cursor, with the given parameters. Mouse must have been * created before you can create Cursor objects. Cursor images are in ARGB @@ -59,14 +62,19 @@ public class Cursor { */ public Cursor(int width, int height, int xHotspot, int yHotspot, int numImages, IntBuffer images, IntBuffer delays) throws LWJGLException { - cursors = new CursorElement[numImages]; IntBuffer flippedImages = BufferUtils.createIntBuffer(images.limit()); flipImages(width, height, numImages, images, flippedImages); ByteBuffer pixels = convertARGBIntBuffertoRGBAByteBuffer(width, height, flippedImages); - + if(numImages == 1) { + isEmpty = true; + for(int i = 0; i < width*height; i++) if(pixels.get(i) != 0) { + System.out.println("Encountered non-zero byte at "+i+", custom cursor is not empty!"); + isEmpty = false; + } + } for (int i = 0; i < numImages; i++) { int size = width * height; ByteBuffer image = BufferUtils.createByteBuffer(size); @@ -248,6 +256,14 @@ public class Cursor { index = ++index % cursors.length; } + /** + /* Returns wheteher the cursor image is empty or not + */ + + /*package-private*/ boolean isEmpty() { + return isEmpty; + } + /** * A single cursor element, used when animating */ @@ -266,5 +282,4 @@ public class Cursor { throw new RuntimeException("Error creating GLFW cursor"); } } - } diff --git a/jre_lwjgl3glfw/src/main/java/org/lwjgl/input/InfdevMouse.java b/jre_lwjgl3glfw/src/main/java/org/lwjgl/input/InfdevMouse.java new file mode 100644 index 000000000..51ad9f7c9 --- /dev/null +++ b/jre_lwjgl3glfw/src/main/java/org/lwjgl/input/InfdevMouse.java @@ -0,0 +1,25 @@ +package org.lwjgl.input; + +import net.java.openjdk.cacio.ctc.ExternalMouseReader; +import net.java.openjdk.cacio.ctc.InfdevGrabHandler; + +public class InfdevMouse implements ExternalMouseReader, Mouse.EmptyCursorGrabListener { + static { + InfdevGrabHandler.setMouseReader(new InfdevMouse()); + } + + @Override + public int getX() { + return Mouse.getAbsoluteX(); + } + + @Override + public int getY() { + return Mouse.getAbsoluteY(); + } + + @Override + public void onGrab(boolean grabbing) { + InfdevGrabHandler.setGrabbed(grabbing); + } +} diff --git a/jre_lwjgl3glfw/src/main/java/org/lwjgl/input/Mouse.java b/jre_lwjgl3glfw/src/main/java/org/lwjgl/input/Mouse.java index b933a3f67..2cfd05a78 100644 --- a/jre_lwjgl3glfw/src/main/java/org/lwjgl/input/Mouse.java +++ b/jre_lwjgl3glfw/src/main/java/org/lwjgl/input/Mouse.java @@ -31,6 +31,7 @@ */ package org.lwjgl.input; +import java.lang.reflect.Constructor; import java.nio.ByteBuffer; import java.nio.IntBuffer; import java.security.AccessController; @@ -144,6 +145,7 @@ public class Mouse { private static boolean isGrabbed; private static InputImplementation implementation; + private static EmptyCursorGrabListener grabListener = null; /** Whether we need cursor animation emulation */ private static final boolean emulateCursorAnimation = LWJGLUtil.getPlatform() == LWJGLUtil.PLATFORM_WINDOWS || @@ -151,6 +153,16 @@ public class Mouse { private static boolean clipMouseCoordinatesToWindow = !getPrivilegedBoolean("org.lwjgl.input.Mouse.allowNegativeMouseCoords"); + static { + try { + Class infdevMouse = Class.forName("org.lwjgl.input.InfdevMouse"); + Constructor constructor = infdevMouse.getConstructor(); + grabListener = (EmptyCursorGrabListener) constructor.newInstance(); + }catch (Throwable e) { + e.printStackTrace(); + } + } + /** * Mouse cannot be constructed. */ @@ -164,7 +176,6 @@ public class Mouse { */ public static Cursor getNativeCursor() { return currentCursor; - } /** @@ -181,6 +192,14 @@ public class Mouse { */ public static Cursor setNativeCursor(Cursor cursor) throws LWJGLException { //dummy + if(cursor == null && currentCursor.isEmpty()) { + Mouse.setGrabbed(false); + if(grabListener != null) grabListener.onGrab(false); + } + if(cursor != null && cursor.isEmpty()) { + Mouse.setGrabbed(true); + if(grabListener != null) grabListener.onGrab(true); + } currentCursor = cursor; return currentCursor; } @@ -625,4 +644,18 @@ public class Mouse { public static boolean isInsideWindow() { return implementation.isInsideWindow(); } + + /* + * Package private methods to get the absolute unclipped X/Y coordiates + */ + /*package-private*/ static int getAbsoluteX() { + return absolute_x; + } + /*package-private*/ static int getAbsoluteY() { + return absolute_y; + } + + interface EmptyCursorGrabListener { + void onGrab(boolean grabbing); + } } \ No newline at end of file