This commit is contained in:
ShirosakiMio 2024-08-19 19:17:58 +08:00
parent e0dcc0fead
commit 61435809b6
9 changed files with 235 additions and 220 deletions

View File

@ -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;

View File

@ -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());

View File

@ -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");
}
}
}

View File

@ -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(() -> {

View File

@ -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);
}
}

View File

@ -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");
}

View File

@ -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);
}

View File

@ -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");
}

View File

@ -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();
}