done
This commit is contained in:
parent
e0dcc0fead
commit
61435809b6
|
@ -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;
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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(() -> {
|
||||
|
|
|
@ -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<Integer, Integer> 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);
|
||||
}
|
||||
}
|
|
@ -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");
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -5,58 +5,6 @@
|
|||
#include <fcl_internal.h>
|
||||
#include <android/log.h>
|
||||
|
||||
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");
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue