[Input pipe] Bug fix attempt: combining Alt/Ctrl/Shift/etc.. not working

This commit is contained in:
khanhduytran0 2020-12-10 18:10:35 +07:00
parent 9a8e961795
commit 9b88689802
5 changed files with 56 additions and 40 deletions

View file

@ -172,27 +172,18 @@ public class AndroidLWJGLKeycode {
}
}
int mods = 0;
if (keyEvent.isAltPressed()) {
mods &= LWJGLGLFWKeycode.GLFW_MOD_ALT;
} if (keyEvent.isCapsLockOn()) {
mods &= LWJGLGLFWKeycode.GLFW_MOD_CAPS_LOCK;
} if (keyEvent.isCtrlPressed()) {
mods &= LWJGLGLFWKeycode.GLFW_MOD_CONTROL;
} /* if (keyEvent.isFunctionPressed()) {
mods &= LWJGLGLFWKeycode.GLFW_MOD_FUNCTION
} */ if (keyEvent.isNumLockOn()) {
mods &= LWJGLGLFWKeycode.GLFW_MOD_NUM_LOCK;
} if (keyEvent.isShiftPressed()) {
mods &= LWJGLGLFWKeycode.GLFW_MOD_SHIFT;
}
CallbackBridge.holdingAlt = keyEvent.isAltPressed();
CallbackBridge.holdingCapslock = keyEvent.isCapsLockOn();
CallbackBridge.holdingCtrl = keyEvent.isCtrlPressed();
CallbackBridge.holdingNumlock = keyEvent.isNumLockOn();
CallbackBridge.holdingShift = keyEvent.isShiftPressed();
try {
if (!CallbackBridge.isGrabbing()) {
if (keyEvent.isPrintingKey()) {
BaseMainActivity.sendKeyPress(androidToLwjglMap.get(keyEvent.getKeyCode()), (char) keyEvent.getUnicodeChar(keyEvent.getMetaState()), keyEvent.getScanCode(), mods, isDown);
BaseMainActivity.sendKeyPress(androidToLwjglMap.get(keyEvent.getKeyCode()), (char) keyEvent.getUnicodeChar(keyEvent.getMetaState()), keyEvent.getScanCode(), CallbackBridge.getCurrentMods(), isDown);
} else if ((int) keyEvent.getDisplayLabel() != KeyEvent.KEYCODE_UNKNOWN) {
BaseMainActivity.sendKeyPress(androidToLwjglMap.get(keyEvent.getKeyCode()), (char) keyEvent.getDisplayLabel(), keyEvent.getScanCode(), mods, isDown);
BaseMainActivity.sendKeyPress(androidToLwjglMap.get(keyEvent.getKeyCode()), (char) keyEvent.getDisplayLabel(), keyEvent.getScanCode(), CallbackBridge.getCurrentMods(), isDown);
}
}
} catch (Throwable th) {

View file

@ -609,7 +609,7 @@ public class BaseMainActivity extends LoggableActivity {
case MotionEvent.ACTION_POINTER_DOWN: // 5
CallbackBridge.sendPrepareGrabInitialPos();
CallbackBridge.sendMouseKeycode(CallbackBridge.mouseLeft ? LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT : LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, 0, true);
CallbackBridge.sendMouseKeycode(CallbackBridge.mouseLeft ? LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT : LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT, CallbackBridge.getCurrentMods(), true);
initialX = x;
initialY = y;
@ -1071,13 +1071,13 @@ public class BaseMainActivity extends LoggableActivity {
}
public void sendKeyPress(char keyChar) {
sendKeyPress(0, keyChar, 0, 0, true);
sendKeyPress(0, keyChar, 0, 0, false);
sendKeyPress(0, keyChar, 0, CallbackBridge.getCurrentMods(), true);
sendKeyPress(0, keyChar, 0, CallbackBridge.getCurrentMods(), false);
}
public void sendKeyPress(int keyCode) {
sendKeyPress(keyCode, 0, true);
sendKeyPress(keyCode, 0, false);
sendKeyPress(keyCode, CallbackBridge.getCurrentMods(), true);
sendKeyPress(keyCode, CallbackBridge.getCurrentMods(), false);
}
private static boolean isLeftMouseDown, isRightMouseDown;
@ -1089,7 +1089,7 @@ public class BaseMainActivity extends LoggableActivity {
isLeftMouseDown = button == LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_LEFT && status;
isRightMouseDown = button == LWJGLGLFWKeycode.GLFW_MOUSE_BUTTON_RIGHT && status;
CallbackBridge.sendMouseKeycode(button, 0, status);
CallbackBridge.sendMouseKeycode(button, CallbackBridge.getCurrentMods(), status);
}
public void calculateMcScale() {

View file

@ -24,7 +24,6 @@ public class ControlButton extends Button implements OnLongClickListener, OnTouc
private boolean mChecked = false;
private float mScaleAt;
private int mMods;
public ControlButton(ControlLayout layout, ControlData properties) {
super(layout.getContext());
@ -67,14 +66,6 @@ public class ControlButton extends Button implements OnLongClickListener, OnTouc
mProperties.transparency = mProperties.hidden ? 100 : mProperties.transparency;
properties.update();
if (properties.holdAlt) {
mMods &= LWJGLGLFWKeycode.GLFW_MOD_ALT;
} if (properties.holdCtrl) {
mMods &= LWJGLGLFWKeycode.GLFW_MOD_CONTROL;
} if (properties.holdShift) {
mMods &= LWJGLGLFWKeycode.GLFW_MOD_SHIFT;
}
// com.android.internal.R.string.delete
// android.R.string.
setText(properties.name);
@ -93,7 +84,8 @@ public class ControlButton extends Button implements OnLongClickListener, OnTouc
// setOnLongClickListener(null);
setOnTouchListener((View.OnTouchListener) properties.specialButtonListener);
} else {
throw new IllegalArgumentException("Field " + ControlData.class.getName() + ".specialButtonListener must be View.OnClickListener or View.OnTouchListener, but is " + properties.specialButtonListener.getClass().getName());
throw new IllegalArgumentException("Field " + ControlData.class.getName() + ".specialButtonListener must be View.OnClickListener or View.OnTouchListener, but was " +
properties.specialButtonListener.getClass().getName());
}
setLayoutParams(new FrameLayout.LayoutParams((int) properties.width, (int) properties.height));
@ -169,6 +161,20 @@ public class ControlButton extends Button implements OnLongClickListener, OnTouc
return mCanTriggerLongClick;
}
private void setHolding(boolean isDown) {
if (mProperties.holdAlt || mProperties.keycode == LWJGLGLFWKeycode.GLFW_KEY_LEFT_ALT || mProperties.keycode == LWJGLGLFWKeycode.GLFW_KEY_RIGHT_ALT) {
CallbackBridge.holdingAlt = isDown;
} if (mProperties.keycode == LWJGLGLFWKeycode.GLFW_KEY_CAPS_LOCK) {
CallbackBridge.holdingCapslock = isDown;
} if (mProperties.holdCtrl || mProperties.keycode == LWJGLGLFWKeycode.GLFW_KEY_LEFT_CONTROL || mProperties.keycode == LWJGLGLFWKeycode.GLFW_KEY_RIGHT_CONTROL) {
CallbackBridge.holdingCtrl = isDown;
} if (mProperties.keycode == LWJGLGLFWKeycode.GLFW_KEY_NUM_LOCK) {
CallbackBridge.holdingNumlock = isDown;
} if (mProperties.holdShift || mProperties.keycode == LWJGLGLFWKeycode.GLFW_KEY_LEFT_SHIFT || mProperties.keycode == LWJGLGLFWKeycode.GLFW_KEY_RIGHT_SHIFT) {
CallbackBridge.holdingShift = isDown;
}
}
private float moveX, moveY;
private float downX, downY;
@Override
@ -191,10 +197,12 @@ public class ControlButton extends Button implements OnLongClickListener, OnTouc
default:
return false;
}
MainActivity.sendKeyPress(mProperties.keycode, mMods, isDown);
setHolding(isDown);
MainActivity.sendKeyPress(mProperties.keycode, CallbackBridge.getCurrentMods(), isDown);
} else if (mGestureDetector.onTouchEvent(event)) {
mChecked = !mChecked;
MainActivity.sendKeyPress(mProperties.keycode, mMods, mChecked);
setHolding(mChecked);
MainActivity.sendKeyPress(mProperties.keycode, CallbackBridge.getCurrentMods(), mChecked);
}
return true;
}

View file

@ -25,7 +25,7 @@ public class CallbackBridge {
public static void putMouseEventWithCoords(int button, int state, int x, int y /* , int dz, long nanos */) {
sendCursorPos(x, y);
sendMouseKeycode(button, 0, state == 1);
sendMouseKeycode(button, CallbackBridge.getCurrentMods(), state == 1);
}
private static boolean threadAttached;
@ -42,7 +42,7 @@ public class CallbackBridge {
public static void sendPrepareGrabInitialPos() {
DEBUG_STRING.append("Prepare set grab initial posititon");
sendMouseKeycode(-1, 0, false);
sendMouseKeycode(-1, CallbackBridge.getCurrentMods(), false);
}
public static void sendKeycode(int keycode, char keychar, int scancode, int modifiers, boolean isDown) {
@ -66,8 +66,8 @@ public class CallbackBridge {
}
public static void sendMouseKeycode(int keycode) {
sendMouseKeycode(keycode, 0, true);
sendMouseKeycode(keycode, 0, false);
sendMouseKeycode(keycode, CallbackBridge.getCurrentMods(), true);
sendMouseKeycode(keycode, CallbackBridge.getCurrentMods(), false);
}
public static void sendScroll(double xoffset, double yoffset) {
@ -127,6 +127,24 @@ public class CallbackBridge {
private static native void nativeSendData(boolean isAndroid, int type, String data);
*/
public static boolean holdingAlt, holdingCapslock, holdingCtrl,
holdingNumlock, holdingShift;
public static int getCurrentMods() {
int currMods = 0;
if (holdingAlt) {
currMods &= LWJGLGLFWKeycode.GLFW_MOD_ALT;
} if (holdingCapslock) {
currMods &= LWJGLGLFWKeycode.GLFW_MOD_CAPS_LOCK;
} if (holdingCtrl) {
currMods &= LWJGLGLFWKeycode.GLFW_MOD_CONTROL;
} if (holdingNumlock) {
currMods &= LWJGLGLFWKeycode.GLFW_MOD_NUM_LOCK;
} if (holdingShift) {
currMods &= LWJGLGLFWKeycode.GLFW_MOD_SHIFT;
}
return currMods;
}
public static native boolean nativeAttachThreadToOther(boolean isAndroid, boolean isUsePushPoll);
/*
private static native boolean nativeSendChar(char codepoint);

View file

@ -22,7 +22,6 @@
#define EVENT_TYPE_MOUSE_BUTTON 1006
#define EVENT_TYPE_SCROLL 1007
#define EVENT_TYPE_WINDOW_SIZE 1008
#define EVENT_TYPE_KEYCODE 1009
typedef void GLFW_invoke_Char_func(void* window, unsigned int codepoint);
typedef void GLFW_invoke_CharMods_func(void* window, unsigned int codepoint, int mods);