diff --git a/FCL/src/main/java/com/tungsten/fcl/activity/JVMActivity.java b/FCL/src/main/java/com/tungsten/fcl/activity/JVMActivity.java index c62c997c..f21e27f7 100644 --- a/FCL/src/main/java/com/tungsten/fcl/activity/JVMActivity.java +++ b/FCL/src/main/java/com/tungsten/fcl/activity/JVMActivity.java @@ -22,9 +22,12 @@ import com.tungsten.fcl.setting.GameOption; import com.tungsten.fcl.setting.MenuSetting; import com.tungsten.fclauncher.bridge.FCLBridge; import com.tungsten.fclauncher.keycodes.FCLKeycodes; +import com.tungsten.fclauncher.keycodes.LwjglGlfwKeycode; import com.tungsten.fclcore.util.Logging; import com.tungsten.fcllibrary.component.FCLActivity; +import org.lwjgl.glfw.CallbackBridge; + import java.util.Objects; import java.util.logging.Level; @@ -133,6 +136,7 @@ public class JVMActivity extends FCLActivity implements TextureView.SurfaceTextu if (menu != null) { menu.onPause(); } + CallbackBridge.nativeSetWindowAttrib(LwjglGlfwKeycode.GLFW_HOVERED, 0); super.onPause(); } @@ -141,9 +145,22 @@ public class JVMActivity extends FCLActivity implements TextureView.SurfaceTextu if (menu != null) { menu.onResume(); } + CallbackBridge.nativeSetWindowAttrib(LwjglGlfwKeycode.GLFW_HOVERED, 1); super.onResume(); } + @Override + protected void onStart() { + super.onStart(); + CallbackBridge.nativeSetWindowAttrib(LwjglGlfwKeycode.GLFW_VISIBLE, 1); + } + + @Override + protected void onStop() { + CallbackBridge.nativeSetWindowAttrib(LwjglGlfwKeycode.GLFW_VISIBLE, 0); + super.onStop(); + } + @Override public boolean dispatchKeyEvent(KeyEvent event) { boolean handleEvent = true; diff --git a/FCL/src/main/java/com/tungsten/fcl/game/LauncherHelper.java b/FCL/src/main/java/com/tungsten/fcl/game/LauncherHelper.java index 4d5e73c0..f2fad581 100644 --- a/FCL/src/main/java/com/tungsten/fcl/game/LauncherHelper.java +++ b/FCL/src/main/java/com/tungsten/fcl/game/LauncherHelper.java @@ -67,6 +67,8 @@ import com.tungsten.fcllibrary.component.dialog.FCLAlertDialog; import com.tungsten.fcllibrary.component.dialog.FCLDialog; import com.tungsten.fcllibrary.component.view.FCLButton; +import org.lwjgl.glfw.CallbackBridge; + import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; @@ -171,6 +173,7 @@ public final class LauncherHelper { }).thenComposeAsync(launcher -> { // launcher is prev task's result return Task.supplyAsync(launcher::launch); }).thenAcceptAsync(fclBridge -> Schedulers.androidUIThread().execute(() -> { + CallbackBridge.nativeSetUseInputStackQueue(version.get().getArguments().isPresent()); Intent intent = new Intent(context, JVMActivity.class); fclBridge.setScaleFactor(repository.getVersionSetting(selectedVersion).getScaleFactor()); fclBridge.setController(repository.getVersionSetting(selectedVersion).getController()); diff --git a/FCLauncher/src/main/java/com/tungsten/fclauncher/FCLauncher.java b/FCLauncher/src/main/java/com/tungsten/fclauncher/FCLauncher.java index abd25096..eca4b849 100644 --- a/FCLauncher/src/main/java/com/tungsten/fclauncher/FCLauncher.java +++ b/FCLauncher/src/main/java/com/tungsten/fclauncher/FCLauncher.java @@ -156,9 +156,11 @@ public class FCLauncher { envMap.put("HOME", config.getLogDir()); envMap.put("JAVA_HOME", config.getJavaPath()); envMap.put("FCL_NATIVEDIR", config.getContext().getApplicationInfo().nativeLibraryDir); + envMap.put("POJAV_NATIVEDIR", config.getContext().getApplicationInfo().nativeLibraryDir); envMap.put("TMPDIR", config.getContext().getCacheDir().getAbsolutePath()); envMap.put("PATH", config.getJavaPath() + "/bin:" + Os.getenv("PATH")); envMap.put("LD_LIBRARY_PATH", getLibraryPath(config.getContext())); + envMap.put("FORCE_VSYNC","false"); FFmpegPlugin.discover(config.getContext()); if (FFmpegPlugin.isAvailable) { envMap.put("PATH", FFmpegPlugin.libraryPath + ":" + envMap.get("PATH")); @@ -181,8 +183,15 @@ public class FCLauncher { envMap.put("LIBGL_VSYNC", "1"); envMap.put("LIBGL_NOINTOVLHACK", "1"); envMap.put("LIBGL_NOERROR", "1"); + if (renderer == FCLConfig.Renderer.RENDERER_GL4ES) { + envMap.put("POJAV_RENDERER","opengles2"); + } else { + envMap.put("POJAV_RENDERER","opengles2_vgpu"); + } } else if (renderer == FCLConfig.Renderer.RENDERER_ANGLE) { + envMap.put("POJAV_RENDERER","opengles3_desktopgl_angle_vulkan"); envMap.put("LIBGL_ES","3"); + envMap.put("POJAVEXEC_EGL","libEGL_angle.so"); } else { envMap.put("MESA_GLSL_CACHE_DIR", config.getContext().getCacheDir().getAbsolutePath()); envMap.put("MESA_GL_VERSION_OVERRIDE", renderer == FCLConfig.Renderer.RENDERER_VIRGL ? "4.3" : "4.6"); @@ -195,11 +204,14 @@ public class FCLauncher { if (renderer == FCLConfig.Renderer.RENDERER_VIRGL) { envMap.put("GALLIUM_DRIVER", "virpipe"); envMap.put("OSMESA_NO_FLUSH_FRONTBUFFER", "1"); + envMap.put("POJAV_RENDERER","opengles3_virgl"); } else if (renderer == FCLConfig.Renderer.RENDERER_ZINK) { envMap.put("GALLIUM_DRIVER", "zink"); + envMap.put("POJAV_RENDERER","vulkan_zink"); } else if (renderer == FCLConfig.Renderer.RENDERER_FREEDRENO) { envMap.put("GALLIUM_DRIVER", "freedreno"); envMap.put("MESA_LOADER_DRIVER_OVERRIDE", "kgsl"); + envMap.put("POJAV_RENDERER","vulkan_zink"); } } } diff --git a/FCLauncher/src/main/java/com/tungsten/fclauncher/bridge/FCLBridge.java b/FCLauncher/src/main/java/com/tungsten/fclauncher/bridge/FCLBridge.java index bbdde7b9..2d04bfa1 100644 --- a/FCLauncher/src/main/java/com/tungsten/fclauncher/bridge/FCLBridge.java +++ b/FCLauncher/src/main/java/com/tungsten/fclauncher/bridge/FCLBridge.java @@ -19,8 +19,11 @@ import androidx.annotation.Nullable; import androidx.core.content.FileProvider; import com.tungsten.fclauncher.keycodes.FCLKeycodes; +import com.tungsten.fclauncher.keycodes.LwjglGlfwKeycode; import com.tungsten.fclauncher.utils.FCLPath; +import org.lwjgl.glfw.CallbackBridge; + import java.io.File; import java.io.Serializable; @@ -29,44 +32,44 @@ public class FCLBridge implements Serializable { public static final int DEFAULT_WIDTH = 1280; public static final int DEFAULT_HEIGHT = 720; - public static final int HIT_RESULT_TYPE_UNKNOWN = 0; - public static final int HIT_RESULT_TYPE_MISS = 1; - public static final int HIT_RESULT_TYPE_BLOCK = 2; - public static final int HIT_RESULT_TYPE_ENTITY = 3; + public static final int HIT_RESULT_TYPE_UNKNOWN = 0; + public static final int HIT_RESULT_TYPE_MISS = 1; + public static final int HIT_RESULT_TYPE_BLOCK = 2; + public static final int HIT_RESULT_TYPE_ENTITY = 3; - public static final int INJECTOR_MODE_ENABLE = 1; - public static final int INJECTOR_MODE_DISABLE = 0; + public static final int INJECTOR_MODE_ENABLE = 1; + public static final int INJECTOR_MODE_DISABLE = 0; - public static final int KeyPress = 2; - public static final int KeyRelease = 3; - public static final int ButtonPress = 4; - public static final int ButtonRelease = 5; - public static final int MotionNotify = 6; - public static final int KeyChar = 7; - public static final int ConfigureNotify = 22; - public static final int FCLMessage = 37; + public static final int KeyPress = 2; + public static final int KeyRelease = 3; + public static final int ButtonPress = 4; + public static final int ButtonRelease = 5; + public static final int MotionNotify = 6; + public static final int KeyChar = 7; + public static final int ConfigureNotify = 22; + public static final int FCLMessage = 37; - public static final int Button1 = 1; - public static final int Button2 = 2; - public static final int Button3 = 3; - public static final int Button4 = 4; - public static final int Button5 = 5; - public static final int Button6 = 6; - public static final int Button7 = 7; + public static final int Button1 = LwjglGlfwKeycode.GLFW_MOUSE_BUTTON_1; + public static final int Button2 = LwjglGlfwKeycode.GLFW_MOUSE_BUTTON_2; + public static final int Button3 = LwjglGlfwKeycode.GLFW_MOUSE_BUTTON_3; + public static final int Button4 = LwjglGlfwKeycode.GLFW_MOUSE_BUTTON_4; + public static final int Button5 = LwjglGlfwKeycode.GLFW_MOUSE_BUTTON_5; + public static final int Button6 = LwjglGlfwKeycode.GLFW_MOUSE_BUTTON_6; + public static final int Button7 = LwjglGlfwKeycode.GLFW_MOUSE_BUTTON_7; - public static final int CursorEnabled = 1; - public static final int CursorDisabled = 0; + public static final int CursorEnabled = 1; + public static final int CursorDisabled = 0; - public static final int ShiftMask = 1 << 0; - public static final int LockMask = 1 << 1; - public static final int ControlMask = 1 << 2; - public static final int Mod1Mask = 1 << 3; - public static final int Mod2Mask = 1 << 4; - public static final int Mod3Mask = 1 << 5; - public static final int Mod4Mask = 1 << 6; - public static final int Mod5Mask = 1 << 7; + public static final int ShiftMask = 1 << 0; + public static final int LockMask = 1 << 1; + public static final int ControlMask = 1 << 2; + public static final int Mod1Mask = 1 << 3; + public static final int Mod2Mask = 1 << 4; + public static final int Mod3Mask = 1 << 5; + public static final int Mod4Mask = 1 << 6; + public static final int Mod5Mask = 1 << 7; - public static final int CloseRequest = 0; + public static final int CloseRequest = 0; private FCLBridgeCallback callback; @@ -91,18 +94,23 @@ public class FCLBridge implements Serializable { } public native int[] renderAWTScreenFrame(); + public native void nativeSendData(int type, int i1, int i2, int i3, int i4); + public native void nativeMoveWindow(int x, int y); - public native void setFCLNativeWindow(Surface surface); public native int redirectStdio(String path); + public native int chdir(String path); + public native void setenv(String key, String value); + public native int dlopen(String path); + public native void setLdLibraryPath(String path); + public native void setupExitTrap(FCLBridge bridge); - public native void setEventPipe(); - public native void pushEvent(long time, int type, int keycode, int keyChar); + public native void refreshHitResultType(); public native void setFCLBridge(FCLBridge fclBridge); @@ -132,6 +140,7 @@ public class FCLBridge implements Serializable { this.callback = callback; this.surface = surface; setFCLBridge(this); + CallbackBridge.setFCLBridge(this); receiveLog("invoke redirectStdio" + "\n"); int errorCode = redirectStdio(getLogPath()); if (errorCode != 0) { @@ -143,7 +152,6 @@ public class FCLBridge implements Serializable { handleWindow(); } receiveLog("invoke setEventPipe" + "\n"); - setEventPipe(); // start if (thread != null) { @@ -152,27 +160,36 @@ public class FCLBridge implements Serializable { } public void pushEventMouseButton(int button, boolean press) { - pushEvent(System.nanoTime(), press ? ButtonPress : ButtonRelease, button, 0); + switch (button) { + case Button4: + if (press) { + CallbackBridge.sendScroll(0, 1d); + } + break; + case Button5: + if (press) { + CallbackBridge.sendScroll(0, -1d); + } + break; + default: + CallbackBridge.sendMouseButton(button, press); + } } public void pushEventPointer(int x, int y) { - pushEvent(System.nanoTime(), MotionNotify, x, y); + CallbackBridge.sendCursorPos(x, y); } public void pushEventKey(int keyCode, int keyChar, boolean press) { - pushEvent(System.nanoTime(), press ? KeyPress : KeyRelease, keyCode, keyChar); + CallbackBridge.sendKeycode(keyCode, (char) keyChar, 0, 0, press); } - public void pushEventChar(int keyChar) { - pushEvent(System.nanoTime(), KeyChar, FCLKeycodes.KEY_RESERVED, keyChar); + public void pushEventChar(char keyChar) { + CallbackBridge.sendChar(keyChar, 0); } public void pushEventWindow(int width, int height) { - pushEvent(System.nanoTime(), ConfigureNotify, width, height); - } - - public void pushEventMessage(int msg) { - pushEvent(System.nanoTime(), FCLMessage, msg, 0); + CallbackBridge.sendUpdateWindowSize(width, height); } // FCLBridge callbacks @@ -303,7 +320,7 @@ public class FCLBridge implements Serializable { private void handleWindow() { if (gameDir != null) { receiveLog("invoke setFCLNativeWindow" + "\n"); - setFCLNativeWindow(surface); + CallbackBridge.setupBridgeWindow(surface); } else { receiveLog("start Android AWT Renderer thread" + "\n"); Thread canvasThread = new Thread(() -> { diff --git a/FCLauncher/src/main/java/com/tungsten/fclauncher/keycodes/LwjglKeycodeMap.java b/FCLauncher/src/main/java/com/tungsten/fclauncher/keycodes/LwjglKeycodeMap.java new file mode 100644 index 00000000..3e548eb1 --- /dev/null +++ b/FCLauncher/src/main/java/com/tungsten/fclauncher/keycodes/LwjglKeycodeMap.java @@ -0,0 +1,130 @@ +package com.tungsten.fclauncher.keycodes; + +import android.util.Log; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +/** + * @author mio + */ +public class LwjglKeycodeMap { + private static final Map KEY_MAP = new HashMap<>(); + + private static void add(int lwjglKeycode, int fclKeycode) { + KEY_MAP.put(fclKeycode, lwjglKeycode); + } + + public static int convertKeycode(int fclKeycode) { + Integer key = KEY_MAP.get(fclKeycode); + if (key != null) { + return key; + } + return LwjglGlfwKeycode.KEY_UNKNOWN; + } + + static { + add(LwjglGlfwKeycode.KEY_HOME, FCLKeycodes.KEY_HOME); + add(LwjglGlfwKeycode.KEY_ESCAPE, FCLKeycodes.KEY_ESC); + add(LwjglGlfwKeycode.KEY_0, FCLKeycodes.KEY_0); + add(LwjglGlfwKeycode.KEY_1, FCLKeycodes.KEY_1); + add(LwjglGlfwKeycode.KEY_2, FCLKeycodes.KEY_2); + add(LwjglGlfwKeycode.KEY_3, FCLKeycodes.KEY_3); + add(LwjglGlfwKeycode.KEY_4, FCLKeycodes.KEY_4); + add(LwjglGlfwKeycode.KEY_5, FCLKeycodes.KEY_5); + add(LwjglGlfwKeycode.KEY_6, FCLKeycodes.KEY_6); + add(LwjglGlfwKeycode.KEY_7, FCLKeycodes.KEY_7); + add(LwjglGlfwKeycode.KEY_8, FCLKeycodes.KEY_8); + add(LwjglGlfwKeycode.KEY_9, FCLKeycodes.KEY_9); + add(LwjglGlfwKeycode.KEY_3, FCLKeycodes.KEY_3); + add(LwjglGlfwKeycode.KEY_UP, FCLKeycodes.KEY_UP); + add(LwjglGlfwKeycode.KEY_DOWN, FCLKeycodes.KEY_DOWN); + add(LwjglGlfwKeycode.KEY_LEFT, FCLKeycodes.KEY_LEFT); + add(LwjglGlfwKeycode.KEY_RIGHT, FCLKeycodes.KEY_RIGHT); + add(LwjglGlfwKeycode.KEY_A, FCLKeycodes.KEY_A); + add(LwjglGlfwKeycode.KEY_B, FCLKeycodes.KEY_B); + add(LwjglGlfwKeycode.KEY_C, FCLKeycodes.KEY_C); + add(LwjglGlfwKeycode.KEY_D, FCLKeycodes.KEY_D); + add(LwjglGlfwKeycode.KEY_E, FCLKeycodes.KEY_E); + add(LwjglGlfwKeycode.KEY_F, FCLKeycodes.KEY_F); + add(LwjglGlfwKeycode.KEY_G, FCLKeycodes.KEY_G); + add(LwjglGlfwKeycode.KEY_H, FCLKeycodes.KEY_H); + add(LwjglGlfwKeycode.KEY_I, FCLKeycodes.KEY_I); + add(LwjglGlfwKeycode.KEY_J, FCLKeycodes.KEY_J); + add(LwjglGlfwKeycode.KEY_K, FCLKeycodes.KEY_K); + add(LwjglGlfwKeycode.KEY_L, FCLKeycodes.KEY_L); + add(LwjglGlfwKeycode.KEY_M, FCLKeycodes.KEY_M); + add(LwjglGlfwKeycode.KEY_N, FCLKeycodes.KEY_N); + add(LwjglGlfwKeycode.KEY_O, FCLKeycodes.KEY_O); + add(LwjglGlfwKeycode.KEY_P, FCLKeycodes.KEY_P); + add(LwjglGlfwKeycode.KEY_Q, FCLKeycodes.KEY_Q); + add(LwjglGlfwKeycode.KEY_R, FCLKeycodes.KEY_R); + add(LwjglGlfwKeycode.KEY_S, FCLKeycodes.KEY_S); + add(LwjglGlfwKeycode.KEY_T, FCLKeycodes.KEY_T); + add(LwjglGlfwKeycode.KEY_U, FCLKeycodes.KEY_U); + add(LwjglGlfwKeycode.KEY_V, FCLKeycodes.KEY_V); + add(LwjglGlfwKeycode.KEY_W, FCLKeycodes.KEY_W); + add(LwjglGlfwKeycode.KEY_X, FCLKeycodes.KEY_X); + add(LwjglGlfwKeycode.KEY_Y, FCLKeycodes.KEY_Y); + add(LwjglGlfwKeycode.KEY_Z, FCLKeycodes.KEY_Z); + add(LwjglGlfwKeycode.KEY_COMMA, FCLKeycodes.KEY_COMMA); + add(LwjglGlfwKeycode.KEY_PERIOD, FCLKeycodes.KEY_DOT); + add(LwjglGlfwKeycode.KEY_LEFT_ALT, FCLKeycodes.KEY_LEFTALT); + add(LwjglGlfwKeycode.KEY_RIGHT_ALT, FCLKeycodes.KEY_RIGHTALT); + add(LwjglGlfwKeycode.KEY_LEFT_SHIFT, FCLKeycodes.KEY_LEFTSHIFT); + add(LwjglGlfwKeycode.KEY_RIGHT_SHIFT, FCLKeycodes.KEY_RIGHTSHIFT); + add(LwjglGlfwKeycode.KEY_TAB, FCLKeycodes.KEY_TAB); + add(LwjglGlfwKeycode.KEY_SPACE, FCLKeycodes.KEY_SPACE); + add(LwjglGlfwKeycode.KEY_ENTER, FCLKeycodes.KEY_ENTER); + add(LwjglGlfwKeycode.KEY_BACKSPACE, FCLKeycodes.KEY_BACKSPACE); + add(LwjglGlfwKeycode.KEY_GRAVE_ACCENT, FCLKeycodes.KEY_GRAVE); + add(LwjglGlfwKeycode.KEY_MINUS, FCLKeycodes.KEY_MINUS); + add(LwjglGlfwKeycode.KEY_EQUAL, FCLKeycodes.KEY_EQUAL); + add(LwjglGlfwKeycode.KEY_LEFT_BRACKET, FCLKeycodes.KEY_LEFTBRACE); + add(LwjglGlfwKeycode.KEY_RIGHT_BRACKET, FCLKeycodes.KEY_RIGHTBRACE); + add(LwjglGlfwKeycode.KEY_BACKSLASH, FCLKeycodes.KEY_BACKSLASH); + add(LwjglGlfwKeycode.KEY_SEMICOLON, FCLKeycodes.KEY_SEMICOLON); + add(LwjglGlfwKeycode.KEY_APOSTROPHE, FCLKeycodes.KEY_APOSTROPHE); + add(LwjglGlfwKeycode.KEY_SLASH, FCLKeycodes.KEY_SLASH); + add(LwjglGlfwKeycode.KEY_PAGE_UP, FCLKeycodes.KEY_PAGEUP); + add(LwjglGlfwKeycode.KEY_PAGE_DOWN, FCLKeycodes.KEY_PAGEDOWN); + add(LwjglGlfwKeycode.KEY_ESCAPE, FCLKeycodes.KEY_ESC); + add(LwjglGlfwKeycode.KEY_LEFT_CONTROL, FCLKeycodes.KEY_LEFTCTRL); + add(LwjglGlfwKeycode.KEY_RIGHT_CONTROL, FCLKeycodes.KEY_RIGHTCTRL); + add(LwjglGlfwKeycode.KEY_CAPS_LOCK, FCLKeycodes.KEY_CAPSLOCK); + add(LwjglGlfwKeycode.KEY_PAUSE, FCLKeycodes.KEY_PAUSE); + add(LwjglGlfwKeycode.KEY_END, FCLKeycodes.KEY_END); + add(LwjglGlfwKeycode.KEY_INSERT, FCLKeycodes.KEY_INSERT); + add(LwjglGlfwKeycode.KEY_F1, FCLKeycodes.KEY_F1); + add(LwjglGlfwKeycode.KEY_F2, FCLKeycodes.KEY_F2); + add(LwjglGlfwKeycode.KEY_F3, FCLKeycodes.KEY_F3); + add(LwjglGlfwKeycode.KEY_F4, FCLKeycodes.KEY_F4); + add(LwjglGlfwKeycode.KEY_F5, FCLKeycodes.KEY_F5); + add(LwjglGlfwKeycode.KEY_F6, FCLKeycodes.KEY_F6); + add(LwjglGlfwKeycode.KEY_F7, FCLKeycodes.KEY_F7); + add(LwjglGlfwKeycode.KEY_F8, FCLKeycodes.KEY_F8); + add(LwjglGlfwKeycode.KEY_F9, FCLKeycodes.KEY_F9); + add(LwjglGlfwKeycode.KEY_F10, FCLKeycodes.KEY_F10); + add(LwjglGlfwKeycode.KEY_F11, FCLKeycodes.KEY_F11); + add(LwjglGlfwKeycode.KEY_F12, FCLKeycodes.KEY_F12); + add(LwjglGlfwKeycode.KEY_NUM_LOCK, FCLKeycodes.KEY_NUMLOCK); + add(LwjglGlfwKeycode.KEY_KP_0, FCLKeycodes.KEY_KP0); + add(LwjglGlfwKeycode.KEY_KP_1, FCLKeycodes.KEY_KP1); + add(LwjglGlfwKeycode.KEY_KP_2, FCLKeycodes.KEY_KP2); + add(LwjglGlfwKeycode.KEY_KP_3, FCLKeycodes.KEY_KP3); + add(LwjglGlfwKeycode.KEY_KP_4, FCLKeycodes.KEY_KP4); + add(LwjglGlfwKeycode.KEY_KP_5, FCLKeycodes.KEY_KP5); + add(LwjglGlfwKeycode.KEY_KP_6, FCLKeycodes.KEY_KP6); + add(LwjglGlfwKeycode.KEY_KP_7, FCLKeycodes.KEY_KP7); + add(LwjglGlfwKeycode.KEY_KP_8, FCLKeycodes.KEY_KP8); + add(LwjglGlfwKeycode.KEY_KP_9, FCLKeycodes.KEY_KP9); + add(LwjglGlfwKeycode.KEY_KP_DECIMAL, FCLKeycodes.KEY_KPDOT); + add(LwjglGlfwKeycode.KEY_KP_SUBTRACT, FCLKeycodes.KEY_KPMINUS); + add(LwjglGlfwKeycode.KEY_KP_MULTIPLY, FCLKeycodes.KEY_KPASTERISK); + add(LwjglGlfwKeycode.KEY_KP_ADD, FCLKeycodes.KEY_KPPLUS); + add(LwjglGlfwKeycode.KEY_KP_DIVIDE, FCLKeycodes.KEY_KPSLASH); + add(LwjglGlfwKeycode.KEY_KP_ENTER, FCLKeycodes.KEY_KPENTER); + add(LwjglGlfwKeycode.KEY_KP_EQUAL, FCLKeycodes.KEY_KPEQUAL); + } +} \ No newline at end of file diff --git a/FCLauncher/src/main/java/org/lwjgl/glfw/CallbackBridge.java b/FCLauncher/src/main/java/org/lwjgl/glfw/CallbackBridge.java index 133dbfc9..8b11c9c7 100644 --- a/FCLauncher/src/main/java/org/lwjgl/glfw/CallbackBridge.java +++ b/FCLauncher/src/main/java/org/lwjgl/glfw/CallbackBridge.java @@ -7,6 +7,7 @@ import androidx.annotation.Nullable; import com.tungsten.fclauncher.bridge.FCLBridge; import com.tungsten.fclauncher.keycodes.LwjglGlfwKeycode; +import com.tungsten.fclauncher.keycodes.LwjglKeycodeMap; import com.tungsten.fclauncher.utils.FCLPath; import java.util.function.Consumer; @@ -49,7 +50,11 @@ public class CallbackBridge { public static void sendKeycode(int keycode, char keychar, int scancode, int modifiers, boolean isDown) { // TODO CHECK: This may cause input issue, not receive input! if (keycode != 0) { - nativeSendKey(keycode, scancode, isDown ? 1 : 0, modifiers); + int code = LwjglKeycodeMap.convertKeycode(keycode); + if (code <= 0) { + return; + } + nativeSendKey(code, scancode, isDown ? 1 : 0, modifiers); } if (isDown && keychar != '\u0000') { nativeSendCharMods(keychar, modifiers); @@ -223,7 +228,7 @@ public class CallbackBridge { private static native void nativeSendScreenSize(int width, int height); public static native void nativeSetWindowAttrib(int attrib, int value); - + public static native void setupBridgeWindow(Object surface); static { System.loadLibrary("pojavexec"); } diff --git a/FCLauncher/src/main/jni/fcl/fcl_bridge.c b/FCLauncher/src/main/jni/fcl/fcl_bridge.c index 4f2ec28d..5ff1f13b 100644 --- a/FCLauncher/src/main/jni/fcl/fcl_bridge.c +++ b/FCLauncher/src/main/jni/fcl/fcl_bridge.c @@ -29,10 +29,6 @@ __attribute__((constructor)) void env_init() { __android_log_print(ANDROID_LOG_INFO, "Environ", "%p", fcl); } -ANativeWindow* fclGetNativeWindow() { - return fcl->window; -} - void fclSetPrimaryClipString(const char* string) { PrepareFCLBridgeJNI(); CallFCLBridgeJNIFunc( , Void, setPrimaryClipString, "(Ljava/lang/String;)V", (*env)->NewStringUTF(env, string)); @@ -55,11 +51,6 @@ const char* fclGetPrimaryClipString() { return fcl->clipboard_string; } -JNIEXPORT void JNICALL Java_com_tungsten_fclauncher_bridge_FCLBridge_setFCLNativeWindow(JNIEnv* env, jclass clazz, jobject surface) { - fcl->window = ANativeWindow_fromSurface(env, surface); - FCL_INTERNAL_LOG("setFCLNativeWindow : %p, size : %dx%d", fcl->window, ANativeWindow_getWidth(fcl->window), ANativeWindow_getHeight(fcl->window)); -} - JNIEXPORT void JNICALL Java_com_tungsten_fclauncher_bridge_FCLBridge_setFCLBridge(JNIEnv *env, jobject thiz, jobject fcl_bridge) { fcl->object_FCLBridge = (jclass)(*env)->NewGlobalRef(env, thiz); } diff --git a/FCLauncher/src/main/jni/fcl/fcl_event.c b/FCLauncher/src/main/jni/fcl/fcl_event.c index 7ba881bc..e2d4da45 100644 --- a/FCLauncher/src/main/jni/fcl/fcl_event.c +++ b/FCLauncher/src/main/jni/fcl/fcl_event.c @@ -5,58 +5,6 @@ #include #include -void EventQueue_init(EventQueue* queue) { - queue->count = 0; - queue->head = NULL; - queue->tail = NULL; -} - -FCLEvent* EventQueue_add(EventQueue* queue) { - FCLEvent* ret = NULL; - QueueElement* e = malloc(sizeof(QueueElement)); - if (e != NULL) { - e->next = NULL; - if (queue->count > 0) { - queue->tail->next = e; - queue->tail = e; - } - else { // count == 0 - queue->head = e; - queue->tail = e; - } - queue->count++; - ret = &queue->tail->event; - } - return ret; -} - -int EventQueue_take(EventQueue* queue, FCLEvent* event) { - int ret = 0; - if (queue->count > 0) { - QueueElement* e = queue->head; - if (queue->count == 1) { - queue->head = NULL; - queue->tail = NULL; - } - else { - queue->head = e->next; - } - queue->count--; - ret = 1; - if (event != NULL) { - memcpy(event, &e->event, sizeof(FCLEvent)); - } - free(e); - } - return ret; -} - -void EventQueue_clear(EventQueue* queue) { - while (queue->count > 0) { - EventQueue_take(queue, NULL); - } -} - FCLinjectorfun injectorCallback; void fclSetInjectorCallback(FCLinjectorfun callback) { @@ -79,116 +27,7 @@ void fclSetCursorMode(int mode) { CallFCLBridgeJNIFunc( , Void, setCursorMode, "(I)V", mode); } -int fclGetEventFd() { - if (!fcl->has_event_pipe) { - return -1; - } - return fcl->event_pipe_fd[0]; -} - -int fclWaitForEvent(int timeout) { - if (!fcl->has_event_pipe) { - return 0; - } - struct epoll_event ev; - int ret = epoll_wait(fcl->epoll_fd, &ev, 1, timeout); - if (ret > 0 && (ev.events & EPOLLIN)) { - return 1; - } - return 0; -} - -int fclPollEvent(FCLEvent* event) { - if (!fcl->has_event_pipe) { - return 0; - } - if (pthread_mutex_lock(&fcl->event_queue_mutex)) { - FCL_INTERNAL_LOG("Failed to acquire mutex"); - return 0; - } - char c; - int ret = 0; - if (read(fcl->event_pipe_fd[0], &c, 1) > 0) { - ret = EventQueue_take(&fcl->event_queue, event); - } - if (pthread_mutex_unlock(&fcl->event_queue_mutex)) { - FCL_INTERNAL_LOG("Failed to release mutex"); - return 0; - } - return ret; -} - JNIEXPORT void JNICALL Java_com_tungsten_fclauncher_bridge_FCLBridge_refreshHitResultType(JNIEnv *env, jobject thiz) { if (injectorCallback) injectorCallback(); -} - -JNIEXPORT void JNICALL Java_com_tungsten_fclauncher_bridge_FCLBridge_pushEvent(JNIEnv* env, jclass clazz, jlong time, jint type, jint p1, jint p2) { - if (!fcl->has_event_pipe) { - return; - } - if (pthread_mutex_lock(&fcl->event_queue_mutex)) { - FCL_INTERNAL_LOG("Failed to acquire mutex"); - return; - } - FCLEvent* event = EventQueue_add(&fcl->event_queue); - if (event == NULL) { - FCL_INTERNAL_LOG("Failed to add event to event queue"); - return; - } - event->time = time; - event->type = type; - event->state = 0; - switch (type) { - case KeyChar: - event->keychar = p2; - break; - case MotionNotify: - event->x = p1; - event->y = p2; - break; - case ButtonPress: - case ButtonRelease: - event->button = p1; - break; - case KeyPress: - case KeyRelease: - event->keycode = p1; - event->keychar = p2; - break; - case ConfigureNotify: - event->width = p1; - event->height = p2; - break; - case FCLMessage: - event->message = p1; - break; - } - write(fcl->event_pipe_fd[1], "E", 1); - if (pthread_mutex_unlock(&fcl->event_queue_mutex)) { - FCL_INTERNAL_LOG("Failed to release mutex"); - } -} - -JNIEXPORT void JNICALL Java_com_tungsten_fclauncher_bridge_FCLBridge_setEventPipe(JNIEnv* env, jclass clazz) { - if (pipe(fcl->event_pipe_fd) == -1) { - FCL_INTERNAL_LOG("Failed to create event pipe : %s", strerror(errno)); - return; - } - fcl->epoll_fd = epoll_create(3); - if (fcl->epoll_fd == -1) { - FCL_INTERNAL_LOG("Failed to get epoll fd : %s", strerror(errno)); - return; - } - struct epoll_event ev; - ev.events = EPOLLIN; - ev.data.fd = fcl->event_pipe_fd[0]; - if (epoll_ctl(fcl->epoll_fd, EPOLL_CTL_ADD, fcl->event_pipe_fd[0], &ev) == -1) { - FCL_INTERNAL_LOG("Failed to add epoll event : %s", strerror(errno)); - return; - } - EventQueue_init(&fcl->event_queue); - pthread_mutex_init(&fcl->event_queue_mutex, NULL); - fcl->has_event_pipe = 1; - FCL_INTERNAL_LOG("Succeeded to set event pipe"); } \ No newline at end of file diff --git a/FCLauncher/src/main/jni/pojav/egl_bridge.c b/FCLauncher/src/main/jni/pojav/egl_bridge.c index 0afcddb6..87ee4e94 100644 --- a/FCLauncher/src/main/jni/pojav/egl_bridge.c +++ b/FCLauncher/src/main/jni/pojav/egl_bridge.c @@ -81,7 +81,8 @@ EXTERNAL_API void pojavTerminate() { } } -JNIEXPORT void JNICALL Java_net_kdt_pojavlaunch_utils_JREUtils_setupBridgeWindow(JNIEnv* env, ABI_COMPAT jclass clazz, jobject surface) { +JNIEXPORT void JNICALL +Java_org_lwjgl_glfw_CallbackBridge_setupBridgeWindow(JNIEnv *env, ABI_COMPAT jclass clazz, jobject surface) { pojav_environ->pojavWindow = ANativeWindow_fromSurface(env, surface); if(br_setup_window != NULL) br_setup_window(); }